0 / 0 / 0
Регистрация: 11.01.2018
Сообщений: 8
1

Программа зацикливается при вводе некорректных данных

11.01.2018, 23:00. Показов 3612. Ответов 11

Доброго дня.
Уже искал по форуму, нашел много похожих тем, но предложенные там решения, в основном, не срабатывают. А код, предлагаемый заблокированным пользователем "-=ЮрА=-" проверять не только страшно, но еще и непонятно, как его встроить в мой.

Проблемный участок:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int k = 5;
while (k != 6)
{
    switch (k)
    {
        case 1: first = addNode(first); break;
        case 2: outNode(first); break;
        case 3: outNodeNum(first); break;
        case 4: first = deleteNode(first); break;
        case 5: Menu(); break;
        case 6: break;
        default: cout << "  ОШИБКА! Числа от 1 до 6.\n";
    }
    cout << "\nВведите нужный пункт: ";
    cin >> k;
}
getchar(); // пауза    
return 0;
Полный код программы:
Кликните здесь для просмотра всего текста
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
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
#include "stdafx.h"
#include <iostream>
#include <string>
#include <iomanip>
#include "windows.h"
using namespace std;
 
struct Node
{
    char point[20];    //- пункт назначения;
    int reis;        //- номер рейса;
    char name[12];    //- фамилия пассажира;
    char surname[12];    //- имя
    char patr[12];    //- отчество
    char date[12];  //- желаемая дата вылета;
    Node * next;    // указатель на структуру заявка.
};
 
void Menu();
Node *addNode(Node *first); // - добавление заявок в список;
Node *deleteNode(Node *first); // - удаление заявок по заданному номеру рейса
void outNode(Node *first); // - вывод всех заявок.
void outNodeNum(Node *first); // вывод одной заявки
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    //Node *first = new Node;
    //int n = 1;
    //cout << "-------Данные о заявке-------\n\n";
    //cout << "Введите пункт назначения > ";
    //cin >> first->point;
    //cout << "Введите номер рейса > ";
    //cin >> first->reis;
    //cout << "Введите фамилию пассажира > ";
    //cin >> first->name;
    //cout << "Введите имя пассажира > ";
    //cin >> first->surname;
    //cout << "Введите отчество пассажира > ";
    //cin >> first->patr;
    //cout << "Введите дату вылета > ";
    //cin >> first->date;
    //cout << "\n";
    //first->next = NULL;
 
    ////////////////////////////////////////////////////////
    Node *first = new Node;  first->reis = 1021;  strcpy_s(first->name, 20, "Шишов"); strcpy_s(first->surname, 20, "Иван");  strcpy_s(first->patr, 20, "Иванов"); strcpy_s(first->point, 20, "Москва"); strcpy_s(first->date, 20, "13.01.2018");
    Node *f1 = new Node;     f1->reis = 20;       strcpy_s(f1->name, 20, "Шишеков");  strcpy_s(f1->surname, 20, "Иван");     strcpy_s(f1->patr, 20, "Сергеевич"); strcpy_s(f1->point, 20, "Владивосток"); strcpy_s(f1->date, 20, "13.01.2018");
    Node *f2 = new Node;     f2->reis = 3010;     strcpy_s(f2->name, 20, "Иванов");   strcpy_s(f2->surname, 20, "Станислав"); strcpy_s(f2->patr, 20, "Вислоонов"); strcpy_s(f2->point, 20, "Пекин"); strcpy_s(f2->date, 20, "13.01.2018");
    Node *f3 = new Node;     f3->reis = 4201;     strcpy_s(f3->name, 20, "Шив");      strcpy_s(f3->surname, 20, "Николай");      strcpy_s(f3->patr, 20, "Викторович"); strcpy_s(f3->point, 20, "Берлин"); strcpy_s(f3->date, 20, "14.01.2018");
 
    first->next = f1;
    f1->next = f2;
    f2->next = f3;
    f3->next = NULL;
    ////////////////////////////////////////////////////////
    int k = 5;
    while (k != 6)
    {
        switch (k)
        {
            case 1: first = addNode(first); break;
            case 2: outNode(first); break;
            case 3: outNodeNum(first); break;
            case 4: first = deleteNode(first); break;
            case 5: Menu(); break;
            case 6: break;
            default: cout << "  ОШИБКА! Числа от 1 до 6.\n";
        }
        cout << "\nВведите нужный пункт: ";
        cin >> k;
    }
    getchar(); // пауза    
    return 0;
}
 
 
void Menu()
{
    system("cls");
    cout << "\n";
    cout << "1 - Добавить заявку\n";
    cout << "2 - Вывести все заявки\n";
    cout << "3 - Вывести заявку по номеру рейса и дате вылета\n";
    cout << "4 - Удалить заявку\n";
    cout << "5 - Очистить экран\n";
    cout << "6 - Выход\n";
}
 
