Есть нижеприведенный код простенького калькулятора. Внимание вопрос: почему он впадает в бесконечный цикл с выбиванием ошибки при вводе вместо числовых данных символов в var1 и var2?
Как это можно исправить?
// Калькулятор 0.3.1
#include <iostream>
#include <conio.h>
// Прототип функции вывода справки
void fhelp (void);
// Прототип функции арифметических вычислений / размещения / возведения в степень
double arif (const double, const char, const double);
// Прототип функции сообщения об ошибке
void error (void);
// Прототип функции вычисления факториала
unsigned long long factorial (const unsigned int);
// Прототип функции выбора типа y/n
unsigned short answer (void);
// Прототип функции возведения в степень
double grade (const double, const int);
// Прототип функции извлечения квадратного корня
unsigned long square (const unsigned long long int);
// Прототип функции выбора между извлечением корня и нахождением факториала
void switch1 (unsigned long long, const char);
using namespace std;
int main()
{
setlocale (LC_ALL, "Russian"); // установка языка
cout << "Здравствуйте! Это программа Калькулятор v0.3\nДля показа справки нажмите Y, для продолжения нажмите N...\n\n";
while (1) // Выбор показа справки
{
if (answer () == 2)
{
fhelp ();
break;
}
if (answer () == 3) break;
}
while (1)
{
double var1, var2; // переменные значений
char operat; // оператор вычисления
cout << "\n\nДля продолжения введите данные: ";
cin >> var1;
cin >> operat;
if (operat == '!' || operat == '`') // определение запроса функции вычисления факториала или нахождения квадратного корня и переход к ней
{
if (var1 >= 0)
{
switch1 (var1, operat);
}
else
error();
continue;
}
cin >> var2;
if (operat == '+' || operat == '-' || operat == '*' || operat == '/' || operat == '^' || operat == '~' || operat == '\\') // определение запроса функции арифметических действий / возведения в степень
{ // размещений / сочетаний и переход к ней
arif (var1, operat, var2);
continue;
}
else
{
error ();
continue;
}
}
}
// Имплементация функции вывода справки
void fhelp (void)
{
cout << "\nС П Р А В К А:\n\nДля выполнения одного из простейших арифметических действий\nВведите два числа, разделяя их одним из символов: '+' '-' '*' '/''\n\nДля нахождения m в степени n введите m и n, разделяя знаком ^";
cout << "\nДля нахождения размещений из N по K без повторений, введите N и K, разделяя знаком ~\nДля нахождения сочетаний из N по K без повторений, введите N и K, разделяя знаком \\\n\n";
cout << "Для нахождения факториала числа введите число и знак !\nДля нахождения квадратного корня числа введите число и знак `\n";
}
// Имплементация функции арифметических действий / размещений/ сочетаний / возведения в степнеь
double arif (const double var01, const char var02, const double var03)
{
switch (var02)
{
case '*':
{
cout << "\nПроизведение " << var01 << " и " << var03 << " равно: " << var01*var03;
break;
}
case '/':
{
cout << "\nОтношение " << var01 << " к " << var03 << " равно: " << var01/var03;
break;
}
case '+':
{
cout << "\nСумма " << var01 << " и " << var03 << " равна: " << var01+var03;
break;
}
case '-':
{
cout << "\nРазность " << var01 << " и " << var03 << " равна: " << var01-var03;
break;
}
case '^':
{
(int) var03;
cout << "\nЧисло " << var01 << "в степени " << var03 << " равно: " << grade (var01, var03);
break;
}
case '~':
{
if (var01 >= 0 && var03 >= 0 && var03 < var01)
{
(int) var01, var03;
int var04 = var01 - var03;
cout << "\nЧисло размещений из " << var01 << " по " << var03 <<" равно: " << (factorial(var01))/factorial(var04);
}
else error();
break;
}
case '\\':
{
if (var01 >= 0 && var03 >= 0 && var03 < var01)
{
(int) var01, var03;
int var04 = var01 - var03;
cout << "\nЧисло сочетаний из " << var01 << " по " << var03 <<" равно: " << (factorial(var01)/(factorial(var03)*factorial(var04)));
}
else error();
break;
}
}
}
// Имплементация функции вывода сообщения об ошибке
void error (void)
{
cout << "\nК сожалению, произошла ошибка, пожалуйста, попробуйте снова...\n";
}
// Имплементация функции вычисления факториала
unsigned long long factorial (const unsigned int fact)
{
int f = fact;
unsigned long long res = 1;
if (fact == 0) return 1;
while (f != 1)
{
res = f*res;
--f;
}
return res;
}
// Имплементация функции выбора типа y/n
unsigned short answer (void)
{
char ch;
ch = getch ();
if (ch == 'y' || ch == 'Y') return 2;
if (ch == 'n' || ch == 'N') return 3;
else error();
return 4;
}
// Имплементация функции возведения в степень
double grade (const double x, const int y)
{
double var001 = x;
int var002 = y;
unsigned short counter = 1;
if (var002 > 0)
{
double helper = var001;
while (counter != var002)
{
helper*=var001;
++counter;
}
return helper;
}
if (var002 == 0)
return 1;
if (var002 < 0)
{
var002 = -var002;
return (1/grade (var001, var002));
}
}
// Имплементация функции извлечения квадратного корня
unsigned long square (const unsigned long long int num)
{
unsigned long long num1 = num;
unsigned long num2 = num1/2;
while ((num2*num2) != num1 )
{
--num2;
if (num2 < 2)
{
error ();
return 0;
}
}
return num2;
}
// Имплементация функции выбора между извлечением корня и нахождением факториала
void switch1 (unsigned long long num00, const char cho)
{
unsigned long long var1 = num00;
switch (cho)
{
case '!':
{
cout << "\nФакториал " << var1 << " равен: " << factorial(var1) << endl;
break;
}
case '`':
{
cout << "\nКвадратный корень из " << var1 << " равен: " << square (var1);
break;
}
}
}