Запросить два числа и затем выполнить затребованную арифметическую операцию - C (СИ)
Формулировка задачи:
Доброго времени суток!
Помогите разобраться с проблемой.
На данный момент читаю С. Прата - Язык программирования С.
Имеется такая задача:
Напишите программу, которая выводит на экран меню, предлагающее выбрать сложение, вычитание, умножение или деление. После выбора программа должна запросить два числа и затем выполнить затребованную операцию. Программа должна принимать только варианты, предлагаемые в меню. Для чисел должен использоваться
тип float и программа должна предоставлять пользователю возможность повторно вводить числа, если он ввел не числовые данные. В случае деления программа должна предложить пользователю ввести другое значение, если он ввел для второго операнда значение 0.
Мое решение выглядит так:
Однако, как видно на выводе есть пара проблем, а именно:
1. Есть ввести например число 15s, то программа продублирует строчку №56.
2. После возврата в меню и выбора действия почему то вхожу в цикл while (строчка №34).
Ну и заодно хотелось бы услышать пару советов по оптимизации кода. Мой уровень знаний - начинающий. Еще, не обращайте внимание на корявый английский, я двоечник.
#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;
}Решение задачи: «Запросить два числа и затем выполнить затребованную арифметическую операцию»
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;
}
Объяснение кода листинга программы
В этом коде:
- Объявлены две переменные:
numberтипаfloatиchтипаshort. - Выводится приглашение для ввода числа.
- С помощью цикла
whileпроисходит проверка корректности ввода числа. - Если введено некорректное число, то с помощью функции
getchar()считывается символ, который был введен, и выводится обратно на экран. - Выводится сообщение о том, что введено некорректное число.
- С помощью цикла
whileпроисходит ожидание корректного ввода числа. - Если введено корректное число, то функция
scanf()считывает его и сохраняет в переменнойnumber. - Цикл завершается, и возвращается считанное число. Код: 11