Node *addNode(Node *first)
{
    cout << "______________________________________________\n";
    Node *pv = new Node;
    cout << "Данные о заявке: \n";
    cout << "Введите пункт назначения > ";
    cin >> pv->point;
    cout << "Введите номер рейса > ";
    cin >> pv->reis;
    cout << "Введите фамилию пассажира > ";
    cin >> pv->name;
    cout << "Введите имя пассажира > ";
    cin >> pv->surname;
    cout << "Введите отчество пассажира > ";
    cin >> pv->patr;
    cout << "Введите дату вылета > ";
    cin >> pv->date;
    cout << "\n";
    pv->next = NULL;
    cout << "______________________________________________\n";
    if (first == NULL)
    {
        first = pv;
    }
    else
    {
        Node *p = first;
        while (p->next != NULL)
        {
            p = p->next;
        }
        p->next = pv;
    }
    return first;
}
 
void outNode(Node *first)
{
    //Node *pv = first;
    //while (pv)
    //{
    //  cout << "\nДанные о заявке \n";
    //  cout << "\nПункт назначения > " << pv->point;
    //  cout << "\nНомер рейса > "; cout << pv->reis;
    //  cout << "\nФамилия пассажира > " << pv->name;
    //  cout << "\nИмя пассажира > " << pv->surname;
    //  cout << "\nОтчество пассажира > " << pv->patr;
    //  cout << "\nДата вылета > " << pv->date << "\n\n\n";
    //  pv = pv->next;
    //}
 
    cout << setiosflags(ios::right);
    cout << "_________________________________________________________________\n";
    cout << "Данные по заявкам:\n";
    cout << "       Пункт  Номер   -------- ДАННЫЕ ПАССАЖИРА -----        Дата\n";
    cout << "  назначения  рейса    Фамилия      Имя      Отчество      вылета\n";
    cout << " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n";
 
    Node *pv = first;
    while (pv)
    {
        cout << setw(12) << pv->point << setw(7) << pv->reis << setw(11) << pv->name;
        cout << setw(10) << pv->surname << setw(13) << pv->patr << setw(12) << pv->date << endl;
        pv = pv->next;
    }
    cout << "_________________________________________________________________\n";
}
 
void outNodeNum(Node *first)
{
    int num;
    string dat;
    Node *pv = first;
    cout << "Введите номер рейса: ";
    cin >> num;
    cout << "Введите дату: ";
    cin >> dat;
    int n = 1, fl = 0;
    while (pv)
    {
        if (pv->reis == num && pv->date == dat)
        {
            outNode(pv);
            break;
        }
        pv = pv->next;
    }
}
 
