1 / 14
文档名称:

C语言初学者编程的常见错误及分析.docx

格式:docx   大小:36KB   页数:14页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

C语言初学者编程的常见错误及分析.docx

上传人:科技星球 2022/11/30 文件大小:36 KB

下载得到文件列表

C语言初学者编程的常见错误及分析.docx

相关文档

文档介绍

文档介绍:该【C语言初学者编程的常见错误及分析 】是由【科技星球】上传分享,文档一共【14】页,该文档可以免费在线阅读,需要了解更多关于【C语言初学者编程的常见错误及分析 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。C语言初学者编程的常见错误及分析
 
 
马晓娟
(集宁师范学院计算机系,内蒙古乌兰察布012000)
Summary:C语言最大的特点是功能强大、,某些错误编译程序不予以检查,这不但给编程人员留下灵活的空间,而且给调试程序带来许多不便,尤其对于初学者来说,,还要经常归纳总结,这样就可以避免一些典型错误的发生.
Keys:语法错误;编译;逻辑错误
TP312:A:1673-260X(2013)09-0016-04
1引言
作为一个长期从事C语言教学的教师来说,经过多次的教学过程,发现初次接触C语言的相当一部分同学入门比较慢,往往跟不上老师的节奏,导致知识讲授越多问题
堆积越多,,即使出现一丝错误也使得整个程序不能运行或运行出错误的结果,这就要求教师在讲课时突出强调语法格式与种种注意事项.
编程错误分两种,,这种错误编译程序在编译时能检测出来,并给出用户错误提示信息,,有可能会运行出错误的结果,这就说明程序有逻辑错误,指的是程序的算法有问题,,往往要求用户有很扎实的基础.
经过多次教学经验的积累,不难总结出一些初学者编程中会出现的普遍性错误,其中包括了各种语法错误与逻辑错误,以下将对其分类逐一的分析.
2初学者编程时的常见错误及分析
、赋值、引用的错误
,:
inta=5;
printf("%d",A);
编译程序区分大小写字母,把a和A认为是两个不同的变量名,从而显示变量A未定义这一错误提示信息.
:
charc;
c="a";
字符常量是由一对单引号括起来的单个字符,’\0’作字符串结束标志,它是由系统自动加上的,字符串“a”实际上包含两个字符:’a’和’\0’,所以不能把它赋给一个字符变量.
,:
inta,b,c;
c=a+b;
引用变量一定要保证其值固定,:
intx,y;
if(x>=0)y=1;
elsey=-1;
,:
inta[3]={1,2,3},i,s=0;
s=s+a[i];
第二条语句中的变量i未被赋值,其值不确定,极有可能超出下标范围0—2,也就是说所引用的数组元素a[i]极有可能不是数组a的元素.
:
intx=65535;
printf(“%d”,x;);
在TurboC运行环境中,int型变量占内存2个字节,且其最高位是符号位,表示数的范围是-32768—32767,若变量值超出此范围,-1,实际是将65535的二进制值(16位全1)看做带符号数转换成10进制的-,可以将变量定义为long型.
:
intn=6,a[n];,
说明数组长度的只能是常量表达式,而不能出现变量,即C不允许对数组的大小作动态定义[1].
“元素个数”误认为是可使用的最大下标值[2].如:
inta[10]={1,2,3,4,5,6,7,8,9,10};
printf("%d",a[10]);
定义时用a[10],,所以a[10]是不合法的数组元素,,所以一旦犯了就很难发现.
:
structstu
{intnum;
charname;
}x={12101,”lirong”},y={12106,”renduo”};
intt;
t=x;x=y;y=t;
很多同学****惯将中间变量t定义为整型,而x与y是结构体类型,类型不同不能赋值.

