C语言复习题.docx
《C语言复习题.docx》由会员分享,可在线阅读,更多相关《C语言复习题.docx(12页珍藏版)》请在冰豆网上搜索。
![C语言复习题.docx](https://file1.bdocx.com/fileroot1/2023-1/21/c6b1777d-2c33-4783-ae6e-2c437a65765c/c6b1777d-2c33-4783-ae6e-2c437a65765c1.gif)
C语言复习题
C语言复习题
熟读理论教材,理解相关知识,并复习理论教材课后练习题
(切记:
以理论教材知识、例题和课后练习为主复习)
熟读课本例题及知识,完成以下知识点的复习及总结。
一.填空
1.一个C语言的执行是从本程序的____开始,到____结束?
2.C语言中用户的标识符命名规则是____。
3.在一个c语言程序中,main函数的位置是___。
4.若有代数式p(mne)/(bcd),其中p、m、n、e、b、c、d为变量,则该代数式的C语言表达式为___。
5.chara;intx;floaty,m;doublez,p;则表达式“a*x*m+z-y*x*p”值的数据类型为___。
6.C语言的常用关键字有___(举例说明,越多越好)。
7.printf函数中用到格式符%ms,其中数字m表示输出的字符串占用m列。
如果字符串长度大于m,则输出时的规则是___。
若如果字符串长度小于m,则输出时的规则是___。
若如果字符串长度等于m,则输出时的规则是___。
当m>0时是左对齐还是右对齐?
m<0呢?
8已有定义“intx;floaty;”且执行“scanf(“%4d%f”,&x,&y);”语句,若从第一列开始输入数据,则x的值为___。
10.能正确表示a≥-100或a≦100的关系表达式是___。
能正确表示a≥-100且a≦100的关系表达式是___。
11.判断逻辑值为“真”的判断方法是___。
逻辑值为“假”的判断方法是___。
12.已知“intx=100,y=200,z=300”,则执行if(x>y)z=x;x=y;y=z;语句后,x、y、z的值是___。
13.若m和n均为int型变量,则以下for语句循环执行的次数___及输出结果是___。
for(n=8,m=8;m!
=8;m++,++n)printf(“Welcomeyou!
\n”);
14.若n为int型变量,则循环语句“for(n=0;n<100;n++)”控制循环体执行___次。
15.在循环语句循环体中执行continue语句,其作用是___,break的作用是__;在swich()
Case语句中break语句作用是__。
16.关于函数的参数,实参可以是__,形参可以是__,
A.表达式;B.变量c.常量D.默认值
17.C语言的编译系统对宏命令的处理是在什么时间进行__
18.在C语言中,函数返回值的类型最终取决于__
19.定义二维整型数组b时,该数组行号和列号是否可以为变量?
20.对一维数组和二维数组定义及初始化的方法进行总结,并举例说明__
21.若有以下语句,chara[]=”abcdefgh”;charb[]={‘a’,’b’,’c’,’d,’e,’f’,’g’,’h’};则a和b数组长度分别为__和__
22.设有定义“intn1=0,n2,*p=&n2,*q=&n1;”,以下赋值语句中与“n2=n1;”语句等价的是另外一种表示语句为__
23.如有语句“intq=100,*p=&q;”,下面均代表地址的一组选项是________________
A.q,p,*&qB.&*q,&q,*pC.*&p,p,&qD.float*q,&*p,p
24.若有说明语句“intm,a[10][10];”,则不能将a[1][1]的值赋给变量m的语句是________________
A.m=*(*(a+1)+1);B.m=a[1][1]C.m=*(*(a+1))D.m=*(a[1])+1)
25.下面程序的运行结果是________________
charstr[]=”ABCDEFGGH”,*p=str;printf(“%d\n”,*(p+3));
26.C语言结构体类型变量在程序执行期间驻留在内存中的包括________________
27.以下关于结构体与共用体的共同点和区别是________________,他们如何分配空间的?
28.已有定义“inta,b,c;”,且a=b=c=20,执行if(a++||b++)c++;语句后,a、b、c的值是分别是________________、______________、________________。
已有定义“inta,b,c;”,且a=b=c=20,执行if(a++&&b++)c++;语句后,a、b、c的值是分别是________________、______________、________________
29.在一个源文件中定义的全局变量和局部变量的作用域为________________和________________。
30.在调用函数时,如果实参是简单变量,它与对应形参之间的数据传递方式是什么?
如果实参是地址值呢?
不同的是什么?
31.有以下程序,结果为_______________。
voidmain()
{inta[5]={1,2,3,4,5};
int*pa=&a[1];
printf(“%d”,pa[1]);
}
32.下面函数调用语句含有实参的个数为_______________。
y=fun(a,b,c,min(d,e),max(a,b));
33.以下程序的输出结果是_______________。
longfib(intn)
{if(n>2)
return(fib(n-1)+fib(n-2));else
return
(2);
}
voidmain()
{printf("%ld\n",fib(5));}
34.若有以下语句inta,*p,**p;a=808;p=&a;pp=&p;则**PP的值是_______________。
35.设有如下定义:
int*p();inta[10],*q[10];q[i]=&a[i]则p表示的意义是_______________,*q的表示的含义是_______________,其值是_______________。
38.若有#defineMU(x,y)x*y,则表达式24/MU(1+2,2)的值是_______________。
39.若有inta=1;则执行完循环语句while(a++<100);后a的值为_______________。
40.以下所列的C语言常量中,错误的是_______________。
A.0xFFB.2.8e0.2C.25.3D.'B'
41.所有的字符串都是以_______________字符结束的。
42假定double类型变量占用8个字节,且有定义:
doublex[10]={1,2,3};,则数组x在内存中所占字节数是_______________
43判断char型变量ch是否为小写字母的正确表达式是_______________
44.以下语句正确的有_______________,错误的有_______________
Achara='P',b='M';Bfloata=b=101.0;
Cintm=101,*n=&m;Ddouble*a,b=&a;
45.以下4个选项中,不能看做一条语句的是_______________
A.a-=23;B.a=8,b=12.5,c=13.68;
B.if(a<15)p++;D.if(b!
=5)x=2;y=6;
46.关于if后一对圆括号中的表达式,可以是哪种类型的表达式_______________
47.以下有关变量使用范围不正确的说法是_______________。
A在不同函数中可以使用同名的变量B形式参数是局部变量
C在函数内定义的变量只在本函数内有效D全局变量可以在所有函数中使用
48.若有说明语句:
inta,b,*d=&b;,则能正确从键盘读入2个整数分别赋给变量a、b的语句是_______________。
A.scanf("%d%d",&a,d);B.scanf("%d%d",&a,&d);
C.scanf("%d%d",a,d);D.scanf("%d%d",a,*d);
49.已知intp=20;则执行
if(p<=0)
if(p!
=0)printf(“AAAAA”);
elseprintf(“BBBBB”);
elseprintf(“CCCCC”);
语句后,输出的结果是_______________。
50.要使字符数组str存放一个字符串"Goodbye",正确的定义语句是_______________。
51.若用二维数组名作为函数调用的实参,传递给形参的值是_______________。
52.若有intx=20,y=8,z;,则执行语句z=0.7+x/y后z的值为_______________。
53.设有以下语句:
structSS
{intno;charname[10];}PERSON;
则下面叙述中错误的是_______________。
Astruct是结构体类型的关键字 BstructSS是结构体类型
CPERSON是结构体类型名 Dname是结构体成员名
54.已知:
charch='m';则下列表达式的值是_______________。
ch=(ch>='a'&&ch<='z')?
(ch-32):
ch;
55.下面程序的运行结果是_______________。
charc[8]={'a','\0,’b','\0','c','\0'};
printf("%s",c);
56.以下程序的输出结果是_______________。
main()
{charst[20]="10987654321\n\t\n\\\t\\";
printf("%d\n",strlen(st));}
57.有如下程序,该程序的输出结果是_______________。
main()
{floatx=2.0,y;
if(x<0.0)y=0.0;
elseif(x<10.0)y=1.0/x+1/4;
elsey=10.0;
printf("%f\n",y);}
58.以下程序段的输出结果是_______________。
main()
{
inta[10]={1,2,3,4,5,6,7,8,9,10},*p=&a[2];
printf("%d",*(p+3));
}
59.有如下程序,该程序的执行结果是_______________。
main()
{inti,sum=0;
for(i=1;i<=10;i++)sum+=i;
printf("%d\n",sum);
}
60.以下程序段,while循环执行的次数是_______________。
intk=0;while(k=2){k=k-1;}
60.语言使用的磁盘文件系统中,数据文件存储的的形式有哪两种_______________。
61.文件函数中,用于打开文件的函数是________,用于关闭文件的函数是_______,读写文件中字符的函数是_______,将一个字符写入磁盘文件的函数是_______。
二.编程
1.已知某班10个学生的C语言成绩为
学号
9901
9902
9903
9904
9905
9906
9907
9908
9909
9910
C成绩
65.4
86.7
69.8
88.5
100
92.6
87.3
54.8
96.3
79.6
要求:
按成绩大小排序输出,格式如下:
学号成绩名次
9905100.01
990996.32
…………
参考答案:
#include"stdio.h"
voidmain()
{staticintnum[10]={},i,j,p,t;
staticfloatsc[10]={65.4,86.7,69.8,88.5,100,92.6,87.3,54.8,96.3,79.6},f;
printf("theoriginaldata:
\n");
printf("学号成绩\n===========\n");
for(i=0;i<10;i++)
printf("%6d%6.1f\n",num[i],sc[i]);
for(i=0;i<9;i++)
{p=i;
for(j=i+1;j<10;j++)
if(sc[p]if(p!
=i)
for(j=0;j<10;j++)
{t=num[p];num[p]=num[i];num[i]=t;
f=sc[p];sc[p]=sc[i];sc[i]=f;
}
}
printf("thesorteddata:
\n");
printf("学号成绩名次\n===========\n");
for(i=0;i<10;i++)
printf("%6d%6.1f%d\n",num[i],sc[i],i+1);
}
2.例8.3 编写一个交换两个变量的函数,在主程序中调用,实现两个变量值的交换。
#include
voidmain()
{ inta,b;
int*pa,*pb;
voids*p1,int*p2); /*函数声明*/
scanf(″%d%d″,&a,&b);
pa=&a;/*pa指向变量a*/
pb=&b;/*pb指向变量b*/
s,pb);
printf(″\na=%d,b=%d\n″,a,b);
}
voids*p1,int*p2)
{ inttemp;
temp=*p1; /*三行语句交换指针p1,p2所指向的变量的值*/
*p1=*p2;
*p2=temp;
}
3.例6.5编程求组合C
=
分别定义求组合的函数和求阶乘的函数:
#include
longfac(intk) /*定义求阶乘的函数*/
{longf=1;
inti;
for(i=1;i<=k;i++)
f=f*i;
returnf;
}
longcomb(intn,intm)/*定义组合函数*/
{longc;
c=fac(m)/(fac(n)*fac(m-n));/*嵌套调用阶乘函数*/
returnc;
}
main()
{intn,m;
longc;
scanf(″%d,%d″,&n,&m);
c=comb(n,m);/*调用组合函数*/
printf(″%ld″,c);
}
4.例6.6输入两个数,输出其中较大的数。
#include
voidmain()
{inta,b,m;
intmax(int,int);/*对函数max的声明*/
scanf(″%d,%d″,&a,&b);
m=max(a,b);/*调用函数max,a、b已有具体的值*/
printf(″max=%d″,m);
}
intmax(intx,inty)
{intt;
if(x>y)t=x;
elset=y;
returnt;
}
如果运行时输入:
10,5
输出为
10
5.例6.8 用递归计算n!
。
程序:
#include
longfac(intn)
{longf;
if(n==0)
f=1;
esle
f=n*fac(n-1);/*递归调用,求(n-1)!
*/
returnf;
}
voidmain()
{longy;
intn;
scanf(″%d″,&n);
y=fac(n);/*调用fac(n)求n!
*/
printf(″%d!
=%ld″,n,y);
}
程序运行时如果输入:
3
6.例5.9 找出3~1000中的全部素数。
程序:
#include
voidmain()
{ unsignedinti,j,count,flag;/*用flag作标志*/
count=0;/*计数器清0*/
for(i=3;i<=1000;i++)
{ flag=0;
for(j=2;j<=sqrt(i);j++)
{ if(i%j==0)/*能整除,不是素数,标志设为1*/
{flag=1;break;}
}/*内循环结束*/
if(flag==0)/*若flag为0,则i是素数*/
{ printf(″%4d,″,i);count++;
if(count%8==0)printf(″\n″);/*每行输出8个素数*/
}
}/*外循环*/
}
7.例8.1 从键盘输入两个整数到a、b,按由大到小输出。
#include
voidmain()
{
inta,b,*pa=&a,*pb=&b,*p;
/*定义指针变量pa、pb,并进行初始化,如图8.4(a)所示*/
scanf(″%d%d″,&a,&b);
if(*pa<*pb)
{ p=pa; /*进行指针交换,如图8.4(b)和图8.4(c)所示*/
pa=pb;
pb=p;
}
printf(″\na=%d,b=%d\n″,a,b);
printf(″\nmax=%d,min=%d″,*pa,*pb); /*pa指向大数,pb指向小数*/
}
输入:
12 22↙
输出:
a=12,b=22
max=22,min=12
8.例8.14 用指向一维数组的行指针输出二维数组,并输出数组中的最大元素及所在行列号。
#include
voidmain()
{
inti,j,m,n,max;
inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int(*p)[4];/*定义p为指向一个有4个元素的一维数组的指针变量*/
p=a;/*p指向第0行*/
max=**p;/*将第一个元素送入max,**p相当于*(*(p+0)+0)*/
for(i=0;i<3;i++)
{
printf(″\n″);
for(j=0;j<4;j++)
{
printf(″%5d″,*(*p+j));
if(max<*(*p+j))
{max=*(*p+j);
m=i;n=j;
}
}
p++;/*指向下一行*/
}
printf(″\nmaxis:
a[%2d][%2d]=%5d″,m,n,max);
}
9.例5.1 编写一个程序,输入一个班的学生的成绩,求全班的平均成绩。
程序:
#include
voidmain()
{ floatscore,average=0; /*average存放平均成绩,初值为0*/
intn=0;/*n存放学生数,初值为0*/
scanf(″%f″,&score);/*输入第一个学生的分数*/
while(score>=0)
{
average+=score;/*average先用来放总分*/
n++;/*学生数加一*/
scanf(″%f″,&score);/*输入下一个学生的分数*/
}
if(n!
=0)
average=average/n;/*求平均成绩average*/
printf(″%6.2f″,average);/*输出平均成绩average,保留两位小数*/
}
(学习的目的是增长知识,提高能力,相信一分耕耘一分收获,努力就一定可以获得应有的回报)