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

Объяснить почему программа уходит в бесконечный цикл (связные списки) - C++

Восстановить пароль Регистрация
 
mercurygermes
1 / 1 / 0
Регистрация: 26.09.2015
Сообщений: 179
27.12.2015, 16:19     Объяснить почему программа уходит в бесконечный цикл (связные списки) #1
Всем привет.
Собрал связанный список, он работает, но при вводе типа char, программа уходит в бесконечный цикл.
Без данного типа данных, функционирует нормально.

Вот основной код:

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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
#include <iostream>
#include <random>
#include <time.h>
#include <string.h>
#include "связанный список.h"
using namespace std;
typedef unsigned short USHORT;
int main()
{
    setlocale (LC_ALL, "rus");
    //srand (time(NULL));
    USHORT weght, price;
    char name [40];
    LinkedList List;
    Cargo * pCargo;
    for ( ; ; ){
        cout << " Если Вес равен нулю, Вод прекратиться!Введите вес. : ";
        cin >> weght;
        cout << endl;
        if (!weght)
            break;
        cout << "Введите цену: ";
        cin >> price;
        cout << endl;
        cout << "Введите название продукта: ";
        pCargo = new Cargo(weght, price);
        cin.get(name, 39);
        pCargo->SetName(name);
 
        List.Insert(pCargo);
 
    }
    system("cls");
    List.ShowAll();
 
    system("pause");
    return 0;
}
 
 
вод заголовочный файл:
using namespace std;
typedef unsigned short USHORT;
enum {SMALLER, LARGER, SAME};
 
class Cargo
{
public:
    Cargo(USHORT weight, USHORT price);
    ~Cargo(){}
    USHORT Compare(const Cargo & lTheCargo);
    void SetName(char n[40]){ strcpy(name,n); }
    
    void Show()
    {    
        cout << "название продукта: " << name;
        cout << "\tВес груза: \t" << Weight << "   "; 
        cout << "\tЦена груза: \t" << Price << endl;
        
    }
private:
    USHORT Weight;
    USHORT Price;
    char name[40];
};
Cargo::Cargo (USHORT weight, USHORT price) : Weight(weight) , Price (price)
{
 
}
USHORT Cargo::Compare (const Cargo & lTheCargo)
{
    if (Weight < lTheCargo.Weight)
        return SMALLER;
 
    else if (Weight > lTheCargo.Weight)
        return LARGER;
 
    else
        return SAME;
}
 
class Node;
class HeadNode;
class InternalNode;
class TailNode;
 
class Node
 {
public :
    Node ( ) { }
    virtual ~Node() { }
    virtual Node * pInsert(Cargo * pTheCargo) = 0;
    virtual void Show() = 0;
private:
};
 
class InternalNode  :  public Node
 {
public :
    InternalNode(Cargo * pTheCargo, Node * pnext ) ;
    ~InternalNode(){ delete pMyNext; pMyCargo; }
    virtual Node * pInsert(Cargo * pTheCargo) ;
    virtual void Show(){ pMyCargo->Show( ) ; pMyNext->Show () ; }
 
private:
    Cargo * pMyCargo;
    Node * pMyNext;
};
InternalNode::InternalNode(Cargo * pTheCargo, Node * pnext) : pMyCargo(pTheCargo) , pMyNext(pnext)
{
 
}
Node * InternalNode::pInsert(Cargo * pTheCargo)
{
    USHORT result = pMyCargo->Compare(*pTheCargo ) ;
    switch (result)
    {
    case SAME:
    case SMALLER:
    {
                   InternalNode * CargoNode = new InternalNode(pTheCargo, this ) ;
                   return CargoNode;
    }
    case LARGER:
        pMyNext = pMyNext->pInsert(pTheCargo ) ;
        return this;
    }
    return this;
}
 
class TailNode : public Node
{
public:
    TailNode(){}
    ~TailNode(){}
    virtual Node * pInsert(Cargo * pTheCargo) ;
    void Show(){}
private:
};
 
Node * TailNode::pInsert(Cargo * pTheCargo)
{
    InternalNode * CargoNode = new InternalNode(pTheCargo, this ) ;
    return CargoNode;
}
 
