Отслеживать ошибки ввода и сообщать об этом пользователю - 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;
}

Объяснение кода листинга программы

  1. Ввод запрашивает у пользователя первый операнд, затем второй операнд и затем знак операции.
  2. Значение первого операнда сохраняется в переменной first, а значение второго операнда сохраняется в переменной second.
  3. Затем программа проверяет значение переменной ch, которая содержит знак операции.
  4. В зависимости от значения ch, программа выполняет соответствующую операцию (сложение, умножение, вычитание или деление) и выводит результат.
  5. Если пользователь вводит неправильный символ вместо числа, программа выводит сообщение об ошибке и просит ввести правильное значение.
  6. Если пользователь вводит q или Q, программа завершается.
  7. Функция get_couse используется для получения от пользователя выбора операции.
  8. Функция get_char используется для получения от пользователя ввода, пока не будет введено правильное значение.
  9. Функция get_float используется для получения от пользователя числа. Если пользователь вводит неправильное значение, программа выводит сообщение об ошибке и просит ввести правильное значение.
  10. Программа завершается сообщением о завершении работы.
  11. Значения переменных first, second и ch сохраняются в стеке при вызове функций и восстанавливаются при возврате из функций.
  12. Переменная ch используется как флаг для контроля выхода из функций.
  13. Значения переменных first и second вычисляются в функции main.
  14. Значения переменных first и second используются в функции main.
  15. Значение переменной ch используется в функции main.
  16. В цикле while в функции main программа повторяется до тех пор, пока пользователь не введет q или Q.
  17. В цикле while в функции get_char программа повторяется до тех пор, пока не будет введено правильное значение.
  18. В цикле while в функции get_float программа повторяется до тех пор, пока не будет введено правильное число.
  19. Функции get_couse, get_char и get_float вызываются в функции main.
  20. Значения переменных first, second и ch не сохраняются между вызовами функций.

Оцени полезность:

5   голосов , оценка 4.4 из 5
Похожие ответы