给定程序MODll.C中函数fun的功能是:计算并输出下列级数的前N项之和sN,直到SN+1大于q为止,q的值通过形参传入。 例如,若q的值为:50.0,则函数值为:49.394948。 请改正程序中的错误,使程序能输出正确的结果。

admin2013-04-02  21

问题 给定程序MODll.C中函数fun的功能是:计算并输出下列级数的前N项之和sN,直到SN+1大于q为止,q的值通过形参传入。

    例如,若q的值为:50.0,则函数值为:49.394948。
    请改正程序中的错误,使程序能输出正确的结果。
    注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include
double fun(double q)
{int n; double s,t;
  n = 2;
  s = 2.0;
  while (s<=q)
  {
    t=s;
/************found************/
    s=s+(n+1)/n;
    n++;
  }
  printf("n=%d\n",n);
/************found************/
  return s;
}
main ()
{
   printf("%f\n", fun(50));
}

选项

答案s=s+(n+1.)/n; return t;

解析 (1)注意到n是整型变量,n+1也是整数,因此(n+1)/n是两个整数相除,得到的结果也是整数即1。而“s=s+(n+1)/n;”是s和1转化成double类型之后的和,相当于s=s+1.0,因此计算结果不正确。第一标识下应改为“s=s+(n+1.)/n;”,n+1.计算结果是浮点数,(n+1.)/n得到的结果也是浮点数而不是整数。
(2)注意到在循环体内部“t=s;”,即将s的值赋给t,然后s再累加了下一个级数项。在最后一次进入循环的时候,t记录s的值,s再加一个级数项,下次循环进入之前判断的时候发现s已经大于q了,此时while不再执行,而是执行后面的printf语句,即s>t,s>q。题干要求返回级数的前N项之和SN,而SN+1大于q,因此只能返回t,而不是返回s。第二标识下应改为“return t;”。
转载请注明原文地址:https://kaotiyun.com/show/ZJJp777K
0

最新回复(0)