:
inta,b;
scanf("%d%d",a,b);
scanf函数的作用是:按照a、b在内存的地址将a、b的值存进去.“&a”“&”,但字符数组除外,因为数组名本身就代表了数组的起始地址[3].如下程序段是正确的:
chars[20];
scanf("%s",s);
:
scanf("%d%d",&a,&b);
输入时,不能用逗号作为两个数据间的分隔符,应在两个数据之间以一个或多个空格间隔,,
scanf("%d,%d",&a,&b);则应输入:3,4,:scanf("a=%d,b=%d",&a,&b);应输入:a=3,b=4.
“\n”.如:
inta,b;
scanf("%d,%d\n",&a,&b);
输入时敲3,4后再敲回车无法结束输入,必须敲入“3,4\n”才可以正确将两数存放到对应的变量里面,这就是末尾加了“\n”的副作用.
:
inta=3;floatb=;
printf("%d,%f\n",b,a);
编译时不给出出错信息,但实型数据用%d输出结果为0,整型数据用%.
:
printf(“%d,%d\n,a,b”);
函数调用语句没有语法错误,编译程序将其理解为输出两个整型随机数,因为没有输出数据只有格式字符串,本应该作为输出变量的a,b被看做普通字符原样输出.

,:
floata=;
printf("%d",a%3);
只有两个整型数据才能进行求余运算,而实型数据不可以.
“=”与“==”的区别,在比较两个量相等时用了“=”[4].
在C语言中,“=”是赋值运算符,“==”(a==3)a=b;表示如果a和3相等,(a=3)a=b;则表示将3赋值给a,而条件a=3为真值,所以执行语句a=b;
:
if(0<x<=9)y=1;
其中条件是错误的表达式,要表示x是一个一位数只能写成x>0&&x<=9,即变量只能和一个量进行关系运算.
:
if(x>0,x<=9)y=1;
括号中的条件可以被编译程序理解为一个逗号表达式,而其值是由后面的x<=9决定的,相当于x>0不起作用,从而也就不能表示两个条件同时成立.
:
x=(-b+sqrt(d)/(2*a);
这是一个计算一元二次方程根的赋值语句,括号比较多,极容易丢掉括号,写完语句应数一下左右括号的数目,或应仔细检查表达式的书写情况.

.
分号是C语句中不可缺少的一部分,语句末尾若没有分号,编译程序将把下一行也作为上一行语句的一部分,,有时在被指出有错的一行中未发现错误,就需要看上一行是否缺分号.
:
if(a%3==0);
i++;
(a%3==0)后多加了分号,分号代表空语句,此语句将被理解为如果a是3的倍数则执行空语句,而后面的i++;不受条件的限制,程序将无条件执行语句“i++;”,不论3是否整除a,:
for(i=0,s=0;i<5;i++);
{scanf("%d",&x);s+=x;}
本意是输入5个数,()后多加了一个分号,使循环体变为空语句,此时只能输入一个数并将其加到s.
,:
if(a+b>c&&a+c>b&&b+c>a)
s=(a+b+c)/2;
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf(“%f\n”,area);
elseprintf(“itisnottriangle\n”);
以上程序段是用来计算三角形面积的,在能构成三角形时计算周长的一半、跟着计算面积并输出面积,所以条件成立时执行后面三条语句,,则理解为条件成立时求周长的一半(即单分支if语句),后面的计算并输出面积是无条件执行的,紧跟着出现的else就是非法的,没有与之配对的if.
:
计算1*5+2*4+3*3可用以下语句完成:
for(s=0,i=1,j=5;i<=j;i++,j--)s=s+i*j;
很多学生都不遵守语法规则,每出现一个表达式就跟一个分号,写成:
for(s=0;i=1;j=5;i<=j;i++;j--)s=s+i*j;
:
i=1;s=0;
while(i<=10)
s+=i;i++;
虽然将s+=i;和i++;写在同一行上,但循环体仅仅是跟在while后面的一条语句,所以只有s+=i;是循环体,而i的值在循环中一直都没有改变,所以条件总是成立的,循环将一直进行下去,++;也归到循环体中程序段就可以
求出1到10的累加和,当多条语句充当循环体时要加花括号将其构成复合语句,这种错误是循环程序中的常见错误.
:
if(a+b>c&&a+c>b&&b+c>a)
{s=(a+b+c)/2;
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf(“%f\n”,area);
elseprintf(“itisnottriangle\n”);
在if子句中包含三条语句,加括号时只在前面写了一半,:
for(r=1;r<=10;r++)
{c=2**r;
if(c<40){s=*r*r;printf(“r=%d,s=%.2f\n”,r,s);}
elsebreak;
上述程序段是求半径1到10且周长小于40的圆的面积,在循环体结束处缺一半花括号.
.
如果在程序中用到sqrt或fabs函数,,如果没有这个文件包含命令,则编译程序不识别被调用的库函数.