ImageVerifierCode 换一换
格式:DOCX , 页数:122 ,大小:76.37KB ,
资源ID:8498878      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8498878.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(改错题100套.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

改错题100套.docx

1、改错题100套前言改错题难以分类,只好按其顺序逐题分析。改错题分值30分,通常一题中有两个错误,偶而也有一个错或三个错的,其得分按比例分配,如该题共有三个错,能改正一个错则得10分;能改正二个错则得20分,以此类推。凡错误必在/*found*/的下一行,这样就方便了我们的改错工作,但这并不能让我们很容易找出错误原因并做出相应的修正。文档中给出了解答和解析,但这只是一种“纸上查错”法,没有能充分利用上机环境下的系统查错手段,所以我又增加了前30题上机查错的方法分析,便于大家能比较迅速掌握改错题的解答。改错题的错误性质可分为一,两大类,一是语法错,但这类错误在考试中出现比较少,更多的是逻辑错误。改

2、错前应当对程序进行编译,利用系统的查错功能,知道错误的原因,查看有无语法错误,是什么样的语法错误,再进行相应的修正。如没有语法错误,或已经将语法错误修改完毕,此时应该按要求运行程序,根据运行的结果与应当得到的正确结果作比较,往往也能帮助我们找到错误的原因,以下我将调试过程详细说明。为便于观看报错信息方便,在进行源程序编译前,应调整源程序显示窗口的大小,使屏幕下方的组建选项卡的高度能达到整个屏幕的一半。目录第1套 第2套 第3套 第4套 第5套 第6套 第7套 第8套 第9套 第10套 第11套 第12套 第13套 第14套 第15套 第16套 第17套 第18套 第19套 第20套 第21套

3、第22套 第23套 第24套 第25套 第26套 第27套 第28套 第29套 第30套 第31套 第32套 第33套 第34套 第35套 第36套 第37套 第38套 第39套 第40套 第41套 第42套 第43套 第44套 第45套 第46套 第47套 第48套 第49套 第50套 第51套 第52套 第53套 第54套 第55套 第56套 第57套 第58套 第59套 第60套 第61套 第62套 第63套 第64套 第65套 第66套 第67套 第68套 第69套 第70套 第71套 第72套 第73套 第74套 第75套 第76套 第77套 第78套 第79套 第80套 第81套

4、第82套 第83套 第84套 第85套 第86套 第87套 第88套 第89套 第90套 第91套 第92套 第93套 第94套 第95套 第96套 第97套 第98套 第99套 第100套 二级C上机试题改错第一套 返回目录下列给定程序中,函数fun()的功能是逐个比较a,b两个字符串对应位置中的字符,把ASCII值小或相等的字符依次存放到c数组中,形成一个新的字符串。例如:a中的字符串为fshADfg,b中的字符串为sdAEdi,则c中的字符串应为fdAADf。请改正程序中的错误,使它能得到正确结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序如下:#incl

5、ude #include void fun(char *p,char *q,char *c) int k=0; while(*p|*q)/*found*/ if (*p=*q) 【2】k+;解析:错误1:依题意,把ASCII值小或相等的字符存放到c数组中,故if语句的关系运算符应为=。错误2:C语言规定,每个语句要用分号结束。调试过程:打开1_err.c源程序,并进行编译、组建 ,此时组建选项卡中显示如下报错信息:syntax error : missing ; before 1_err.obj - 1 error(s), 0 warning(s)其中“1_err.obj - 1 error(

6、s), 0 warning(s)”,表明有一个致命性错误语法,无警告性语法错误。其错误性质是“syntax error : missing ; before ”,其意思是:语法错,在前少了;,用鼠标双击“syntax error : missing ; before ”,光标停留在“”这一行上,结合程序中的错误定位提示,知道遗漏“;”的一定是“k+”这一行,于是补一个“;”,再次编译,此时系统不再报告还有语法错误。运行该程序,弹出窗口显示如下内容:The string a:fshADfgThe string b:sdAEdiThe result :sshEdig与期望结果不同。仔细观察,可发现

7、是将a、b字符串中对应位置上ASCII码较大的字符复制到c数组中去了。按回车,回到编辑状态。将第一个错误所在行中的语句“if (*p=*q)”。再重新组建、运行程序并观察结果,这次发现程序能正确运行。最后保存修改后的源程序。第二套 返回目录下列给定程序中,函数fun()的功能是根据整型形参m,计算如下公式的值。y=1-1/(22)+1/(33)-1/(44)+(-1)(m+1)/(mm)例如:m中的值为5,则应输出0.838611。请改正程序中的错误,使它能得到正确结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序:#include #include double