Node *deleteNode(Node *first)
{
    cout << "______________________________________________\n";
    cout << "Номер рейса, заявку по которому удалить: ";
    int num;
    cin >> num;
    Node *temp = first;
    int k = -1;
    int N = 0;
    while (temp)
    {
        if (temp->reis == num)
        {
            k = N;
        }
        temp = temp->next;
        N++;
    }
    N--;
    if (k != -1)
    {
        temp = first;
        // если нужно удалить 1-й узел и он единственный был в списке
        if (k == 0 && N == 0)
        {
            delete first;
            cout << "  Удаление прошло успешно!\n";
            cout << "______________________________________________\n";
            return NULL;
        }
        // если нужно удалить 1-й узел и он НЕ единственный в списке
        if (k == 0 && N > 0)
        {
            temp = temp->next;
            delete first;
            cout << "  Удаление прошло успешно!\n";
            cout << "______________________________________________\n";
            return temp;
        }
        // если нужно удалить узел где-то в середине списка, но не последнего
        Node *el = first;
        temp = first->next;
        while (temp->next)
        {
            if (temp->reis == num)
            {
                el->next = temp->next;
                delete temp;
                cout << "  Удаление прошло успешно!\n";
                cout << "______________________________________________\n";
                return first;
            }
            el = el->next;
            temp = temp->next;
        }
        // если нужно удалить последний узел
        el->next = NULL;
        delete temp;
        cout << "  Удаление прошло успешно!\n";
        cout << "______________________________________________\n";
        return first;
    }
    else
    {
        cout << "  Такого рейса нет или список пуст!\n";
        cout << "______________________________________________\n";
        return first;
    }
}


Есть одно решение, которое мне помогло:
C++
1
2
3
4
5
6
7
8
9
10
11
#define ignorecin std::cin.clear(); std::cin.sync(); std::cin.ignore(std::cin.rdbuf()->in_avail())
#define clearcin std::cin.clear(); std::cin.sync(); while(std::cin.get()!='\n');
 
...
 
if (!(cin >> k) || cin.get() != '\n')
{
    ignorecin;
    cout << "  ОШИБКА! Введите число от 1 до 6:\n";
}
else break;
Но при его применении, программа перестает "понимать" "правильные" символы, пока к ним не будет добавлен "неправильный".
Пример: Пишем "2" и нажимаем Enter. Вместо ввода и срабатывания соответствующей части, двойка остается висеть и идет переход на следующую строку. Если после этого ввести букву, то программа выдает сначала сообщение о неправильном вводе, а сразу под ним - запрошенные по "двойке" данные.

Заранее спасибо за помощь.

P.S. Я знаю, что код убогий и есть другие проблемы. Что делать, я только-только начал изучать Си - хотя бы с этим, для начала, разобраться.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.01.2018, 23:00
Ответы с готовыми решениями:

Зацикливание программы при вводе некорректных данных
Привет всем! Я совсем новенький в программировании на С++ (в школе чуток увлекался Бейсиком, но...

Обработку исключений при вводе некорректных данных
#include &lt;iostream&gt; #include &lt;signal.h&gt; using namespace std; class Student{public: string...

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

При вводе символа программа зацикливается
Я пытался создать программу, которая при вводе отрицательного или типа не int выводит ошибку и...

11
1750 / 1342 / 1407
Регистрация: 28.10.2016
Сообщений: 4,267
12.01.2018, 00:35 2
Можно для case попробовать использовать 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
#include "stdafx.h"
#include <iostream>
#include <ctype.h>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "rus");
    char k = '0';
    while (k != '4') {
        cout << "Число 1..4 (4 - Выход): ";
        cin >> k;
        switch (k)
        {
        case '1': cout << "Ввели 1\n"; break;
        case '2': cout << "Ввели 2\n"; break;
        case '3': cout << "Ввели 3\n"; break;
        case '4': break;
        default: cout << "Только числа 1..4!!!\n";
            break;
        }
    }
    cout << "Успешно вышли из CASE" << endl;
    system("pause");
    return 0;
}
1
20 / 20 / 6
Регистрация: 16.11.2017
Сообщений: 87
12.01.2018, 01:21 3
Дело в том, что при вводе целого числа система пытается прочитать из входного потока именно целое число. При удачном считывании из потока удаляется то, что прочиталось. А если вместо целого числа там что-то ещё (буква) то считывание не происходит, cin уходит в ошибку и из входного потока буква не удаляется. Соответственно следующий запуск "cin >> k" не срабатывает из-за взведенной ошибки. Но даже если эту ошибку сбросить, в буфере осталась буква от предыдущего ввода и все опять повторяется, поэтому нужно ещё и очищать буфер.

C++
1
2
3
4
5
6
7
8
9
10
        
int k = 5;
while (k != 6)
{
  cout << "\nВведите нужный пункт: ";
 
  cin >> k;
  cin.clear(); //сбрасываем ошибку
  cin.ignore(numeric_limits<streamsize>::max(), '\n'); //удаляем все из буфера до перевода строки
}
Такой код отработает верно даже если будете вводить буквы.


Вариант сделать тип вводимого числа char тоже решает проблему, т.к. тогда при вводе любого символа cin ввод будет считаться корректным и cin не выпадет в ошибку.
0
0 / 0 / 0
Регистрация: 11.01.2018
Сообщений: 8
12.01.2018, 11:33  [ТС] 4
Всем спасибо за неравнодушие.

Цитата Сообщение от pewit Посмотреть сообщение
Такой код отработает верно даже если будете вводить буквы.
Пока что выдает кучу ошибок.
Программа зацикливается при вводе некорректных данных

Возможно, не хватает в шапке ссылки на нужный файл:
C++
1
2
3
4
5
6
#include "stdafx.h"
#include <iostream>
#include <string>
#include <iomanip>
#include "windows.h"
using namespace std;
Когда пытаюсь использовать "char" вместо "int", то прога считает за ошибку ввод чего угодно. Взятие в кавычки цифр выдает кучу ошибок, но если взять в одинарные кавычки('), то как-то работает.
Сейчас попытаюсь сделать так, чтобы работало не "как-то", а нормально, и когда у меня не получится - отпишусь.
0
20 / 20 / 6
Регистрация: 16.11.2017
Сообщений: 87
12.01.2018, 11:53 5
Попробуйте
C++
1
#include <limits>
Добавлено через 1 минуту
Если вводите char, то конечно нужно сравнивать с цифрами в одинарных кавычках, то есть с символами, потому что код символа '1' не равен 1. В двойные кавычки берутся строки, что в данном случае не правильно. Внимательно посмотрите пример от Hitoku.
0
0 / 0 / 0
Регистрация: 11.01.2018
Сообщений: 8
12.01.2018, 12:30  [ТС] 6
Ура, товарищи! Меню заработало. Спасибо всем откликнувшимся.

Правда пытаясь действовать по аналогии, я пока не могу настроить то же самое для номера рейса.

E0042 несовместимые типы операндов ("char *" и "char")
C2446 ==: нет преобразования "int" в "char *"
Выдаются, в частности, на строчку:
C++
1
if (pv->reis == num && pv->date == dat)
Полный код переписанной программы:
Кликните здесь для просмотра всего текста
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
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
#include "stdafx.h"
#include <iostream>
#include <string>
#include <iomanip>
#include "windows.h"
using namespace std;
 
struct Node
{
    char point[20];    //- пункт назначения;
    char reis[8];        //- номер рейса;
    char name[12];    //- фамилия пассажира;
    char surname[12];   //- имя
    char patr[12];    //- отчество
    char date[12];  //- желаемая дата вылета;
    Node * next;    // указатель на структуру заявка.
};
 
void Menu();
Node *addNode(Node *first); // - добавление заявок в список;
Node *deleteNode(Node *first); // - удаление заявок по заданному номеру рейса
void outNode(Node *first); // - вывод всех заявок.
void outNodeNum(Node *first); // вывод одной заявки
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    //Node *first = new Node;
    //int n = 1;
    //cout << "-------Данные о заявке-------\n\n";
    //cout << "Введите пункт назначения > ";
    //cin >> first->point;
    //cout << "Введите номер рейса > ";
    //cin >> first->reis;
    //cout << "Введите фамилию пассажира > ";
    //cin >> first->name;
    //cout << "Введите имя пассажира > ";
    //cin >> first->surname;
    //cout << "Введите отчество пассажира > ";
    //cin >> first->patr;
    //cout << "Введите дату вылета > ";
    //cin >> first->date;
    //cout << "\n";
    //first->next = NULL;
 
    ////////////////////////////////////////////////////////
    Node *first = new Node;  strcpy_s(first->reis, 8, "1021");  strcpy_s(first->name, 20, "Шишов"); strcpy_s(first->surname, 20, "Иван");  strcpy_s(first->patr, 20, "Иванов"); strcpy_s(first->point, 20, "Москва"); strcpy_s(first->date, 20, "13.01.2018");
    Node *f1 = new Node;     strcpy_s(f1->reis, 8, "20");       strcpy_s(f1->name, 20, "Шишеков");  strcpy_s(f1->surname, 20, "Иван");     strcpy_s(f1->patr, 20, "Сергеевич"); strcpy_s(f1->point, 20, "Владивосток"); strcpy_s(f1->date, 20, "13.01.2018");
    Node *f2 = new Node;     strcpy_s(f2->reis, 8, "3010");     strcpy_s(f2->name, 20, "Иванов");   strcpy_s(f2->surname, 20, "Станислав"); strcpy_s(f2->patr, 20, "Вислоонов"); strcpy_s(f2->point, 20, "Пекин"); strcpy_s(f2->date, 20, "13.01.2018");
    Node *f3 = new Node;     strcpy_s(f3->reis, 8, "4201");     strcpy_s(f3->name, 20, "Шив");      strcpy_s(f3->surname, 20, "Николай");      strcpy_s(f3->patr, 20, "Викторович"); strcpy_s(f3->point, 20, "Берлин"); strcpy_s(f3->date, 20, "14.01.2018");
 
    first->next = f1;
    f1->next = f2;
    f2->next = f3;
    f3->next = NULL;
    ////////////////////////////////////////////////////////
    char k = '5';
    while (k != '6')
    {
        switch (k)
        {
            case '1': first = addNode(first); break;
            case '2': outNode(first); break;
            case '3': outNodeNum(first); break;
            case '4': first = deleteNode(first); break;
            case '5': Menu(); break;
            case '6': break;
            default: cout << "  ОШИБКА! Числа от 1 до 6.\n";
        }
        cout << "\nВведите нужный пункт: ";
        cin >> k;
    }
    getchar(); // пауза    
    return 0;
}
 
 
void Menu()
{
    system("cls");
    cout << "\n";
    cout << "1 - Добавить заявку\n";
    cout << "2 - Вывести все заявки\n";
    cout << "3 - Вывести заявку по номеру рейса и дате вылета\n";
    cout << "4 - Удалить заявку\n";
    cout << "5 - Очистить экран\n";
    cout << "6 - Выход\n";
}
 
Node *addNode(Node *first)
{
    cout << "______________________________________________\n";
    Node *pv = new Node;
    cout << "Данные о заявке: \n";
    cout << "Введите пункт назначения > ";
    cin >> pv->point;
    cout << "Введите номер рейса > ";
    cin >> pv->reis;
    cout << "Введите фамилию пассажира > ";
    cin >> pv->name;
    cout << "Введите имя пассажира > ";
    cin >> pv->surname;
    cout << "Введите отчество пассажира > ";
    cin >> pv->patr;
    cout << "Введите дату вылета > ";
    cin >> pv->date;
    cout << "\n";
    pv->next = NULL;
    cout << "______________________________________________\n";
    if (first == NULL)
    {
        first = pv;
    }
    else
    {
        Node *p = first;
        while (p->next != NULL)
        {
            p = p->next;
        }
        p->next = pv;
    }
    return first;
}
 
void outNode(Node *first)
{
    //Node *pv = first;
    //while (pv)
    //{
    //  cout << "\nДанные о заявке \n";
    //  cout << "\nПункт назначения > " << pv->point;
    //  cout << "\nНомер рейса > "; cout << pv->reis;
    //  cout << "\nФамилия пассажира > " << pv->name;
    //  cout << "\nИмя пассажира > " << pv->surname;
    //  cout << "\nОтчество пассажира > " << pv->patr;
    //  cout << "\nДата вылета > " << pv->date << "\n\n\n";
    //  pv = pv->next;
    //}
 
    cout << setiosflags(ios::right);
    cout << "_________________________________________________________________\n";
    cout << "Данные по заявкам:\n";
    cout << "       Пункт  Номер   -------- ДАННЫЕ ПАССАЖИРА -----        Дата\n";
    cout << "  назначения  рейса    Фамилия      Имя      Отчество      вылета\n";
    cout << " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n";
 
    Node *pv = first;
    while (pv)
    {
        cout << setw(12) << pv->point << setw(7) << pv->reis << setw(11) << pv->name;
        cout << setw(10) << pv->surname << setw(13) << pv->patr << setw(12) << pv->date << endl;
        pv = pv->next;
    }
    cout << "_________________________________________________________________\n";
}
 
void outNodeNum(Node *first)
{
    char num;
    string dat;
    Node *pv = first;
    cout << "Введите номер рейса: ";
    cin >> num;
    cout << "Введите дату: ";
    cin >> dat;
    int n = 1, fl = 0;
    while (pv)
    {
        if (pv->reis == num && pv->date == dat)
        {
            outNode(pv);
            break;
        }
        pv = pv->next;
    }
}
 
Node *deleteNode(Node *first)
{
    cout << "______________________________________________\n";
    cout << "Номер рейса, заявку по которому удалить: ";
    char num;
    cin >> num;
    Node *temp = first;
    char k = '-1';
    int N = 0;
    while (temp)
    {
        if (temp->reis == num)
        {
            k = N;
        }
        temp = temp->next;
        N++;
    }
    N--;
    if (k != '-1')
    {
        temp = first;
        // если нужно удалить 1-й узел и он единственный был в списке
        if (k == '0' && N == 0)
        {
            delete first;
            cout << "  Удаление прошло успешно!\n";
            cout << "______________________________________________\n";
            return NULL;
        }
        // если нужно удалить 1-й узел и он НЕ единственный в списке
        if (k == '0' && N > 0)
        {
            temp = temp->next;
            delete first;
            cout << "  Удаление прошло успешно!\n";
            cout << "______________________________________________\n";
            return temp;
        }
        // если нужно удалить узел где-то в середине списка, но не последнего
        Node *el = first;
        temp = first->next;
        while (temp->next)
        {
            if (temp->reis == num)
            {
                el->next = temp->next;
                delete temp;
                cout << "  Удаление прошло успешно!\n";
                cout << "______________________________________________\n";
                return first;
            }
            el = el->next;
            temp = temp->next;
        }
        // если нужно удалить последний узел
        el->next = NULL;
        delete temp;
        cout << "  Удаление прошло успешно!\n";
        cout << "______________________________________________\n";
        return first;
    }
    else
    {
        cout << "  Такого рейса нет или список пуст!\n";
        cout << "______________________________________________\n";
        return first;
    }
}
0
1750 / 1342 / 1407
Регистрация: 28.10.2016
Сообщений: 4,267
12.01.2018, 12:34 7
Цитата Сообщение от SadStudent Посмотреть сообщение
E0042 несовместимые типы операндов ("char *" и "char")
Вы пытаетесь сравнить массив символов с символом. Неудивительно, что ругается. Похожая ситуация, я подозреваю, со второй ошибкой
0
0 / 0 / 0
Регистрация: 11.01.2018
Сообщений: 8
12.01.2018, 14:10  [ТС] 8
Откатился к предыдущей версии для проверки: "#include <limits>" не помогает.
А жаль.

