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