问题 填空题

程序MODI1.C中函数fun和funx的功能是:用二分法求方程2x3-4x2+3x-6=0的一个根,并要求绝对误差不超过0.001。
例如,若给m输入-100,给n输入90,则函数求得的一个根值为2.000。
请改正程序中的错误,使程序能输出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
文件MODI1.C内容如下:
#include<stdio.h>
#include<math.h>
double funx(double x)
return(2*x*x*x-4*x*x+3*x-6);
double fun(double m,double n)
/***********found**********/
int r;
r=(m+n)/2;
/**********found**********/
while(fabs(n-m)<0.001)
if(funx(r)*funx(n)<0) m=r;
else n=r;
r=(m+n)/2;

return r;

void main( )
double m,n,root;
printf("Enter m n:\n");
scanf("%1f%1f",&m,&n);
root=fun(m,n);
printf("root=%6.3f\n",root);

答案

参考答案:第1处:将“int r;”改为“double r;”。
第2处:将“while(fabs(n-m)<0.001)”改为“while(fabs(n-m)>0.001)”。

解析: 程序中的第1处错误是语法错误,函数类型定义为double型,变量r的值作为函数值返回,说明变量r的类型也应该是double型,所以第1处错误是变量r类型定义出错。第2处错误是一个逻辑错误,循环条件出现错误,题目要求误差的绝对值不超过0.001,说明大于0.001时循环,直到误差的绝对值小于等于0.001时跳出循环,所以第2处应该将“<”改为“>”。
[归纳总结]逻辑错误是一类不太容易发现的错误,因为程序在编译连接时通常没有错误提示,不太容易判断。逻辑错误需要仔细分析程序,看清题目要求从而作出正确的处理。常见的逻辑错误有:
(1)循环条件出错。循环条件出错有两种情况:一是循环条件始终为“真”,导致程序出现死循环;二是循环条件第一次判断就为假,循环一次都没有执行,从而出现错误结果。通常情况下,循环条件出现问题都是运算符使用不当造成的。例如,该用“&&”运算,却用成了“||”;该用“>”,却用成了“<”等。
(2)循环控制变量的初值和终值出现错误。此类错误需要看清题目要求,分析循环过程,仔细分析循环控制变量的初值和终值,尤其是循环条件出现“>”或“<”时,需要分析是否要取到等号。
(3)循环累加、累乘错误。循环累加、累乘算法,在循环体中会有以下形式的语句:s=s+i;s=s*i。或者用复合的赋值运算法表示s+=i;,s*=i;,而在改错题中会出现这样的错误语句:s=i。
(4)整除和实除的错误。如果两个整型数据要得到实除的结果,则至少需要将其中一个整数转换成实数才可以实现。

判断题
多项选择题