如何写一个C程序来寻找最大值之间的三个数字使用开关语句?

3npbholx  于 2023-06-28  发布在  其他
关注(0)|答案(2)|浏览(68)
#include <stdio.h>

int main()
{
    int num1, num2, num3;
    printf("Enter three integers to find maximum: \n");
    scanf("%d%d%d", num1, num2, num3);
    switch (num1 > num2)
    {
        switch (num1 > num3)
        {
        case 1:
            printf("%d is maximum", num1);
            break;
            switch (num2 > num1)
            {
                switch (num2 > num3)
                {
                case 1:
                    printf("%d is maximum", num2);
                    break;
                default:
                    printf("%d is maximum", num3);
                }
            }
        }
    }
}

这是我在VS Code中编写的switch语句程序,用于查找3个数字之间的最大值,但它不起作用。我声明了3个变量num1num2num3,然后我将num1num2num3进行比较,类似地,num2num1num3num3default中。
我们可以写3个数字之间的最大值吗?

cfh9epnr

cfh9epnr1#

对于初学者,scanf调用的参数

scanf("%d%d%d", num1, num2, num3);

是不正确的。你需要写

scanf("%d%d%d", &num1, &num2, &num3);

一般来说,您应该检查输入是否成功,例如

if ( scanf("%d%d%d", &num1, &num2, &num3) == 3 )
{
    //...
}
else
{
    //...
}

其次,用户可以输入至少两个彼此相等的数字,它们大于第三个数字。你得考虑到这点。
为了使编写switch语句更简单,使用if语句执行任务将是有用的。他们可以看下面的方式

if (!( num1 < num2 ) && !( num1 < num3 ))
    {
        printf( "%d is maximum\n", num1 );
    }
    else if ( !( num2 < num3 ) )
    {
        printf( "%d is maximum\n", num2 );
    }
    else
    {
        printf( "%d is maximum\n", num3 );
    }

所以现在使用switch语句重写if语句并不困难。他们可以看下面的方式

switch (!( num1 < num2 ) && !( num1 < num3 ))
    {
    case 1:
        printf( "%d is maximum\n", num1 );
        break;

    case 0:
        switch (!( num2 < num3 ))
        {
        case 1:
            printf( "%d is maximum\n", num2 );
            break;

        case 0:
            printf( "%d is maximum\n", num3 );
            break;
        }
    }

在case标签中不使用常量01,而可以通过包含头<stdbool.h>来使用命名常量falsetrue,例如

#include <stdbool.h>

//...

    switch (!( num1 < num2 ) && !( num1 < num3 ))
    {
    case true:
        printf( "%d is maximum\n", num1 );
        break;

    case false:
        switch (!( num2 < num3 ))
        {
        case true:
            printf( "%d is maximum\n", num2 );
            break;

        case false:
            printf( "%d is maximum\n", num3 );
            break;
        }
    }

当然,还有其他方法来编写switch语句,但这种方法已经足够清楚了。
这是一个演示程序。

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

int main( void )
{
    int num1, num2, num3;

    printf( "Enter three integers to find maximum: " );
    scanf( "%d%d%d", &num1, &num2, &num3 );

    if (!( num1 < num2 ) && !( num1 < num3 ))
    {
        printf( "%d is maximum\n", num1 );
    }
    else if ( !( num2 < num3 ) )
    {
        printf( "%d is maximum\n", num2 );
    }
    else
    {
        printf( "%d is maximum\n", num3 );
    }

    switch (!( num1 < num2 ) && !( num1 < num3 ))
    {
    case true:
        printf( "%d is maximum\n", num1 );
        break;

    case false:
        switch (!( num2 < num3 ))
        {
        case true:
            printf( "%d is maximum\n", num2 );
            break;

        case false:
            printf( "%d is maximum\n", num3 );
            break;
        }
    }
}

它的输出可能看起来像

Enter three integers to find maximum: 3 2 3
3 is maximum
3 is maximum

演示程序中包含if语句只是为了表明使用if语句和switch语句的结果是相同的。当然,在你的程序中,你应该删除if语句。

rjee0c15

rjee0c152#

switch语句体中缺少casedefault子句。
还要注意,你必须将目标变量的地址传递给scanf(),并且你应该测试这个scanf成功地转换了3个整数:它返回成功转换的次数。
以下是修改后的版本:

#include <stdio.h>

int main(void) {
    int num1, num2, num3;

    printf("Enter three integers to find maximum: \n");

    if (scanf("%d%d%d", &num1, &num2, &num3) != 3) {
        printf("invalid input\n");
        return 1;
    }

    switch (num1 > num2) {
    case 1:
        switch (num1 > num3) {
        case 1:
            printf("%d is maximum\n", num1);
            break;
        default:
            printf("%d is maximum\n", num3);
            break;
        }
    default:
        switch (num2 > num3) {
        case 1:
            printf("%d is maximum\n", num2);
            break;
        default:
            printf("%d is maximum\n", num3);
            break;
        }
    }
    return 0;
}

下面是一个使用单个switch语句的替代方案:

#include <stdio.h>

int main(void) {
    int num1, num2, num3;

    printf("Enter three integers to find maximum: \n");

    if (scanf("%d%d%d", &num1, &num2, &num3) != 3) {
        printf("invalid input\n");
        return 1;
    }

    switch ((num1 >= num2) + 2 * (num1 >= num3) + 4 * (num2 >= num3)) {
    case 3:
    case 7:
        printf("%d is maximum\n", num1);
        break;
    case 4:
    case 6:
        printf("%d is maximum\n", num2);
        break;
    case 0:
    case 1:
        printf("%d is maximum\n", num3);
        break;
    default:
        printf("CPU is broken\n");
        break;
    }
    return 0;
}

最后,滥用规则,这里是一个简化的版本,仍然使用switch语句,很容易扩展到更大的数字集:

#include <stdio.h>

int main(void) {
    int num1, num2, num3, max;

    printf("Enter three integers to find maximum: \n");

    if (scanf("%d%d%d", &num1, &num2, &num3) != 3) {
        printf("invalid input\n");
        return 1;
    }

    switch (max = num1,
            max = (max >= num2) * max + (max < num2) * num2,
            max = (max >= num3) * max + (max < num3) * num3)
    {
    default:
        printf("%d is maximum\n", max);
        break;
    }
    return 0;
}

为了完整起见,上面的switch语句可以重写为空体:

switch (max = num1,
            max = (max >= num2) * max + (max < num2) * num2,
            max = (max >= num3) * max + (max < num3) * num3)
        /* empty body */;

    printf("%d is maximum\n", max);

相关问题