计算机等级考试二级上机改错题详细分析2

计算机等级考试二级上机改错题详细分析2,第1张

计算机等级考试二级上机改错题详细分析2,第2张

2.在给定的程序MODI1中。c,fun的作用是求以下分数序列的前N项之和。(顺序见下图)

结果通过函数值返回给主函数。例如,如果n的值是:5,它应该输出:8.391667。
请更正程序中的错误,或者在下划线处填入适当的内容并删除下划线,这样它才能得到正确的结果。
注意:不要改变主函数,不要增删行,不要改变程序的结构!
测试源程序如下:
# include < stdio . h >
/* * * * * * * found * * * * * * */
Fun(int n)[/br double t,s,a,b,c;
/* * * * * * * * * *找到了* * * * * * * * */
s = 1;a = 1;b = 2;
/* * * * * * * * * *找到了*********/
For(i=0,i<=n,i++)
{ t = a/b;s = s+t;
/* * * * * * * * * *找到了* * * * * * * * */
_ _ _ _ _ _ _ _;
a = b;
b = c;
}
return s;
}
main()
{ int n;
printf(" Enter n:";scanf("%d ",& n);printf("\n\nn=%d\n ",n);
printf(" \ n函数的值为:%lf\n ",fun(n));
}分析:(1)编译上述程序时,给出的第一条错误信息是:语句缺失;,指示该语句缺少分号(。查看出现此消息的前一行。for的关键字写成For,更正后编译。给出的错误信息是:代码无效,表示代码无效。检查消息所在的for语句行,可以发现括号中的项是用逗号而不是分号分隔的,所以应该更正。
(2)在做了上述修改后,编译器指出下划线处有错误,这是不可避免的。你应该在这里填写适当的陈述。这就需要考生理解题目的意思和给出的程序算法。从程序中可以看出,分数序列中的每一项都放在变量T中,分子放在变量A中,分母放在变量B中,累加和放在变量s中,每次累加后都需要重新获取下一项的分子和分母。根据给定的分数序列,下一项的分母是上一项的分子,由语句b=a确定;实现;下一项的分子是上一项的分子和分母之和,根据语句a = c;可以看出,前一项的分子和分母之和放在变量C中,所以:c=a+b要填在下划线处。
(3)编译后没有语法错误。执行程序输入5到N,输出结果是0.00000。检查函数中的return语句,函数的返回值是S,S中的值是0吗?为此,在for循环的末尾添加一个output语句printf ("s =% f \ n ",s);,来检查s的值.运行程序得到如下输出结果:
n = 5
s = 1.500000
s = 4.5000000
s = 5.833333
s = 7.583333[可以断定函数值的返回有问题。通过检查函数值的类型,发现函数的类型是int,而在主函数中,输出函数值是双精度的,S本身也是双精度的,所以在函数名fun之前要加上类型名double。
(4)再次执行程序,输入5到n,输出结果不是8.391667,而是10.791126,大于应有的结果。所以要检查赋初值和循环次数是否过多;首先检查每个变量的初始值,存储累加和的S的初始值应该是0,而不是1,并进行修正;变量A是一个分子,第一个分子的初始值应该是2,第一项的分母应该是1。所以应该给A 2,给B 1进行修正。
(5)修正后执行程序输入5到N,输出结果为10.007051。因此,在检查循环数后,发现for循环的循环控制变量I从0变为5,循环数为6。所以for循环应该改成for(I = 0;I < n;++)或for(I = 1;I < = n;++),再次运行它以获得正确的结果。
(6)提示:
①对于计算型程序,在开头检查函数值的类型。
②对于计算类型的程序,需要注意变量的初值和循环重复次数。
③对于1/n之类的整除,应改为1.0/n或(double) 1/n.
④所有关键字必须小写,例如if不能写成If,double写成Double。
⑤注意变量名的大小写字母。比如定义变量名str,不能错写成Str,定义变量名pt,不能错写成Pt。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 计算机等级考试二级上机改错题详细分析2

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情