【问题标题】:"while()" function?“while()”函数?
【发布时间】:2015-02-11 18:59:30
【问题描述】:

这个程序应该将华氏度转换为摄氏度:

#include <stdio.h>
int main() {
    float fahrenheit, celsius;
    int max, min, step;

    max = 100;
    min = 0;
    step = 5;

    fahrenheit = 0.0;
    //celsius = (fahrenheit - 32.0) * 5.0/9.0; DOESN'T WORK HERE

    printf("\n");
    printf("This program converts fahrenheit into celsius \n");

    while(fahrenheit <= max) {
        celsius = (fahrenheit - 32.0) * 5.0/9.0; /* Works here */
        printf("%3.0f %6.2f\n", fahrenheit, celsius);
        fahrenheit = fahrenheit + step;
    }
}

正如我在源 cmets 中所指出的,当我尝试将摄氏公式放入 main() 函数的主体时,每个华氏值都会得到 -17.8。输出看起来像这样 -

0 -17.78
5 -17.78
10 -17.78
15 -17.78
20 -17.78
25 -17.78

等等等等。但是,当我将摄氏公式放入 while() 函数时,我得到每个华氏值的正确摄氏值。它看起来像这样:

0 -17.78
5 -15.00
10 -12.22
15  -9.44
20  -6.67

为什么会这样?

这是不起作用的代码。它与上面的代码相同,除了摄氏度公式的位置。 (至少,我认为是。)

#include <stdio.h>
//this program is supposed to convert fahrenheit into celsius 
int main() {
    float fahrenheit, celsius;
    int max, min, step;

    max = 100;
    min = 0;
    step = 5;

    fahrenheit = 0.0;
    celsius = (fahrenheit - 32.0) * 5.0/9.0; 

    printf("\n");
    printf("This program converts fahrenheit into celsius \n");

    while(fahrenheit <= max) {
        printf("%3.0f %6.2f\n", fahrenheit, celsius);
        fahrenheit = fahrenheit + step;
    }
}

【问题讨论】:

  • while 不是函数;它是指定特定类型语句的关键字。您问题中的代码可以正常工作。我们需要查看不起作用的代码
  • @KeithThompson 他提供了不起作用的代码:相同的代码,但转换代码移出循环。
  • @FUZxxl:是的,他在我发表评论后编辑了问题。
  • 该代码不起作用是因为仅对华氏温度的一个值执行计算,特别是当它等于 0 时。鉴于您的 cmets 和代码,我的建议是花一点学习C语言的时间

标签: c while-loop


【解决方案1】:

当您为变量设置值时,会计算实际值,然后将其存储到变量中。但是,您确实存储变量的公式。因此,当您运行时

celsius = (fahrenheit - 32.0) * 5.0/9.0;

while 循环之外,它使用fahrenheit 的当前值(即0.0),并计算celsius 的值,即-17.78。

while 循环内部,虽然fahrenheit 发生了变化,但celsius 不会,因为while 循环内部没有任何语句可以实际更改变量的值。这就是为什么您必须将语句移动到 while 循环中,以确保每次 fahrenheit 值更改时 celsius 值都会更新。

【讨论】:

    【解决方案2】:

    当您转换单个值时,您不能期望 fahrenheit 的值会在循环外发生变化:

    (-32.0) * 5.0/9.0 = -17.8 (every time)
    

    改变值的唯一情况是你改变fahrenheit 本身的值。在循环之外。那不会发生。

    此外,将intfloat 进行比较绝不是一个好主意。原因是以 IEEE-754 单精度浮点格式存储的浮点数不是为存储提供的值的精确表示。 (例如 32.2 并不像 32.2 那样以浮点格式存储)虽然您可以进行相对比较:

    while(fahrenheit <= max) 
    

    最好的做法是:

    int i = 0;
    for (i = 0; i < max; i+=5) {
        fahrenheit += (float)i;
        celsius = (fahrenheit - 32.0) * 5.0/9.0;
    ...
    

    您正在循环内更改fahrenheit,然后您可以预期celsius 的值会相应更改。

    关于浮点比较,您需要阅读The Floating-Point Guide - What Every Programmer Should Know ...。问题是你没有比较你认为的自己。

    【讨论】:

    • 这应该是一条评论
    • C 无论如何都会在(i - 32.0) 中将i 转换为浮点数。
    • 当浮点数表示整数时,将浮点数与整数进行比较也没有什么坏处,因为它可以准确地表示数字。
    • 更重要的是,这并没有回答 OP 的问题,即如果计算在循环之外,为什么他会得到相同的值。
    • float 是准确的,int 是准确的。某些运算不能提供完全相同的数学结果。 7/3, 7.0/3.0
    【解决方案3】:

    那是因为 while 是一个循环,用来重复一段代码。

    如果您将celsius = (fahrenheit - 32.0) * 5.0/9.0; /* Works here */ 放在while 块之外,它将只迭代一次(它将在华氏= 0.0 时),但是如果您将celsius = (fahrenheit - 32.0) * 5.0/9.0; /* Works here */ 放在while 块中,则摄氏将其值更改为华氏度确实如此,而条件fahrenheit &lt;= max 为真。

    【讨论】:

    • bucle 是什么意思?
    • 意思是loop...我还以为英文也可以说bucle,我错了。
    • 次要问题:循环仍会从 0 到 100 华氏度进行迭代,而不仅仅是一次,它只是不会打印不同的结果
    【解决方案4】:

    代码:

    celsius = (fahrenheit - 32.0) * 5.0/9.0;
    

    (fahrenheit - 32.0) * 5.0/9.0分配变量celsius

    在 while 循环外调用代码时,华氏度为 0,因此摄氏度变为 -17.78

    如果将代码放在 while 循环中,它会在每次 while 块循环时重新分配摄氏度。华氏温度在此循环内发生变化,因此每次执行 while 循环时,如果您在 while 循环内使用 celsius = (fahrenheit - 32.0) * 5.0/9.0; 重新分配摄氏度,华氏温度和摄氏度都会有所不同。

    【讨论】:

      【解决方案5】:

      欢迎来到 SO。您将掌握每种编程语言中存在的基本流控制语句之一。

      基本上,任何计算机程序都是一系列指令,您可以设想计算机从页面顶部到底部一次执行一条指令。

      从逻辑上讲,这意味着每条指令只执行一次,除非有办法告诉程序“倒退”并再次执行某些操作。这就是while 语句(它不是函数)的作用。在英语中,while 语句(通常称为while loop)会执行类似的操作

      if a condition is true
          execute some instructions
          go back and check the condition and keep looping
      else 
          continue after the loop
      

      因此,您的主循环有一组只执行一次的语句(while 之前的所有内容)。

      然后,while 循环中的语句会重复,fahrenheit 在循环中每次都取一个不同的值:0、5、10、15、...、95、100。当你添加 5 时,最后一个此时,fahrenheit 的值为 105,因此程序退出循环并继续(在这种情况下,结束 main() 函数并退出程序。

      如果您在循环外有 celsius 计算,则它只会发生一次。然后每次通过循环它都会打印出您计算的值 - 即使fahrenheit 不断变化。

      当您在 while 循环内移动计算时,celsius 会在每次通过循环时重新计算,使用 fahrenheit 的新值,从而产生不同的结果。

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-03
        • 2021-01-14
        • 1970-01-01
        • 2021-08-25
        • 2023-03-16
        • 2013-12-22
        • 2012-01-12
        • 2014-12-22
        相关资源
        最近更新 更多