程序设计 国二必考.docx
《程序设计 国二必考.docx》由会员分享,可在线阅读,更多相关《程序设计 国二必考.docx(10页珍藏版)》请在冰豆网上搜索。
![程序设计 国二必考.docx](https://file1.bdocx.com/fileroot1/2023-3/18/88641eed-c9b7-4ee2-b098-99ed85aacb97/88641eed-c9b7-4ee2-b098-99ed85aacb971.gif)
程序设计国二必考
C语言编程时常犯十八个错误
作者:
admin 发布时间:
2012-04-2818:
53 来源:
C语言中文网 人围观
分享到:
QQ空间新浪微博人人网腾讯微博豆瓣12
C语言的最大特点是:
功能强、使用方便灵活。
C编译的程序对语法检查并不象其它高级语言那么严格,这就给编程人员留下“灵活的余地”,但还是由于这个灵活给程序的调试带来了许多不便,尤其对初学C语言的人来说,经常会出一些连自己都不知道错在哪里的错误。
看着有错的程序,不知该如何改起,本人通过对C的学习,积累了一些C编程时常犯的错误,写给各位学员以供参考。
1、书写标识符时,忽略了大小写字母的区别。
main()
{
inta=5;
printf("%d",A);
}
编译程序把a和A认为是两个不同的变量名,而显示出错信息。
C认为大写字母和小写字母是两个不同的字符。
习惯上,符号常量名用大写,变量名用小写表示,以增加可读性。
2、忽略了变量的类型,进行了不合法的运算。
main()
{
floata,b;
printf("%d",a%b);
}
%是求余运算,得到a/b的整余数。
整型变量a和b可以进行求余运算,而实型变量则不允许进行“求余”运算。
3、将字符常量与字符串常量混淆。
charc;
c="a";
在这里就混淆了字符常量与字符串常量,字符常量是由一对单引号括起来的单个字符,字符串常量是一对双引号括起来的字符序列。
C规定以“\”作字符串结束标志,它是由系统自动加上的,所以字符串“a”实际上包含两个字符:
‘a'和‘\0',而把它赋给一个字符变量是不行的。
4、忽略了“=”与“==”的区别。
在许多高级语言中,用“=”符号作为关系运算符“等于”。
如在BASIC程序中可以写
if(a=3)then…
但C语言中,“=”是赋值运算符,“==”是关系运算符。
如:
if(a==3)a=b;
前者是进行比较,a是否和3相等,后者表示如果a和3相等,把b值赋给a。
由于习惯问题,初学者往往会犯这样的错误。
5、忘记加分号。
分号是C语句中不可缺少的一部分,语句末尾必须有分号。
a=1
b=2
编译时,编译程序在“a=1”后面没发现分号,就把下一行“b=2”也作为上一行语句的一部分,这就会出现语法错误。
改错时,有时在被指出有错的一行中未发现错误,就需要看一下上一行是否漏掉了分号。
{
z=x+y;
t=z/100;
printf("%f",t);
}
对于复合语句来说,最后一个语句中最后的分号不能忽略不写(这是和PASCAL不同的)。
6、多加分号。
对于一个复合语句,如:
{
z=x+y;
t=z/100;
printf("%f",t);
};
复合语句的花括号后不应再加分号,否则将会画蛇添足。
又如:
if(a%3==0);
I++;
本是如果3整除a,则I加1。
但由于if(a%3==0)后多加了分号,则if语句到此结束,程序将执行I++语句,不论3是否整除a,I都将自动加1。
再如:
for(I=0;I<5;I++);
{scanf("%d",&x);
printf("%d",x);}
本意是先后输入5个数,每输入一个数后再将它输出。
由于for()后多加了一个分号,使循环体变为空语句,此时只能输入一个数并输出它。
7、输入变量时忘记加地址运算符“&”。
inta,b;
scanf("%d%d",a,b);
这是不合法的。
Scanf函数的作用是:
按照a、b在内存的地址将a、b的值存进去。
“&a”指a在内存中的地址。
8、输入数据的方式与要求不符。
①scanf("%d%d",&a,&b);
输入时,不能用逗号作两个数据间的分隔符,如下面输入不合法:
3,4
输入数据时,在两个数据之间以一个或多个空格间隔,也可用回车键,跳格键tab。
②scanf("%d,%d",&a,&b);
C规定:
如果在“格式控制”字符串中除了格式说明以外还有其它字符,则在输入数据时应输入与这些字符相同的字符。
下面输入是合法的:
3,4
此时不用逗号而用空格或其它字符是不对的。
343:
4
又如:
scanf("a=%d,b=%d",&a,&b);
输入应如以下形式:
a=3,b=4
9、输入字符的格式与要求不一致。
在用“%c”格式输入字符时,“空格字符”和“转义字符”都作为有效字符输入。
scanf("%c%c%c",&c1,&c2,&c3);
如输入abc
字符“a”送给c1,字符“”送给c2,字符“b”送给c3,因为%c只要求读入一个字符,后面不需要用空格作为两个字符的间隔。
10、输入输出的数据类型与所用格式说明符不一致。
例如,a已定义为整型,b定义为实型
a=3;b=4.5;
printf("%f%d\n",a,b);
编译时不给出出错信息,但运行结果将与原意不符。
这种错误尤其需要注意。
11、输入数据时,企图规定精度。
scanf("%7.2f",&a);
这样做是不合法的,输入数据时不能规定精度。
12.switch语句中漏写break语句。
例如:
根据考试成绩的等级打印出百分制数段。
switch(grade)
{
case'A':
printf("85~100\n");
case'B':
printf("70~84\n");
case'C':
printf("60~69\n");
case'D':
printf("<60\n");
default:
printf("error\n");
}
由于漏写了break语句,case只起标号的作用,而不起判断作用。
因此,当grade值为A时,printf函数在执行完第一个语句后接着执行第二、三、四、五个printf函数语句。
正确写法应在每个分支后再加上“break;”。
例如
case'A':
printf("85~100\n");break;
13、忽视了while和do-while语句在细节上的区别。
(1)main()
{inta=0,I;
scanf("%d",&I);
while(I<=10)
{a=a+I;
I++;
}
printf("%d",a);
}
(2)
main()
{inta=0,I;
scanf("%d",&I);
do
{a=a+I;
I++;
}while(I<=10);
printf("%d",a);
}
可以看到,当输入I的值小于或等于10时,二者得到的结果相同。
而当I>10时,二者结果就不同了。
因为while循环是先判断后执行,而do-while循环是先执行后判断。
对于大于10的数while循环一次也不执行循环体,而do-while语句则要执行一次循环体。
14、定义数组时误用变量。
intn;
scanf("%d",&n);
inta[n];
数组名后用方括号括起来的是常量表达式,可以包括常量和符号常量。
即C不允许对数组的大小作动态定义。
15、在定义数组时,将定义的“元素个数”误认为是可使的最大下标值。
main()
{staticinta[10]={1,2,3,4,5,6,7,8,9,10};
printf("%d",a[10]);
}
C语言规定:
定义时用a[10],表示a数组有10个元素。
其下标值由0开始,所以数组元素a[10]是不存在的。
17、在不应加地址运算符&的位置加了地址运算符。
scanf("%s",&str);
C语言编译系统对数组名的处理是:
数组名代表该数组的起始地址,且scanf函数中的输入项是字符数组名,不必要再加地址符&。
应改为:
scanf("%s",str);
18、同时定义了形参和函数中的局部变量。
intmax(x,y)
intx,y,z;
{
z=x>y?
x:
y;
return(z);
}
形参应该在函数体外定义,而局部变量应该在函数体内定义。
应改为:
intmax(x,y)
intx,y;
{
intz;
z=x>y?
x:
y;
return(z);
}
∙下一篇:
手把手教你如何优化C语言程序
∙上一篇:
为什么要学习C语言,而不是其
初学者最容易犯的错误是:
1、没有区分开教材上的数字1和字母l,字母o和数字0的区别,造成变量未定义的错误。
另一个易错点是将英文状态下的逗号,分号;括号()双引号""输入出入成中文状态下的逗号,分号;括号(),双引号“”造成非法字符错误。
2、C语言初学者易犯语法错误:
使用未定义的变量、标示符(变量、常量、数组、函数等)不区分大小写、漏掉“;”、“{”与“}”、“(”与“)”不匹配、控制语句(选择、分支、循环)的格式不正确、调用库函数却没有包含相应的头文件、调用未声明的自定义函数、调用函数时实参与形参不匹配、数组的边界超界等。
3、修改C语言语法错误时要注意以下两点:
(1)、由于C语言语法比较自由、灵活,因此错误信息定位不是特别精确。
例如,当提示第10行发生错误时,如果在第10行没有发现错误,从第10行开始往前查找错误并修改之。
(2)、一条语句错误可能会产生若干条错误信息只要修改了这条错误,其他错误会随之消失。
特别提示:
一般情况下,第一条错误信息最能反映错误的位置和类型,所以调试程序时务必根据第一条错误信息进行修改,修改后,立即运行程序,如果还有很多错误,要一个一个地修改
C语言程序设计入门学习六步曲
作者:
admin 发布时间:
2012-04-2919:
52 来源:
C语言中文网 人围观
分享到:
QQ空间新浪微博人人网腾讯微博豆瓣10
初学者遇到最多的困惑是:
上课也能听懂,书上的例题也能看明白,可是到自己动手做编程时,却不知道如何下手。
发生这种现象的原因有三个:
一、所谓的看懂听明白,只是很肤浅的语法知识,而我们编写的程序或软件是要根据要解决问题的实际需要控制程序的流程,如果你没有深刻地理解C语言的语句的执行过程(或流程),你怎么会编写程序解决这些实际问题呢?
二、用C语言编程解决实际问题,所需要的不仅仅是C语言的编程知识,还需要相关的专业知识。
例如,如果你不知道长方形的面积公式,即使C语言学得再好你也编不出求长方形的面积的程序来。
三、C语言程序设计是一门实践性很强的课程,“纸上谈兵”式的光学不练是学不好C语言的。
例如,大家都看过精彩自行车杂技表演,假如,你从来没有骑过自行车,光听教练讲解相关的知识、规则、技巧,不要说上台表演、就是上路你恐怕都不行。
出现问题原因清楚了,那么如何学习呢?
请你看【C语言学习六步曲】
特别提醒:
在使用本方法之前一定要先阅读C语言的相关内容,要初步掌握相关知识的要点,然后按下述方法学习,可以达到理解、巩固、提高C语言知识和提高程序调式能力的目的。
第一步、验证性练习
在这一步要求按照教材上的程序实例进行原样输入,运行一下程序是否正确。
在这一步基本掌握C语言编程软件的使用方法(包括新建、打开、保存、关闭C程序,熟练地输入、编辑C程序;初步记忆新学章节的知识点、养成良好的C语言编程风格)。
单击此处查看【C语言的编程风格】
使用《TurboC/C++forWindows集成实验与学习环境》软件可以很方便地看着软件集成的《C语言入门教程》输入练习其中的程序例题。
具体使用方法参见软件帮助部分。
初学者最容易犯的错误是:
1、没有区分开教材上的数字1和字母l,字母o和数字0的区别,造成变量未定义的错误。
另一个易错点是将英文状态下的逗号,分号;括号()双引号""输入出入成中文状态下的逗号,分号;括号(),双引号“”造成非法字符错误。
2、C语言初学者易犯语法错误:
使用未定义的变量、标示符(变量、常量、数组、函数等)不区分大小写、漏掉“;”、“{”与“}”、“(”与“)”不匹配、控制语句(选择、分支、循环)的格式不正确、调用库函数却没有包含相应的头文件、调用未声明的自定义函数、调用函数时实参与形参不匹配、数组的边界超界等。
3、修改C语言语法错误时要注意以下两点:
(1)、由于C语言语法比较自由、灵活,因此错误信息定位不是特别精确。
例如,当提示第10行发生错误时,如果在第10行没有发现错误,从第10行开始往前查找错误并修改之。
(2)、一条语句错误可能会产生若干条错误信息只要修改了这条错误,其他错误会随之消失。
特别提示:
一般情况下,第一条错误信息最能反映错误的位置和类型,所以调试程序时务必根据第一条错误信息进行修改,修改后,立即运行程序,如果还有很多错误,要一个一个地修改,即,每修改一处错误要运行一次程序。
第二步、照葫芦画瓢
在第一步输入的C程序的基础上进行试验性的修改,运行一下程序看一看程序结果发生了什么变化,分析结果变化的原因,加深新学知识点的理解。
事实上这和第一步时同步进行的,实现“输入”加深知识的记忆,“修改”加深对知识的理解。
记忆和理解是相辅相成的,相互促进。
例如:
将最简单的HelloWorld!
程序
#include"stdio.h"
intmain()
{
printf("HelloWorld!
\n");
return0;
}
中的printf("HelloWorld!
\n");中的HelloWorld!
改成你的姓名,运行一下程序,看有什么变化?
再如求1+2+3...+100的和的程序
#include
main()
{
inti,sum=0;
for(i=1;i<=100;i++)
{
sum=sum+i;
}
printf("sum=%d\n",sum);
}
第1次将for(i=1;i<=100;i++)中的100改成50,运行一下程序,看有什么变化?
第2次将for(i=1;i<=100;i++)中的i++改成i=i+2,运行一下程序,看有什么变化?
找出程序结果变化的原因,就加深了对C语句的理解。
第三步、不看教材看是否能将前两步的程序进行正确地输入并运行。
在这一步要求不看教材,即使程序不能运行,看能否将其改正,使其能正确运行。
目的是对前两步的记忆、理解进一步强化。
第四步、增强程序的调试能力
在《TurboC/C++forWindows集成实验与学习环境》集成的教材中每章都有C语言初学者易犯的错误,按照易出错的类型,将教材中的正确的程序改成错误的程序,运行一下程序,看出现的错误信息提示,并记下错误信息,再将程序改成正确的,运行一下程序。
这样反复修改,就能够学习C语言程序发生错误的原因和修改错误的能力。
注意:
每次只改错一个地方,目的是显示发生该错误的真正原因,避免一次改动多个地方,搞清发生错误的真正原因,切记!
!
!
!
注意:
上机调试程序时要带一个记录本,记下英文错误提示信息和解决该错误问题的方法,积累程序调试经验,避免在编程犯同样的错误,切记!
!
!
!
例如,将HelloWorld程序中语句printf("HelloWorld!
\n");中的;改成中文的分号;运行一下程序,看有什么结果?
C语言的错误信息的形式:
(下面例子是的TuroboC2.0错误信息,如图1)
错误 文件名 行号 冒号 错误内容
↓ ↓ ↓ ↓ ↓
ErrorE:
\WinTc\WinTc\frist.c 5 :
Functioncallmissing)infunctionmain
C语言的错误信息的形式:
(下面例子是VisualC++6.0错误信息,如图2)
文件名 行号冒号错误代码 冒号 错误内容
↓ ↓ ↓ ↓ ↓ ↓
e:
\wintc\wintc\frist.c(5):
errorC2143:
syntaxerror:
missing')'before';'
软件集成了高校教学用的最多的两个编译器VisualC++6.0和Turboc2.0,支持C、标准C、C++、标准C++、WINDOWSC程序的编辑、编译、和调试。
软件根据用户输入程序的类型智能选择编译器,不用使用者干涉。
调试程序是一种实践性很强的事,光纸上谈兵是是没用的,就像游泳运动员只听教练讲解示范,而不亲自下水练习,是永远学不会游泳的。
即使在优秀的程序员编写程序也会犯错误的,可能事最低级的语法错误,但他能快速发现错误并改正错误,而我们C语言初学者面对错误提示,不知道发生了什么错误,如何改正,这就是差别。
第五步、研究典型的C语言程序,提高程序设计能力
经过上述过程的学习,我们已经学会了C语言各种语句的流程(即计算机是如何执行这些语句的过程),然后就可以研读别人编写C语言经典程序,看懂别人是如何解决问题的,学习解决问题的方法和程序设计技巧,提高自己的程序设计能力。
在软件中有50多个典型的源程序,研究它的实现方法,提高自己的程序设计能力。
第六步、研究课程设计源成序,提高C语言程序设计的能力。
C语言课程设计的目的:
是让学生综合利用所学的C语言知识,解决一些接近实际问题题目,提高程序设计和调试较大程序的能力,为进一步进行软件开发打下坚实的基础。
最后送C语言初学者一句话来共勉:
首先要相信自己是有能力学好C语言的,然后不惜一切代价把这种能力表现出来,你就成功了。
做任何事,何尝不是这样呢?
兴趣是学习C语言的最大动力,学习方法给你指明努力的方向,让你事半功倍。
如果你感觉对你有帮助的话,请回帖支持,让更多的朋友知道它,谢谢支持!
!
!
C语言中循环语句有三种:
while循环、do-while循环、for循环。
while循环:
先判断while后面括号里的值,如果为真则执行其后面的代码;否则不执行。
while
(1)表示死循环。
死循环有没有用呢?
看下面例子:
比如你开发一个系统要日夜不停的运行,但是只有操作员输入某个特定的字符‘#’才可以停下来。
while
(1)
{
if(‘#’==GetInputChar())
{
break;
}
}
一、break与continue的区别
break关键字很重要,表示终止本层循环。
现在这个例子只有一层循环,当代码执行到break时,循环便终止。
如果把break换成continue会是什么样子呢?
continue表示终止本次(本轮)循环。
当代码执行到continue时,本轮循环终止,进入下一轮循环。
while
(1)也有写成while(true)或者while(1==1)或者while((bool)1)等形式的,效果一样。
do-while循环:
先执行do后面的代码,然后再判断while后面括号里的值,如果为真,循环开始;否则,循环不开始。
其用法与while循环没有区别,但相对较少用。
for循环:
for循环可以很容易的控制循环次数,多用于事先知道循环次数的情况下。
留一个问题:
在switchcase语句中能否使用continue关键字?
为什么?
二、循环语句的注意点
1、在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。
例如:
2、建议for语句的循环控制变量的取值采用“半开半闭区间”写法。
半开半闭区间写法和闭区间写法虽然功能是相同,但相比之下,半开半闭区间写法写法更加直观。
3、不能在for循环体内修改循环变量,防止循环失控。
4、循环要尽可能的短,要使代码清晰,一目了然。
如果你写的一个循环的代码超过一显示屏,那会让读代码的人发狂的。
解决的办法由两个:
第一,重新设计这个循环,确认是否这些操作都必须放在这个循环里;第二,将这些代码改写成一个子函数,循环中只调用这个子函数即可。
一般来说循环内的代码不要超过20行。
5、把循环嵌套控制在3层以内。
国外有研究数据表明,当循环嵌套超过3层,程序员对循环的理解能力会极大的降低。
如果你的循环嵌套超过3层,建议你重新设计循环或是将循环内的代码改写成一个字函数。