【问题标题】:What is the difference between these two programs which compute triangular numbers?这两个计算三角数的程序有什么区别?
【发布时间】:2016-08-01 20:59:44
【问题描述】:

这两个代码都可以编译,但只有第二个代码可以满足我的要求。 第一个代码:

#include <stdio.h>
#include <cs50.h>
#include <math.h>

int main()

  {
    int TriNumber = 0;
    int n;

       for(n = 5;  n <= 50; n += 5)
       TriNumber = ((n + 1) * n) / 2;

        printf("The trianglular number of %d is %d\n", n, TriNumber);

   }

哪些输出:

55的三角形数是1275

下面的程序做我想做的事:它为 5 到 50 之间的每五个整数打印一个三角数。

#include <stdio.h>
#include <cs50.h>
#include <math.h>

int main()

{
   int TriNumber = 0;
   int n;

    for(n = 5;  n <= 50; n += 5)

        printf("The trianglular number of %d is %d\n", n, TriNumber = (((n + 1) * n) / 2));

}

这给出了我想要的输出:

5的三角形数是15
10的三角形数是55
15的三角形数是120
20的三角形数是210
25的三角形数是325
30的三角形数是465
35的三角形数是630
40的三角形数是820
45的三角形数是1035
50的三角形数是1275

我不明白为什么将TriNumber = ((n + 1) * n) / 2; 放在第一个代码中的单独行和第二个代码中的printf 函数中会产生如此不同的结果。

【问题讨论】:

  • 第一个sn-p计算TriNumber十次,然后打印一次。 printf 不在循环中。
  • for 是循环的开始。只要满足循环条件,就会重复下一个语句。您的第一个示例,打印发生在 循环完成之后。你的第二个例子,打印是循环的一部分。
  • 检查您的课程笔记。在 for 循环语句之后直接执行的唯一语句是 ...
  • 在完成第一个代码中的 for 循环之前,您不会打印任何内容。同样,“n”变量最后一次递增到 55。

标签: c for-loop math cs50


【解决方案1】:

不带花括号的for 循环(或任何其他控制结构)仅在一条语句上运行。因此,第一个 sn-p 将遍历 TriNumber 计算,但只有在循环完成后才调用 printf。相当于写

for(n = 5;  n <= 50; n += 5) {
    TriNumber = ((n + 1) * n) / 2;
}
printf("The trianglular number of %d is %d\n", n, TriNumber);

为了让它按预期工作,您可以自己在两个语句周围添加花括号:

for(n = 5;  n <= 50; n += 5) {
    TriNumber = ((n + 1) * n) / 2;
    printf("The trianglular number of %d is %d\n", n, TriNumber);
}

【讨论】:

    【解决方案2】:

    ● 在您的第一种情况中,for 循环计算TriNumber 直到条件满足,然后进入下一条语句;即printf:

    for(n = 5;  n <= 50; n += 5)
        TriNumber = ((n + 1) * n) / 2;
    
    printf("The trianglular number of %d is %d\n", n, TriNumber);
    

    这类似于(为了更好理解):

    for(n = 5;  n <= 50; n += 5)
    {
        TriNumber = ((n + 1) * n) / 2;
    }
    printf("The triangular number of %d is %d\n", n, TriNumber);
    

    这就是为什么您会得到一条语句输出说明:

    55的三角形数是1275

    ● 在您的第二种情况中,for 循环计算TriNumber 并在每次满足循环条件时打印它,因为这里的printf 是下一个被执行的for 循环的语句。

    for(n = 5;  n <= 50; n += 5)
    
        printf("The trianglular number of %d is %d\n", n, TriNumber = (((n + 1) * n) / 2));
    

    即使没有大括号{},也类似于下面的代码:

    for(n = 5;  n <= 50; n += 5)
    {
        printf("The trianglular number of %d is %d\n", n, TriNumber = (((n + 1) * n) / 2));
    }
    

    这不仅适用于for 循环,还适用于所有其他控制结构,如while、if;等在没有{} 大括号的下一个语句上运行,正如Mureinik 所说。

    【讨论】:

      【解决方案3】:

      在第一种情况下,您在最后一次循环迭代后打印,结果n 得到5 的额外增量,您会看到55。在第二种情况下,您从上次迭代中直接打印,并且循环计数器尚未额外增加,您会看到 50。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 2021-12-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多