
综合练习1
一、单选题(每小题2分,共20分)
1.在每个C语言程序中都必须包含有这样一个函数,该函数的函数名为。
a.main
b.name
c.MAIN
d.function
2.每个C语言程序文件的编译错误分为( )类。
a.2
b.4
c.3
d.1
3.字符串"a+b=12\\n"的长度为( )。
a.6
b.9
c.8
d.7
4.在switch语句的每个case块中,假定都是以break语句结束的,则此switch语句容易被改写为( )语句。
a.while
b.if
c.for
d.do
5.在下面的do-while循环语句中,其循环体语句被执行的次数为( )。
int i=0; do i++; while(i<10);
a.4
b.5
c.10
d.3
6.将两个字符串连接起来组成一个字符串时,选用的函数为( )。
a.strcmp()
b.strcat()
c.strlen()
d.strcap()
7.若用数组名作为函数调用的实参,传递给形参的是( )。
a.数组元素的个数
b.数组中全部元素的值
c.数组中第一个元素的值
d.数组的首地址
8.假定a为一个整数类型的数组名,整数类型的长度为4,则元素a[4]的地址比a数组的首地址大( )个字节。
a.32
b.16
c.8
d.4
9.假定s被定义为指针类型char *的变量,初始指向的字符串为"Hello world!",若要使变量p指向s所指向的字符串,则p应定义为( )。
a.char *p=s;
b.char *p;p=*s;
c.char *p=&s;
d.char *p; p=&s;
10.从一个数据文件中读入以换行符结束的一行字符串的函数为( )。
a.fgets()
b.fgetc()
c.gets()
d.getc()
二、填空题(每小题2分,共26分)
11.C语言中的每条简单语句以(分号)作为结束符。
12.C程序中的所有预处理命令均以(#)字符开头。
13.当不需要函数返回任何值时,则应使用(void)标识符来定义函数类型。
14.十进制数25表示成符合C语言规则的十六进制数为(19)。
15.假定不允许使用逻辑非操作符,则逻辑表达式a>b || b==5的相反表达式为(a<=b && b!=5)。
16.执行“typedef int DataType;”语句后,在使用int定义整型变量的地方也可以使用(DataType)来定义整型变量。
17.假定一维数组的定义语句为“char* a[8];”,则该数组a所占存储空间的字节数为(32)。
18.假定二维数组的定义语句为“double a[M][N];”,则该数组a的列下标的取值范围在0到(N-1)之间。
19.存储一个空字符串需要占用(1)个字节。
20.strcpy函数用于把一个字符串(拷贝)到另一个字符数组空间中。
21.程序的编译单位是一个(程序文件)。
22.假定a是一个一维数组,则a[i]的指针访问方式为((a+i))。
23.执行int *p=malloc(sizeof(int))操作得到的一个动态分配的整型对象为(p)。
三、写出下列每个程序运行后的输出结果(每小题6分,共30分)
24.#include void main() { int x=5; switch(2*x) { case 4: printf("%d ",x); break; case 7: printf("%d ",2*x); break; case 10: printf("%d ",3*x); break; default: printf("%s } printf("%d\\n",4*x); } 程序运行结果:15 20 25.#include void main() { int f1,f2,i; f1=1; printf("%d ",f1); for(i=2;i<5;i++) { f2=3*f1+i; printf("%d ",f2); f1=f2; } printf("\\n"); } 程序运行结果:1 5 18 58 26.#include #define N 8 void main() { int a[N]={12,39,26,41,55,63,72,40}; int i, i1=0, i2=0; for(i=0;i printf("%d %d\\n",i1,i2); } 程序运行结果:4 4 27.#include #include void main { char s[15]="56712340"; int i, n=strlen(s) ; for(i=0; i s[i]=s[n-1-i]; s[n-1-i]=c; } printf("%s\\n",s); } 程序运行结果:0432198765 28.#include int LB(int *a, int n) { int i,s=1; for(i=0;i } void main() { int a[]={1,2,3,4,2,2,5,8}; int b=LB(a,4)+LB(a+3,4); printf("b=%d\\n",b); } 程序运行结果:b=104 四、根据下列每个函数回答相应问题(每小题6分,共12分) 29.void SF(int x) { //n为大于等于0的整数 int i=2; while(x>i) { if(x%i==0) printf("%d ",i); i++; } printf("\\n"); } 假定使用SF(70)调用该函数,则输出的所有整数依次为_____________。 参: 2 5 7 10 14 35 30.void QC(struct IntNode* f) { //f为一个单链表的表头指针 while(f) { printf("%d ",f->data); f=f->next; } } 假定结构类型IntNode的定义为: struct IntNode {int data; struct IntNode *next;}; 该函数的功能为: 参: 遍历并输出由表头指针f所指向的单链表中每个结点的data域的值。 五、按题目要求编写程序(每小题6分,共12分) 31.编写一个程序,首先从键盘上输入10个整数到一维数组a[10]中,然后按照下标从大到小的次序输出数组a[10]中的所有元素值。假定数组a[10]和循环变量i均在主函数中定义。 参: #include void main() { int a[10],I; printf(“从键盘输入10个整数:\\n”); for(i=0;i<10;i++) scanf(“%d”,&a[i]); for(i=9;i>=0;i--) printf(“%d”,a[i]); printf(“\\n”); } 32.编写一个程序,已知6≤a≤50,10≤b≤30,求出满足不定方程3a+2b=120的全部整数组解。如(20,30)就是其中的一组解。 参: #include void main() { int a,b; for(a=6;a<=50;a++) for(b=10;b<=30;b++) if(3*a+2*b==120) printf(“(%d,%d)\\n”,a,b); } 综合练习2 一、单选题(每小题2分,共20分) 1.C语言源程序文件的缺省扩展名为( )。 a.cpp b.C c.exe d.obj 2.设x和y均为逻辑值,则x && y为真的条件是x和y( )。 a.均为假 b.其中一个为真 c.均为真 d.其中一个为假 3.在下列的符号常量定义中,正确的定义格式为( )。 a.const char mark b.const int M2 20 c.#define M3 10 d.#define M1 4.for循环语句能够被改写为( )语句。 a.while b.if c.switch d.复合 5.在下面的一维数组定义中,错误的定义格式为( )。 a.int a[]={1,2,3}; b.int a[5]; c.int a[]; d.int a[10]={0}; 6.下面的函数原型声明中存在语法错误的是( )。 a.void AA(int, int); b.void AA(int a, int); c.void AA(int a; int b;); d.void AA(int a, int b); 7.假定a为一个数组名,则下面存在错误的表达式为( )。 a.*a++ b.*(a+1) c. *a d. a[i] 8.假定有定义为“int a[10], x, *pa=a;”,若要把数组a中下标为3的元素值赋给x,则不正确的赋值为( )。 a.x=*(a+3) b.x=*pa+3 c.x=a[3] d.x=pa[3] 9.char类型的长度为________个字节。 a.3 b.1 c.4 d.2 10.向一个二进制文件中写入信息的函数为( )。 a.fgets() b.fwrite() c.fputs() d.fread() 二、填空题(每小题2分,共26分) 11.C语言中的每条复合语句以(})作为结束符。 12.在#include命令中所包含的文件,可以是头文件,也可以是(程序)文件。 13.十进制数56对应的八进制数为(070)。 14.假定x=5,则表达式12+x++的值为(17)。 15.增量表达式++y表示成赋值表达式为回答(y=y+1)。 16.若x=5,y=6,则x>y的值为(0)。 17.假定二维数组的定义为“int a[4][5];”,则该数组所含元素的个数为回答(20)。 18.执行“typedef int ABC[20];”语句把ABC定义为具有20个整型元素的(数组)类型。 19.strcat()函数用于(连接)两个字符串。 20.假定p所指对象的值为30,p+1所指对象的值为24,则*p++的值为(30)。 21.若要把一个整型指针p转换为字符指针,则采用的强制转换表达式为((char )p)。 22.NULL是一个符号常量,通常作为空指针值,它对应的值为(0)。 23.假定要动态分配一个类型为struct Worker的对象,并由r指针指向这个对象,则使用的表达式为(struct Worker r)=malloc(sizeof(struct Worker))。 三、写出下列每个程序运行后的输出结果(每小题6分,共30分) 24.#include void main() { int i,s=0; for(i=1;i<7;i++) s+=i*i; printf(“s=%d\\n”,s); } 程序运行结果:s=91 25.#include #define N 6 void main() { int i,a[N]={2,5,8,10,15,20}; for(i=0; i printf("\\n"); } 程序运行结果:8 20 26. #include #include void main() { int i; unsigned int len; char* a[5]={"stud len=strlen(a[0]); for(i=1; i<5; i++) if(strlen(a[i])>len) len=strlen(a[i]); printf("%d\\n",len); } 程序运行结果:7 27.#include void main() { int a,b; for(a=2,b=3; b<30;) { printf("%d %d ",a,b); a=a+b; b=a+b; } } 程序运行结果:2 3 5 8 13 21 28.#include void LE(int* a, int* b) { int x=*a; *a=*b; *b=x; } void main() { int x=5, y=8; printf("%d %d ",x,y); LE(&x,&y); printf("%d %d\\n",x,y); } 程序运行结果:5 8 8 5 四、写出下列每个函数的功能(每小题6分,共12分) 29.#include int SG(int x) { //x为大于等于2的整数 int a=(int)sqrt(x); //sqrt(x)取x的平方根 int i=2; while(i<=a) { if(x%i==0) break; i++; } if(i<=a)return 0; else return 1; } 函数功能: 参:判断x是否为一个素数,若是则返回1,否则返回0。 30.int FindMax(struct IntNode *f) //f为一个单链表的表头指针 { int x; if(!f) {printf("单链表为空\\n"),exit(1);} x=f->data; f=f->next; while(f) { if(f->data>x) x=f->data; f=f->next; } return x; } 假定struct IntNode的类型定义为: struct IntNode { int data; struct IntNode* next;}; 函数功能: 参:求出由f所指向的单链表中所有结点的最大值。 五、按题目要求编写程序或函数(每小题6分,共12分) 31.编写一个程序,输出35以内(含35)的、能够被4或者7整除的所有整数。 参: #include void main() { int i; for(i=4;i<=35;i++) if(i%4==0||i%7==0) printf(“%d”,i); printf(“\\n”); } 32.编写一个递归函数“int FF(int a[], int n)”,求出数组a中所有n个元素之积并返回。 参: #include int FF(int a[],int n) { if(n==1) return a[0]; else return a[0]*FF(a+1,n-1); } main() { int n=5,s,a[5]={1,2,3,4,5}; s=FF(a,n); printf("%d\\\\n",s); } 综合练习3 一、单选题(每小题2分,共20分) 1.由C语言源程序文件编译而成的目标文件的默认扩展名为( )。 a.obj b.exe c.cpp d.c 2.设x和y均为逻辑值,则x || y为假的条件是( )。 a.它们均为假 b.它们均为真 c.其中一个为真 d.其中一个为假 3.枚举类型中的每个枚举常量的值都是一个( )。 a.字符 b.整数 c.浮点数 d.记录 4.循环语句“for(i=0; i<=n; i++) S;”中循环体S被执行的次数为( )。 a.n-1 b.n c.n+1 d.1 5.假定有定义为“int a[4][5]={{1,3,5},{2,8}};”,则a[1][1]的值为( )。 a.2 b.8 c.5 d.3 6.在下面的选项中,不能作为函数值返回类型的是( )。 a.new b.long c.void d.int 7.假定x的值为4,y的值为6,则表达式x++*++y的值为( )。 a.35 b.24 c.30 d.28 8.用calloc函数创建具有10个整型元素的动态存储空间的正确调用是( )。 a.calloc(10,sizeof(char)) b.calloc(10) c.calloc(sizeof(int),10,) d.calloc(10,sizeof(int)) 9.假定有定义“int b[10], *pb;”,则不正确的赋值为( )。 a.pb=b b.pb=b+4 c.pb=&b[0] d.pb=b[5] 10.标准输入设备的文件流标识符是( )。 a.stderr b.stdout c.stdin d.stdio 二、填空题(每小题2分,共26分) 11.执行“printf("%c",'A'+3);”语句后得到的输出结果为(D)。 12.short int类型的长度为(2)。 13.用类型关键字表示十进制常数3.26f的类型为(float)。 14.假定y=5,则表达式--y*3的值为(12)。 15.逻辑表达式(x==0 && y>5)的相反表达式为((x!=0 || y<=5) 或:(x || y<=5))。 16.若x=5,y=10,则x!=y的逻辑值为(1)。 17.假定二维数组的定义为“int a[3][6];”,则该数组所占存储空间的字节数为(72)。 18.使用“typedef char BB[M][N];”语句定义(BB)为含有M行N列的二维字符数组类型。 19.字符串"a:\\\\xxk\\\数据"的长度为(11)。 20.假定p所指对象的值为20,p+1所指对象的值为30,则*++p的值为(30)。 21.假定一个数据对象为int*类型,则指向该对象的指针类型为(int)。 22.假定一个结构类型的定义为 “struct A{int a,b; A* c;};”,则该类型的长度为(12)。 23.假定要访问一个结构对象x中的数据成员a,则表示方式为(x.a)。 三、写出下列每个程序运行后的输出结果(每小题6分,共30分) 24.#include void main() { int i, s=0; for(i=1;;i++) { if(s>20) break; if(i%2) s+=i; } printf("s=%d\\n",s); } 程序运行结果:s=25 25.#include void main() { int a[9]={36,25,48,24,55,40,18,30,20}; int i, b1, b2; b1=b2=a[0]; for(i=1; i<9; i++) { if(a[i]>b1) b1=a[i]; if(a[i] printf("%d %d\\n",b1,b2); } 程序运行结果:55 18 26.#include void SB(char ch) { switch(ch) { case 'A': case 'a': printf("WW "); break; case 'B': case 'b': printf("GG "); break; default: printf("BB "); break; } } void main() { char a1='a',a2='B',a3='f'; SB(a1);SB(a2);SB(a3); printf("\\n"); } 程序运行结果:WW GG BB 27.#include #define M 6 void main() { int i,x; int a[M]={10,15,22,37,46,58}; for(i=0; i } 程序运行结果:37 15 28.#include struct Worker { char name[15]; int age; float pay; }; void main() { struct Worker x={"wanghua",34,4250}; struct Worker y, *p; y=x; p=&x; printf("%d %7.2f\\n", y.age+p->age, p->pay+300); } 程序运行结果:68 4550.00 四、写出下列每个函数的功能(每小题6分,共12分) 29.int FH() { int x,y=0; scanf("%d",&x); while(x!=-1) { y+=x; scanf("%d",&x);} return y; } 函数功能: 参:求出从键盘上输入的一批整数的总和,以-1作为结束数据输入的标志。 30.int FF(struct IntNode *f) //f为指向一个单链表的表头指针 { int n=0; if(!f) return 0; while(f) { n++; f=f->next; } return n; } 假定struct IntNode的类型定义为: struct IntNode { int data; struct IntNode* next; }; 函数功能: 参:求出并返回由f所指向的单链表中所有结点的个数。 五、按题目要求编写程序或函数(每小题6分,共12分) 31.编写一个程序,利用while循环,计算并打印输出的值,其中正整数n值由键盘输入。假定求和变量用sum表示,计数变量用i表示,sum、i和n均定义为全局变量,sum和i的初值分别被赋予0和1。 参: #include int n,i=1; double sum=0; void main() { scanf(“%d”,&n); while(i<=n) sum+=(double)1/i++; printf(“sum=%1f\\n”,sum); } 32.根据函数原型“void DD(int a[], int n, int MM)”编写函数定义,利用双重循环查找并打印输出数组a[n]中任何两个元素的值等于MM值的元素值。假定a[i]+a[j]等于MM,则输出格式为:(a[i],a[j])。 参: void DD(int a[],int n,int MM) { int i,j; for(i=0;i } 综合练习4 一、单选题(每小题2分,共20分) 1.由C语言目标文件连接而成的可执行文件的缺省扩展名为( )。 a.exe b.obj c.c d.cpp 2.设有两条语句为“int a=10; a+=a*a;”,则执行结束后,a的值为( )。 a.100 b.10 c.20 d.110 3.带有随机函数调用的表达式rand()%50的值在( )区间内。 a.1~50 b.1~49 c.0~49 d.0~50 4.for循环语句“for(i=0; i b.n-1 c.n/2+1 d.n/2-1 5.在下列的字符数组定义中,存在语法错误的是( )。 a.char a[15]={'1','2'}; b.char a[20]="abcdefg"; c.char a[10]='5'; d.char a[]="x+y=55."; 6.若有一个函数原型为“double *function()”,则它的返回值类型为( )。 a.函数指针型 b.实数型 c.实数指针型 d.数组型 7.在C语言中,所有预处理命令都是以( )符号开头的。 a.# b.& c.* d.@ 8.假定整数指针p所指数据单元的值为30,p+1所指数据单元的值为40,则执行*p++后,p所指数据单元的值为( )。 a.10 b.40 c.70 d.30 9.若要使p指向二维整型数组a[10][20],则p的类型为( )。 a.int ** b.int * c.int *[20] d.int(*)[20] 10.表示文件结束符的符号常量为( ) a.feof b.eof c.Eof d.EOF 二、填空题(每小题2分,共26分) 11.一个函数定义由(函数头)和函数体两部分组成。 12.执行“printf("%c",'F'-3);”语句后得到的输出结果为(C)。 13.int类型的长度为(4)。 14.表达式(float)25/4的值为(6.25)。 15.若x=5,y=10,则x<=y的逻辑值为(1)。 16.作为语句标号使用的case和default只能用于(switch)语句的定义体中。 17.在程序中执行到(return)语句时,将结束所在函数的执行过程,返回到调用该函数的位置。 18.假定二维数组的定义为“char a[M][N];”,则该数组所含元素的个数为(M N)。 19.存储字符'a'需要占用存储器的(1)个字节空间。 20.用于存储一个长度为n的字符串,需要的字符数组的长度至少为(n+1)。 21.假定p所指对象的值为30,p+1所指对象的值为46,则执行表达式(*p)++后,p所指对象的值为(31)。 22.假定p是一个指向整数对象的指针,则用(p)表示该整数对象。 23.假定一个结构类型的定义为“struct B{int a[5]; char* b;};”,则该类型的理论长度为(24)。 三、写出下列每个程序运行后的输出结果(每小题6分,共30分) 24. #include void main() { int i, s1=0, s2=0; for(i=0;i<=10;i++) if(i%2) s1+=i; else s2+=i; printf("%d %d\\n",s1,s2); } 程序运行结果:25 30 25.#include const int M=20; void main() { int i=2; while(1) { if(i>M/2) break; if(M%i==0) printf("%d ",i); i++; } printf("\\n"); } 程序运行结果:2 4 5 10 26.#include int a[7]={4,5,6,15,20,12,9}; void main() { int i,s1,s2; s1=s2=0; for(i=0; i<7; i++) { switch(a[i]%2) { case 0: s2+=a[i];break; case 1: s1+=a[i];break; } } printf("%d %d\\n",s1,s2); } 程序运行结果:29 42 27.#include void main() { int a[3][3]={{3,15,7},{9,11,10},{6,8,20}}; int i,*p=&a[0][0]; for(i=0;i<9;i++) { if(*p>10) printf("%d ",*p); p++; } printf("\\n"); } 程序运行结果:15 11 20 28.#include #include struct Worker { char name[15]; int age; float pay;}; void main() { struct Worker x; char *t="liouting"; int d=38; float f=2400; strcpy(x.name,t); x.age=d; x.pay=f; x.age++; x.pay*=2; printf("%s %d %6.2f\\n",x.name,x.age,x.pay); } 程序运行结果:liouting 39 4800.00 四、写出下列每个函数的功能(每小题6分,共12分) 29.#include int SA(int a, int b) { if(a>b) return 1; else if(a==b) return 0; else return -1; } 函数功能: 参:比较两个整数a和b的大小,若a>b则返回1,若a==b则返回0,若a30.void Output(struct IntNode *f) //f为单链表的表头指针 { if(!f) return; while(f) { printf("%d ",f->data); f=f->next; } printf("\\n"); } 假定struct IntNode的类型定义为: struct IntNode { int data; struct IntNode* next;}; 函数功能: 参:遍历并输出由f所指向的单链表中每个结点的值。 五、按题目要求编写程序或函数(每小题6分,共12分) 31.编写一个程序,计算1+3+32+...+310的值并输出,假定分别用i,p,s作为循环变量、累乘变量和累加变量的标识符。 参: #include voil main() { int i; int p=1; int s=1; for(i=1;i<=10;i++){p*=3;s+=p;} printf(“%d\\n”,s); } 32.据函数原型“int FF(int a[], int n)”,编写函数定义,计算并返回数组a[n]中所有元素之和。 参: int FF(int a[],int n) { int i,sum=0; for(i=0;i } 综合练习5 一、单选题(每小题2分,共20分) 1.程序运行中需要从键盘上输入多于一个数据时,各数据之间默认使用( )符号作为分隔符。 a.逗号或回车 b.空格或回车 c.空格或逗号 d.逗号或分号 2.逻辑表达式(x>0 && x<=10)的相反表达式为( )。 a.x>0 && x>10 b.x<=0 && x>10 c. x<=0 || x<=10 d.x<=0 || x>10 3.当处理一个问题时的循环次数已知时,最好采用( )循环来解决。 a.do-while b.while c.for d.switch 4.假定i的初值为0,则在循环语句“while(i b.n c.n+1 d.n/2 5.假定一个二维数组的定义语句为“int a[3][4]={{3,4},{2,8,6}};”,则元素a[1][2]的值为( )。 a.8 b.4 c.2 d.6 6.在下列选项中,不正确的函数原型格式为( )。 a.void int(double* a); b.int Function(int a); c.int Function(a); d.int Function(int a); 7.假定p是一个指向double类型的数据指针,则p+1所指向的数据的地址比p所指向的数据的地址大( )个字节。 a.2 b.4 c.1 d.8 8.假定有一条定义语句为“int m=7, *p;”,则给p赋值的正确表达式为( )。 a.p=*m b.p=&m c.p=m d.*p=&m 9.假定指针变量p的定义语句为“int *p=malloc(sizeof(int));”,要释放p所指向的动态存储空间,应调用的函数为( )。 a.free(&p) b.free(p) c.free(*p) d.delete(p) 10.C语言中的系统函数fopen()是( )一个数据文件的函数。 a.写入 b.打开 c.读取 d.关闭 二、填空题(每小题2分,共26分) 11.用于输出表达式值的标准输出函数的函数名是(printf)。 12.每个C语言程序文件在编译时可能出现有致命性错误,其对应的标识符为(error)。 13.已知'A'~'Z'的ASCII码为65~90,当执行“int x='C'+6;”语句后x的值为(73)。 14.表达式(int)24.6的值为(24)。 15.假定不允许使用逻辑非操作符,则关系表达式x+y>5的相反表达式为(x+y<=5)。 16.假定x=15,则执行“a=(x?10:20);”语句后a的值为(10)。 17.假定一维数组a的定义语句为“char* a[M];”,则该数组所占存储空间的字节数为(4 M)。 18.存储字符串"a"需要至少占用存储空间中的(2)个字节。 19.strlen()函数用于计算一个字符串的(长度)。 20.在C语言中,一个函数定义由函数头和(函数体)这两个部分组成。 21.假定p所指对象的值为25,p+1所指对象的值为52,则执行表达式*(p++)后,p所指对象的值为(52)。 22.假定p是一个变量,则用(&p)表示该变量的地址。 23.把间接访问表达式p->name改写成对应的直接访问表达式为(( p).name)。 三、写出下列每个程序运行后的输出结果(每小题6分,共30分) 24.#include void main() { int n=6, y=1; while(n--) y+=3+n; printf("y=%d\\n",y); } 程序运行结果:y=34
