【问题标题】:The code seems to have a logic error but when I run it works the way I would like代码似乎有一个逻辑错误,但是当我运行它时,它以我想要的方式工作
【发布时间】:2021-06-21 18:16:55
【问题描述】:

我尝试将摄氏度转换为华氏和开尔文转换器,但在程序要求用户输入关于要进行哪种转换的部分似乎存在逻辑错误。

#include <stdio.h>
#include <stdlib.h>
#define Fx 1.8
#define Fy 32
#define Kx 273.15
int main(){
    double c;
    double f;
    int choice;
    printf("Convert Celsius to:\n[1] Fahrenheit\n[2] Kelvin\n");
    do{
        printf("Choose: ");
        scanf("%i", &choice);
    }while(choice != 1 && choice != 2); 
    if (choice == 1){
        printf("°C = ");
        scanf("%lf", &c);
        f = c * Fx + Fy;
        printf("°F = %f\n", f);
    }
    else{
        printf("°C = ");
        scanf("%lf", &c);
        printf("°K = %lf\n", c + Kx);
    }

   
    return 0;
}

在while(choice != 1 &amp;&amp; choice != 2); 部分应该有一个逻辑错误。运算符检查选择是否不同于 1 和 2。如果用户输入为 1,则运算符应该为 false 和 true 并重新运行查询,但它会正常执行。应该有一个问题并一遍又一遍地运行相同的问题,但事实并非如此。当我使用布尔运算符|| 时,问题的重复发生了。我想知道这里发生了什么。

【问题讨论】:

  • 不是 AND 工作方式。
  • 所以...?当条件为真时,循环正在执行。当输入为1时,如你所说为假。
  • 假设,“如果 Luiz 不是大象并且 Luiz 不是长颈鹿,我们会这样做。”现在,你不是大象,也不是长颈鹿,所以我们不这样做。
  • 但是现在改变一下:“如果 Luiz 不是人类并且 Luiz 不是长颈鹿,我们会这样做。”现在,你不是长颈鹿,但你是人,所以我们会做的。
  • 所以只需要满足其中一个条件吗?

标签: c logic


【解决方案1】:

while(choice != 1 &amp;&amp; choice != 2);部分没有逻辑错误。

当输入1时,choice != 1为假,所以条件为假,循环结束。

当输入2时,choice != 1为真,而choice != 2为假,所以条件也为假,循环结束。

当输入3时,choice != 1和choice != 2都为真,所以条件为真,循环继续。

但是,您的代码有一个问题:您没有检查scanf() 的返回值。例如,当先输入3,然后输入a,则a 不是%i 的有效输入,它不会被消费。 choice 仍然是 3 并且循环无限进行。

【讨论】:

  • 我通过输入 A 对其进行了测试,它实际上一直在无限运行。谢谢你的警告。
【解决方案2】:

您想要的是将choice 设为1 或2。所以,你会很好,如果

(choice == 1) || (choice == 2)

这意味着如果它的否定为真,你想进入循环,或者

!((choice == 1) || (choice == 2))

只要应用德摩根定律,你就会得到

( !(choice == 1) && !(choice == 2) )

或

((choice != 1) && (choice != 2))

这表明你所拥有的不是错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 2020-01-20
    • 2018-12-09
    • 2021-08-26
    相关资源
    最近更新 更多