Запросить два числа и затем выполнить затребованную арифметическую операцию - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток! Помогите разобраться с проблемой. На данный момент читаю С. Прата - Язык программирования С. Имеется такая задача: Напишите программу, которая выводит на экран меню, предлагающее выбрать сложение, вычитание, умножение или деление. После выбора программа должна запросить два числа и затем выполнить затребованную операцию. Программа должна принимать только варианты, предлагаемые в меню. Для чисел должен использоваться тип float и программа должна предоставлять пользователю возможность повторно вводить числа, если он ввел не числовые данные. В случае деления программа должна предложить пользователю ввести другое значение, если он ввел для второго операнда значение 0. Мое решение выглядит так:
#include <stdio.h>
short getMenu(void);
short getFirst(void);
float getNumber(void);
void calculateAdd(void);
void calculateSub(void);
void calculateMul(void);
void calculateDiv(void);
void main(void)
{
    short ch;
    while((ch = getMenu()) != 'q')
    {
        switch(ch)
        {
            case 'a': calculateAdd(); break;
            case 'b': calculateSub(); break;
            case 'c': calculateMul(); break;
            case 'd': calculateDiv(); break;
            default: printf("Error!\n"); break;
        }
    }
    return;
}
 
short getMenu(void)
{
    short ch;
    printf("Press get operation:\n");
    printf("a. Addition\t\tc.Multiplication\n");
    printf("b. Subtraction\t\td.Division\n");
    printf("q. Quit\n");
    ch = getFirst();
    while(ch != 'a' && ch != 'b' && ch != 'c'
        && ch != 'd' && ch != 'q')
    {
        printf("Please enter 'a', 'b', 'c','d' or 'q'\n");
        ch = getFirst();
    }
    return ch;
}
 
short getFirst(void)
{
    short ch;
    ch = getchar();
    while(getchar() != '\n')
        continue;
    return ch;
}
 
float getNumber(void)
{
    float number;
    short ch;
    printf("Enter number: ");
    while(scanf("%f", &number) != 1)
    {
        while((ch = getchar()) != '\n')
            putchar(ch);
        printf("  - not number...\n");
        printf("Press number:\n");
    }
    return number;
}
 
void calculateAdd(void)
{
    float num1, num2;
    num1 = getNumber();
    num2 = getNumber();
    printf("%.2f + %.2f = %.2f\n",num1, num2, num1 + num2);
    return;
}
void calculateSub(void)
{
    float num1, num2;
    num1 = getNumber();
    num2 = getNumber();
    printf("%.2f - %.2f = %.2f\n",num1, num2, num1 - num2);
    return;
}
 
void calculateMul(void)
{
    float num1, num2;
    num1 = getNumber();
    num2 = getNumber();
    printf("%.2f * %.2f = %.2f\n",num1, num2, num1 * num2);
    return;
}
 
void calculateDiv(void)
{
    float num1, num2;
    num1 = getNumber();
    num2 = getNumber();
    if(!num2)
    {
        printf("Error!\n");
        printf("Press next number(>0): ");
        num2 = getNumber();
    }
    printf("%.2f / %.2f = %.2f\n",num1, num2 ,num1 / num2);
    return;
}
Однако, как видно на выводе есть пара проблем, а именно: 1. Есть ввести например число 15s, то программа продублирует строчку №56. 2. После возврата в меню и выбора действия почему то вхожу в цикл while (строчка №34). Ну и заодно хотелось бы услышать пару советов по оптимизации кода. Мой уровень знаний - начинающий. Еще, не обращайте внимание на корявый английский, я двоечник.

Решение задачи: «Запросить два числа и затем выполнить затребованную арифметическую операцию»

textual
Листинг программы
float getNumber(void)
{
    float number;
    short ch;
    printf("Enter number: ");
    while(scanf("%f", &number) != 1)
    {
        while((ch = getchar()) != '\n')
            putchar(ch);
        printf("  - not number...\n");
        printf("Press number:\n");
        while(getchar() != '\n')
            continue;
    }
    return number;
}

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

В этом коде:

  1. Объявлены две переменные: number типа float и ch типа short.
  2. Выводится приглашение для ввода числа.
  3. С помощью цикла while происходит проверка корректности ввода числа.
  4. Если введено некорректное число, то с помощью функции getchar() считывается символ, который был введен, и выводится обратно на экран.
  5. Выводится сообщение о том, что введено некорректное число.
  6. С помощью цикла while происходит ожидание корректного ввода числа.
  7. Если введено корректное число, то функция scanf() считывает его и сохраняет в переменной number.
  8. Цикл завершается, и возвращается считанное число. Код: 11

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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