
没有运行结果的原因是代码中存在死循环。
进入 while 循环体前,变量 t 的值为 1。循环过程中 t 的值没有改变,而循环条件是 t >= 0.0001,这个条件一直满足,所以程序不会跳出循环。程序一直卡在循环里面,自然不会执行到下面的 printf 函数。
卡循环是没有运行结果的原因。实际上代码还存在其他问题,无法计算出正确的结果:
[1] 变量 s 的类型应该是 double:格雷戈里公式中的每一项都是小数,使用整型数类型保存结果会将小数部分截断;
[2] 第 10 和 11 行的 if 语句块是不必要的:前面的代码保证变量 t 的值为 1,因此无需负数到正数的转换;
[3] 变量 t 没有迭代:代码中变量 t 的作用是每次循环自增,用以提供分母的值,而实际上在循环中没有更新 t 的值;
[4] 变量 t 和变量 s 混淆了:代码用变量 s 来表示格雷戈里公式中的每一项的值,而循环条件的判断却用了变量 t,这也是死循环的原因。同时原题中要求用 t 表示格雷戈里公式中的每一项,代码中使用了变量 s 来表示;
下面提供能输出正确结果的代码并附上说明:
#include <stdio.h>
#define ABS(X) (X >= 0 ? X : -X)
int main()
{
double pi = 0, t = 1;
int flag = 1, de = 1;
while (ABS(t) >= 0.0001)
{
t = (double)flag / de;
pi += t;
flag = -flag;
de += 2;
}
pi *= 4;
printf("pi=%.4f\n", pi);
return 0;
}
代码说明:
[1] 第 2 行 ABS 宏定义:用来取绝对值,正数返回自身值,负数返回相反数,因为公式中的每一项是正负交替的,而判断精度只看绝对值;
[2] 变量 t:代表格雷戈里公式中的每一项的值,初始化值为 1 的原因是,while 循环体的循环条件是 "t >= 0.0001",初始化为 0 不能进入循环;
[3] 变量 de:代表每一项的分母的值,每循环一次自身值加 2;
[4] "t = (double)flag / de;":变量 flag 和 变量 de 的类型都是 int,被除数和除数都是整型数的除法,结果是舍去余数的整数商,因此需要将变量 flag 强制转换成浮点数类型,这样才能得到小数结果,另外,这个表达式省去了每一项的分子 1,实际上是 "(double)flag * 1 / de;"
[5] "+=" 和 "*=":表示变量自增的加数或自乘的因数,"pi += t;" 等同 "pi = pi + t;" ,"pi *= 4;" 等同 "pi = pi * 4;"
程序运行结果
厉害
不过宏定义我们还没学