@walter73

Почему программа впадает в бесконечный цикл без причин и как это исправить?

Есть нижеприведенный код простенького калькулятора. Внимание вопрос: почему он впадает в бесконечный цикл с выбиванием ошибки при вводе вместо числовых данных символов в 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;
		}
	}
}
  • Вопрос задан
  • 175 просмотров
Пригласить эксперта
Ответы на вопрос 1
webinar
@webinar
Учим yii: https://youtu.be/-WRMlGHLgRg
как минимум тут:
while (counter != var002)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы