c primer加上第6章ex12

时间:2016-09-27 10:26:28

标签: c

每个人,c引物加上第6章ex12:

  

**考虑这两个无限系列:

     

1.0 + 1.0 / 2.0 + 1.0 / 3.0 + 1.0 / 4.0 + ...

     

1.0 - 1.0 / 2.0 + 1.0 / 3.0 - 1.0 / 4.0 + ...

     

编写一个程序,评估这两个系列的运行总数达到某个极限   条款数量。提示:-1次本身奇数次为-1,自身为-1次   偶数次是1.让用户以交互方式输入限制;让零或   负值终止输入。查看100个术语,1000个术语后的运行总计,   10,000个条款。这两个系列是否会收敛到某个值?**

#include <stdio.h>
int main(void)
{
    int times, a, b, d;
    float sum1, sum2, c;
    printf("Enter the times: ");
    scanf("%d", &times);
    while (times > 0)
    {
        sum1 = 0;
        sum2 = 0;

        for (a = times; a >= 1; a--)
            sum1 += 1.0 / (float)a;
        printf("The sum1 is %f\n", sum1);


        for (b = times; b >= 1; b--)
        {
            c = -1.0;
            while ((d = b) % 2 == 1)
            { 
                c = 1.0;
                d++;
            }
            sum2 += (c / (float)b);
        }
        printf("The sum2 is %f\n", sum2);

        printf("Enter the times again: ");
        scanf("%d", &times);
    }
    return 0;
}

我的代码有什么问题?

1 个答案:

答案 0 :(得分:1)

这里:

while ((d = b) % 2 == 1)
{ 
  c = 1.0;
  d++;
}

您将b的值分配给d(按d = b),然后检查此模2的值是否等于1.如果是这样的话,你永远进入你的循环,因为b的值永远不会改变。当然,您在循环中增加d,但在检查中,您将其值重置为b,从而导致无限循环。

关于您的练习,如果c是偶数,则您尝试将-1设置为b,而将1设为b则为奇数。这可以通过条件赋值轻松完成:

c = (b % 2 == 0) ? -1.0 : 1.0;

或者,正如您的问题中提示的那样,您可以在循环之前将c初始化为1(或-1)并在c = -1.0 * c内进行