Форум программистов, компьютерный форум CyberForum.ru

Динамические структуры. Стек (помогите найти ошибку) - C++

Восстановить пароль Регистрация
 
ulian
0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 53
20.03.2013, 00:29     Динамические структуры. Стек (помогите найти ошибку) #1
помогите найти ошибку. Есть задание: построить стек, элементами которого являются слова текста,которые считываются из текстового файла. Слова отделяются друг от друга запятыми, пробелами и другими разделительными знаками. Создать новый стек, в котором содержатся слова заданной длины, что выбранные с первого стека. Вывести содержимое первого и второго стеков.

Есть код, я реализовал считывание с файла текстового, розбития текста на лексемы и теперь пытаюсь записать это в стек, но оно записывает задом на перед и не учитывает пробелов. В чем проблема? и помогите со второй частью задания - создать новый стек, в котором содержатся слова заданной длины, что выбранные с первого стека.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
const int lenght = 256;
struct item{
    char data[lenght];
    item * next;
};
item * head, * current;
 
 
void push(char * value){
    current = new (item);
    strcpy(current -> data,value);
    current -> next = head;
    head = current;
}
 
void pop(char * value){
    current = head;
    strcpy(value,head->data);
    head = current ->next;
    delete current;
}
 
void lenghtWord(char str[]){
    int n;
    char * temp, * del = " ,.?!:;-\/";
    temp = strtok(str,del);
    while(temp !=NULL){
        //cout<<" "<<temp;
        push(temp);
        temp=strtok(NULL,del);
        
    }
    
}
 
 
void read (char str[]) {
    string nameFile;
    int n;
    cout<<"Enter filename"<<endl;
    cin>>nameFile;
    cout<<"\n Enter lenght of words"<<endl;
    cin>>n;
    ifstream myfile (nameFile);
    if (myfile.is_open())
    {
        while (! myfile.eof() )
        {
            myfile>>str;
            lenghtWord(str);
        }
        myfile.close();
    }
    else cout << "File not found ";
    
}
 
 
int main(){
    char str[lenght];
    head = NULL;
    char key;
    do{
        cout<<"\n Choose the option"<<endl;
        cout<<"1.Reading from file all text"<<endl;
        cout<<"2.Print first stack"<<endl;
        cout<<"3.Exit"<<endl;
        cin>>key;
        switch(key){
        case '1':{
                    read(str);
                    break;
                 }
        case '2':{
                    while(head!=NULL)
                    {
                        pop(str);
                        cout<<str<<"";
                    }
                    cout<<"stack empty"<<endl;
                 }
        }
    }while(key!='3');
    system("pause");
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.03.2013, 00:29     Динамические структуры. Стек (помогите найти ошибку)
Посмотрите здесь:

C++ С++ структуры (не могу найти ошибку)
C++ Динамические структуры данных.Стек.
C++ Структуры. Помогите найти ошибку в программе
C++ Стек (найти ошибку в коде)
Найти ошибку. Динамические массивы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
anmartex
...
 Аватар для anmartex
1700 / 1193 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
20.03.2013, 09:19     Динамические структуры. Стек (помогите найти ошибку) #2
Демку сделал без менюшки. Я думаю, что если понадобиться, то вы и сами сделаете:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include <iostream>
#include <fstream>
#include <string>
#include <cctype>
#include <cstdlib>
 
using namespace std;
 
struct TNode
{
   string value;
   TNode* next;
};
 
//----------------------------------------------//
TNode* Push(TNode*& stack, const string& value)
{
   TNode* node = new TNode;
   node->value = value;
   node->next = stack;
 
   stack = node;
 
   return stack;
}
//----------------------------------------------//
string Pop(TNode*& stack)
{
   string value;
 
   if (stack == NULL)
   {
      return value;
   }
   value = stack->value;
 
   TNode* node = stack;
   stack = stack->next;
   delete node;
 
   return value;
}
//----------------------------------------------//
ostream& operator << (ostream& os, const TNode* stack)
{
   for (; stack; stack = stack->next)
   {
      os << stack->value << " ";
   }
 
   return os;
}
//----------------------------------------------//
bool GetWord(const char* text, const char*& begin, const char*& end)
{
   for (; *text && !isalpha(*text); ++text) { ; }
 
   begin = text;
 
   for (; *text && isalpha(*text); ++text) { ; }
 
   end = text;
 
   return (begin != end);
}
//----------------------------------------------//
bool LoadWords(const string& fname, TNode*& stack)
{
   ifstream f(fname.c_str());
 
   if (f.is_open() == false)
   {
      return false;
   }
 
   f.seekg(0, f.end);
   int length = f.tellg();
   f.seekg (0, f.beg);
 
   char* buff = new char [length+1];
   f.read(buff, length);
   buff[length] = 0;
 
   const char* text = buff;
   const char* begin, * end;
 
   for (; GetWord(text, begin, end); text = end+1)
   {
      Push(stack, string(begin, end-begin));
   }
 
   delete[] buff;
 
   return true;
}
//----------------------------------------------//
void CopyWordWithLength(const TNode* source, TNode*& target, size_t length)
{
   for (; source; source = source->next)
   {
      if (source->value.size() == length)
      {
         Push(target, source->value);
      }
   }
}
//----------------------------------------------//
 
int main()
{
   TNode* stack = NULL;
 
   if (LoadWords("program.cpp", stack) == false)
   {
      cerr << "file not open" << endl;
      system("pause");
      return 1;
   }
 
   cout << stack << endl;
 
   TNode* target = NULL;
 
   CopyWordWithLength(stack, target, 4);
 
   cout << endl << target << endl;
 
   system("pause");
 
   return 0;
}
Динамические структуры. Стек (помогите найти ошибку)

Бинарник + исходник: program.7z
ulian
0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 53
20.03.2013, 19:13  [ТС]     Динамические структуры. Стек (помогите найти ошибку) #3
спасибо большое, только один вопрос по коду - не могу сделать так что я бы я сам задавал имя файла с которым работаю - подскажите как сделать
ulian
0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 53
20.03.2013, 19:25  [ТС]     Динамические структуры. Стек (помогите найти ошибку) #4
то есть оно должно работать с текстом с файл, а когда я попробовал использовать .txt файл оно эррорит
Миниатюры
Динамические структуры. Стек (помогите найти ошибку)  
anmartex
...
 Аватар для anmartex
1700 / 1193 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
20.03.2013, 19:43     Динамические структуры. Стек (помогите найти ошибку) #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
int main()
{
   TNode* stack = NULL;
 
   cout << "input file name: ";
   string fname;
   cin >> fname;
 
   if (LoadWords(fname, stack) == false)
   {
      cerr << "file '" << fname << "' not open" << endl;
      system("pause");
      return 1;
   }
 
   cout << stack << endl;
 
   cout << endl << "input length words: ";
   size_t length;
   cin >> length;
 
   TNode* target = NULL;
   CopyWordWithLength(stack, target, length);
 
   cout << target << endl;
 
   system("pause");
 
   return 0;
}
Динамические структуры. Стек (помогите найти ошибку)

Бинарник + исходник: program.7z
anmartex
...
 Аватар для anmartex
1700 / 1193 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
20.03.2013, 20:01     Динамические структуры. Стек (помогите найти ошибку) #6
К сожалению у меня нет студии. А текстовый файл случайно не в UTF кодировке или не с русскими ли буквами? В данной программе используется функция isalpha, она распространяется только на 1 байтовый char и только на латинские символы. Явно срабатывает assert и как видите (unsigned)c+1<=256. Если нужна кириллица, то программу следует доработать.
ulian
0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 53
20.03.2013, 20:15  [ТС]     Динамические структуры. Стек (помогите найти ошибку) #7
нет-нет, содержание текстового файла случайный английский текст из просторов интернета. а эрорит даже с срр файлом
Вложения
Тип файла: txt in.txt (820 байт, 1 просмотров)
ulian
0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 53
21.03.2013, 02:12  [ТС]     Динамические структуры. Стек (помогите найти ошибку) #8
Вы сможете помочь с данной проблемой?

Добавлено через 4 часа 57 минут
Возможно кто-то может подсказать как устранить данную проблему?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.03.2013, 02:35     Динамические структуры. Стек (помогите найти ошибку) #9
Вот так сделайте со всеми функциями cctype:
C++
1
isalpha((unsigned char)(*text))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2013, 03:35     Динамические структуры. Стек (помогите найти ошибку)
Еще ссылки по теме:

Динамические структуры данных.Стек. Значение выражения в постфиксной форме C++
Найти ошибку в объявлении структуры C++
Помогите найти ошибку в задаче на структуры C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
anmartex
...
 Аватар для anmartex
1700 / 1193 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
21.03.2013, 03:35     Динамические структуры. Стек (помогите найти ошибку) #10
Цитата Сообщение от alsav22 Посмотреть сообщение
Вот так сделайте со всеми функциями cctype:
Да, точно, должно помочь.
Yandex
Объявления
21.03.2013, 03:35     Динамические структуры. Стек (помогите найти ошибку)
Ответ Создать тему
Опции темы

Текущее время: 15:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru