1、若错误行是函数首部,可分为以下几种情况:
A、该行最后若有分号则删除,中间若有分号则改成逗号
B、形参类型不一致的问题,特别是指针类型,若后面用到某形参时有指针运算则该形参必为指针类型;若形参是二维数组或指向m个元素的指针变量,则第二维的长度必须与main中对应数组的第二维长度相同
C、函数类型不一致的问题,若函数中没有return语句则函数类型为void,若有return语句则函数的类型必须与return后变量的类型一致。
2、若错误行是if或while语句,则首先看有没有用小括号将整个表达式括起,若没有则加上小括号。
3、若错误行中有if、while、for则要特别注意条件表达式的错误问题:
A、指针变量的应用,若表达式中有指针变量且没有指针运算符,则加上指针运算符
B、若条件表达式中只有一个等于号,则改成两个等于号,若为其它比较运算符则一般是进行逆转或加一个等于号
C、for中要用分号分隔表达式,而不是用逗号
4、语法错误
A、语句缺少分号,若错误行中有语句没有用分号结束,则加上分号。
B、大小写不对,若错误行中有大写字母则一般都改成小写字母。
5、指针变量的运用,若错误行中有指针变量,并且该变量名前没有指针运算符则一般都是加上指针运算符
6、若错误行为return语句,则首先看是否是缺少分号若是则加上分号即可;否则就是return后的变量或表达式错误(此时可通过看题意,来分析该返回哪一变量或表达式)
7、若错误行中见到整型1除以某个表达式时,一概改成1.0。但若是整型变量或表达式则只能用强制转换
8、复合运算符写错
9、字符串结束符写错,若有字符串结束符则要特别注意有没有写错,但第11题例外,因为该题是要将数字字符转换成对应的数字。
10、若错误行是定义语句,则首先看类型是否符合;再看所赋初值是否正确;若以上均不是,则看是否少定义了某个变量或少了花括号。
11、表达式错误(占的份量最多,并且没有统一的改法,我们只能通过题目要求来分析并修改)
12、若错误行中有一条横线,则必须将横线删除再填空。填空题中亦是如此
例如,n的值为8时,输入28.3、41.5、19.0、89.5、55.8、74.2、22.4、68.9,所得平均值为49.949997;在平均值以上(含平均值)的实数的个数为4。 请改正函数fun中的错误,使它能得出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构! 试题源程序如下: #include "stdio.h" int fun(float x[],int n) /**********found**********/ int i; /**********found**********/ float xn=0.0; for(i=0;i<n;i++) /**********found**********/ xn=xn+x[j]/n; printf("ave=%f\n",xn); for(i=0;i<n;i++) /**********found**********/ if(x[i]=>xn)c++; return c; } main() { float x[20]={28.3,41.5,19.0,89.5,55.8,74.2,22.4,68.9}; printf("The number over average value:%d\n",fun(x,8)); }分析:(1)当对以上程序进行编译时,给出的第一个出错信息是:Declaration syntax error,指出在说明语句int i;中有语法错,仔细观察,可以发现在说明语句前却少了函数体开始的左花括号,应当添加左花括号。 (2)修改后进行编译,在第一个for循环体处给出一个警告出错信息:Possible use of'xn'beforedefintion,提示xn有确定的值之前使用了它。此处,变量xn用于存放累加和,xn出现在赋值号的右边,在第一次累加时它应当有初值,向上寻找,没有发现给它赋过初值,因此应当在定义语句中给它赋初值0。float xn;改成float xn=0.0; (3)修改后再次进行编译,编译提示if语句中的关系表达式有语法错,出错信息是:Expressionsyntax;查看关系表达式,可发现关系运算符"=>"写错,应该是">=",应进行修正。 (4)修改后再次进行编译,编译指出在c++;处有错,出错信息是:Undefined symbol'c',指出符号'c'没有经过定义;此处变量c用以统计数组中高于、等于平均值的实数的个数,查看函数开头处的定义语句,未曾对c进行过定义,因此应该在int语句中添加。 (5)修改后再次进行编译,编译给出出错信息:Undefined symbol'c',指出变量c没有定义。所以说明语句应写成int i,c=0;。因为函数用c进行累加,它应当先赋初值0, (6)进行了以上的修改后,编译已无错误,运行程序得到正确的结果。 文章出处 http://www.diybl.com/course/comshiti/rank2/zhzhd/2007521/35601.html
例如,当字符串s中的内容为:abcdabfabcdx,子串t中的内容为:abc时,输出结果应为:abcdx。当子串t中的内容为:abd时,输出未找到信息:Notbe found!。 请改正函数fun中指定部位的错误,使它能得出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构! 试题源程序如下: #include <stdio.h> /**********found**********/ char fun( char *s, char *t ) { char *p, *r, *a; a=NULL; /**********found**********/ while( s ) { p=s; r=t; while(*r) /**********found**********/ if( r==p ) r++; p++; } else break; if( *r==0 ) a=s; s++; } /**********found**********/ retrun a; } main() { char s[50]= "abcdabfabcdx", t[50], *p; printf("The string s: %s\n\n",s ); printf("Enter substring: "); gets(t); p=fun(s,t); if(p)printf("\nThe result is: %s\n", p ); else printf("\nNot be found !\n"); }分析:(1)对以上程序进行编译,给出出错信息:Misplaced else,指出else放错了位置;检查else语句,本身没有错,察看有关的if语句,可以发现if子句应是一个复合语句,但缺了左括号,进行改正。 (2)再次进行编译,在函数的最后出错,显示出错信息:Undefined symbol 'retrun',指出错在retrun。在此把return拼错,进行改正。 (3)编译无错,运行程序,输入子串:abc,输出结果也是:abc,显然不对。需进一步检查程序。 (4)函数中,形参指针s、t分别指向主函数中的主串s和子串t,为叙述简单,直接称s串和t串;函数中定义p、r和a为工作指针,从return语句看,指针a存放字符串中最后一次出现子字符串的地址。 (5)主函数中,fun函数返回的值放在指针p中,因此fun函数值应是地址,fun函数的类型应是基类型为char的指针,但是程序中fun函数的类型为char,应当改正为char*。改正后运行程序,仍不正确<绦觳槌绦颉?BR> (6)外层while循环的判断条件应当是逐个检查s串中的字符是否为字符串结束标志,若是字符串结束标志则循环应结束;而此处用s(地址)作为循环控制表达式是不合理的,应该改为*s。 (7)查看外层while的循环体,第一条语句在p中放入s当前所指地址,在r中放入t当前所指地址。内嵌的while循环体把s串和子串中的字符逐个进行比较,如果在子串结束前有不同的字符,则执行break退出此内循环,s指向下一个字符重新再比较;反之,若相同,则r和p同时向后移,继续比较直到遇到子串结束;因此内循环中if语句的表达式应是*r==*p;进行改正。 (8)改正后按要求输入子串,得到正确结果。 (9)提示:本题的改错虽有语法错的部分,但要完全得到正确结果,必须读懂程序,理解算法。这样的改错题有一定的难度。
文章出处 http://www.diybl.com/course/comshiti/rank2/zhzhd/2007521/35599.html
1、给定程序MODI1.C中,函数fun的功能是:通过某种方式实现两个变量值的交换,规定不允许增加任何语句和表达式。例如变量a中的值原为10,b中的值原为20,程序运行后a中的值为20,b中的值为10。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构! 试题源程序如下: #include<stdio.h> /**********found***********/ void fun(int x,int y) { int t. /**********found***********/ t=x. x=y. /**********found***********/ retum y. } main() { int a,b. printf("Enter a,b: ").scanf("%d%d",&.a,&.b). printf("a=%d b=%d\n\n",a,b). b=fun(&.a,b). printf("a=%d b=%d\n\n",a,b). }分析1)当对以上程序进行编译时,给出的第一个出错信息是:void function may not return avalue。指出void类型的函数不可能返回一个函数值。从主函数可知,函数将返回值赋给整型变量b,因此,fun函数应当是int类型,在fun之前的void应改为int或删除void。 (2)改正以上错误的同时,考生会发现主函数中调用fun函数时,第一个实参和形参的类型不匹配,实参的类型是int变量的地址值,形参的类型是int类型变量,因此应该在fun函数的第一个形参x之前加一个*号,把x定义成一个能接受地址的指针。 (3)进行修改后的程序编译不再出错,运行程序时给a和b输入数据(注意输入的数据用空格隔开)。若给a输入10,给b输入20,从输出的结果看a和b的值都没有变,也就是说,在fun函数中并没有进行指定的交换操作,这就要求对fun函数中的语句进行检查。 (4)在函数内可以发现语句t=x.把地址值赋给了整型变量,这是不允许的,按题义应当把指针x所指a的值赋给t,因此语句应该是t=*x.同样语句x=y.应该改成*x=y.,这样就把主函数中变量b的值赋给了变量a;改变后再运行程序并给a和b分别输入10和20,观察输出结果可以看到a和b的值都为20,也就是说b的值已给了a,而b本身并没有改变。 (5)再审查程序应当看到在主函数中,b最后的值是通过fun函数的返回值赋给的,观察函数的return语句,返回的是函数中y的值,而这是主函数中b的原值,因此在逻辑上存在错误,按题义应该返回a的原值,而此时,a的原值已通过t=*x放在了fun函数的t中,所以return语句应改成:retum t.。再次运行程序,就的到了正确的结果。 (6)提示: ①首先检查被调用函数的类型和形参的类型是否与主函数中的调用函数和实参的类型一致,如果不一致,应按主函数中的调用来进行修改。例如,实参为指针或数组名时,对应的形参一定应定义成基类型相同的指针。在主函数中返回的函数值赋给一个指针时,则函数的类型也一定是基类型相同的地址值。 ②若函数有返回值,应检查return语句中的表达式的类型是否与函数的类型一致。 ③若形参是指针类型,则在函数中应通过间址符(*)来引用主函数中的变量。
|