Бесконечный цикл while C++

Пишу простой калькулятор на С++ (изучаю классы). При проверке деления на ноль, continue переходит на следующую итерацию цикла, а при проверке isdigit() цикл становится бесконечным.

Сам класс:

#include <iostream>
using std::cout;

double Calc::Calculate(double a, char operation, double b)
{
    switch (operation)
    {
    case '+':
        return a + b;
    case '-':
        return a - b;
    case '*':
        return a * b;
    case '/':
        return a / b;
    default:
        return 0.0;
    }
}

Проверка и вывод:

    while (true)
    {
        cin >> a >> operation >> b;

        if ( !(isdigit(a)) || !(isdigit(b)) ) {
            cout << "Я считаю только числа :(\n";
            continue;
        }
        else if (b == 0 && operation == '/') {
            cout << "На ноль дельть нельзя!\n";
            continue;
        }
        else {
            result = c.Calculate(a, operation, b);
            cout << a << " " << operation << " " << b << " = " << result << endl;
        }
        
    } 

Ответы (1 шт):

Автор решения: Matvj

Всё довольно просто, вы сделали бесконечный цикл и не добавили возможность выйти из него.

Пусть у вас будет специальный символ выхода, допустим ;.

Тогда надо сделать проверку на выход следующим образом:

if (operation == ';') break; 

Также вам надо тип заменить a и b на тип double. Чтоб вам не надо было добавлять проверки. Вы можете удалить проверки is_digit и всё будет работать. Только придётся в default написать обработку не корректного ввода.

Если же вы хотите a и b оставить строкой, то можно добавить проверку (пусть a и b будут типом string).

is_number(string a)
{
    bool has_point = false;

    for(auto symbol : a)
    {
        if (symbol == '.')
        {
            if(!has_point) has_point = true;
            else return false;
        }

        else if(!is_digit(symbol)) return false;
    }

    return true;
}

Теперь надо заменить is_digit на is_number в проверке на число.

→ Ссылка