class HeadNode : public Node
{
public:
    HeadNode();
    ~HeadNode(){ delete pMyNext; }
    Node * pInsert(Cargo * pTheCargo ) ;
    void Show(){ pMyNext->Show( ) ; }
private:
    Node * pMyNext;
};
 
 HeadNode::HeadNode()
{
    pMyNext = new TailNode;
}
 Node * HeadNode::pInsert(Cargo * pTheCargo)
 {
     pMyNext = pMyNext->pInsert(pTheCargo ) ;
     return this;
 }
 
 class LinkedList
 {
 public:
     LinkedList();
     ~LinkedList(){ delete pMyHead; }
     void Insert(Cargo * pCargo);
     void ShowAll(){ pMyHead->Show( ) ; }
 private:
     HeadNode * pMyHead;
 };
 LinkedList::LinkedList()
 {
     pMyHead = new HeadNode;
 }
 
 void LinkedList::Insert(Cargo * pCargo)
 {
     pMyHead->pInsert(pCargo) ;
 }
Также буду очень рад, если вы оцените мой уровень по коду и скажите, соответствует ли мои знания уровню junior.
Код взят с книги Джесс Либерти, но я его немого изменил и подстроил под себя. Весь синтаксис данного кода понимаю на уровне книги.
Заранее большое спасибо за понимание и помощь.

 Комментарий модератора 

mercurygermes, , пожалуйста, прочитайте правила форума и постарайтесь впредь их соблюдать:
П. 4.3. Создавайте темы с осмысленными и понятными названиями - это серьезно повышает шансы, что на Ваш вопрос ответят.
П. 4.9. Используйте тэги форматирования текста для удобства восприятия ваших сообщений другими пользователями.


Добавлено через 1 час 30 минут
краткое описание данного кода.
код должен принимать данные о весе и цене продукта, а также название продукта.
после завершения вписывание названий и характеристик продукта, программа должна вывести на экран
список продукта по убыванию.
пример.
мясо
вес 30
цена 400.

проблемма именно с водом имени. когда я в данные вожу тип переменной char, то программа начинает глючить.
после вода веса и цены, программа отображает бесконечное количество раз, прозбу вода веса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nord_v
227 / 176 / 69
Регистрация: 22.08.2013
Сообщений: 723
27.12.2015, 21:29     Объяснить почему программа уходит в бесконечный цикл (связные списки) #2
Цитата Сообщение от mercurygermes Посмотреть сообщение
пример.
мясо
вес 30
цена 400.
Это к чему пример? У тебя в коде сначала вес вводится, потом цена, а потом название.
Цитата Сообщение от mercurygermes Посмотреть сообщение
проблемма именно с водом имени. когда я в данные вожу тип переменной char
Здесь вводишь, или где?
Цитата Сообщение от mercurygermes Посмотреть сообщение
C++
1
cin.get(name, 39);
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 1
27.12.2015, 21:33     Объяснить почему программа уходит в бесконечный цикл (связные списки) #3
Цитата Сообщение от mercurygermes Посмотреть сообщение
cin >> price;
....
cin.get(name, 39);
Избитая ошибка
Распространенные ошибки
mercurygermes
1 / 1 / 0
Регистрация: 26.09.2015
Сообщений: 179
27.12.2015, 22:27  [ТС]     Объяснить почему программа уходит в бесконечный цикл (связные списки) #4
да именно здесь, а get использую как ограничение символов.

Добавлено через 38 минут
почему именно cin.get(name, 39); происходит ошибка?
nord_v
227 / 176 / 69
Регистрация: 22.08.2013
Сообщений: 723
27.12.2015, 22:46     Объяснить почему программа уходит в бесконечный цикл (связные списки) #5
Цитата Сообщение от mercurygermes Посмотреть сообщение
cin >> price;
Вот так сделай:
C++
1
(cin >> price).get();
Добавлено через 1 минуту
И не нужно в cin.get() писать 39, пиши 40, функция сама будет читать на один символ меньше от 40.
mercurygermes
1 / 1 / 0
Регистрация: 26.09.2015
Сообщений: 179
27.12.2015, 22:51  [ТС]     Объяснить почему программа уходит в бесконечный цикл (связные списки) #6
спасибо этот код char name[40]; cin.get(name,38);
сделать так (cin>>name).get();

