Бесконечный цикл 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 шт):
Всё довольно просто, вы сделали бесконечный цикл и не добавили возможность выйти из него.
Пусть у вас будет специальный символ выхода, допустим ;.
Тогда надо сделать проверку на выход следующим образом:
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
в проверке на число.