С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 18.08.2020
Сообщений: 15

Бесконечно выполняется функция при использовании while

18.08.2020, 13:39. Показов 2735. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет!
Столкнулся с такой проблемой: при определённых условиях начинает зацикливаться выполнение функции. Если была тема с таким вопросом - извиняюсь, поиском не нашёл.

Код программы:
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
#include "iostream"
#include "windows.h"
#include "cstdlib"
                        
char txtFstNum[] = "Enter first number:";
char txtSecNum[] = "Enter second number:";
char txtOper[] = "Enter operation (+, -. *, /):";
char txtResult[] = "Result: ";
char txtWrongAction[] = "Wrong action, please, repeat:";
 
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
 
double fstNum(0), secNum(0), result(0);
char oper(0);
 
void getValues();
void printResult();
 
int main()
{
    while (true)
    {
        getValues();
 
        switch (oper)
        {
 
        case '+': result = fstNum + secNum;
            printResult(); break;
        case '-': result = fstNum - secNum;
            printResult(); break;
        case '*': result = fstNum * secNum;
            printResult(); break;
        case '/': result = fstNum / secNum;
            printResult(); break;
        default:
            SetConsoleTextAttribute(hConsole, (WORD)((0 << 4) | 4));
            std::cout << txtWrongAction << '\n' << '\n';
            SetConsoleTextAttribute(hConsole, (WORD)((0 << 4) | 7));
 
            if (std::cin.fail())
            {
                std::cin.clear();
                std::cin.ignore(32767, '\n');
            }
            main();
        }
        system("pause");
    }
}
 
void getValues()
{
        std::cout << txtFstNum << '\n';
        std::cin >> fstNum;
 
        std::cout << txtSecNum << '\n';
        std::cin >> secNum;
 
        std::cout << txtOper << '\n';
        std::cin >> oper;
}
 
void printResult()
{
    SetConsoleTextAttribute(hConsole, (WORD)((0 << 4) | 15));
    std::cout << txtResult << result << '\n' << '\n';
    SetConsoleTextAttribute(hConsole, (WORD)((0 << 4) | 7));
}
То самое условие: как минимум один должно быть выполнено правильное вычисление (т.е. программа должна выполниться до system("pause")), если таковое было, то нужно написать что-либо кроме числа(допустим, "a" или "!") в "Enter first number", либо в "Enter second number".
Примерно так выглядит вывод с багом:

Кликните здесь для просмотра всего текста
Enter first number:
15
Enter second number:
15
Enter operation (+, -. *, /):
+
Result: 30

Для продолжения нажмите любую клавишу . . .
Enter first number:
1a
Enter second number:
Enter operation (+, -. *, /):
Result: 1

Для продолжения нажмите любую клавишу . . .
Enter first number:
Enter second number:
Enter operation (+, -. *, /):
Result: 1

Для продолжения нажмите любую клавишу . . .


И так далее, если убрать system("pause"), то будет этим спамить.

Если не было ни одного правильного действия и при этом выполнить вышенаписанное, то программа работает как и должна: выводит wrongAction.
Понимаю, что этот косяк появляется из-за использования while, но не понимаю как его решить.
Прошу помочь.
Простите, если слишком усложнил всё, так получилось)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.08.2020, 13:39
Ответы с готовыми решениями:

При каких значениях параметров функция бесконечно малая
При каких значениях \alpha и \beta функция является бесконечно малой: y=sqrt(4*x^2+x+1)-\alpha *x-\beta Если a) x\rightarrow...

Курсор выполняется бесконечно
DECLARE @ID int, @Mine int, @Child int, @Sheme int DECLARE @Cursor CURSOR; SET @Cursor = CURSOR FOR SELECT , MineUser_ID,...

Цикл выполняется бесконечно
AnsiString S1,S2; float Year1, Day1, Month1, Year2, Day2, Month2; S1=DateTimePicker1-&gt;Date; StringGrid1-&gt;RowCount=2; ...

12
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
18.08.2020, 14:05
Цитата Сообщение от Desync Посмотреть сообщение
Столкнулся с такой проблемой: при определённых условиях начинает зацикливаться выполнение функции. Если была тема с таким вопросом - извиняюсь, поиском не нашёл.
Во-первых, не нужно вызывать main() рекурсивно. Здесь в вообще рекурсия вроде не нужна.
1
0 / 0 / 0
Регистрация: 18.08.2020
Сообщений: 15
18.08.2020, 14:07  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Во-первых, не нужно вызывать main() рекурсивно. Здесь в вообще рекурсия вроде не нужна.
Да, действительно.
Убрал вызов, всё так же работает, но баг остался.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
18.08.2020, 14:14
Лучший ответ Сообщение было отмечено Desync как решение

Решение

Цитата Сообщение от Desync Посмотреть сообщение
if (std::cin.fail())
            {
                std::cin.clear();
                std::cin.ignore(32767, '\n');
            }
Это перенеси в начало функции getValues()