Добавлено через 15 минут
Цитата Сообщение от Hitoku Посмотреть сообщение
Вы пытаетесь сравнить массив символов с символом
Угу. Просто без этого возникает проблема в другом месте.
Сначала все было вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct Node
{
    char point[20];    //- пункт назначения;
    char reis;        //- номер рейса;
    char name[12];    //- фамилия пассажира;
    char surname[12];   //- имя
    char patr[12];    //- отчество
    char date[12];  //- желаемая дата вылета;
    Node * next;    // указатель на структуру заявка.
};
...
Node *first = new Node;  first->reis = '1021'; ...
Отображается только последний символ.

Я попробовал это исправить и сделал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct Node
{
    char point[20];    //- пункт назначения;
    char reis[8];        //- номер рейса;
    char name[12];    //- фамилия пассажира;
    char surname[12];   //- имя
    char patr[12];    //- отчество
    char date[12];  //- желаемая дата вылета;
    Node * next;    // указатель на структуру заявка.
};
...
Node *first = new Node;  strcpy_s(first->reis, 8, "1021");
Теперь все вообще отказывается работать...

Добавлено через 1 час 14 минут
В общем, в итоге я, временно, смирился с тем, что номер рейса должен быть из одной цифры.
Всем спасибо за помощь.
0
20 / 20 / 6
Регистрация: 16.11.2017
Сообщений: 87
12.01.2018, 14:50 9
Проверил, всё работает

Visual Studio 2017
Файл - создать - проект - Visual C++ - Классическое приложение Windows - Консольное приложение Windows
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    int k = 5;
    while (k != 6)
    {
        cout << "\nВведите нужный пункт: ";
 
        cin >> k;
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }
    
    return 0;
}
0
0 / 0 / 0
Регистрация: 11.01.2018
Сообщений: 8
13.01.2018, 21:55  [ТС] 10
Цитата Сообщение от pewit Посмотреть сообщение
Проверил, всё работает
Проверил Ваш код - да, никаких ошибок не выдает.
Почему-то при попытке вставить в мой - подчеркивает "мах" и говорит "E0040 требуется идентификатор".
It's magic?

У меня, к слову, та же VS17
0
20 / 20 / 6
Регистрация: 16.11.2017
Сообщений: 87
13.01.2018, 22:47 11
Всё просто, на выбор:

Вариант 1 правильный - уберите не нужный
C++
1
#include "windows.h"
потому что он подключает
C++
1
#define max(a,b)            (((a) > (b)) ? (a) : (b))
Можете нажать Ctrl+клик на max() и увидите это сами. Соответственно компилятор учитывает этот define, просит для max() 2 аргумента и ругается.

Вариант 2 сомнительный
C++
1
#undef max
Вариант 3 альтернативный
вместо
C++
1
cin.ignore(numeric_limits<streamsize>::max(), '\n');
пишем
C++
1
2
string ss;
getline(cin,ss);
То есть после сброса ошибки считываем всю оставшуюся в буфере строку в новую переменную.
1
0 / 0 / 0
Регистрация: 11.01.2018
Сообщений: 8
14.01.2018, 11:33  [ТС] 12
Цитата Сообщение от pewit Посмотреть сообщение
Всё просто, на выбор:
Ого. Спасибо, буду пробовать.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.01.2018, 11:33
Помогаю со студенческими работами здесь

При вводе в переменную нетипичного ей символа программа зацикливается
Проблема в том, что если ввести в программу символ отличный от цифры то программа зацикливается, а...

При вводе слишком большого числа программа зацикливается
При вводе слишком большого числа идет зацикливание(вроде так)помогите исправить #include...

Зацикливается программа при вводе буквы, которую уже вводили
Всем привет! Подскажите, пожалуйста, почему при вводе буквы, которую уже вводил, игра зацикливается...

Задание на ряды: программа зацикливается при вводе некоторых значений
Здравствуйте, решал вузовское задание &quot;на дом&quot;. Написал код. Однако при вводе некоторых значений...


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

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

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