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

Меню в программе - бесконечный loop - C++

Восстановить пароль Регистрация
 
Pseudodog
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 18
22.11.2014, 15:16     Меню в программе - бесконечный loop #1
Доброго всем дня. Разными способами пытаюсь сделать меню в программе. Если делать через switch, то всё нормально ровно до тех пор, пока не вводишь левое значение. Do while запускают бесконечный цикл вывода текста на экран шо аж программу прикрывать приходится. for( ;; ) тот же результат, даже хуже - введя правильное значение всё равно в меню остаёшься, а не идёшь реализовывать функции. goto тоже самое - бесконечный луп меню со скорость вывода нескольких сотен за секунду на экран.

1) Как сделать защиту от дурака, чтобы возвращало в начало меню и не запускало цикл бесконечно при вводе неверного значения?
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
extern void option1();
extern void option2();
extern void option3();
extern void option4();
extern void option5();
 
 
void Menu()
 
{
 
int choice;
 
do
{
std::wcout << L"\t\t***LOGO***\n";
std::wcout << L"\n";
std::wcout << L"\t1 - Меню 1\n";
std::wcout << L"\t2 - Меню 2\n";
std::wcout << L"\t3 - Меню 3\n";
std::wcout << L"\t4 - Меню 4\n";
std::wcout << L"\t5 - Меню 5\n";
std::wcout << L"\n";
 
std::wcout << L"Введите пункт меню: ";
std::wcin >> choice;
 
switch (choice)
 
{
case 1:
option1();
break;
 
case 2:
option2();
break;
 
case 3:
option3();
break;
 
case 4:
option4();
break;
 
case 5:
option5();
break;
 
}
 
}
 
while ((choice <1) || (choice > 5));
 
}
Более ли менее работающий код, который идёт дальше, если всё ввёл правильно. Но стоит вести букву какую, то всё плохо. По нескольку раз пробовал всё местами переставлять и т.д. С if else тоже не работает.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
demmax2004
57 / 135 / 35
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
22.11.2014, 15:43     Меню в программе - бесконечный loop #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
extern void option1();
extern void option2();
extern void option3();
extern void option4();
extern void option5();
 
 
void Menu()
 
{
 
int choice;
 
do
{
std::wcout << L"\t\t***LOGO***\n";
std::wcout << L"\n";
std::wcout << L"\t1 - Меню 1\n";
std::wcout << L"\t2 - Меню 2\n";
std::wcout << L"\t3 - Меню 3\n";
std::wcout << L"\t4 - Меню 4\n";
std::wcout << L"\t5 - Меню 5\n";
std::wcout << L"\n";
 
std::wcout << L"Введите пункт меню: ";
nachalo:
std::wcin >> choice;
 
switch (choice)
 
{
case 1:
option1();
break;
 
case 2:
option2();
break;
 
case 3:
option3();
break;
 
case 4:
option4();
break;
 
case 5:
option5();
break;
default: goto nachalo; 
}
 
}
 
 
}
Pseudodog
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 18
22.11.2014, 15:47  [ТС]     Меню в программе - бесконечный loop #3
demmax2004, нет. В таком виде надо удалить do. Но это бог с ним. Удалил. Если сделать через goto, то программа никуда дальше не двигается. Просто мигает значок нижнего подчёркивания и всё.
demmax2004
57 / 135 / 35
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
22.11.2014, 15:53     Меню в программе - бесконечный loop #4
Да не может такого быть
Takeshi80
 Аватар для Takeshi80
17 / 15 / 2
Регистрация: 08.03.2012
Сообщений: 124
22.11.2014, 17:17     Меню в программе - бесконечный loop #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
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
#include <iostream>
extern void option1();
extern void option2();
extern void option3();
extern void option4();
extern void option5();
 
 
void Menu()
 
