Калькулятор циклов на языке Си

#c

Вопрос:

Я просто делаю простой калькулятор и хотел бы знать, как я мог бы сделать так, чтобы мой калькулятор возвращался к началу, когда вводится недопустимый оператор/float; чтобы попросить пользователя ввести все снова. В основном перезапускаю его.

 #include <stdlib.h>
#include <stdio.h>
#include <math.h>

int main()
{
    double num1;
    double num2;
    char op;

    printf("Input a number: ");
    scanf("%lf", amp;num1);
    printf("Enter operator ( ,-,*,/,^): ");
    scanf(" %c", amp;op);
    printf("Enter the second number: ");
    scanf(" %lf", amp;num2);

    if (op == ' ')
    {
        printf("%f", num1   num2);
    } 
    else if (op == '-')
    {
        printf("%f", num1 - num2);
    }
    else if (op == '/')
    {
        printf("%f", num1 / num2);
    }
     else if (op == '*')
    {
        printf("%f", num1 * num2);
    } 
    else if (op == '^')
    {
        printf("%f", pow(num1,num2));
    }
    else
    {
        printf("Invalid operator entered");
    }
    return 0;
}
                                
 

Комментарии:

1. Оберните основную часть в бесконечный цикл ( while (1) { ... } или что-то подобное). В конце цикла break это. Когда в цикле возникает ошибка (которая, по крайней мере, не помешает вам повторить попытку), continue это.

2. Переименуйте main() как calc() и используйте это main() вместо: int main() { for (;;) calc(); }

Ответ №1:

Вставьте всю логику в бесконечный цикл, как показано ниже.

 while(1) {
    printf("Input a number: ");
    scanf("%lf", amp;num1);
    printf("Enter operator ( ,-,*,/,^): ");
    scanf(" %c", amp;op);
    printf("Enter the second number: ");
    scanf(" %lf", amp;num2);

    if (op == ' ')
    {
        printf("%f", num1   num2);
    } 
    else if (op == '-')
    {
        printf("%f", num1 - num2);
    }
    else if (op == '/')
    {
        printf("%f", num1 / num2);
    }
     else if (op == '*')
    {
        printf("%f", num1 * num2);
    } 
    else if (op == '^')
    {
        printf("%f", pow(num1,num2));
    }
    else
    {
        printf("Invalid operator entered");
    }
}
 

Комментарии:

1. очень маловероятно, что это сработает во время второй операции

Ответ №2:

Я бы сделал это по-другому, чтобы n избежать проблем со сканированием

 #define MAXNUMSTR 100

int calc(void)
{
    char line[MAXNUMSTR];
    double num1;
    double num2;
    double res;

    do
    {
        printf("nInput first number: ");
        if(!fgets(line, MAXNUMSTR -1, stdin)) return 0;
    }while(sscanf(line, "%lf", amp;num1) != 1);
    do
    {
        printf("nInput second number: ");
        if(!fgets(line, MAXNUMSTR -1, stdin)) return 0;
    }while(sscanf(line, "%lf", amp;num2) != 1);
    printf("nEnter operator ( ,-,*,/,^, x): ");
    if(!fgets(line, MAXNUMSTR -1, stdin)) return 0;

    switch(line[0])
    {
        case ' ':
            res = num1   num2;
            break;
        case '-':
            res = num1 - num2;
            break;
        case '*':
            res = num1 * num2;
            break;
        case '/':
            if(num2 == 0.0) 
            {
                printf("nDivision by zeron");
                return 1;
            }
            res = num1 / num2;
            break;
        case '^':
            res = pow(num1, num2);
            break;
        case 'x':
            return 0;
        default:
                printf("nInvalid operationn");
                return 1;

    }
    printf("n%f %c %f = %fn", num1, num2, res);
    return 1;
}

int main(void)
{
    while(calc());
    return 0;
}