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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ulian
0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 53
#1

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

20.03.2013, 00:29. Просмотров 511. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.03.2013, 00:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Динамические структуры. Стек (помогите найти ошибку) (C++):

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

Помогите найти ошибку в задаче на структуры - C++
Помогите , 1 ошибка в коде , код писал с книги . Буду очень благодарен за помощь. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; ...

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

Динамические структуры данных.Стек. Значение выражения в постфиксной форме - C++
Пусть строка символов, введенная с клавиатуры, задает выражение, записанное в постфиксной форме (например, 6523+8*+3+*). В выражении...

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

Найти ошибку. Динамические массивы - C++
Всем доброго времени суток! Прошу помочь найти ошибку в коде и разобраться с динамическими массивами =) Текст задания: Строка...

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

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

Динамические структуры данных. Программа ввода в структуры и вывода информации из неё. - C++
Автоматизированная информационная система на железнодорожном вокзале содержит сведения об отправлении поездов дальнего следования. Для...

Найти ошибку в объявлении структуры - C++
Здравствуйте!Задание найти ошибку в к следующем коде в строке 1,2,3 или 4. Мне кажется все верно, разве нет? #include &lt;stdio.h&gt; ...

С++ структуры (не могу найти ошибку) - C++
Нужно ввести кол-во спортсменов и их средний балл, затем установить пропускной балл в финал соревнований и вывести на экран спортсменов...

Помогите найти ошибку: По двум сторонам и углу найти все остальное - C++
Доброго времени суток. В универе дали задание написать программу &quot;По двум сторонам и углу между ними в треугольнике АВС найти два остальных...


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

Или воспользуйтесь поиском по форуму:
10
Yandex
Объявления
21.03.2013, 03:35
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru