易错点
C语言中易犯的错误
对初学C语言的人来说,经常会出一些连自己都不知道错在哪里的错误.看着有错的程序,不知该如何改起,一些C编程时常犯的错误,写给各位学员以供参考.
****************************************************************************************
1.书写标识符时,忽略了大小写字母的区别.
main() {
int a=5;
printf("%d",A); }
编译程序把a和A认为是两个不同的变量名,而显示出错信息.
C认为大写字母和小写字母是两个不同的字符.习惯上,符号常量
名用大写,变量名用小写表示,以增加可读性.
****************************************************************************************
2.忽略了变量的类型,进行了不合法的运算.
main() {
float a,b;
printf("%d",a%b); }
%是求余运算,得到a/b的整余数.整型变量a和b可以进行求余
运算,而实型变量则不允许进行"求余"运算.
****************************************************************************************
3.将字符常量与字符串常量混淆.
char c; c="a";
在这里就混淆了字符常量与字符串常量,字符常量是由一对单
引号括起来的单个字符,字符串常量是一对双引号括起来的字符序
列.C规定以"\"作字符串结束标志,它是由系统自动加上的,所
以字符串"a"实际上包含两个字符:'a'和'\',而把它赋给一
个字符变量是不行的.
**************************************************************************************** 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); }
对于复合语句来说,最后一个语句中最后的分号不能忽略不写
**************************************************************************************** 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.输入变量时忘记加地址运算符"&".
int a,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
此时不用逗号而用空格或其它字符是不对的.
3 4 3:4
又如:
scanf("a=%d,b=%d",&a,&b); 输入应如以下形式: a=3,b=4
****************************************************************************************
9.输入字符的格式与要求不一致.
在用"%c"格式输入字符时,"空格字符
"和"转义字符"都作为 有效字符输入.
scanf("%c%c%c",&c1,&c2,&c3);
如输入a b c
字符"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 'C':printf("60~69\n");break; **************************************************************************************** 13.忽视了while和do-while语句在细节上的区别. (1)main() {int a=0,I; scanf("%d",&I); while(I<=10) {a=a+I; I++; } printf("%d",a); } (2)main() {int a=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.定义数组时误用变量. int n; scanf("%d",&n); int a[n]; 数组名后用方括号括起来的是常量表达式,可以包括常量和符号常 量.即C不允许对数组的大小作动态定义. **************************************************************************************** 15.在定义数组时,将定义的"元素个数"误认为是可使的最大下 标值. main() {static int a[10]={1,2,3,4,5,6,7,8,9,10}; printf("%d",a[10]); } C语言规定:定义时用a[10],表示a数组有10个元素.其下标值由0 开始,所以数组元素a[10]是不存在的. **************************************************************************************** 16.初始化数组时,未使用静态存储. int a[3]={0,1,2}; 这样初始化数组是不对的.C语言规定只有静态存储(static)数组 和外部存储 (exterm)数组才能初始化.应改为: static int a[3]={0,1,2}; **************************************************************************************** 17.在不应加地址运算符&的位置加了地址运算符. scanf("%s",&str); C语言编译系统对数组名的处理是:数组名代表该数组的起始地址 ,且scanf函数中的输入项是字符数组名,不必要再加地址符&.应 改为:scanf("%s",str); **************************************************************************************** 18.同时定义了形参和函数中的局部变量. int max(x,y) int x,y,z; {z=x>y?x:y; return(z); } 形参应该在函数体外定义,而局部变量应该在函数体内定义.应改 为: int max(x,y)
int x,y;
{int z;
z=x>y?x:y;
return(z); }
试题一
一、单项选择题(共30分,每题1分)1. 下列不正确的转义字符是
A.\\ B.\‘ C.074 D.\02. 不是C语言提供的合法关键字是
A.switch B.cher C.case D.default
3.正确的标识符是( )A.?a B.a=2 C.a.3 D.a_3 4.下列字符中属于键盘符号的是A.\ B.\n C.\t D.\b .下列数据中属于“字符串常量”的A.ABC B.“ABC” C.‘ABC’ D.‘A’6.char型常量在内存中存放的是A.ASCII码 B.BCD码 C.内码值 D.十进制代码值
7.设a为5,执行下列语句后,b的值不为2的是( ) A.b=a/2 B.b=6-(——a) C.b=a%2 D.b=a>3?2:2 8.在以下一组运算符中,优先级最高的运算符是( )
A.<= B.= C.% D.&&
9.设整型变量i的值为3,则计算表达式i——i后表达式的值是() A.0 B.1 C. 2 D.表达式出错
10.设整型变量a,b,c均为2,表达式a+++b+++c++的结果是( ) A.6 B.9 C.8 D.表达式出错
11.若已定义x和y为double类型,则表达式x=1,y=x+3/2的值是( )
A.1 B.2 C.2.0 D.2.5 12.设a=1,b=2,c=3,d=4,则表达式:a<b?a:c<d?a:d的结果是( ) A.4 B.3 C.2 D.1 13.设a为整型变量,不能正确表达数学关系:10<a<15的C语言表达式是()
A.10<a<15 B.a= =11 || a= =12 || a= =13 || a= =14
C.a>10&&a<15 D.!(a<=10)&&!(a>=15)
14.若有以下定义:char a、 int b 、 float c 、 double d,则表达式a*b+d-c值的类型为()
A.float B.int C.char D.double
15.表达式“10!=9”的值是( ) A.true B.非零值 C.0 D.1
16.循环语句 for (x=0,y=0; (y!=123)|| (x<4);x++);的循环执行( )
A.无限次 B.不确定次 C.4次 D.3次
17.在C语言中,下列说法中正确的是( )
A. 不能使用“do while”的循环 B.“do while”的循环必须使用break语句退出循环
C.“do while”的循环中,当条件为非0时将结束循环
D.“do while”的循环中,当条件为0时将结束循环。
18.设a,b为字符型变量,执行scanf(“a=%c,b=%c”,&a,&b)后使a为‘A’,b为‘B’,从键盘上的正确输入是( )
A.‘A’ ‘B’ B.‘A’,‘B’ C.A=A,B=B D.a=A,b=B 19.设i,j,k均为int型变量,执行完下面的for循环后,k的值为( )
for (i=0,j=10;i<=j;i++,j——)k=i+j;
A.10 B.9 C.8 D.7 20.设有定义:char
s[12]={“string”};则printf (“%d\n”,strlen(s));的输出是( )
A.6 B.7 C.11 D.12 21.合法的数组定义是()
A.int a[]={“string”}; B.int a[5]={0,1,2,3,4,5}; C.char a={“string”}; D.char a[]={0,1,2,3,4,5}
22.函数调用strcat(strcpy
(str1,str2),str3)的功能是() A. 将字符串str2复制到字符串str1中后再将字符串str3连接到字符串str1之后
B. 将字符串str1复制到字符串str2中后再连接到字符串str3之后 C. 将字符串str1复制到字符串str2中后再复制到字符串str3之后 D. 将字符串str2连接到字符串str1中后再将字符串str1复制到字符串str3中
23.设有如下定义,则正确的叙述为( )
char x[]={“abcdefg”}; char y[]={‘a’,‘b’,‘c’,‘d’,‘e’,‘f’,‘g’}; A.数组x和数组y等价
B.数组x和数组y的长度相同 C.数组x的长度大于数组y的长度
D.数组x的长度小于数组y的长度
24.设有单精度变量f,其值为13.8.执行语句“n=((int)f)%3;”后,n的值是()
A.4 B.1 C.4.333333 D.4.6
25.执行语句“f=(3.0,4.0,5.0),(2.0,1.0,0.0);”后,单精度变量f的值是( )
A.3.0 B.5.0 C.2.0 D.0.0
26.设a、b均为整型变量,下列表达式中不是赋值表达式的是( ) A.a=3,4,
5 B.a=3*2 C.a=a&&b D.a=b=4
27.表达式“1?(0?3:2): (10?1:0)”的值为( ) A.3 B.2 C.1 D.0 28.sizeof(double)的结果值是( )A.8 B.4 C.2 D.出错
29.指出下面正确的输入语句是( )
A.scanf (“a=b=%d”,&a,&b); B.scanf(“a=%d,b=%f”,&m,&f);
C.scanf(“%3c”,c); D.scanf(“%5.2f,&f);
30.若有以下定义和语句,且0<=i<5,则( )是对数组元素地址的正确表示
int a[]={1,2,3,4,5},*p,i;
p=a;
A.&
(a+i) B.&p C.a++ D.&p[i]
二、填空(20分,每空1分)1.在内存中存储“A”要占用( )个字节,存储‘A’要占用( )字节。 2.符号常量的定义方法是( )。 3.能表述“20<x<30或x<-100”的C语言表达式是( )。 4.结构化程序设计方法规定程序或程序段的结构有三种:顺序结构、( )和( )。 5.C语言共提供了三种用于实现循环结构的流程控制语句,它们是( )、( )和( )。 6.若在程序中用到“putchar”,应在程序开头写上包含命令
( ),若在程序中用到“strlen()”函数时,应在程序开头写上包含命令( )。
7.设有定义语句“static int a[3][4]={{1},{2},{3}}”,则a[1][1]值为( ),a[2][1]的值为( )。
8.“*”称为( )运算符,“&”称为( )运算符。 9.赋值表达式和赋值语句的区别在于有无( )号。 10.用{}把一些语句括起来称为( )语句
11.设a=12、b=24、c=36,对于“scanf (”a=%d,b=%d,c=%d“,&a,&b,&c);”,输入形式应为( ) 12.表达式“sqrt(s*(s-a)*(s-b)*(s-c));”对应的数学式子为( ) 13.C语言编绎系统在判断一个量是否为“真”时,以0代表“假”,以( )代表“真” 三、读程序(30分)
1. main()
{ int a=10,b=4,c=3;
if (a<b) a=b;
if (a<c) a=c;
printf(“%d,%d,%d”,a,b,
c);}
2. main( )
{int y=9;
for (;y>0;y——)
if (y%3= = 0) {printf (“%d”,——y);continue;} 3. main() { int x,y;
for (y=1,x=1;y<=50;y++) { if (x>=10) break; if (x%2= =1) { x+=5;continue;} x-=3; }
printf (“%d”,y)4. main() { static int a[][3]={9,7,5,3,1,2,4,6,8};
int i,j,s1=0,s2=0; i,j,s1=0,s2=0;
for (i=0;i<3;i++) for (j=0;j<3;j++) { if (i= =j )s1=s1+a[i][j];
if (i+j= =2) s2=s2+a[i][j];
}
printf (“%d\n%d\n”,s1,s2);}
5. main()
{static char a[]={‘*’,‘*’,‘*’,‘*’,‘*’};
int i,j,k;
for (i=0;i<5;i++)
{printf (“\n”);
for (j=0;j<i;j++) printf (“%c”,‘ ’);
for (k=0;k<5;k++) printf (“%c”,a[k]); } } 6. int fac(int n) {static int f=1; f=f*n; return(f);} main()
{int i;
for (i=1;i<=5;i++) printf (“%d!=%d\n”,i,fac(i));}
四、编写程序(20分)
1. 编一个程序,输入X的值,按下列公式计算并输出Y的值 2. 编程序按下列公式计算e的值(精度为1e-6)
e=1+1/1!+1/2!+1/3!+??1/n!
参考答案:
一、单项选择题(共30分,每题1分)
1.C 2. B 3. D 4. A 5. B 6. A 7. C 8. C 9. A 10. A 11.
C 12. D 13. A 14. D 15. D 16.
C 17. D 18. D 19. A 20. B 21.
D 22. A 23. C 24. B 25. D 26. D 27. B 28. A 29. B 30. C
;}二、填空(20分,每空1分) 1.2,1
2.#define 符号常量 常量 3.(x>20 && x<30) || x<-100 4.分支结构,循环结果 5.while do for
6.#include “stdio.h” # include “string.h” 7.a[1][1]=0 , a[2][1]=0 8.* 指针运算符, &地址运算符
9.分号; 10.复合语句 11.a=12,b=24,c=36 13.非0
三、读程序(30分) 1.结果:10,4,3 2.结果:8 5 2 3.6
4.18 10
5.*****
6.5!=120 四、编写程序(20分1. Main(){int x,y;
scanf (“%d”,&x); if (x<=1) y=x; (x<=1) y=x; else if (x>1&&x<10) y=2*x-1; else y=3*x-11;
printf (“x=%d,y=%d\n”,x,y);
}bsp; } 2.Main() {float E; int n; s=0;E=1;
试题二 一、单项选择题(每小题2分,共50分) 1、一个C程序的执行是从___A__。 A、本程序的main函数开始,到main函数结束 B、本程序的main函数开始,到本程序文件的最后一个函数结束 C、本程序文件的第一个函数开始,到本程序文件的最后一个函数结束 D、本程序文件的第一个函数开始,到本程序main函数结束 2、C语言程序的基本单位是___C___。 A、程序行 B、语句 C、函数 D、字符 3、请选出可用作C语言用户标识符的一组标识符___B___。 A、void B、a3_b3 C、For D、2a define _123 -abc DO WORD IF ase sizeof 4、假定x和y为double型,则表达式(x=2,y=x+5/2)的值是__C__ 。 A、4.500000 B、4 C、4.000000 D、2.000000 5、下列可以正确表示字符型常量的是___D__。 A、297 B、"a" C、"\n" D、'\t' 6、在C语言中,要求运算数必须是整型的运算符是__D__。 A、/ B、++ C、*= D、% 7、C语言中,复合语句的构成是将一系列语句置于__C__。
A、begin与end之间
B、方框号“[ ]”之间
C、花括号“{ }”之间 D、圆括号“( )”之间 8、有如下程序段,对应正确的数据输入是___A___。 float x,y; scanf(”%f%f”, &x,&y); printf(”a=%f,b=%f”, x,y); A、2.04<回车> B、2.04,5.67<回车> 5.67<回车> C、A=2.04,B=5.67<回车> D、2.045.67<回车> 9、以下程序段的输出结果是___D__。 int a=5678; printf(”%2d\n”, a); A、提示出错、无结果 B、56 C、78 D、5678 10、已知:char ch='A';则下列表达式的值是__B__。 ch = (ch>='A'&&ch<='Z') ? (ch+32) : ch; A、A B、a C、Z D、z 11、下列描述,正确的是___B__ 。 A、表达式3.91%5是合法的 B、用b=89作为while循环的条件是合法的 C、逗号表达式是没有值和类型的 D、字符型变量和int型变量的操作完全不同 12、阅读以下程序: main() {int x; scanf("%d",&x); if(x--<5) printf("%d",x); else printf("%d",x++); } 程序运行后,如果从键盘上输人5,
则输出结果是__B__ 。 {if(b>=10) break; A、3 B、 4 if (b%3==1) C、 5 D、 6 13、下列程序的运行结果是___C__。 #include ”stdio.h” main() { int k; k=3; switch(k) { case 1: printf(”%d\n”, k++); case 2: printf(”%d\n”, k++); case 3: printf(”%d\n”, k++); case 4: printf(”%d\n”, k++); break; default: printf(”Full!\n”); } } A、3 B、4 C、3 D、4 4 4 14、设a、b、c、d、m、n均为int型变量,且a=5、b=6、c=7、d=8、 m=2、n=1,则逻辑表达式(m==a<b)&&(n==c<d) 的值为__A__。 A、0 B、 1 C、2 D、 3 15、设x、y和temp均为long int型变量,则以下语句: {temp=x; x=y; y=temp;} 的功能是__D__。 A、把x和y按从大到小排列 B、把x和y按从小到大排列 C、无确定结果 D、交换变量x和变量y的值 16、以下程序的输出结果是 ___A__ 。 main() {int a, b; for(a=1, b=1; a<=100; a++) { b+=3; continue; } }
printf("%d\n",a); } A、4 B、6 C、5 D、101 17、执行以下程序后输出的结果是___D__。 main()
{ int y=10; do {y--;}
while(--y); printf("%d\n",y--);}
A、-1 B、1 C、8 D、0
18、执行以下程序后输出的结果是___B__。 main()
{int i, j, w=0; for(i=4; i; i--) for(j=1;j<=2;j++) w=w+i*j; w=i*j;
printf("%d\n",w); } A、4 B、0 C、1 D、30 19、以下程序运行后,输出结果是__C__。 main() { int n[5]={3,3,3},i,k=2; for(i=0;i<k;i++)
n[i]=n[i]+1; printf("%d\n",n[k]);
} A、4 B、9 C、3 D、不确定的值 20、以下程序的输出结果是 __A__ 。 f ( int a)
{int b=0; static int c = 3; b++; c++;
return(a+b+c); C、3.14159 } main() {int a = 2, i; for(i=0;i<3;i++) printf("%d\n",f(a)); } A、 7 B、 7 C、 7 D、 7 8 9 10 7 9 11 13 7 21、设C程序如下: #define ABC(x) x*x #include"stdio.h" main() {int a=3,b; b=ABC(a+1); printf("b=%d", b); } 上述程序运行输出的结果是__D_ 。 A、b=4 B、b=a+1 C、b=16 D、b=7 22、以下程序的输出结果是__B__。 main() {int i, a[10]; for(i=9;i>=0;i--) a[i]=10-i; printf("%d %d %d",a[1],a[6],a[9]); } A、1 6 9 B、9 4 1 C、9 6 1 D、3 5 7 23、若定义:float x=3.14159,*p=&x; 则printf("%f\n",*p++);的输出结果为__C__ 。 A、无确定值 B、x的地址 D、4.14159 24、以下程序的输出结果是___B__ main() {char b[]="Language"; char *p=b; printf("%c ",*(b+2)); p=p+7; printf("%c\n",*p++); } A、2 7 B、n e C、a g D、n u 25、下列程序的输出结果是___A__。 #include "stdio.h" main() { int a[]={1,2,3,4,5,6,7,8,9,0}, i, s, *p; p=a;s=0; for(i=0;i<=9;i++) s+=*p++; printf("%d\n", s); } A、45 B、44 C、0 D、9 二、判断题(每小题1分,共10分) 1.语句int *point;中的point是指针变量名。( T ) 2.主函数和其它函数之间可以相互调用。( F ) 3.puts( )和gets( )函数只能输入或输出一个字符。( F ) 4. 可以对字符型数组元素进行整体输入、输出。( T ) 5.do-while语句构成的循环不能用其他语句构成的循环来代替。( F ) 6.在一个函数内的复合语句中定义的变量可以在本函数范围内有效。(F ) 7.函数必须有返回值,否则不能使
用函数。( F ) 8.for(;;);语句相当于while(1);语句。( T ) 9.C程序的执行总是从第一个定义的函数开始。( F ) 10.C语言中的关键字专门用作语言的特定成分,而不能作为一般标识符使用。( T ) 三、程序填空题(每空2分,共10分) 1、下面程序完成判断某一个数m是否为素数,如果是则输出"m is a prime!",否则就输出"m is not a prime!",请选择填空。 main() { int i, m; scanf("m=%d", &m); for(i=2; i<m; i++) { if(m%i==0) { printf("%d is not a prime!\n", m); (1) } else (2) } if(i==m) printf("%d is a prime!\n", m); } (1)、 A、break B、continue C、break; D、continue; (2)、 A、break B、break; C、continue D、continue; 2、以下程序的功能是:求出用数字0至9组成没有重复数字且是13倍数的三位数的个数,请选择填空。 #include<stdio.h> void main() { int i, j, k, w, count = 0; for( (3) ; i<=9; i++) for(j=0;j<=9; j++) for(k=0; k<=9;k++) if( (4) ) { w =
i*100+j*10+k; if( (5) ) count++; } printf("\n count=%d\n", count); } (3)、 A、i=0 B、i=1 C、i=9 D、i=-1 (4)、 A、i!=j B、i!=j ||j!=k C、i!=j&& j!=k D、i!=j&& j!=k && k!=i (5)、 A、w%13=0 B、w/13=0 C、w%13==0 D、w/13==0 四、编程题(第1小题12分,第2小题18分,共30分) 1、从键盘输入一个4位数的正整数n,将该数反序输出。例如,若输入的是
1357,则输出的是7531。 要求:1)利用VC++编译系统进行
调试、运行
2)对输入的正整数n的合
法性进行检查 3)将源程序以“编程题
1.c”为文件名保存在
网络盘(K:盘)的考生文件夹上,用其它文件名保存或保存在其他地方均不能得分
2、已知一组字符串a[27]="jjyyzzabcdefgJJYYZZABCDEFG"; 请编一程序,将其 中的小写字母换成其前一个字母,即z换成y,y换成x,...,b换成a,
若是a则换成z。然后对数组a[27]从小到大排序,并输出排序后的字符串。
要求:1)利用VC++编译系统进行调试、运行
2)先输出原字符串(即未做任何改变的字符串),最后输出排序后
的字符串
3)将源程序以“编程题
2.c”为文件名保存在网络盘(K:盘)的考生文件夹上,用其它文件名保存或
保存在其他地方均不能得
分