第三章 程序改错.doc_第1页
第三章 程序改错.doc_第2页
第三章 程序改错.doc_第3页
第三章 程序改错.doc_第4页
第三章 程序改错.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章 程序改错本章的目的是纠正编程中的常见错误。我们重点分析了编程中常见错误产生的原因,同时还提供了一些改错专项练习题,希望能够通过本章的学习提高大家的辨错和纠错能力。31要点分析编程中的常见错误主要有两种,一种是语法错误,一种是逻辑错误。语法错误的产生主要是基本概念问题,逻辑错误的产生主要是基本概念和算法问题。语法问题主要出现在输入输出、变量和函数的定义、条件的表达等方面。例如,用scanf()函数给整型变量b赋值,函数会写成如下一些形式:scanf(“%d”,b);或scanf(“%f”,b);或scanf(“%f”,&b);。而正确的语句是:scanf(“%d”,&b);。用scanf()函数给字符数组a赋值一串字符,将函数错写成scanf(“%s”,&a);,而正确的写法是:scanf(“%s”,a);,因为数组名是数组的地址,所以不需要在数组名a前加&。再如,用printf()函数输出整型数组a的元素,错误的写为:printf(“%d”,*a+);。正确的写法应该是:printf(“%d”,*(a+i));。数组名的值是不允许改变的。如,定义整型函数ax形式参数为整型a,b。正确的定义是int ax(int a,int b);,而错误的写为:int ax(int a, b);,将形式参数的定义与变量定义混淆。如,在条件表达式中将条件运算符“= =”写成赋值运算符“=”。将诸如,a大于b并且a小于d的表达式写成bad,而正确的表达式是bd。类似的例子很多,我们将不一一列举。下面我们列举几个逻辑错误。例:程序用二分法在一个按单调不减次序排列的数组中查找某个数。若存在,输出该数及它的下标位置;若不存在,输出表示找不到该数的信息。下面程序中有两个逻辑错误,请指出。#1 main( )#2 #3 int a10=2,5,6,8,11,15,18,22,60,88;#4 int low,high,m,i,x;#5 scanf(“%d”,&x);#6 low=0;#7 high=9;#8 while(lowam) high=m+1;#13 else low=m-1;#14 #15 if(lowam时应该在am之后继续查找,所以应该调整low的值为m+1,而不是调整high的值为m+1。当xam时应该在am之 前继续查找,所以应该调整high的值为m-1,而不是调整low的值为m-1。在这个程序中产生的错误完全是由于对二分法算法没有完全掌握引起的。再如,求最大最小值的程序段,正确写法:if(maxai) min=ai;常见的错误写法为:if(maxai)max=ai else min=ai;如,在字符串比较中使用关系运算符进行比较,而正确的比较是用字符串比较函数strcmp().程序中常见的其它错误,我们将在专项练习中列出,并纠正。32专项练习下列程序中都有三个错误,按题中的计算要求,纠正所有错误,并以“将#XX行改为YYYY”的形式进行解答,代码左边的“#1”、“#2”、是附加的行号。(1) 程序输入n(0n=100)个整数,计算n个整数之和并输出和数。#1 (2) #define N 100 (符号常量:定义符号N表示数字100)#2 int sum (int *b, m)(定义函数sum)(3) 函数定义分为2种#3 int s=0;#4 for (;m-;)for(;m-)(4) 【for 函数(循环变量赋初值;循环条件;循环变量增值)】(5) 比如for(i=0;i,=100;i+)(6) xcc#5 s+=*b+;#6 return s;#7 #8 main()#9 int i,n,aN;(定义数组a【100】)(变量必须先定义后使用【变量名实际上是用以一个名字代表的一个存储地址)在系统编译时会会给每个变量名分配对应的内存地址】#10 do printf(Enter n(0n0&n=100);#13 printf(Enter a0-a%dn,n-1);#14 for(i=0;in;i+)#15 scanf(%d,a+);#16 printf(sum%dn,sum(a,n);#17 (7) 程序用二分法在一个按单调不减次序排列的数组中查找某个数。若存在,输出该数及它的下标位置;若不存在,输出表示找不到该数的信息。#20 main( )#21 #22 int a10=2,5,6,8,11,15,18,22,60,88;#23 int low,high,m,i,x;#24 scanf(“%f”,&x);#25 low=0;#26 high=9;#27 while(lowam) high=m+1;#32 else low=m-1;#33 #34 if(low=high)#35 printf(“ d is found,the position is %d”,x,m);#36 else#37 printf(“%d is not foundn”,x);#38 (8) 程序求3*4矩阵中的最大元素及其所在行和列的位置。数组元素可能有大于0,等于0或小于0的值。#1 #include stdio.h#define M 3#2 #define N 4#3 main()#4 int aMN,max,i,j;#5 int row,column;#6 for(i=0;iM;i+)#7 for(j=0;jN;j+)#8 scanf(%d,aij);#9 max=0;#10 for(i=0;iM;i+)#11 for(j=0;jN;j+)#12 if(maxaij)#13 max=aij;row=i;column=j;#14 printf(nmax=%d,row=%d,colum=%d,max,row,column);#15 (9) 程序中函数fun的功能是计算数组a的每列元素的最大值,存入数组max。#1 #define X 5#2 #define Y 4#3 void fun(int aXY,int max) #4 int i,j;#5 int maxf;#6 for(i=0;iY;i+)#7 maxf=a00; #8 for(j=1;jmaxf)#10 maxf=aji;#11 maxi=maxf;#12 #13 #14 void main()#15 int p =2,4,6,8,9,1,3,5,7,2,4,6,1,3,5,4,5,0,9,9; #16 int maxY,i;#17 fun(p,max);#18 printf(nthe max value sum is:n);#19 for(i=0;iY;i+)#20 printf(%d,maxi);#21 printf(n);#22 (10) 程序的主函数main()调用aver()函数用来统计某数组中值大于0和小于0的元素个数(等于0的元素个数不统计)。并求数组中所有元素的平均值。平均值通过函数返回,其余两个统计结果通过形式参数的方法返回。#1 #include stdio.h#2 main()#3 double aver(int,int,int*,int*);#4 int c1,c2,x=0,12,33,-9,-5,27,80,0,54,-63;#5 double av;#6 av=aver(x,10,c1,c2);#7 printf(nc1=%d,c2=%d,aver=%f,c1,c2,av);#8 #9 double aver(int a,int n,int *p1,int *p2)#10 int i;#11 double sum=0;#12 for (i=0;i0)#15 (*p1)+ ;#16 else#17 (*p2)+;#18 #19 return sum/n;#20 (11) 16进制数可以由数字0到9和大写字母A至F组成的字符串表示,函数hexvalue()的功能是将用字符串表示的16进制数转化为十进制数,如将2A转化为42,若字符串中出现其它符号则返回-1。#1 int hexvalue(char *str)#2 #3 int data,i,n;#4 for(i=0;stri!=0;i+)#5 #6 if(stri=A&stri=F)#9 n=stri-A+10;#10 else#11 return-1;#12 data=data*10+n;#13 #14 return data;#15 (12) 程序计算数列2/1,3/2,5/3,8/5,之和,其中 由定义。#1 #include #2 series_sum(n)#3 int a=2,b=1,c,k;#4 double s=0.0;#5 for(k=1;k=n;k+)#6 s=s+a/b;#7 c=a;a+=b;b=c;#8 return ;#9 #10 void main()#11 int n=10;#12 printf(the sum is:%fn,series_sum(n);#13 (13) 程序调用函数UpperNum ,统计字符串str中大写字母的个数并作为函数值返回。#01 #includectype.h#02 main()#03 char str80;#04 printf(Input a string:);#05 scanf(%c, str);#06 printf(The upper letter is:%dn,UpperNum(str);#07 #08 int UpperNum(char str)#09 int n=0,i=0;#10 while (*(str+i)#11 if(isupper(stri)=0) n+;#12 i+;#13 #14 return i;#15 (14) 程序的功能是输入一个字符串,并将其中的字符a用字符串”shu”替代后输出.如输入为”123abcaHello”,则输出为”123shubcshuHello”.#1. #include#2. void main()#3. #4. int i ;char line81;#5. scanf(“%s”,&line);#6. for(i=0;linei!=n;i+) #7. if(linei=a)#8. printf(“shu”);#9. else#10. printf(“%s”,linei); #11. (15) 程序读入四十名学生三门课的成绩,分别计算并输出全班这三门课的平均成绩。#1. main()#2. float mark403,x; int i,j;#3. for(i=0;i=40;i+)#4. for(j=0;j3;j+)#5. scanf(%f,&x);#6. markij=x;#7. #8. printf(subject No. aven);#9. for(i=0;i3;i+)#10. x=0;#11. for(j=0;j40;j+)#12. x=x+markij;#13. printf(%6d %10.1fn,i+1,x);#14. #15. (16) 程序中函数fun的功能是计算出数组x中的最小值和次小值,并分别将其与x0和x1交换。函数fun中三行有错,请改正。#1 #include stdio.h#2 #includeconio.h#3 #define N 30#4 int fun(int *x,int n)#5 int i,t;#6 int a1=0,a2=0,min1=32767,min2=32767;#7 for(i=1;in;i+)#8 if(ximin1)#9 min1=min2;a2=a1;#10 min1=xi;a1=i;#11 #12 else if(ximin2)#13 min2=xi;#14 a2=i;#15 #16 t=x0;xa1=x0;xa1=t;#17 t=x1;x1=xa2;xa2=t;#18 #19 void main()#20 int hN=4,7,6,5,1,7,3,8,0,2,3;#21 int i;#22 clrscr();#23 for(i=0;i11;i+)#24 printf(%2d,hi);#25 printf(n);#26 fun(h,11);#27 for(i=0;i11;i+)#28 printf(%2d,hi);#29 printf(n);#30 (17) 下列给定程序中,函数fun()的功能是逐个比较a,b两个字符串对应位置中的字符,把ASCII值小或相等的字符依次存放到c数组中,形成一个新的字符串。例如:a中的字符串为fshADfg,b中的字符串为sdAEdi,则c中的字符串应为fdAADf。#1 #include #2 #include #3 void fun(char *p,char *q,char *c)#4 int k;#5 while(*p|*q)#6 if (*p=*q) #7 ck=*q;#8 else ck=*p;#9 if(*p) p+;#10 if(*q) q+ ;#11 k+;#12 #13 #14 main()#15 char a10=fshADfg,b10=sdAEdi,c80 ; #16 fun(a,b,c);#17 printf(The string a:); puts(a);#18 printf(The string b:); puts(b);#19 printf(The result :); puts(c);#20 (18) 程序是在5个字符串中求最小字符串并输出结果。#1 #include#2 #include#3 main()#4 char *name5= FXPRESSION,VARIABLE,#5 STATEMENT,BLOCK,FUNCTION;#6 char temp;#7 int i;#8 temp=name0;#9 for (i=1;i*namei0)#11 temp=namei;#12 printf(%sn,*temp);#13 (19) 当t1所指字符串的内容为12345,t2所指子串中的内容为abcd,连接后,t1所指字符串的内容变为12345abcd。#1 #include #2 #include #3 #include #4 void fun(char t1,chart2)#5 #6 char *p1=*t1;#7 while(*p1) p1+;#8 while(*t2)#9 p1+=t2+;#10 *p1=0;#11 #12 main()#13 char s150,s250;#14 clrscr();#15 printf(“nPlease input string s1:”);#16 scanf(“%s”,s1);#17 printf(“nPlease input string s2:”);#18 scanf(“%s”,s2);#19 fun(s1,s2);#20 printf(“nOutput new string s1:%d,s1);#21 (20) 程序中函数fun的功能是查询字符k在字符串string中是否存在。若存在输出该字符,否则输出字符串。程序中三行有错,请纠正。#1 #include#2 #include#3 #include#4 char str81;#5 void fun(char string,char k)#6 while(*string&*string!=k) *string+; #7 if (*string=k)#8 string=str;#9 string0=k;#10 string1=0;#11 #12 #13 void main()#14 char k;#15 clrscr();#16 printf(nPleas enter a string:n);#17 gets(str);#18 printf(nPlease enter a charcter:n);#19 k=getche();#20 fun(str,k);#21 printf(nThe result is %sn,str);#22 (21) 以下程序是先输入数据给数组a赋值,然后按从a0到a4的顺序输出各元素的值,最后再按从a4到a0的顺序输出各元素的值。请改正程序中的错误,使它能得出正确的结果。#1 main()#2 int a5;#3 int i, *p; #4 for(i=0;i=5;i+)#5 scanf(“%d”,p+);#6 for(i=0,p=a;i=a;p-)#11 printf(“%d”,*p);#12 printf(“n”);#13 (22) 程序通过调用递归函数来求两个整数的最大公约数。#1 main( )#2 #3 int c,d;#4int gcd(int,int);#5 scanf(“%d%d”,c,d);#6 printf(“%d and %d GCD=%d”,a,b,gcd(c,d);#7 #8 int gcd(int a,int b)#9 #10 if(a%b= =0)#11 return a;#12 else#13 return gcd(b,a%b);#14 (23) 程序中函数fun的功能是将字符串s中的小写字母都改为对应的大写字母,其他字符不变。#1 #include#2 #include#3 #include#4 char fun(char *s)#5 int i;#6 for(i=0;si;i+)#7 if (a=si)|(si=z)#8 si+=32;#9 return s;#10 #11 main()#12 int i;#13 char string81;#14 clrscr();#15 printf(nPlese enter a string:);#16 gets(string);#17 printf(nThe result is:%sn,fun(string);#18 (24) 程序中函数fun的功能是接受由m和n指向的直角三角形的两个直角边的边长,计算出斜边的长度。#1 #include #2 #include #3 #include#4 double fun(double *m, *n) #5 double s;#6 s=sqrt(m*m+n*n); #7 #8 return s;#9 #10 void main()#11 double m,n,s;#12 clrscr();#13 printf(enter m,n:);#14 scanf(%lf%lf,&m,&n);#15 s=fun(&m,&n);#16 printf(s=%dn,s); #17 #18 (25) 程序中函数fun的功能是输入一个整数a,计算该数的平方和立方。#1 #include#2 #include#3 #include#4 void fun(int b,int * b2,int * b3)#5 #6 *b2=(int *)malloc(2);#7 *b3=(int *)malloc(2);#8 *b2=b*b;#9 *b3=b*b*b;#10 #11 void main()#12 int a;#13 int*a2,*a3;#14 clrscr();#15 printf(nPlease enter a:n);#16 scanf(%d,a);#17 fun(a,&a2,&a3);#18 printf(a=%d a2=%d a3=%dn,a,*a2,*a3);#19 free(a2);#20 free(a3);#21 33答案与题解(1) 将#2 int sum(int *b, m);改为:int sum(int *b,int m);将#12 while(n 0&n=100);改为: while(n100);将#15 scanf(%d,a+);改为:scanf(“%d”,&ai);(2) 将#5 : scanf(“%f”,&x);改为: scanf(“%d”,&x);将#12 : else if(xam) high=m+1;改为: else if(xam) low=m+1;将#13 : else low=m-1;改为: else high=m-1; 根据题意,数组为单调不减次序排列,当被查找的数x大于当前查找范围中间元素am时,下一步的查找范围在am之后,所以low的值改变为m+1。反之,high=m-1.(3) 将#5:int row,column;改为:int row=0,column=0;将#8:scanf(%d,aij);改为: scanf(%d,&aij);将#9:max=0;改为: max=a00;(4) 将#3 void fun(int aXY,int max) 改为:void fun(int aXY,int *max)将#7 maxf=a00; 改为:maxf=a0i;将#15 int p =2,4,6,8,9,1,3,5,7,2,4,6,1,3,5,4,5,0,9,9; 改为: int pXY=2,4,6,8,9,1,3,5,7,2,4,6,1,3,5,4,5,0,9,9;(5) 将#4 int c1,c2,x=0,12,33,-9,-5,27,80,0,54,-63改为:int c1=0,c2=0,x=0,12,33,-9,-5,27,80,0,54,-63将#6:av=aver(x,10,c1,c2);改为:av=aver(x,10,&c1,&c2);将#17:(*p2)+;改为:if (ai0) (*p2)+;(6) 将# 3:int data,i,n;改为: int data=0,i,n;将#6: if(stri=0& stri=0& stri=9将# 12:data=data*10+n;改为: data=data*16+n; 16进制数转换为十进制数的转换规则。(7) 将#2: series_sum( n)改为: series_sum(int n)将#6: s=s+a/b;改为: s=s+a*1.0/b; 变量a,b为整型,根据所给数列,若用a/b表示数列的项,则数列项的值总为整数1,而根据题意数列的项应为实数,所以表达式应为a*1.0/b。将#8: return ;改为:return s;(8) 将# 05 scanf(%c,str);改为:scanf(%s,str);将#11 if(isupper(stri)=0) n+;改为:if(isupper(stri)= =0) n+;将#14 return i;改为:return n;(9) 将#05 scanf(“%s”,&line); 改为scanf(“%s”,line); 将#06 for(i=0;linei!=n;i+) 改为for(i=0;linei!=0;i+) 将#10 printf(“%s”,linei); 改为printf(“%c”,linei);(10) 将#03:for(i=0;i=40;i+)改为:for(i=0;i40;i+) 将#12:x=x+markij;改为:x=x+markji;将#13:printf(%6d %10.1fn,i+1,x);改为:printf(%6d %10.1fn,i+1,x/40);(11) 将 #7 for(i=1;in;i+)改为:for(i=0;in;i+)将 #9 min1=min2;a2=a1改为:min2=min1; a2=a1 若ximin1,则xi为当前最小值,min1就是次小值。将 #16 t=x0;xa1=x0;xa1=t;改为:t=x0;x0=xa1;xa1=t;(12) 将#4 int k;改为:int k=0;将#6 if (*p=*q)将#15 char a10=fshADfg,b10=sdAEdi,c80 ;改为: char a10=fshADfg,b10=sdAEdi,c80=0 ; 字符串结束的标志是0,若数组c初始化时不赋0,根据程序,数组 c中存放的数据构不成字符串。(13) 将#6 char temp;改为:char *temp;将#10 if (temp*namei0)改为:if(st

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论