Отслеживать ошибки ввода и сообщать об этом пользователю - C (СИ)
Формулировка задачи:
Задача стояла такая. что бы программа могла отслеживать ошибки ввода и сообщать об этом пользователю.
Вот пример работы:
#include <stdio.h>
char get_choice(void);
float get_int(void);
char get_char(void);
int main(void)
{
float first, second;
char choice;
while ((choice = get_choice()) != 'q')
{
printf("Введите первый операнд: ");
first = get_int();
printf("qВведите второй операнд: ");
second = get_int();
switch (choice)
{
case 'c' : printf("Результат - %f\n", first + second);
break;
case 'b' : printf("Результат - %f\n", first - second);
break;
case 'y' : printf("Результат - %f\n", first * second);
break;
case 'd' : printf("Результат - %f\n", first / second);
break;
default : break;
}
}
printf("\nРабота завершенна.\n");
return 0;
}
char get_choice(void)
{
char ch;
printf( "Выберите желаемую операцию:\n"
"c. сложение b. вычитание\n"
"y. умножение d. деление\n"
"q. выход\n");
ch = getchar();
printf("*%c*", ch); //Для проверки, во втором выводе покажет.
while (ch != 'c' && ch != 'b' && ch != 'y' && ch != 'd'
&& ch != 'q')
{
printf("Выберите один из вариантов!\n");
ch = get_char();
}
return ch;
}
float get_int(void)
{
float num;
while (scanf("%f", &num) != 1)
printf("Вы ввели не число, повторите попытку: \n");
return num;
}
char get_char(void)
{
char ch;
while (getchar() != '\n')
continue;
ch = getchar();
return ch;
}Выберите желаемую операцию: c. сложение b. вычитание y. умножение d. деление q. выход c *c*Введите первый операнд: 1 Введите второй операнд: 1 Результат - 2.000000 (
-- Здесь не выводится \n!
Выберите желаемую операцию: c. сложение b. вычитание y. умножение d. деление q. выход * *Выберите один из вариантов! Как видите ch почему то *.Решение задачи: «Отслеживать ошибки ввода и сообщать об этом пользователю»
textual
Листинг программы
#include <stdio.h>
char get_char();
char get_couse();
float get_float();
int main(void)
{
float first, second;
char ch;
while ((ch = get_couse()) != 'q')
{
printf("Введите первый операнд: ");
first = get_float();
printf("Введите второй операнд: ");
second = get_float();
switch (ch)
{
case '+' : printf("%.2f + %.2f = %.2f\n", first, second, first + second);
break;
case '*' : printf("%.2f * %.2f = %.2f\n", first, second, first * second);
break;
case '-' : printf("%.2f - %.2f = %.2f\n", first, second, first - second);
break;
case '/' : printf("%.2f / %.2f = %.2f\n", first, second, first / second);
break;
default : printf("Error!!!");
}
}
printf("Программа завершенна.\n");
return 0;
}
char get_couse()
{
char chouse;
printf("Выберите желаемую операцию\n");
printf("+. сложение *.умножение\n");
printf("-. вычитание /.деление\n");
printf("q. выход\n");
chouse = get_char();
return chouse;
}
char get_char()
{
char ch;
ch = getchar();
while (ch != '+' && ch != '-' && ch != '*' && ch != '/' && ch != 'q')
{
while (getchar() != '\n')
continue;
ch = getchar();
}
return ch;
}
float get_float()
{
float num;
char ch;
while (scanf("%f", &num) != 1)
{
while ((ch = getchar()) != '\n')
putchar(ch);
printf(" не является числом, повторите попытку : ");
}
while (getchar() != '\n')
continue;
return num;
}
Объяснение кода листинга программы
- Ввод запрашивает у пользователя первый операнд, затем второй операнд и затем знак операции.
- Значение первого операнда сохраняется в переменной
first, а значение второго операнда сохраняется в переменнойsecond. - Затем программа проверяет значение переменной
ch, которая содержит знак операции. - В зависимости от значения
ch, программа выполняет соответствующую операцию (сложение, умножение, вычитание или деление) и выводит результат. - Если пользователь вводит неправильный символ вместо числа, программа выводит сообщение об ошибке и просит ввести правильное значение.
- Если пользователь вводит
qилиQ, программа завершается. - Функция
get_couseиспользуется для получения от пользователя выбора операции. - Функция
get_charиспользуется для получения от пользователя ввода, пока не будет введено правильное значение. - Функция
get_floatиспользуется для получения от пользователя числа. Если пользователь вводит неправильное значение, программа выводит сообщение об ошибке и просит ввести правильное значение. - Программа завершается сообщением о завершении работы.
- Значения переменных
first,secondиchсохраняются в стеке при вызове функций и восстанавливаются при возврате из функций. - Переменная
chиспользуется как флаг для контроля выхода из функций. - Значения переменных
firstиsecondвычисляются в функцииmain. - Значения переменных
firstиsecondиспользуются в функцииmain. - Значение переменной
chиспользуется в функцииmain. - В цикле while в функции
mainпрограмма повторяется до тех пор, пока пользователь не введетqилиQ. - В цикле while в функции
get_charпрограмма повторяется до тех пор, пока не будет введено правильное значение. - В цикле while в функции
get_floatпрограмма повторяется до тех пор, пока не будет введено правильное число. - Функции
get_couse,get_charиget_floatвызываются в функцииmain. - Значения переменных
first,secondиchне сохраняются между вызовами функций.