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

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

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

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

22.11.2014, 15:16. Просмотров 646. Ответов 7
Метки нет (Все метки)

Доброго всем дня. Разными способами пытаюсь сделать меню в программе. Если делать через 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 тоже не работает.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2014, 15:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Меню в программе - бесконечный loop (C++):

Есть бесконечный цикл в программе и она поэтому занимает процессор, как это исправить? - C++
НАписал себе напоминалку, а она жрёт процессор (~~ 45%); код упростил для понятности #include &lt;stdio.h&gt; #include &lt;windows.h&gt; #include...

Меню к программе - C++
кто может помочь сделать меню к програмке(строковый калькулятор) типа 1: ввести выражение 2: запись в файл 3: вивести из файла 4:...

Организация меню в программе - C++
Как правильно организовать меню в консольной программе с помощью switch case? Я делал так, но не змею правильно ли? #include &lt;cstdlib&gt; ...

нужно составить меню к программе - C++
/*Написать программу, которая выполняет следующие действия: • вводит с клавиатуры данные в массив, состоящий из десяти структур; записи...

Как сделать меню в программе? - C++
Всем привет) Есть программа,в ней 4 метода,как сделать так чтоб когда её запускаешь можно было выбрать один из них?? Вот код...

Подскажите, как сделать меню к программе - C++
Ребят, хелп Я не знаю как делать рабочее меню программы Мне нужно к программе написать меню.. Хелпаните плиз!!!!

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
demmax2004
60 / 138 / 35
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
22.11.2014, 15:43 #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; 
}
 
}
 
 
}
0
Pseudodog
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 18
22.11.2014, 15:47  [ТС] #3
demmax2004, нет. В таком виде надо удалить do. Но это бог с ним. Удалил. Если сделать через goto, то программа никуда дальше не двигается. Просто мигает значок нижнего подчёркивания и всё.
0
demmax2004
60 / 138 / 35
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
22.11.2014, 15:53 #4
Да не может такого быть
0
Takeshi80
17 / 15 / 2
Регистрация: 08.03.2012
Сообщений: 124
22.11.2014, 17:17 #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;
 
        }
 
    }
 
}
0
Pseudodog
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 18
23.11.2014, 12:05  [ТС] #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 минут
Всё ещё актуально =)
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3826 / 2084 / 532
Регистрация: 18.10.2014
Сообщений: 3,699
23.11.2014, 12:24 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Основная проблема этой программы - не в организации цикла, а в том, что она пытается читать из входного потока число. Если во входном потоке сидит что-то нечисловое, то чтение числа будет прекращено. "Нечисловые" символы останутся в потоке непрочитанными. В следующий раз, когда вы снова попытаетесь выполнить чтение числа, во входном потоке по прежнему будут сидеть те же самые непрочитанные "нечисловые" символы и чтение числа снова будет прекращено неудачно. Так будет продолжаться до бесконечности.

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

Чтоб решить проблему, надо либо чистить входной поток после неудачного чтения, либо не пытаться читать сразу число вообще. Лучше читайте из входного потока строку, а потом уже самостоятельно переводите ее в число.
1
Pseudodog
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 18
23.11.2014, 13:26  [ТС] #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;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2014, 13:26
Привет! Вот еще темы с ответами:

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

Отправка параметров программе из контекстного меню проводника - C++
Здравствуйте))).Помогите пожалуйста решить один вопрос. Текст программы: #include &lt;iostream&gt; int main() { ...

Как сделать меню в программе под DOS, написанную в С++3.0? - C++
Уважаемые программеры! Подскажите, как сделать менюшку в программе под DOS, написанную в С++3.0! Я не знаю, с чего начать!Что вообще надо...

В программе создать главное и контекстное меню. Вывести справку о разработчике - C++
Вывести на экран все трехзначные числа, которые начинаются и заканчиваются на одну и ту же цифру;


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

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

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