【问题标题】:error somewhere in if and else statementsif 和 else 语句中的某处错误
【发布时间】:2020-10-02 22:53:07
【问题描述】:

大部分都可以正常工作,但是,我注意到如果我尝试添加一个负整数,就会发生这种情况:

正确的输出行是: 请输入两个整数:负一+三=二 你的程序打印了这一行: 请输入两个整数:负三=二

我的“printf 否定”if 语句之后的 ifs 出于某种原因没有打印?

#include <stdio.h>

int main(void)  {
    int numOne;
    int numTwo; 
    printf("Please enter two integers:");
    scanf("%d%d", &numOne, &numTwo); 


    if (numOne >= -10 && numOne < 0) {
        printf("negative");    
    }
    if (numOne == 0) {
        printf("zero + ");
    }
    if (numOne == 1) {
        printf("one + ");
    }
    if (numOne == 2) {
        printf("two + ");
    }
    if (numOne == 3) {
        printf("three + ");
    }
    if (numOne == 4) {
        printf("four + ");
    }
    if (numOne == 5) {
        printf("five + ");
    }
    if (numOne == 6) {
        printf("six + ");
    }
    if (numOne == 7) {
        printf("seven + ");
    }
    if (numOne == 8) {
        printf("eight + ");
    }
    if (numOne == 9) {
        printf("nine + ");
    }
    if (numOne == 10) {
        printf("ten + ");
    } else if (numOne > 10 || numOne < -10) {
        printf("%d + ", numOne);
    }

    if (numTwo >= -10 && numTwo < 0) {
        printf("negative");    
    }
    if (numTwo == 0) {
        printf("zero");
    }
    if (numTwo == 1) {
        printf("one");
    }
    if (numTwo == 2) {
        printf("two");
    }
    if (numTwo == 3) {
        printf("three");
    }
    if (numTwo == 4) {
        printf("four");
    }
    if (numTwo == 5) {
        printf("five");
    }
    if (numTwo == 6) {
        printf("six");
    }
    if (numTwo == 7) {
        printf("seven");
    }
    if (numTwo == 8) {
        printf("eight");
    }
    if (numTwo == 9) {
        printf("nine");
    }
    if (numTwo == 10) {
        printf("ten");
    } else if (numTwo > 10 || numTwo < -10) {
        printf("%d = ", numTwo);
    }

    int total = numOne + numTwo;
    if (total >= -10 && total < 0) {
        printf(" = negative");    
    }
    if (total == 0) {
        printf(" = zero\n");
    }
    if (total == 1) {
        printf(" = one\n");
    }
    if (total == 2) {
        printf(" = two\n");
    }
    if (total == 3) {
        printf(" = three\n");
    }
    if (total == 4) {
        printf(" = four\n");
    }
    if (total == 5) {
        printf(" = five\n");
    }
    if (total == 6) {
        printf(" = six\n");
    }
    if (total == 7) {
        printf(" = seven\n");
    }
    if (total == 8) {
        printf(" = eight\n");
    }
    if (total == 9) {
        printf(" = nine\n");
    }
    if (total == 10) {
        printf(" = ten\n");
    } else if (total > 10 || total < -10) {
        printf(" = %d\n", total);
    }


    return 0;
}

【问题讨论】:

  • 如果数字为负数,您需要在第一个 if 内将其更改为正数,以使其余代码正常工作。
  • 并传递自动标记:printf("negative") 在字符串末尾需要一个空格。
  • : 0 aa 那是一个非常有效的修复方法!!

标签: c if-statement


【解决方案1】:

这是因为您捕获了一个负数(插入“负数”),然后只检查数字1..10 以输出幅度。

最简单的解决方法可能是改变:

if (numOne == 1) {
    printf("one + ");
}

进入:

if (numOne == 1 || numOne == -1) {
    printf("one + ");
}

当然,其他的也一样。


或者,或者,您可以大大使用以下功能降低复杂性:

void outputNum(char *pre, int num, char *post) {
    static const char* lookup[] = { "zero", "one", "two", "three",
        "four", "five", "six", "seven", "eight", "nine", "ten" };
    if (num < -10 || num > 10) {
        printf("%s%d%s", pre, num, post);
    } else {
        if (num < 0)
            printf("%snegative %s%s", pre, lookup[-num], post);
        else
            printf("%s%s%s", pre, lookup[num], post);
    }
}

只需简单地调用它:

outputNum("Adding ", num1, "");
outputNum(" and ", num2, "");
outputNum(" gives you ", num1 + num2, "\n");

【讨论】:

    【解决方案2】:

    当变量为负数时,您可以更改变量的符号。喜欢:

    if (numOne >= -10 && numOne < 0) {
        printf("negative");    
        numOne = -numOne;
    }
    

    那么剩下的代码只需要处理正值即可。

    它要求您重新组织一些其他代码。比如这个:

    int total = numOne + numTwo;
    

    必须移动,以便在 scanf 之后完成

    还可以考虑使用字符串数组而不是所有if 语句。 喜欢:

    char numberToText[11][10] = {"zero", "one", "two", ... , "ten"};
    

    那你就可以了

    if (numOne < -10 || numOne  > 10)
    {
        // special handling
    }
    else
    {
        if (numOne < 0) numOne = -numOne;   // Change sign if negative
        printf("%s", numberToText[numOne]);
    }
    

    如果您不想更改numOne 的值,只需使用另一个变量即可:

    if (numOne < -10 || numOne  > 10)
    {
        // special handling
    }
    else
    {
        int tmp = numOne;        // Copy to another variable and
        if (tmp < 0) tmp = -tmp; // make sure it's positive
    
        printf("%s", numberToText[tmp]);   // Use tmp as index
    }
    

    【讨论】:

    • 我很好奇你为什么使用char numberToText[11][10] = ... - 没有理由在任何时候更改这些数据,而且如果你可以只使用char *numberToText[] = ...,这似乎很浪费
    • 实际上,我认为与 KISS 的 相反 一样,如果值发生变化(例如使用不同的语言),您指定的内容是完全不必要且容易出错的)。使用 C 自动调整大小和字符串文字实际上更简单。你可能想稍微缓和一下这些指控,我敢肯定其他 1200 万左右的成员中的任何一个都可能对你投了反对票。除非你真的以非讽刺的方式感谢我,在这种情况下,也许我应该获得荣誉并接受荣誉 :-) 事实上,如果你能摆脱它,我什至可能会赞成你……
    • 但可能不是,因为您几乎没有采取任何措施来缓解真正的问题,if 语句的相当长的序列,最好作为数据驱动的东西来完成。哦,是的,还有毫无根据的指责 :-) 不是说你的答案是错误,因为你解决了眼前的问题。然而,我更喜欢将教育作为过程的一部分。并不总能为我赢得声望,但它很有用,我相信。
    猜你喜欢
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    相关资源
    最近更新 更多