переключить регистр, чтобы найти максимум или равен в c не работает - PullRequest
0 голосов
/ 10 февраля 2020

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

#include <stdio.h>

void main()
{
    int num1,num2;
    printf("Enter two numbers:");
    scanf("%d%d",&num1,&num2);
    switch(num1 > num2)
    {
        case 0:
            printf("Number1 is greater than Number2");
            break;
        case 1:
            printf("Number2 is greater than Number1");
            break;

    }
    switch(num1 == num2)
    {
        case 0:
            printf("Number1 is equal to Number2");
            break;
        case 1:
            printf("Number1 is not equal to Number2");
            break;
    }
}

Ответы [ 4 ]

1 голос
/ 10 февраля 2020

Используйте следующий подход

switch( ( num2 < num1 ) - ( num1 < num2 ) )
{
    case -1:
        puts( "Number2 is greater than Number1" );
        break;
    case 0:
        puts( "Number1 is equal to Number2" );
        break;
    case 1:
        puts( "Number1 is greater than Number2" );
        break;
}

Вот демонстрационная программа.

#include <stdio.h>

int main(void) 
{
    int num1 = 0, num2 = 0;

    printf( "Enter two numbers: " );
    scanf( "%d%d", &num1, &num2 );

    switch( ( num2 < num1 ) - ( num1 < num2 ) )
    {
    case -1:
        puts( "Number2 is greater than Number1" );
        break;
    case 0:
        puts( "Number1 is equal to Number2" );
        break;
    case 1:
        puts( "Number1 is greater than Number2" );
        break;
    }

    return 0;
}

Ее вывод может выглядеть, например, как

Enter two numbers: 10 20
Number2 is greater than Number1

Это лучший подход среди всех остальных, показанных здесь. :) Он использует только один оператор switch.

1 голос
/ 10 февраля 2020

Когда числа равны, num1 > num2 будет ложным, поэтому вы go попадете в первый случай первого переключателя, который неправильно утверждает, что num2 > num1. Существует три варианта, но это условие может вернуть только 2 разных результата.

Вам нужно вкладывать их, а не делать их последовательно.

switch (num1 == num2) {
case 1:
    printf("Number1 is equal to Number2");
    break;
case 0:
    switch (num1 > num2) {
    case 1:
        printf("Number1 is greater than Number2");
        break;
    case 0:
        printf("Number2 is greater than Number1");
        break;
    }
    printf("Number1 is not equal to Number1");
    break;
}
0 голосов
/ 10 февраля 2020

Вы сделали одну ошибку в логах c, во втором случае коммутатора num1 и num2 оба имеют одинаковое значение, тогда они тогда выводят num1 == num2 будет 1, и если оба имеют разные значения, это будет return 0. Таким образом, вам также нужно изменить оператор print1 для второго регистра переключателя.

Ваш полнофункциональный код находится здесь:

#include <stdio.h>

int main()
{
    int num1,num2;
    printf("Enter two numbers:");
    scanf("%d%d",&num1,&num2);
    switch(num1 > num2)
    {
        case 0:
            printf("Number1 is greater than Number2");
            break;
        case 1:
            printf("Number2 is greater than Number1");
            break;
    }

    switch(num1 == num2)
    {
        case 0:
            printf("Number1 is not equal to Number2");
            break;
        case 1:
            printf("Number1 is equal to Number2");
            break;
    }

    return 0;
}
0 голосов
/ 10 февраля 2020

Возможно, вам необходимо проверить, не отсканировал ли ваш scanf.

int main()
{
    int num1,num2;
    printf("Enter two numbers:");
    if(scanf("%d,%d",&num1,&num2) == 2)
    {
        switch(num1 > num2)
        {
            case 0:
                printf("Number1 is greater than Number2");
                break;
            case 1:
                printf("Number2 is greater than Number1");
                break;

        }
        switch(num1 == num2)
        {
            case 0:
                printf("Number1 is equal to Number2");
                break;
            case 1:
                printf("Number1 is not equal to Number2");
                break;
        }
    }
    else
    {
        printf("Scanf failed!!!\n");
    }
}

Обычно при тестировании некоторых идей лучше избегать ввода данных пользователем.

int main()
{
    int num1,num2;
    for(int index =0; index < 50; index++)
    {
        num1 = rand() % 50;
        num2 = rand() % 50;

        printf("Numbers : %d, %d - ", num1, num2);
        switch(num1 > num2)
        {
            case 1:
                printf("Number1 is greater than Number2\n");
                break;
            case 0:
                printf("Number2 is greater than Number1\n");
                break;

        }
        switch(num1 == num2)
        {
            case 1:
                printf("Number1 is equal to Number2\n");
                break;
            case 0:
                printf("Number1 is not equal to Number2\n");
                break;
        }
    }
}

Тогда легко заметить, что 1 и 0 необходимо поменять местами, так как ноль означает ложь, а 1 true;

    switch(num1 > num2)
    {
        case 0:
            printf("Number1 is greater than Number2");

Так что, если num1 > num2 - истина, то результатом этого логического выражения будет 1, а не ноль

Но у вас также есть много других логических ошибок (не совсем программирование - просто простая логика c). Если num1> num2 id не true, это означает, что num2 больше, чем num1. Это также может быть равно;

Таким образом, вы должны изменить текст в переключателе на:

        case 0:
            printf("Number2 is greater than Number1 or they are equal\n");
            break;
...