если не сложно можешь обяснить почему мой вариант не сработал. я свой код взял с книги. я хочу понять суть моей ошибки и в чем ошибка была

Добавлено через 2 минуты
и как в таком коде вести ограничения на вод символов
nord_v
227 / 176 / 69
Регистрация: 22.08.2013
Сообщений: 723
27.12.2015, 23:15     Объяснить почему программа уходит в бесконечный цикл (связные списки) #7
Цитата Сообщение от mercurygermes Посмотреть сообщение
сделать так (cin>>name).get();
Где я это писал? Я это писал:
Цитата Сообщение от nord_v Посмотреть сообщение
(cin >> price).get();
То есть, в последнем вводе (который делается через cin >>) перед cin.get(name, 40), нужно так сделать (убрать '\n' из потока ввода).

Добавлено через 1 минуту
Цитата Сообщение от mercurygermes Посмотреть сообщение
я свой код взял с книги
Сомневаюсь, что ты его правильно перенёс.

Добавлено через 3 минуты
Ты пишешь непонятно что. На вопрос ответь:
Цитата Сообщение от nord_v Посмотреть сообщение
Сообщение от mercurygermes
пример.
мясо
вес 30
цена 400.
Это к чему пример? У тебя в коде сначала вес вводится, потом цена, а потом название.
Добавлено через 19 минут
Цитата Сообщение от mercurygermes Посмотреть сообщение
и как в таком коде вести ограничения на вод символов
О каком ограничении речь? Пиши яснее.
mercurygermes
1 / 1 / 0
Регистрация: 26.09.2015
Сообщений: 179
28.12.2015, 00:05  [ТС]     Объяснить почему программа уходит в бесконечный цикл (связные списки) #8
ограничить количество символов при воде cin>>name;
к примеру если массив name[40];
то мы же должны ограничить вод не больше 39 символов.
я в книге джесса либерти используется такой код. cin.(name,39);
где 39 это ограничение

Добавлено через 27 минут
nord_v,
То есть, в последнем вводе (который делается через cin >>) перед cin.get(name, 40), нужно так сделать (убрать '\n' из потока ввода).

я весь код переискал и не нашел '\n' у себя, где у меня нужно убрать этот символ

Добавлено через 12 минут
если можно, посоветуй одну книгу где все мельчайшие детали С++ будут расписанны и разжеваны по полочкам.
желательно и с STL. Я изучаю по книге Джесса Либерти. програмирование за 21. учу около 4 месяцев и только до главы 13 день дошел. я не ставлю цель выучить програмирование за один день и готов этому посвятить столько времени сколько понадобиться. буду рад, если даш полноценную книгу, которая полностью будет описана на понятном языке как у джеса либерти и охватит все нюансы.
П.С.
цель: Научиться писать мини инди игры на с++, для операционной системы андроид или мобильного виндовс.
чтобы через год или максимум два года смог написать простые игры. примерные игры это pac man или змейка.
не просто скопировать код, а полное глубокое понимание кода с ее деталями
nord_v
227 / 176 / 69
Регистрация: 22.08.2013
Сообщений: 723
28.12.2015, 00:22     Объяснить почему программа уходит в бесконечный цикл (связные списки) #9
Цитата Сообщение от mercurygermes Посмотреть сообщение
я весь код переискал и не нашел '\n' у себя, где у меня нужно убрать этот символ
Когда нажимаешь Enter (при вводе через cin >>), в поток ввода помещается '\n', т.е., всё что до '\n' читается в переменную price, а '\n' остаётся в очереди ввода первым. cin.get(neme, 40) читает первый символ в очереди ввода ('\n'), для неё это пустая строка, в потоке ввода устанавливается флаг ошибки (поток ввода становится нерабочим), в name помещается '\0', '\n' остаётся в очереди ввода.
Вот такая конструкция, убирает '\n' из очереди ввода, перед работой cin.get(name, 40):
Цитата Сообщение от nord_v Посмотреть сообщение
C++
1
(cin >> price).get();
mercurygermes
1 / 1 / 0
Регистрация: 26.09.2015
Сообщений: 179
28.12.2015, 00:31  [ТС]     Объяснить почему программа уходит в бесконечный цикл (связные списки) #10
nord_v,

