c语言中的常见错误及程序文档格式.docx
《c语言中的常见错误及程序文档格式.docx》由会员分享,可在线阅读,更多相关《c语言中的常见错误及程序文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
![c语言中的常见错误及程序文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/30/b8c61f7f-8dbc-4589-8507-c5c265e66041/b8c61f7f-8dbc-4589-8507-c5c265e660411.gif)
前者是进行比较,a是否和3相等,后者表示如果a和3相等,把b值赋给a。
由于习惯问题,
初学者往往会犯这样的错误。
5.忘记加分号。
分号是C语句中不可缺少的一部分,语句末尾必须有分号。
a=1
b=2
编译时,编译程序在“a=1”后面没发现分号,就把下一行“b=2”也作为上一行语句的一
部分,这就会出现语法错误。
改错时,有时在被指出有错的一行中\未发现错误,就需要看
一下上一行是否漏掉了分号。
{z=x+y;
t=z/100;
%f"
t);
对于复合语句来说,最后一个语句中最后的分号不能忽略不写(这是和PASCAL
不同的)。
6.多加分号。
对于一个复合语句,如:
};
复合语句的花括号后不应再加分号,否则将会画蛇添足。
又如:
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("
&
x);
x);
本意是先后输入5个数,每输入一个数后再将它输出。
由于for()后多加了一个分号,使循
环体变为空语句,此时只能输入一个数并输出它。
7.输入变量时忘记加地址运算符“&
”。
inta,b;
scanf("
%d%d"
a,b);
这是不合法的。
Scanf函数的作用是:
按照a、b在内存的地址将a、b的值存进去。
“&
a”指
a在内存中的地址。
8.输入数据的方式与要求不符。
①scanf("
a,&
b);
输入时,不能用逗号作两个数据间的分隔符,如下面输入不合法:
3,4
输入数据时,在两个数据之间以一个或多个空格间隔,也可用回车键,跳格键tab。
②scanf("
%d,%d"
C规定:
如果在“格式控制”字符串中除了格式说明以外还有其它字符,则在输入数据时应
输入与这些字符相同的字符。
下面输入是合法的:
此时不用逗号而用空格或其它字符是不对的。
343:
4
a=%d,b=%d"
输入应如以下形式:
a=3,b=4
9.输入字符的格式与要求不一致。
在用“%c”格式输入字符时,“空格字符”和“转义字符”都作为有效字符输入。
%c%c%c"
c1,&
c2,&
c3);
如输入abc
字符“a”送给c1,字符“”送给c2,字符“b”送给c3,因为%c只要求读入一个字符,后
面不需要用空格作为两个字符的间隔。
10.输入输出的数据类型与所用格式说明符不一致。
例如,a已定义为整型,b定义为实型
a=3;
b=4.5;
%f%d\n"
编译时不给出出错信息,但运行结果将与原意不符。
这种错误尤其需要注意。
11.输入数据时,企图规定精度。
%7.2f"
a);
这样做是不合法的,输入数据时不能规定精度。
12.switch语句中漏写break语句。
例如:
根据考试成绩的等级打印出百分制数段。
switch(grade)
{case'
A'
:
85~100\n"
);
case'
B'
70~84\n"
C'
60~69\n"
D'
<
60\n"
default:
error\n"
由于漏写了break语句,case只起标号的作用,而不起判断作用。
因此,当grade值为A时,
printf函数在执行完第一个语句后接着执行第二、三、四、五个printf函数语句。
正确写
法应在每个分支后再加上“break;
例如
break;
13.忽视了while和do-while语句在细节上的区别。
(1)main()
{inta=0,I;
I);
while(I<
=10)
{a=a+I;
a);
(2)main()
do
}while(I<
=10);
可以看到,当输入I的值小于或等于10时,二者得到的结果相同。
而当I>
10时,二者结果就
不同了。
因为while循环是先判断后执行,而do-while循环是先执行后判断。
对于大于10的
数while循环一次也不执行循环体,而do-while语句则要执行一次循环体。
14.定义数组时误用变量。
intn;
n);
inta[n];
数组名后用方括号括起来的是常量表达式,可以包括常量和符号常量。
即C不允许对数组的
大小作动态定义。
15.在定义数组时,将定义的“元素个数”误认为是可使的最大下标值。
{staticinta[10]={1,2,3,4,5,6,7,8,9,10};
a[10]);
C语言规定:
定义时用a[10],表示a数组有10个元素。
其下标值由0开始,所以数组元素a[
10]是不存在的。
16.在不应加地址运算符&
的位置加了地址运算符。
%s"
str);
C语言编译系统对数组名的处理是:
数组名代表该数组的起始地址,且scanf函数中的输入
项是字符数组名,不必要再加地址符&
应改为:
str);
17.同时定义了形参和函数中的局部变量。
intmax(x,y)
intx,y,z;
{z=x>
y?
x:
y;
return(z);
形参应该在函数体外定义,而局部变量应该在函数体内定义。
intx,y;
{intz;
z=x>
}
求1+2+3+……….+100。
(循环)
答案
#include<
stdio.h>
voidmain()
inti,sum=0;
for(i=1;
i<
=100;
i++)
sum=sum+i;
printf("
%d"
sum);
2、求1*2*3*……….*10。
inti=0,j=1;
for(i=2;
=10;
j*=i;
j);
return0;
3、输入三个数字,输出他们的最大值。
(if)
{inta,b,c,d;
scanf("
%d,%d,%d"
b,&
c);
d=max(a,b,c);
max=%d"
d);
getch();
/*暂停看运行结果*/
intmax(intx,inty,intz)
{intu;
if(x>
=y&
&
x>
=z)
u=x;
elseif(y>
=x&
y>
u=y;
else
u=z;
return(u);
4.用起泡法对十个数据排序(数组实现)
main()
{inti,j,t;
staticinta[10]={5,7,4,2,3,6,1,0,9,8};
for(j=0;
j<
9;
j++)
{for(i=0;
9-j;
i++)
{if(a>
a)
{t=a;
a=a;
a=t;
for(i=0;
10;
%2d"
5、输入十个数字,逆序输出。
(数组实现)
main()
{inta[10],i=0;
=9;
%f"
\n"
for(i=9;
i>
=0;
i--)
6输入两个数,交换他们的值并输出。
(元素交换)
intmain()
{
intm,n,temp;
%d%d"
m,&
if(m<
n)
temp=m;
m=n;
n=temp;
m);
7.输出9*9乘法表。
(双层循环)
#include<
voidmain()
inti=1;
for(i;
i<
i++)
intj=1;
for(j;
=i;
%d*%d=%d"
i,j,i*j);
8.输入一行字符,将所有的小写字母转换成大写字母,大写字母转换成小写字母,其余字符不变。
输出转变后的这行字符。
#include"
stdio.h"
chara[n];
inti;
%s"
大写为:
"
=n;
if(a<
='
z'
a>
a'
)
a=a-32;
%c"
\n小写为:
=3;
a=a+32;
9、编写一个简单计算器程序,要求能够完成两个数的+,-,*,/四种运算。
输出运算式及运算结果。
(switch)
6.2
#include"
{charc;
inti=0,j=0,k=0,l=0;
while((c=getchar())!
=’\n’)
{if(c>
=65&
c<
=90||c>
=97&
=122)i++;
elseif(c>
=48&
=57)j++;
elseif(c==32)k++;
elsel++;
i=%d,j=%d,k=%d,l=%d\n"
i,j,k,l);
6.6
math.h"
{intx=100,a,b,c;
while(x>
=100&
x<
1000){a=0.01*x;
b=10*(0.01*x-a);
c=x-100*a-10*b;
if(x==(pow(a,3)+pow(b,3)+pow(c,3)))printf("
%5d"
x++;
6.7
{intm,i,j,s;
for(m=6;
m<
10000;
m++)
{s=1;
for(i=2;
m;
if(m%i==0)s=s+i;
if(m-s==0)
{printf("
%5ditsfastorsare1"
for(j=2;
j++)if(m%j==0)
或
1000;
{s=m-1;
if(m%i==0)s=s-i;
if(s==0)
6.8
{inti=1,n;
doublet,x=1,y=2,s,sum=0;
%ld"
while(i<
=n){s=y/x;
sum=sum+s;
t=y;
y=y+x;
x=t;
i++;
%f\n"
11,P128例6.10(译码)
\n'
c=c+4;
if(c>
'
Z'
+4||c>
c=c-26;
c);
12,P1115.55.6(switch)
5.5
{intx,y;
输入x:
if(x<
1)
{y=x;
x=%3d,y=x=%d\n"
x,y);
elseif(x<
10)
{y=2*x-1;
x=%3d,y=2*x-1=%d\n"
{y=3*x-11;
x=%3d,y=3*x-11=%d\n"
5.6
{floatscore;
chargrade;
case2:
请输入学生成绩:
score);
while(score>
100||(score<
0)
{printf("
\n输入有误,请重新输入:
switch((int)(score/10))
{case10:
case9:
grade=’A’;
case8:
grade=’B’;
case7:
grade=’C’;
case6:
grade=’D’;
case5:
case4:
case3:
case1:
case0:
grade=’E’;
成绩是%5.1f,相应的等级是%c。
score,grade);
13,P108例5.5(一元二次方程求根)例5.6(求闰年)
intyear,leap;
year);
if(year%4==0)
if(year%100==0)
if(year%400==0)
leap=1;
else
leap=0;
if(leap)
%dis"
year);
%disnot"
aleapyear.\n"
14,P31例2.17例2.18
2.17
输出50个学生中成绩高于80分者的学号和成绩
2.18
输出2000——2500年每一年是否闰年
intyear;
year=2000;
go:
if(((year%4==0)&
(year%100!
=0))||(year%400==0))
%disrunnian"
if(year<
=2500)
year=year++;
if(year>
2500)
gotoend;
gotogo;
end:
getch();