Heineken Virus C 程序(如果在我的代码中,如何简化和丢弃 else)

计算科学 C
2021-12-22 02:12:50

所以我有一个关于简化我的 C 代码的问题,这是一个问题:喜力病毒正在克罗地亚和世界各地流行。国家民防总部计划出台保护措施,从周日午夜开始生效,它们是:

如果外面阳光充足且无风,最多可以聚集 5 人,因为在这种情况下病毒很容易传播。如果外面阳光明媚但刮风,最多可以聚集15人,因为病毒更难传播,因为风把它从一群人身上吹走(如果有人碰巧有喜力) . 如果在外面下雨,最多可以聚集 10 人,因为雨会将病毒收集在落到地板上的飞沫中,但也有可能从地板上弹起,一个人吸入它们,然而有感染的可能。如果外面在下雨,风在吹,那是不可能聚集的,因为反正外面天气不好。

编写一个程序,帮助人们知道如何在这种混乱中表现。您的程序接收一个三位数形式的编码输入参数,该参数指示外面的天气情况,并打印出在这种情况下允许聚集的人数。

一个正确编码的数字可能包含 [0, 3] 范围内的值:

0 - 无信息 1 - 晴天 2 - 在下雨 3 - 风在吹

如果数字: 不包含定义范围内的代码数字 多次包含相同的代码数字(可能出现多次的数字 0 除外) 包含非代码数字(除 0、1、2 和3) 包含编码的数字,但未定义这些天气条件下的程序(例如,晴天和下雨)。

我写的尾声如下:

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

int main() {

    int y[3];
    int a, b, c;


    scanf("%1d%1d%1d", y, y + 1, y + 2);

    a = y[0];
    b = y[1];
    c = y[2];

    if (a > 3 || b > 3 || c > 3) {
        printf("Invalid entry!\n");
    }
    else if (a == 1 && b == 0 && c == 0) {
        printf("Maximum 5!\n");
    }
    else if (a == 0 && b == 1 && c == 0) {
        printf("Maximum 5!\n");
    }
    else if (a == 0 && b == 0 && c == 1) {
        printf("Maximum 5!\n");
    }
    else if (a == 1 && b == 1 && c == 1) {
        printf("Invalid entry!\n");
    }
    else if (a == 1 && b == 1 && c == 0) {
        printf("Invalid entry!\n");
    }
    else if (a == 1 && b == 0 && c == 1) {
        printf("Invalid entry!\n");
    }
    else if (a == 1 && b == 2 && c == 0) {
        printf("Invalid entry!\n");
    }
    else if (a == 1 && b == 2 && c == 3) {
        printf("Invalid entry!\n");
    }
    else if (a == 2 && b == 1 && c == 0) {
        printf("Invalid entry!\n");
    }
    else if (a == 2 && b == 1 && c == 3) {
        printf("Invalid entry!\n");
    }
    else if (a == 3 && b == 1 && c == 2) {
        printf("Invalid entry!\n");
    }
    else if (a == 3 && b == 0 && c == 1) {
        printf("Invalid entry!\n");
    }
    else if (a == 1 && b == 3 && c == 0) {
        printf("Maximum 15!\n");
    }
    else if (a == 1 && b == 0 && c == 3) {
        printf("Maximum 15!\n");
    }
    else if (a == 0 && b == 1 && c == 3) {
        printf("Maximum 15!\n");
    }
    else if (a == 3 && b == 1 && c == 0) {
        printf("Maximum 15!\n");
    }
    else if (a == 3 && b == 0 && c == 1) {
        printf("Maximum 15!\n");
    }
    else if (a == 0 && b == 2 && c == 3) {
        printf("Not possible to gather!\n");
    }
    else if (a == 0 && b == 3 && c == 2) {
        printf("Not possible to gather!\n");
    }
    else if (a == 2 && b == 0 && c == 3) {
        printf("Not possible to gather!\n");
    }
    else if (a == 2 && b == 3 && c == 0) {
        printf("Not possible to gather!\n");
    }
    else if (a == 3 && b == 0 && c == 2) {
        printf("Not possible to gather!\n");
    }
    else if (a == 3 && b == 2 && c == 0) {
        printf("Not possible to gather!\n");
    }
    else if (a == 0 && b == 0 && c == 0) {
        printf("Invalid entry!\n");
    }


    return 0;
}

那么,是否有更简单的方法来编写代码而不使用 else if 循环的每种可能组合?提前致谢 :)

1个回答

使用您编写它的方式,在其中枚举所有可能的状态(尽管看起来您仍然缺少一些),您可以先执行有效案例,然后将无效分组到最终的 else 语句中。这将减少针对特定无效状态的大量测试。

要改变您的方法,您可以存储无信息、晴天、下雨和有风的计数,而不是存储 a、b、c。代码中元素的顺序无关紧要,重要的是数量,因此这应该会导致更少和更简单的 else-if 测试。