большое спасибо за помощь.
теперь все заработало.
реально спасибо. ты потратил свое ценное время, на обучение меня, хотя мог посмотреть какой нибудь фильм. спасибо.
посоветуй мне книгу какую нибудь. чтобы там все было подробно написанно и обяснянно. с++11
на руском я не нашел.
nord_v
227 / 176 / 69
Регистрация: 22.08.2013
Сообщений: 723
28.12.2015, 00:35     Объяснить почему программа уходит в бесконечный цикл (связные списки) #11
Цитата Сообщение от mercurygermes Посмотреть сообщение
Я изучаю по книге Джесса Либерти. програмирование за 21
Не очень удачный выбор.
Цитата Сообщение от mercurygermes Посмотреть сообщение
если можно, посоветуй одну книгу где все мельчайшие детали С++ будут расписанны и разжеваны по полочкам.
Навряд ли найдёшь такую, чтобы уж всё по полочкам.
Есть популярные:
Прата "Язык Программирования C++", Липман "Язык программирования С++. Вводный курс", Липман "Язык программирования C++. Базовый курс", Харви М. Дейтел, Пол Дж. Дейтел "Как программировать на C++"
Список литературы есть здесь: Литература C++
Можешь в поиске по форму набрать: литература для начинающего (или что-то подобное) и почитать разные мнения на этот счёт.
mercurygermes
1 / 1 / 0
Регистрация: 26.09.2015
Сообщений: 179
28.12.2015, 00:58  [ТС]     Объяснить почему программа уходит в бесконечный цикл (связные списки) #12
спасибо большое, а ты по какой книге сам учился? и если не секрет, то сколько времени потратил на обучение.
что нужно знать, чтобы писать мини игры на с++ для анодроид и мобильный виндовс.
я сам предполагаю, что нужно знать с++, stl tнаверно opengl, может еще QT хотя даже понятия не имею что это qt
есть ли книги где учат писать игры
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.12.2015, 01:11     Объяснить почему программа уходит в бесконечный цикл (связные списки)
Еще ссылки по теме:

C++ Некорректно работает программа. Бесконечный цикл
C++ Объяснить, почему не работает цикл
C++ Объяснить почему при заполнении матрицы программа уходит в бесконечный цикл

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

Или воспользуйтесь поиском по форуму:
nord_v
227 / 176 / 69
Регистрация: 22.08.2013
Сообщений: 723
28.12.2015, 01:11     Объяснить почему программа уходит в бесконечный цикл (связные списки) #13
Цитата Сообщение от mercurygermes Посмотреть сообщение
спасибо большое, а ты по какой книге сам учился?
Сначала по Прата, потом по разным другим.
Цитата Сообщение от mercurygermes Посмотреть сообщение
если не секрет, то сколько времени потратил на обучение.
Я и сейчас учусь, процесс бесконечен, тем более, пока учишься и язык меняется, опять учиться.

Добавлено через 1 минуту
Цитата Сообщение от mercurygermes Посмотреть сообщение
что нужно знать, чтобы писать мини игры на с++ для анодроид и мобильный виндовс.
я сам предполагаю, что нужно знать с++, stl tнаверно opengl, может еще QT хотя даже понятия не имею что это qt
есть ли книги где учат писать игры
Такие вопросы лучше там задавать: http://www.cyberforum.ru/graphics/

Добавлено через 5 минут
Цитата Сообщение от mercurygermes Посмотреть сообщение
с++11
на руском я не нашел.
Есть сайт на русском, там есть С++11, хотя перевод не очень: http://ru.cppreference.com/w/
Yandex
Объявления
28.12.2015, 01:11     Объяснить почему программа уходит в бесконечный цикл (связные списки)
Ответ Создать тему
Опции темы

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