Я попытался закодировать небольшой калькулятор. Пользователь должен решить, хочет ли он сложить, вычесть, умножить или разделить два числа. Это, вероятно, ошибка нуба, так как я второй день изучаю программирование, но вот код:

#include <stdio.h>
#include <stdbool.h>



int main()
{
    float a;
    float b;
    float c;
    char Input;


    printf("Herzlich Wilkommen, ");


    do
    {
        printf(" \nWas moechten sie tun?\n Fuer Addition A \n Fuer Subtraktion S \n Fuer Division D \n Fuer Multiplikation M\n");
        printf(" Zum Beenden 0 druecken!\n");
        printf(" Eingabe:");
        scanf(" %c", &Input);

        if (Input == 'A')
        {
            printf("Geben sie Zahl 1 an:");
            scanf(" %f", &a);
            printf("Zahl 1: %f\n", a);
            printf("Geben sie Zahl 2 an:");
            scanf(" %f", &b);
            printf("Zahl 2: %f\n", b);
            c = a + b;
            printf("Das Ergebnis ist: %f\n", c);
        }
        if (Input == 'S')
        {
            printf("Geben sie Zahl 1 an:");
            scanf(" %f", &a);
            printf("Zahl 1: %f\n", a);
            printf("Geben sie Zahl 2 an:");
            scanf(" %f", &b);
            printf("Zahl 2: %f\n", b);
            c = a - b;
            printf("Das Ergebnis ist: %f\n", c);
        }
        if (Input == 'M')
        {
            printf("Geben sie Zahl 1 an:");
            scanf(" %f", &a);
            printf("Zahl 1: %f\n", a);
            printf("Geben sie Zahl 2 an:");
            scanf(" %f", &b);
            printf("Zahl 2: %f\n", b);
            c = a / b;
            printf("Das Ergebnis ist: %f\n", c);
        }
        if (Input == 'D')
        {
            printf("Geben sie Zahl 1 an:");
            scanf(" %f", &a);
            printf("Zahl 1: %f\n", a);
            printf("Geben sie Zahl 2 an:");
            scanf(" %f", &b);
            printf("Zahl 2: %f\n", b);
            c = a * b;
            printf("Das Ergebnis ist: %f", c);
        }
        else
            printf("%c ist ein falscher Input!", Input);
        
    } while (Input != 'K');

    printf("Programm Stop");
    return 0;
}

Проблема в том, что функция else также печатается после успешного выполнения вычисления. Это результат:

Herzlich Wilkommen,
Was moechten sie tun?
 Fuer Addition A
 Fuer Subtraktion S
 Fuer Division D
 Fuer Multiplikation M
 Zum Beenden K druecken!
 Eingabe:A
Geben sie Zahl 1 an:12
Zahl 1: 12.000000
Geben sie Zahl 2 an:12
Zahl 2: 12.000000
Das Ergebnis ist: 24.000000

A ist ein falscher Input!

Was moechten sie tun?
 Fuer Addition A
 Fuer Subtraktion S
 Fuer Division D
 Fuer Multiplikation M
 Zum Beenden K druecken!
 Eingabe:

Я имею в виду строку, в которой говорится: «A ist ein falscher Input». Почему он выводит эту строку? Похоже, программа думает, что A все еще находится на входе, что для меня было бы логично. Но почему он не выводит функцию с условием «А»? Я надеюсь, что вы могли понять, в чем моя проблема, так как английский не мой родной язык! Спасибо

-1
Brachialis 4 Фев 2022 в 00:27
2
Используйте if/else if/else if/.../else. В противном случае else применяется только к последнему if.
 – 
Johnny Mopp
4 Фев 2022 в 00:29
Вы должны использовать else if вместо нескольких операторов if.
 – 
h0r53
4 Фев 2022 в 00:30
Пробел перед %f в вызовах scanf() не нужен, потому что %f не соответствует пробелу, как %s или %c. В этом случае более уместным будет switch`case` на Input.
 – 
Clifford
4 Фев 2022 в 00:40

4 ответа

Лучший ответ

У вас есть 3 отдельных оператора if:

    if (Input == 'A')
    {
       ...
    }
    if (Input == 'S')
    {
       ...
    }
    if (Input == 'M')
    {
       ...
    }

Далее следует if/else:

    if (Input == 'D')
    {
       ...
    }
    else
        printf("%c ist ein falscher Input!", Input);

Таким образом, часть else здесь будет работать, если Input не является "D".

Вы хотите объединить отдельные операторы if в if/else:

    if (Input == 'A')
    {
       ...
    }
    else if (Input == 'S')
    {
       ...
    }
    else if (Input == 'M')
    {
       ...
    }
    else if (Input == 'D')
    {
       ...
    }
    else
        printf("%c ist ein falscher Input!", Input);

Таким образом, будет выполняться только одно из условий.

3
dbush 4 Фев 2022 в 00:32
        if (Input == 'D')  //Only this 'if' match next 'else'.
        {
            printf("Geben sie Zahl 1 an:");
            scanf(" %f", &a);
            printf("Zahl 1: %f\n", a);
            printf("Geben sie Zahl 2 an:");
            scanf(" %f", &b);
            printf("Zahl 2: %f\n", b);
            c = a * b;
            printf("Das Ergebnis ist: %f", c);
        }
        else
            printf("%c ist ein falscher Input!", Input);

Замените эту логику на switch/case

0
navylover 4 Фев 2022 в 00:32
Хотя это вариант, на самом деле это не ответ на их вопрос. switch может быть более ясным по смыслу, но также может оказаться более запутанным, и это не показывает им, почему то, что они ожидают, не работает. Этот ответ также ничего не делает, чтобы показать, как они могут это сделать.
 – 
Thomas Jager
4 Фев 2022 в 00:36

С этим кодом

if (Input == 'D')
{
    /* */
}
else
    printf("%c ist ein falscher Input!", Input);

Вы получите сообщение для всего, кроме 'D'.
Как уже упоминалось в комментариях, вам нужно иметь цепочку

if(){}
else if(){}
else if(){}
else
{}

Так что условие на «D» проверяется только в том случае, если все остальные уже не сработали, а последний else используется только в том случае, если ни «D», ни что-либо до этого не соответствует.

0
Yunnosch 4 Фев 2022 в 00:33

Вам нужно выучить switch ... case, что подходит для этого гораздо больше.

int main(void)
{
    float a;
    float b;
    float c;
    char Input;
    int valid = 0;

    printf("Herzlich Wilkommen, ");

    do
    {
        printf(" \nWas moechten sie tun?\n Fuer Addition A \n Fuer Subtraktion S \n Fuer Division D \n Fuer Multiplikation M\n");
        printf(" Zum Beenden 0 druecken!\n");
        printf(" Eingabe:");
        scanf(" %c", &Input);

        valid = 1;

        switch(Input)
        {
            case 'A':
                c = a + b;
                break;
            case 'S':
                c = a - b;
                break;
            case 'M':
                c = a / b;
                break;
            case 'D':
                c = a * b;
                break;
            default: 
                valid = 0;
                printf("%c ist ein falscher Input!", Input);
                break;
        }

        if(valid)
        {
            printf("Geben sie Zahl 1 an:");
            scanf(" %f", &a);
            printf("Zahl 1: %f\n", a);
            printf("Geben sie Zahl 2 an:");
            scanf(" %f", &b);
            printf("Zahl 2: %f\n", b);
            printf("Das Ergebnis ist: %f\n", c);

        }
   } while (Input != 'K');

    printf("Programm Stop");
    return 0;
}
0
0___________ 4 Фев 2022 в 01:40