Меню.Ввод-вывод.Проверка на ошибки ввода - C (СИ)
Формулировка задачи:
Здравствуйте, помогите переделать программу без go to при чтении ввода scanf
/*Задача: Напишите программу, которая выводит на экран меню, предлагающее выбрать сложение, вычитание, умножение или деление. После выбора программа должна запросить два числа и затем выполнить затребованную операцию.Программа должна принимать только варианты, предлагаемые в меню. чисел должен использоваться тип float и программа должна предоставлять пользователю возможность повторно вводить числа, если он ввел нечисловые данные. В случае деления программа должна предложить пользователю ввести другое значение, если он ввел для второго операнда
значение О. Выполнение такой программы должно иметь примерно такой вид:
Выберите желаемую операцию:
с. сложение в. вычитание
у. умножение д. деление
з. завершение
с
Введите первое число: 22.4
Введите второе число: о^ дин
один не является числом.
Введите число, такое как 2.5, -1.78Е8 или 3: 1
22.4 + 1 = 23.4
Выберите желаемую операцию:
с. сложение в. вычитание
у. умножение д. деление
з. завершение
д
Введите первое число: 18.4
Введите второе число: О
Введите число, отличное от О: 0.2
18.4 / 0.2 = 92
Выберите желаемую операцию:
с. сложение в. вычитание
у. умножение д. деление
з. завершение
s
Программа завершена.
Вот мой код:
Использовал go to, пожалуйста покажите как вводимые переменные читать(пока не получим цифру) с вложенным циклом вместо go to, и если можно вообще без цикла и без go to
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <ctype.h>
#include <stdbool.h>
int getfirst(void);
void menu(void);
int main(void)
{
setlocale(LC_CTYPE, "Russian");
double one; // часы в неделю
double two; // чистый доход
double resultat; // налог
char i; // символ ставки
bool a,b;
menu();
while ((i = getfirst()) != 'q')
{ if (i == '\n') /* пропустить новую строку */
continue;
i = tolower(i); /* Принимать заглавные в качестве строчных. */
switch(i)
{case 'a':break;
case 'b':break;
case 'c':break;
case 'd':break;
default:printf("Попробуйте снова выбор из 5 вариантов:\n\n");
menu();
continue;//переход к началу цикла
}
a_1: printf("Введите первое число: ");
a=(scanf("%lf",&one));
if(!a)
{printf("Вы ввели не число, попробуйте ввести число: ");goto a_1;}
a_2:
printf("\nВведите второе число: ");
b=(scanf("%lf",&two));
if(!b){ printf("Вы ввели не число, попробуйте ввести число: ");goto a_2;}
if(i=='d'&&two==0){printf("Введите число отличное от 0: ");goto a_2;}
if(i=='a')resultat=one+two;
if(i=='b')resultat=one-two;
if(i=='c')resultat=one*two;
if(i=='d')resultat=one/two;
printf("Результатом выбранной операции будет:%.2f\n",resultat);
menu();
}
printf("Программа завершена\n");
return 0;
}
void menu(void)
{ printf("***********************************************************************\n");
printf("Введите желаемую операцию:\n");
printf("a)Сложение b)Вычетание\nc)Умножение d)Деление\nq)Выход\n");
printf("***********************************************************************\n");
printf("Жду ввода: ");}
int getfirst(void)
{
int ch;
ch = getchar();
while (isspace(ch))
ch = getchar();
while (getchar() != '\n')
continue;
return ch; }Решение задачи: «Меню.Ввод-вывод.Проверка на ошибки ввода»
textual
Листинг программы
[CODE]
#include <stdio.h>
int get_choise(void); // меню
int get_first(void); // делаем выбор в меню
float get_first_chislo(void); // получение 1 числа
float get_second_chislo(void); //получение 2 числа
int main()
{
int choise;
float fch;
float sch;
while((choise = get_choise()) != 'e')
{
switch (choise)
{
case 'c': printf("Вы выбрали сложение:\n");
fch = get_first_chislo();
sch = get_second_chislo();
printf("%.2f + %.2f = %.2f\n", fch, sch, fch+sch);
while(getchar() != '\n')
continue;
break;
case 'v': printf("Вы выбрали вычитание:\n");
fch = get_first_chislo();
while(fch == 0)
{
printf("Число не должно быть равно 0. ");
fch = get_first_chislo();
if(fch ==0)
continue;
else break;
}
sch = get_second_chislo();
while(sch == 0)
{
printf("Число не должно быть равно 0. ");
sch = get_second_chislo();
if(sch ==0)
continue;
else break;
}
printf("%.2f - %.2f = %.2f\n", fch, sch, fch-sch);
while(getchar() != '\n')
continue;
break;
case 'y': printf("Вы выбрали умножение:\n");
fch = get_first_chislo();
sch = get_second_chislo();
printf("%.2f x %.2f = %.2f\n", fch, sch, fch*sch);
while(getchar() != '\n')
continue;
break;
case 'd': printf("Вы выбрали деление:\n");
fch = get_first_chislo();
while(fch == 0)
{
printf("Число не должно быть равно 0. ");
fch = get_first_chislo();
if(fch ==0)
continue;
else break;
}
sch = get_second_chislo();
while(sch == 0)
{
printf("Число не должно быть равно 0. ");
sch = get_second_chislo();
if(sch ==0)
continue;
else break;
}
printf("%.2f / %.2f = %.2f\n", fch, sch, fch/sch);
while(getchar() != '\n')
continue;
break;
case 'e': break;
default: break;
}
}
return 0;
}
int get_choise(void) // меню
{
int p;
printf("============================================\n");
printf("=\tВыберите желаемую операцию: =\n"
"= c. сложение v. вычитание =\n"
"= y. умножение d. деление =\n"
"= e. завершение =\n");
printf("============================================\n");
p = get_first();
while(p != 'c' && p != 'v' && p != 'y' && p != 'd' && p != 'e')
{
printf("Выберите вариант: c, v, y, d, e\n");
p = get_first();
}
if(p == 'e')
printf("Всего хорошего");
return p;
}
int get_first(void)
{
int p;
p = getchar();
while(getchar() != '\n') {
continue;
}
return p;
}
float get_first_chislo(void) // функция первого числа
{
float p;
int g = 0;
printf("Введите первое число :\n");
while(scanf("%f", &p) != 1)
{
while ((p = getchar()) != '\n')
{
putchar(p);
g++;
continue;
}
if(g > 0)
{
printf(" не являются числом.\n");
printf("Введите число, такое как 2.5, -1.78Е8 или 3:1\n");
continue;
}
}
return p;
}
float get_second_chislo(void) //получаем второе число
{
float r;
int g = 0;
printf("Введите второе число :\n");
while (scanf("%f", &r) != 1)
{
while (( r = getchar()) != '\n')
{
putchar(r);
g++;
continue;
}
if(g > 0)
{
printf(" не являются числом.\n");
printf("Введите число, такое как 2.5, -1.78Е8 или 3:1\n");
continue;
}
}
return r;
}
[/CODE]