Меню.Ввод-вывод.Проверка на ошибки ввода - 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 Программа завершена. Вот мой код:
#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; }
Использовал go to, пожалуйста покажите как вводимые переменные читать(пока не получим цифру) с вложенным циклом вместо go to, и если можно вообще без цикла и без go to

Решение задачи: «Меню.Ввод-вывод.Проверка на ошибки ввода»

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]

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


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

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

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