{
 
    int choice=1;
 
    while (choice!=0)
    {
        std::wcout << L"\t\t***LOGO***\n";
        std::wcout << L"\n";
        std::wcout << L"\t1 - Меню 1\n";
        std::wcout << L"\t2 - Меню 2\n";
        std::wcout << L"\t3 - Меню 3\n";
        std::wcout << L"\t4 - Меню 4\n";
        std::wcout << L"\t5 - Меню 5\n";
        std::wcout << L"\t0 - Exit\n";
        std::wcout << L"\n";
 
        std::wcout << L"Введите пункт меню: ";
        std::wcin >> choice;
 
        switch (choice)
 
        {
        case 1:
            option1();
            break;
 
        case 2:
            option2();
            break;
 
        case 3:
            option3();
            break;
 
        case 4:
            option4();
            break;
 
        case 5:
            option5();
            break;
        case 0:
            break;
        default:
            std::wcout << L"Вы выбрали несуществующий пункт меню!";
            break;
 
        }
 
    }
 
}
Pseudodog
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 18
23.11.2014, 12:05  [ТС]     Меню в программе - бесконечный loop #6
demmax2004, но это так. Специально скомпилировал без лишних левых включенных функций в голом main() и программа считайте прекращает работу после неверного введённого числа, т.е. просто мигает нижняя подчёркнутая чёрточка. Если перед goto nachalo вставить cout с каким-нить текстом, то прогу заклинит и он будет выводиться по несколько штук за секунду пока не закроешь программу. К тому же goto не выход, т.к. у меня в программе планируется переключение между функциями назад-вперёд по выбору пользователя и goto тут никак не спасёт.
Takeshi80, спасибо, но ваш вариант так же не работает и его я уже находил в интернете, но увы. Программа опять же бесконечно и очень быстро просто выводит текст меню сообщение за сообщением. И разумеется я подключил все необходимые стандартные библиотеки, спасибо что подметили =)

работаю в VS 2010 под win8.

Добавлено через 8 минут
Чтоб всем проще было:

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
#include <iostream>
#include <locale>
 
void option1()
{
std::wcout << L"лалал";
}
 
void option2()
{
std::wcout << L"лалал";
}
 
void option3()
{
std::wcout << L"лалал";
}
 
void option4()
{
std::wcout << L"лалал";
}
 
void option5()
{
std::wcout << L"лалал";
}
 
 
int main()
 
{
 
setlocale(LC_CTYPE, ".866");
 
int choice=1;
 
    while (choice!=0)
    {
std::wcout << L"\t\t***LOGO***\n";
std::wcout << L"\n";
std::wcout << L"\t1 - Меню 1\n";
std::wcout << L"\t2 - Меню 2\n";
std::wcout << L"\t3 - Меню 3\n";
std::wcout << L"\t4 - Меню 4\n";
std::wcout << L"\t5 - Меню 5\n";
std::wcout << L"\n";
 
std::wcout << L"Введите пункт меню: ";
std::wcin >> choice;
 
switch (choice)
 
{
case 1:
option1();
break;
 
case 2:
option2();
break;
 
case 3:
option3();
break;
 
case 4:
option4();
break;
 
case 5:
option5();
break;
default: std::wcout << L"Вы выбрали несуществующий пункт меню!";
            break;
 
}
}
}
Добавлено через 16 часов 16 минут
Всё ещё актуально =)
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2908 / 1444 / 397
Регистрация: 18.10.2014
Сообщений: 2,662
23.11.2014, 12:24     Меню в программе - бесконечный loop #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Основная проблема этой программы - не в организации цикла, а в том, что она пытается читать из входного потока число. Если во входном потоке сидит что-то нечисловое, то чтение числа будет прекращено. "Нечисловые" символы останутся в потоке непрочитанными. В следующий раз, когда вы снова попытаетесь выполнить чтение числа, во входном потоке по прежнему будут сидеть те же самые непрочитанные "нечисловые" символы и чтение числа снова будет прекращено неудачно. Так будет продолжаться до бесконечности.

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

Чтоб решить проблему, надо либо чистить входной поток после неудачного чтения, либо не пытаться читать сразу число вообще. Лучше читайте из входного потока строку, а потом уже самостоятельно переводите ее в число.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2014, 13:26     Меню в программе - бесконечный loop
Еще ссылки по теме:

Организация меню в программе C++
нужно составить меню к программе C++
C++ Отправка параметров программе из контекстного меню проводника

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

Или воспользуйтесь поиском по форуму:
Pseudodog
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 18
23.11.2014, 13:26  [ТС]     Меню в программе - бесконечный loop #8
TheCalligrapher, вот об этом я и думал, спасибо! Примерно и представлял, что если вбить абракадабру, то переменной навсегда присвоится левое число и цикл заклинит. Я пока понятия не имею как читать строку, т.к. не дочитал ещё. Значит, таким образом не организовать цикл?

Добавлено через 57 минут
вот такое решение по очистке подсказали.
int menu()
{
int choice;
do
{
std::wcout << L"\t\t***LOGO***\n\n";
std::wcout << L"\t1 - Меню 1\n";
...
std::wcout << L"\t5 - Меню 5\n";
std::wcout << L"\nВведите пункт меню: ";
std::wcin >> choice;
if( std::wcin.fail() ) // The program clears the fail bit and strips the invalid character from the stream to proceed.
{
std::wcin.clear();
wchar_t c;
std::wcin >> c;
}
}while( choice<1 || choice>5 );
return choice;
}
Yandex
Объявления
23.11.2014, 13:26     Меню в программе - бесконечный loop
Ответ Создать тему
Опции темы

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