Добавлено через 1 минуту
C++
1
2
3
4
5
if (!std::cin)
{
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
char getValues()
{
    if (!std::cin)
    {
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
 
    std::cout << txtFstNum << '\n';
    if (!std::cin >> fstNum)
        return -1;
 
    std::cout << txtSecNum << '\n';
    if (!std::cin >> secNum)
        return -1;
 
    char oper = -1;
    std::cout << txtOper << '\n';
    std::cin >> oper;
    return oper;
}
Добавлено через 57 секунд
Цитата Сообщение от Desync Посмотреть сообщение
while (true)
    {
        getValues();
switch (oper)
        {
C++
1
2
3
4
5
6
while (true)
{
    cosnt char oper = getValues();
    switch (oper)
    {
..................
0
0 / 0 / 0
Регистрация: 18.08.2020
Сообщений: 15
18.08.2020, 14:21  [ТС]
Извиняюсь, если туплю, но..


Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Это перенеси в начало функции getValues()

Добавлено через 1 минуту
C++
1
2
3
4
5
if (!std::cin)
{
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
char getValues()
{
    if (!std::cin)
    {
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
 
    std::cout << txtFstNum << '\n';
    if (!std::cin >> fstNum)
        return -1;
 
    std::cout << txtSecNum << '\n';
    if (!std::cin >> secNum)
        return -1;
 
    char oper = -1;
    std::cout << txtOper << '\n';
    std::cin >> oper;
    return oper;
}
Добавлено через 57 секунд

C++
1
2
3
4
5
6
while (true)
{
    cosnt char oper = getValues();
    switch (oper)
    {
..................
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
18.08.2020, 14:26
Цитата Сообщение от Desync Посмотреть сообщение
Извиняюсь, если туплю, но..
Поставь std::cin >> ... в скобки - if (!(std::cin >> fstNum))
1
0 / 0 / 0
Регистрация: 18.08.2020
Сообщений: 15
18.08.2020, 14:32  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Поставь std::cin >> ... в скобки - if (!(std::cin >> fstNum))
А с этим что?
Миниатюры
Бесконечно выполняется функция при использовании while  
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
18.08.2020, 14:36
Цитата Сообщение от Desync Посмотреть сообщение
А с этим что?
Сделай #include <limits>

Добавлено через 2 минуты
А там возможно русская с затесалась
0
0 / 0 / 0
Регистрация: 18.08.2020
Сообщений: 15
18.08.2020, 14:39  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Сделай #include <limits>

Добавлено через 2 минуты
А там возможно русская с затесалась
Проверил, вроде нет.

Инклюд не сильно помог: было 10 ошибок, стало 9..
Миниатюры
Бесконечно выполняется функция при использовании while  
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
18.08.2020, 14:42
Цитата Сообщение от Desync Посмотреть сообщение
Инклюд не сильно помог: было 10 ошибок, стало 9..
const написана неправильно

Добавлено через 52 секунды
В окне с ошибками включи просто Сборка, вместо "Сборка и Intelllisense"
1
0 / 0 / 0
Регистрация: 18.08.2020
Сообщений: 15
18.08.2020, 14:44  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
const написана неправильно
Да, действительно.
Теперь так..
Миниатюры
Бесконечно выполняется функция при использовании while  
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
18.08.2020, 14:46
Цитата Сообщение от Desync Посмотреть сообщение
Да, действительно.
Теперь так..
Сделай там, как у тебя было std::cin.ignore(32767, '\n')
0
0 / 0 / 0
Регистрация: 18.08.2020
Сообщений: 15
18.08.2020, 14:49  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Сделай там, как у тебя было std::cin.ignore(32767, '\n')
Спасибо, помогло.
Готовый код, если кому нужен:
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
#include "iostream"
#include "windows.h"
#include "cstdlib"
                        
char txtFstNum[] = "Enter first number:";
char txtSecNum[] = "Enter second number:";
char txtOper[] = "Enter operation (+, -. *, /):";
char txtResult[] = "Result: ";
char txtWrongAction[] = "Wrong action, please, repeat:";
 
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
 
double fstNum(0), secNum(0), result(0);
char oper(0);
 
char getValues();
void printResult();
 
int main()
{
    while (true)
    {
        const char oper = getValues();
 
        switch (oper)
        {
 
        case '+': result = fstNum + secNum;
            printResult(); break;
        case '-': result = fstNum - secNum;
            printResult(); break;
        case '*': result = fstNum * secNum;
            printResult(); break;
        case '/': result = fstNum / secNum;
            printResult(); break;
        default:
            SetConsoleTextAttribute(hConsole, (WORD)((0 << 4) | 4));
            std::cout << txtWrongAction << '\n' << '\n';
            SetConsoleTextAttribute(hConsole, (WORD)((0 << 4) | 7));
        }
        system("pause");
    }
}
 
char getValues()
{
    if (!(std::cin))
    {
        std::cin.clear();
        std::cin.ignore(32767, '\n');
    }
 
    std::cout << txtFstNum << '\n';
    if (!(std::cin >> fstNum))
    return fstNum;
 
    std::cout << txtSecNum << '\n';
    if (!(std::cin >> secNum))
    return secNum;
 
    std::cout << txtOper << '\n';
    std::cin >> oper;
    return oper;
}
 
void printResult()
{
    SetConsoleTextAttribute(hConsole, (WORD)((0 << 4) | 15));
    std::cout << txtResult << result << '\n' << '\n';
    SetConsoleTextAttribute(hConsole, (WORD)((0 << 4) | 7));
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.08.2020, 14:49
Помогаю со студенческими работами здесь

Почему цикл выполняется бесконечно?
Объясните кто-нибудь, почему этот код #include &lt;iostream&gt; #include &lt;cstdlib&gt; int main() { int array1; ...

Почему данный цикл выполняется бесконечно!?
Начинаю учить С# , сейчас на изучении циклов и у меня возникли трудности. Хочу узнать почему данный цикл выполняется бесконечно!? int...

Зацикливается (бесконечно выполняется) BAT-файл
Доброго времени суток! Никак не могу найти как сделать runas из батника, подскажите пожалуйста! Суть простая - запуск приложения из-под...

Не выполняется функция при повторном вызове
Суть такая: при нажатии на ссылку должна выполняться функция, в которой отправляется Ajax-запрос, удаляется ссылка и добавляется такая же,...

Не выполняется js функция при нажатии, из-за <form>
&lt;script type=&quot;text/javascript&quot; &gt; function myVPScheck() { var checkBox = document.getElementById(&quot;myVPScheck&quot;); var textBox...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru