1.调试 C 程序时常见的错误类型分析一般情况下,错误主要分为两大类:一、语法错误。
对于这种错误,用编译器很容易解决。
所以,改错题的第一步是先编译,解决这类语法错误。
下面总结了二级C 语言上机改错题中常见的语法错误:(1) 丢失分号,或分号误写成逗号。
(2) 关键字拼写错误,如本来小写变成大写。
(3) 语句格式错误,例如for 语句中多写或者少写分号。
(4) 表达式声明错误,例如:少了()(5) 函数类型说明错误。
与main ()函数中不一致。
(6) 函数形参类型声明错误。
例如:少* 等。
(7) 运算符书写错误,例如:/ 写成了。
二、逻辑错误,或者叫语义错误,这和实现程序功能紧密相关,一般不能用编译器发现。
对于逻辑错误可以按这样的步骤进行查找。
(1) 先读试题,看清题目的功能要求。
(2) 通读程序,看懂程序中算法的实现方法。
(3) 细看程序,发现常见错误点。
2.改错题的改错方式总结,当然这些总结只能对大部分改错行有效1、若错误行是函数首部,可分为以下几种情况:A、该行最后若有分号则删除,中间若有分号则改成逗号B、形参类型不一致的问题,特别是指针类型,若后面用到某形参时有指针运算则该形参必为指针类型;若形参是二维数组或指向m 个元素的指针变量,则第二维的长度必须与main 中对应数组的第二维长度相同C、函数类型不一致的问题,若函数中没有return语句则函数类型为void,若有return语句则函数的类型必须与return 后变量的类型一致。
2、若错误行是if 或while 语句,则首先看有没有用小括号将整个表达式括起,若没有则加上小括号。
3、若错误行中有if、while 、for 则要特别注意条件表达式的错误问题:A、指针变量的应用,若表达式中有指针变量且没有指针运算符,则加上指针运算符B、若条件表达式中只有一个等于号,则改成两个等于号,若为其它比较运算符则一般是进行逆转或加一个等于号C、f or 中要用分号分隔表达式,而不是用逗号4、语法错误A、语句缺少分号,若错误行中有语句没有用分号结束,则加上分号。
B、大小写不对,若错误行中有大写字母则一般都改成小写字母。
5、指针变量的运用,若错误行中有指针变量,并且该变量名前没有指针运算符则一般都是加上指针运算符6、若错误行为return 语句,则首先看是否是缺少分号若是则加上分号即可;否则就是return 后的变量或表达式错误(此时可通过看题意,来分析该返回哪一变量或表达式)7、若错误行中见到整型1 除以某个表达式时,一概改成1.0。
但若是整型变量或表达式则只能用强制转换8、复合运算符写错9、字符串结束符写错,若有字符串结束符则要特别注意有没有写错,但第11 题例外,因为该题是要将数字字符转换成对应的数字。
10、若错误行是定义语句,则首先看类型是否符合;再看所赋初值是否正确;若以上均不是,则看是否少定义了某个变量或少了花括号。
11、表达式错误(占的份量最多,并且没有统一的改法,我们只能通过题目要求来分析并修改)12、若错误行中有一条横线,则必须将横线删除再填空。
填空题中亦是如此。
例题/*1.下面给定的程序的功能是:读入一个整数k (2<=k<=10000),打印他所有的质因子(即所有为素数的的质因子)。
例如,若输入整数2310,则应输出:2、3、5、7、11。
请改正程序中的错误,使程序得到正确的结果。
注意:不要改动main 函数,不得增行或删行,也不得更改程序的结构试题程序:1 #include <conio.h>2 #include <stdio.h>3 IsPrime(int n);4 {5 int i,m;6 m=1;7 for(i=2;i<n;i++)8 if!(n%i)9 {10 m=0;break;11 }12 return(m);13 }14 main()15 {16 int j,k;17 clrscr();18 printf("\nPlease enter an integer nunber 2 and 10000:");scanf("%d",&k);19 printf("\n\nThe Prime factor(s) of %d is (are):",k);20 for(j=2;j<=k;j++)21 if((!(k%j))&&(IsPrime(j)))22 printf("\n %4d",j);23 printf("\n");24 } 试题解答及分析错误一:第三行的末尾不需要分号,这并不是一个语句的结束,这是一个函数的头部;错误二:第八行应该该为if(!(n%i)), 这是由if 语句的执行过程决定的,if 语句先判断紧跟着它的()里面的条件的真假,如果真执行下面的语句,如果是多条语句可以用{} 括起来如果嫁就跳过直接执行下面的语句但这个if 语句中把括号忘了。
自然出错;程序整体分析我们的题目要求判断求出一个整数的所有质因子我们可以求出它所有的因子,再看这些因子中哪些是素数不就行了,程序先通过scanf("%d",%k); 从键盘读入一个整数,接着我们开始循环,对于2到k之间的每一个j;用!(k%j)判断j是不是k的因子,如果是的话,k%j=O,则非0 就是真的,再用一个判断它是不是素数的函数IsPrime(int n) 来判断它是不是素数,如果是的话就是我们所求的。
lsPrime()函数分析,函数语句的意思是,只要2到n中有任意一个数有能被n整除的话,就返回0(假),否则返回1(真),我们看一下循环体if(!(n%i) )这个语句的分析上面有,只要n能把i整除的话m=O,break语句会使程序立刻跳出循环体,执行return (m);语句。
*/#include <conio.h>#include <stdio.h>lsPrime(int n){int i,m;m=1;for(i=2;i<n;i++)if(!(n%i)){m=0;break;}return(m);}main(){int j,k;clrscr();printf("\nPlease enter an integer nunber 2 and 10000:");scanf("%d",&k); printf("\n\nThe Prime factor(s) of %d is (are):",k);for(j=2;j<=k;j++) if((!(k%j))&&(IsPrime(j))) printf("\n %4d",j); printf("\n");}改错题集第1题给定程序M0DI1.C 中函数fun 的功能是:把在字符串 s 中出现的每个字符,紧随其后重复 出现一次,形成一个新串放在 t 中, t 中字符按原字符串中字符顺序排列。
例如:当s 中的字符串为:"ABAABBCCDDEE"则 t 中的字符串应为: "AABBCCDDEE 。
"请改正函数 fun 中的错误,使它能得出正确的结果。
注意:不要改动 main 函数,不得增行 或删行,也不得更改程序的结构 !Modi1.c#include#include#include]************#nA************ /参考答案: void fun (char *s,char *t)/ { int i, sl; sl = strlen(s); for (i=0;i{ t[2*i] = s[i]; t[2*i+1] = s[i];}t[2*sl] = '0'; / 参考答案: t[2*sl] = '\0';/ } main() { char s[100], t[100];clrscr(); void fun (char s,char t) / **********found**********printf("\nPlease enter string s:"); scanf("%s", s);fun(s, t);printf("The result is: %s\n", t);}第2题给定程序M0DI1.C 中函数fun 的功能是:把在字符串 s 中出现的每个字符,紧随其后重复 出现一次,放在一个新串 t 中,t 中字符按原字符串中逆排列。
例如:当s 中的字符串为:"ABCDE'时,则 t 中的字符串应为: "EEDDCCBBAA 。
"请改正函数 fun 中的错误,使它能得出正确的结果。
注意:不要改动 main 函数,不得增行 或删行,也不得更改程序的结构 !Modi1.c#include #include #include void fun (char *s, char *t) { int i, sl;sl = strlen(s);for (i=1; i{ t[2*i] = s[sl-i-1]; t[2*i +1] = s[sl-i-1];}main(){ char s[100], t[100];clrscr();printf("\nPlease enter string s:"); scanf("%s", s);fun(s, t);printf("The result is: %s\n", t);}第3题给定程序M0DI1.C 中函数fun 的功能是:将在字符串s 中下标为偶数位置上的字符,紧随 其后重复出现一次,放在一个新串t 中,t 中字符按原字符串中字符的顺序排列。
(注意 0为偶数)例如:当s 中的字符串为:"ABCDE'时,则 t 中的字符串应为: "AACCEE"。
请改正函数 fun 中的错误,使它能得出正确的结果。
注意:不要改动 main 函数,不得增行**********found********** **********found**********t[2*sl] = '0/';/ }参考答案: t[2*sl] = '\0';/或删行,也不得更改程序的结构Modi1.c#include#include#include void fun (char *s, char *t) { int i, j, sl;sl = strlen(s);for (i=0, j=0; i { t[2*j] = s[i]; t[2*j +1] = s[i];j++;}main(){ char s[100], t[100]; clrscr();printf("\nPlease enter string s:"); scanf("%s", s); fun(s, t);printf("The result is: %s\n", t);}第4题给定程序 MODI1.C 中函数 fun 的功能是:将在字符串 s 中下标为奇数位置上的字符,紧随 其后重复出现一次,放在一个新串 t 中 ,t 中字符按原字符串中字符的顺序排列。