Отслеживать ошибки ввода и сообщать об этом пользователю - 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
не сохраняются между вызовами функций.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д