Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 53
1

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

20.03.2013, 00:29. Показов 718. Ответов 9
Метки нет (Все метки)

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

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

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");
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.03.2013, 00:29
Ответы с готовыми решениями:

Динамические структуры. Стек
Дан текстовый файл с изображением целых чисел, которые необходимо записать в список L1. Используя...

Динамические структуры данных.Стек.
Доброго времени суток. Нужна помощь в выполнении лабораторной работы Необходимо создать простую...

Структуры. Помогите найти ошибку в программе
3. Сведения об экзамене содержат следующие данные: дисциплину (программирование, социология,...

Помогите найти ошибку в задаче на структуры
Помогите , 1 ошибка в коде , код писал с книги . Буду очень благодарен за помощь. #include...

9
...
1802 / 1267 / 934
Регистрация: 12.02.2013
Сообщений: 2,058
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
1
0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 53
20.03.2013, 19:13  [ТС] 3
спасибо большое, только один вопрос по коду - не могу сделать так что я бы я сам задавал имя файла с которым работаю - подскажите как сделать
0
0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 53
20.03.2013, 19:25  [ТС] 4
то есть оно должно работать с текстом с файл, а когда я попробовал использовать .txt файл оно эррорит
Миниатюры
Динамические структуры. Стек (помогите найти ошибку)  
0
...
1802 / 1267 / 934
Регистрация: 12.02.2013
Сообщений: 2,058
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
0
...
1802 / 1267 / 934
Регистрация: 12.02.2013
Сообщений: 2,058
20.03.2013, 20:01 6
К сожалению у меня нет студии. А текстовый файл случайно не в UTF кодировке или не с русскими ли буквами? В данной программе используется функция isalpha, она распространяется только на 1 байтовый char и только на латинские символы. Явно срабатывает assert и как видите (unsigned)c+1<=256. Если нужна кириллица, то программу следует доработать.
1
0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 53
20.03.2013, 20:15  [ТС] 7
нет-нет, содержание текстового файла случайный английский текст из просторов интернета. а эрорит даже с срр файлом
Вложения
Тип файла: txt in.txt (820 байт, 2 просмотров)
0
0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 53
21.03.2013, 02:12  [ТС] 8
Вы сможете помочь с данной проблемой?

Добавлено через 4 часа 57 минут
Возможно кто-то может подсказать как устранить данную проблему?
0
5480 / 4875 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.03.2013, 02:35 9
Вот так сделайте со всеми функциями cctype:
C++
1
isalpha((unsigned char)(*text))
1
...
1802 / 1267 / 934
Регистрация: 12.02.2013
Сообщений: 2,058
21.03.2013, 03:35 10
Цитата Сообщение от alsav22 Посмотреть сообщение
Вот так сделайте со всеми функциями cctype:
Да, точно, должно помочь.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.03.2013, 03:35

Динамические структуры данных.Стек. Значение выражения в постфиксной форме
Пусть строка символов, введенная с клавиатуры, задает выражение, записанное в постфиксной форме...

Динамические структуры. В частности стек.
В динамических структурах оочень плохо разбираюсь, помогите. Вывести стек и если все элементы...

Динамические Структуры Данных Стек - Строку В Обратном Порядке
Имеется Предложение Состоящее Из Слов, Разделенных Пробелами. Используя Стек, Создать Предложение...

Динамические структуры данных: "Стек", объектно-ориентированный подход
Всем привет, помогите пожалуйста написать код в объектно-ориентированном подходе, СТЕК, введение...

Найти ошибку. Динамические массивы
Всем доброго времени суток! Прошу помочь найти ошибку в коде и разобраться с динамическими...

Стек (найти ошибку в коде)
Такая проблема: создаю стек, вычисляю количество елементов между минимальным и максималым, удаляю...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru