C语言调试常见错误及修改方法附习题.docx
- 文档编号:27119520
- 上传时间:2023-06-27
- 格式:DOCX
- 页数:14
- 大小:18.19KB
C语言调试常见错误及修改方法附习题.docx
《C语言调试常见错误及修改方法附习题.docx》由会员分享,可在线阅读,更多相关《C语言调试常见错误及修改方法附习题.docx(14页珍藏版)》请在冰豆网上搜索。
C语言调试常见错误及修改方法附习题
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、for中要用分号分隔表达式,而不是用逗号
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
2 #include
3 IsPrime(intn);
4 {
5 inti,m;
6 m=1;
7 for(i=2;i 8 if! (n%i) 9 { 10 m=0;break; 11 } 12 return(m); 13 } 14 main() 15 { 16 intj,k; 17 clrscr(); 18 printf("\nPleaseenteranintegernunber2and10000: ");scanf("%d",&k); 19 printf("\n\nThePrimefactor(s)of%dis(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=0,那么非0就是真的,再用一个判断它是不是素数的函数IsPrime(intn)来判断它是不是素数,如果是的话就是我们所求的。 IsPrime()函数分析,函数语句的意思是,只要2到n中有任意一个数有能被n整除的话,就返回0〔假〕,否那么返回1〔真〕,我们看一下循环体if〔! (n%i)〕这个语句的分析上面有,只要n能把i整除的话m=0,break语句会使程序立刻跳出循环体,执行return(m);语句。 */ #include #include IsPrime(intn) { inti,m; m=1; for(i=2;i if(! (n%i)) { m=0;break; } return(m); } main() { intj,k; clrscr(); printf("\nPleaseenteranintegernunber2and10000: ");scanf("%d",&k); printf("\n\nThePrimefactor(s)of%dis(are): ",k); for(j=2;j<=k;j++) if((! (k%j))&&(IsPrime(j))) printf("\n%4d",j); printf("\n"); } 改错题集 第1题 给定程序MODI1.C中函数fun的功能是: 把在字符串s中出现的每个字符,紧随其后重复出现一次,形成一个新串放在t中,t中字符按原字符串中字符顺序排列。 例如: 当s中的字符串为: "ABAABBCCDDEE"。 那么t中的字符串应为: "AABBCCDDEE"。 请改正函数fun中的错误,使它能得出正确的结果。 注意: 不要改动main函数,不得增行或删行,也不得更改程序的构造! Modi1.c #include #include #include /************found************/ voidfun(chars,chart)/参考答案: voidfun(char*s,char*t)/ {inti,sl; sl=strlen(s); for(i=0;i {t[2*i]=s[i]; t[2*i+1]=s[i]; } /************found************/ t[2*sl]='0';/参考答案: t[2*sl]='\0';/ } main() {chars[100],t[100]; clrscr(); printf("\nPleaseenterstrings: ");scanf("%s",s); fun(s,t); printf("Theresultis: %s\n",t); } 第2题 给定程序MODI1.C中函数fun的功能是: 把在字符串s中出现的每个字符,紧随其后重复出现一次,放在一个新串t中,t中字符按原字符串中逆排列。 例如: 当s中的字符串为: "ABCDE"时, 那么t中的字符串应为: "EEDDCCBBAA"。 请改正函数fun中的错误,使它能得出正确的结果。 注意: 不要改动main函数,不得增行或删行,也不得更改程序的构造! Modi1.c #include #include #include voidfun(char*s,char*t) {inti,sl; sl=strlen(s); /************found************/ for(i=1;i {t[2*i]=s[sl-i-1]; t[2*i+1]=s[sl-i-1]; } /************found************/ t[2*sl]='0/';/参考答案: t[2*sl]='\0';/ } main() {chars[100],t[100]; clrscr(); printf("\nPleaseenterstrings: ");scanf("%s",s); fun(s,t); printf("Theresultis: %s\n",t); } 第3题 给定程序MODI1.C中函数fun的功能是: 将在字符串s中下标为偶数位置上的字符,紧随其后重复出现一次,放在一个新串t中,t中字符按原字符串中字符的顺序排列。 〔注意0为偶数〕 例如: 当s中的字符串为: "ABCDE"时, 那么t中的字符串应为: "AACCEE"。 请改正函数fun中的错误,使它能得出正确的结果。 注意: 不要改动main函数,不得增行或删行,也不得更改程序的构造! Modi1.c #include #include #include voidfun(char*s,char*t) {inti,j,sl; sl=strlen(s); /************found************/ for(i=0,j=0;i{t[2*j]=s[i]; t[2*j+1]=s[i]; j++; } /************found************/ t[2*sl]='\0';/参考答案: t[2*j]='\0';/ } main() {chars[100],t[100]; clrscr(); printf("\nPleaseenterstrings: ");scanf("%s",s); fun(s,t); printf("Theresultis: %s\n",t); } 第4题 给定程序MODI1.C中函数fun的功能是: 将在字符串s中下标为奇数位置上的字符,紧随其后重复出现一次,放在一个新串t中,t中字符按原字符串中字符的顺序排列。 〔注意0为偶数〕 例如: 当s中的字符串为: "ABCDEF"时, 那么t中的字符串应为: "BBDDFF"。 请改正函数fun中的错误,使它能得出正确的结果。 注意: 不要改动main函数,不得增行或删行,也不得更改程序的构造! Modi1.c #include #include #include voidfun(char*s,char*t) {inti,j,sl; sl=strlen(s); /************found************/ for(i=0,j=0;i{t[2*j]=s[i]; t[2*j+1]=s[i]; /************found************/ j--;/参考答案: j++/ } t[2*j]='\0'; } main() {chars[100],t[100]; clrscr(); printf("\nPleaseenterstrings: ");scanf("%s",s); fun(s,t); printf("Theresultis: %s\n",t); } 第5题 给定程序MODI1.C中函数fun的功能是: 将在字符串s中下标为偶数位置上的字符,紧随其后重复出现一次,放在一个新串t中,t中字符按原字符串中字符出现的逆序排列。 〔注意0为偶数〕 例如: 当s中的字符串为: "ABCDEF"时, 那么t中的字符串应为: "EECCAA"。 请改正函数fun中的错误,使它能得出正确的结果。 注意: 不要改动main函数,不得增行或删行,也不得更改程序的构造! Modi1.c #include #include #include voidfun(char*s,char*t) {inti,j,sl; sl=strlen(s); if(sl%2)sl--;elsesl-=2; /************found************/ for(i=sl,j=0;i>=0;i--)/参考答案: for(i=sl,j=0;i>=0;i-=2)/ {t[2*j]=s[i]; t[2*j+1]=s[i]; j++; } /************found************/ t[2*sl]='\0';/参考答案: t[2*j]='\0';/ } main() {chars[100],t[100]; clrscr(); printf("\nPleaseenterstrings: ");scanf("%s",s); fun(s,t); printf("Theresultis: %s\n",t); } 第6题 给定程序MODI1.C中函数fun的功能是: 将在字符串s中下标为奇数位置上的字符,紧随其后重复出现一次,放在一个新串t中,t中字符按原字符串中字符出现的逆序排列。 〔注意0为偶数〕 例如: 当s中的字符串为: "ABCDEFG"时, 那么t中的字符串应为: "FFDDBB"。 请改正函数fun中的错误,使它能得出正确的结果。 注意: 不要改动main函数,不得增行或删行,也不得更改程序的构造! Modi1.c #include #include #include voidfun(char*s,char*t) {inti,j,sl; sl=strlen(s); /************found************/ if(sl%2)Sl-=2;elseSl--;/参考答案: if(sl%2)sl-=2;elsesl--;/ for(i=sl,j=0;i>=0;i-=2) {t[2*j]=s[i]; t[2*j+1]=s[i]; j++; } /************found************/ t[2*sl]='0';/参考答案: t[2*j]='\0';/ } main() {chars[100],t[100]; clrscr(); printf("\nPleaseenterstrings: ");scanf("%s",s); fun(s,t); printf("Theresultis: %s\n",t); } 第7题 给定程序MODI1.C中函数fun的功能是: 把在字符串s中出现的每个字符,紧随其后重复出现一次,形成一个新串放在t中,且在t中把原相邻字符的位置进展了交换。 例如: 当s中的字符串为: "ABCDE"时, 那么t中的字符串应为: "BBAADDCCEE"。 请改正函数fun中的错误,使它能得出正确的结果。 注意: 不要改动main函数,不得增行或删行,也不得更改程序的构造! Modi1.c #include #include #include voidfun(char*s,char*t) { /************found************/ inti,j;/参考答案: inti,j,sl;/ sl=strlen(s); for(i=0,j=0;i{if(i+1 {t[2*j]=s[i+1];t[2*j+1]=s[i+1]; j++; } t[2*j]=s[i];t[2*j+1]=s[i]; /************found************/ j--;/参考答案: j++;/ } t[2*sl]='\0'; } main() {chars[100],t[100]; clrscr(); printf("\nPleaseenterstrings: ");scanf("%s",s); fun(s,t); printf("Theresultis: %s\n",t); } 第8题 给定程序MODI1.C中函数fun的功能是: 将在字符串s中出现、而未在字符串t中出现的字符形成一个新的字符串放在u中,u中字符按原字符串中字符顺序排列,不去掉重复字符。 例如: 当s="AABCDE",t="BDFG"字符。 u中的字符串为"AACE"。 请改正函数fun中的错误,使它能得出正确的结果。 注意: 不要改动main函数,不得增行或删行,也不得更改程序的构造! Modi1.c #include #include #include /************found************/ voidfun(char*s,char*t,charu)/参考答案: voidfun(char*s,char*t,char*u) {inti,j,sl,tl; sl=strlen(s);tl=strlen(t); for(i=0;i {for(j=0;j if(s[i]==t[j])break; /************found************/ if(j>tl)/参考答案: if(j>=tl) *u++=s[i]; } *u='\0'; } main() {chars[100],t[100],u[100]; clrscr(); printf("\nPleaseenterstrings: ");scanf("%s",s); printf("\nPleaseenterstringt: ");scanf("%s",t); fun(s,t,u); printf("theresultis: %s\n",u); } 第9题 给定程序MODI1.C中函数fun的功能是: 将未在字符串s中出现而在字符串t中出现的字符形成一个新的字符串放在u中,u中字符按原字符串中字符顺序排列,不去掉重复字符。 例如: 当s="ABCDE",t="BDFGG"时, u中的字符串为"FGG"。 请改正函数fun中的错误,使它能得出正确的结果。 注意: 不要改动main函数,不得增行或删行,也不得更改程序的构造! Modi1.c #include #include #include voidfun(char*s,char*t,char*u) {inti,j,sl,tl; sl=strlen(s);tl=strlen(t); /************found************/ for(i=0;i /************found************/ {for(j=0;j if(t[i]==s[j])break; if(j>=sl)*u++=t[i]; } /************found************/ u='\0';/参考答案*u='\0'; } main() {chars[100],t[100],u[100]; clrscr(); printf("\nPleaseenterstrings: ");scanf("%s",s); printf("\nPleaseenterstringt: ");scanf("%s",t); fun(s,t,u); printf("Theresultis: %s\n",u); } 第10题 给定程序MODI1.C中函数fun的功能是: 将既在字符串s中出现又在字符串t中出现的字符构成一个新的字符串放在u中,u中字符按原字符串中字符顺序排列,不去掉重复字符。 例如: 当s="ABBCDE",t="BDFG"时,u中的字符串为: "BBD"。 请改正函数fun中的错误,使它能得出正确的结果。 注意: 不要改动main函数,不得增行或删行,也不得更改程序的构造! Modi1.c #include #include #include voidfun(char*s,char*t,char*u) {inti,j,sl,tl; sl=strlen(s);tl=strlen(t); for(i=0;i {for(j=0;j if(s[i]==t[j])break; /************found************/ if(j>=tl)/参考答案if(j *u++=s[i]; } /************found************/ *u='0';/参考答案*u='\0'; } main() {chars[100],t[100],u[100]; clrscr(); printf("\nPleaseenterstrings: ");scanf("%s",s); printf("\nPleaseenterstringt: ");scanf("%s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 调试 常见 错误 修改 方法 习题