8、 fun(int m) double y=1.0;/*found*/ int j=1; int i; for(i=2; i1例如:当给n输入5时,函数值为240;当给n输入3时,函数值为60。请改正程序中的错误,使它能得到正确结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序:#include /*found*/fun(int n); int c;/*found*/ if(n=1) c=15; else c=fun(n-1)*2; return(c);main() int n; printf(Enter n:); scanf(%d,&n); printf(The

9、result :%dnn,fun(n); 正确答案:【1】fun(int n) 【2】if(n=1)解析:错误1:该行是函数的首部,不是一条语句,因此不能以分号结束。错误2:if后面应该紧跟一个条件判断表达式,若写成if(n=1),则说明该表达式的值永远为真,也就是说这个条件永远成立,没有递归执行。调试过程:编译后系统告诉我们程序有一个致命性错误。有两条出错信息提示:双击第一条错信息提示“found at file scope (missing function header?)”(意为少了函数的首部)后光标停留在“ int c;”一行上,结合第一个“/*found*/”的位置,可知出该错误是

10、在“fun(int n);”函数的首行上。函数首行出错在二级C考试上机考试中是常见错误,通常有三类差错:1、函数类型说明不正确;2、形参与实参不匹配;3、多了一个分号。如何检查第一类错误?函数内有一条return语句,返回int类型变量c的值,而函数类型虽然没有说明,但是允许其默认值为int型;如何检查第二类错误?看main主函数中是如何调用函数的,调用形式是fun(n),且主函数中说明n是整型变量,说明该函数只能有一个整型形参,显然本题也没有犯下参数不匹配的错误;第三类错误最容易检查,确实多了一个分号,按理说,函数的首行后面应当是函数体的开始,是应当出现一个“”,现在没有,无怪乎系统要报告“

11、少了函数的首部”,删除了多余的分号后再次编译,知道所有的语法错误都消除了,运行程序,并根据题目要求输入3,结果是15而不是理想中的360,说明程序中有逻辑错误,是在第二个found下面的一句if(n=1)中。通常在if语句的条件式中应当出现比较运算,而这里却出现了赋值运算符号,参考题目的要求,将改成if(n=1)。这次修改后你将会发现大功告成了。第四套 返回目录下列给定程序中函数fun()的功能是计算1/n!的值。例如:给n输入5,则输出0.008333。请改正程序中的错误,使它能得到正确结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序:#include #in

12、clude /*found*/int fun(int n) double result =1.0; if(n=0) return 1.0; while(n1 & n 170)/*found*/ result *=n+ ; result=1/result; return result;main() int n; printf(Input N:); scanf(%d,&n); printf(n1/%d!=%lfn,n,fun(n);正确答案:【1】double fun(int n)【2】result *=n- ;解析:错误1:函数的返回值为实型数据,所以函数的返回类型应为double。错误2:根据

13、阶乘的概念,从n开始,每递减1的数相乘,直到1,因此此处n递减,而不是递增。调试过程:程序中第一个错误是函数的首行。根据上一题介绍的方法逐一检查。函数中有两条return语句,返回值均为double类型,而函数首行的类型说明却是int,将它改为double并重新编译,系统不再报告有任何语法错误,运行程序并输入5但其结果是0.000000而不是理想中的0.008333,检查第二个错误所在行中的语句result *=n+;,每执行一次乘法运算后n增值1,直到n=170才停止运算,并不是计算n!的倒数,而是计算5*6*170的倒数了,改为result *=n-;,经过组建、运算程序,发现修改正确。第

14、五套 返回目录下列给定程序中函数fun()的功能是计算正整数num的各位上的数字之平方和。例如:输入352,则输出应该是38;若输入328,则输出应该是77。请改正程序中的错误,使它能得到正确结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序:#include #include long fun(long num) /*found*/ long k=1; do k+=(num%10)*(num%10); num/=10;/*found*/ while(num) return (k);main() long n; printf(Please enter a numb

15、er:); scanf(%ld,&n); printf(n%ldn,fun(n);正确答案:【1】long k=0; 【2】while(num);解析:错误1:k用来存放各位数字的平方和,初值应为0。错误2:do-while语句的语法,while()后加分号。调试过程:经语法检查发现第二个错误所在行“while(num)”少了分号,补上后消除了语法错误。运行时发现无论是按照要求352或328,输出结果值都比预期值多了1。经检查第2个错误所在行中的求和单元初值是1而不是0,相差恰好是1,改为k=0后程序能得出正确结果。第六套 返回目录下列给定程序中,函数fun()的功能是将字符串s中位于偶数位置

16、的字符或ASCII码为奇数的字符放入字符串t中(规定第一个字符放在第0位中)。例如:字符串中的数据为ADFESHDI,则输出应当是AFESDI。请改正程序中的错误,使它能得到正确结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序:#include #include #include #define N 80/*found*/void fun(char s, char t ) int i, j=0; for(i=0; istrlen(s);i+)/*found*/ if(i%2=0|si%2!=0) tj+=si ; tj=0;main() char sN, tN;

17、 printf(nPlease enter string s :); gets(s); fun(s,t); printf(nThe result is :%sn,t);正确答案:【1】void fun(char *s, char t ) 【2】if(i%2=0|si%2!=0)解析:错误1:由于本题中函数的功能是对字符串进行处理,而不是对单个字符进行处理,因此,函数的参数应为字符串指针。错误2:if语句中要用关系运算符,而不是赋值运算符。调试过程:语法检查时有许多出错信息,一下子头都搞晕了,不知道如何处理才好。此时应当利用题目中告诉我们的出错位置提示,第一个错是函数的首行,按前两题的方法进行检

18、查。函数的类型说明是void,且函数无返回值,应当说函数类型说明无差错。再考虑形参与实参的匹配问题。从主函数中可以看出两个参数均为字符数组,而fun函数的第一个形参却是一个字符变量,改正的方法有两种,1、改为char s ,2、改为char *s。 第二个错是if语句,语句句中的条件表达式一般应使用比较运算符,将i%2=0改为i%2=0。运行后发现程序修改正确。第七套 返回目录下列给定程序中,函数fun()的功能是找出100n(不大于1000)之间百位数字加十位数字等于个位数字的所有整数,把这些整数放在s所指的数组中,个数作为函数值返回。请改正程序中的错误,使它能得到正确结果。注意:不要改动m

19、ain函数,不得增行或删行,也不得更改程序的结构。试题程序:#include #define N 100int fun(int *s, int n) int i,j,k,a,b,c; j=0; for(i=100; in; i+) /*found*/ k=n; a=k%10; k/=10; b=k%10; c=k/10; if(a=b+c) /*found*/ sj=i; return j;main() int aN, n,num=0, i; do printf(nEnter n( 1000); num= fun(a,n); printf(nnThe result :n); for(i=0;

20、inum; i+) printf(%5d,ai); printf(nn);正确答案:【1】k=i; 【2】sj+=i;解析:错误1:k就是当前要被判断的数,是随着i值的变化而变化的。错误2:在循环中,j是数组的下标要递增。调试过程:本程序无语法错。运行该程序输入1000后却无任何结果输出。第一个逻辑错误是k=n;这一句。下面几句是分解k的各位数字。但n是主函数中传递过来的循环范围的上限,需要判断的应当是上面一句for(i=100; in; i+)中的循环变量i,故将k=n; 改为k=i;。运行后依然无结果。第二个逻辑错误是sj=i;这一句。其中j记录了符合条件的数的个数,但每当找到一个符合条件

21、的数后,j却没有增1。故将此句改为sj+=i;。运行后发现程序修改正确。第八套 返回目录下列给定程序中,函数fun()的功能是求出数组中最小数和次最小数,并把最小数和a0中的数对调,次最小数和a1中的数对调。请改正程序中的错误,使它能得到正确结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序:#include #include #define N 20void fun(int *a,int n) int i, m, t, k;/*found*/ for(i=0; in; i+) m=i; for(k=i; kn; k+) if(akam)/*found*/ k=m

22、; t=ai; ai=am; am=t; main() int x,bN=11,5,12,0,3,6,9,7,10,8,n=10,i; for(i=0; in; i+) printf(%d ,bi); printf(n); fun(b,n); for(i=0; in; i+) printf(%d , bi); printf(n);正确答案:【1】for(i=0; i2; i+) 【2】m=k;解析:错误1:由于题目要求将最小数和次最小数分别与a0和a1中的数对调,因此这层循环只需循环两次。错误2:赋值语句的执行方向是从右向左,即把右边的值赋给左边的变量。调试过程:本程序无语法错。运行该程序显示

23、原始数据“11 5 12 0 3 6 9 7 10 8”后再也没有显示,按回车键也不能返回,表示发现程序进入了死循环。单击显示窗口右上角的Closebox,强制退出,回到编辑状态,利用found()信息来改错。第一个逻辑错误行中的for(i=0; in; i+)语句表示要循环n次,而此循环程序是升序排序,但我们只是要找出最小的两个数,所以将它改为for(i=0; i2; i+)。第二个逻辑错误行是k=m;分析这两个变量的作用,在上面有m=i一句语句,m的作用是保存符合条件的下标,因此当if(akam)的条件成立时应有m=k,修改后运行程序将发现程序修改正确。若本题不容易从分析着手,则就硬记,1

24、00道题不可能每题者需要硬记,少数几题还是能记下来的。第九套 返回目录下列给定程序中,函数fun()的功能是计算并输出high以内的素数之和。high由主函数传给fun()函数。若high的值为100,则函数的值为1060。请改正程序中的错误,使它能得到正确结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序:#include #include #include int fun(int high) int sum=0,n=0, j, yes; while(high=2) yes = 1; for(j=2; j=high/2; j+)/*found*/ ifhigh%j=0 yes=0; break; /*found*/ if(yes=0) sum+=high; n+; high-; return sum;main() printf(%dn,fun(1

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1