国家开放大学《C语言程序设计》综合练习题参考答案.docx
国家开放大学C语言程序设计综合练习题参考答案综合练习1一、单选题(每小题2分,共20分)1.在每个C语言程序中都必须包含有这样一个函数,该函数的函数名为。a.mainb.namec.MAINd.function2.每个C语言程序文件的编译错误分为( )类。a.2b.4c.3d.13.字符串"a+b=12n"的长度为( )。a.6b.9c.8d.74.在switch语句的每个case块中,假定都是以break语句结束的,则此switch语句容易被改写为( )语句。a.whileb.if c.ford.do5.在下面的do-while循环语句中,其循环体语句被执行的次数为( )。int i=0; do i+; while(i<10);a.4b.5c.10d.36.将两个字符串连接起来组成一个字符串时,选用的函数为( )。 a.strcmp()b.strcat()c.strlen()d.strcap() 7.若用数组名作为函数调用的实参,传递给形参的是( )。a.数组元素的个数b.数组中全部元素的值 c.数组中第一个元素的值d.数组的首地址8.假定a为一个整数类型的数组名,整数类型的长度为4,则元素a4的地址比a数组的首地址大( )个字节。a.32b.16c.8d.49.假定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* a8;”,则该数组a所占存储空间的字节数为(32)。18.假定二维数组的定义语句为“double aMN;”,则该数组a的列下标的取值范围在0到(N-1)之间。19.存储一个空字符串需要占用(1)个字节。20.strcpy函数用于把一个字符串(拷贝)到另一个字符数组空间中。21.程序的编译单位是一个(程序文件)。22.假定a是一个一维数组,则ai的指针访问方式为((a+i))。 23.执行int *p=malloc(sizeof(int)操作得到的一个动态分配的整型对象为(p)。三、写出下列每个程序运行后的输出结果(每小题6分,共30分)24.#include<stdio.h> 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 ","default"); printf("%dn",4*x); 程序运行结果:15 2025.#include<stdio.h> 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 5826.#include<stdio.h> #define N 8 void main() int aN=12,39,26,41,55,63,72,40; int i, i1=0, i2=0; for(i=0;i<N;i+) if(ai%2=1) i1+; else i2+; printf("%d %dn",i1,i2); 程序运行结果:4 427.#include<stdio.h> #include<string.h> void main char s15="5678912340" int i, n=strlen(s) ; for(i=0; i<n/2; i+) char c=si; si=sn-1-i; sn-1-i=c; printf("%sn",s); 程序运行结果:043219876528.#include<stdio.h> int LB(int *a, int n) int i,s=1; for(i=0;i<n;i+) s*=*a+; return s; void main() int a=1,2,3,4,2,2,5,8; int b=LB(a,4)+LB(a+3,4); printf("b=%dn",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个整数到一维数组a10中,然后按照下标从大到小的次序输出数组a10中的所有元素值。假定数组a10和循环变量i均在主函数中定义。参考答案:#include<stdio.h>void main()int a10,I;printf(“从键盘输入10个整数:n”);for(i=0;i<10;i+) scanf(“%d”,&ai);for(i=9;i>=0;i-) printf(“%d”,ai);printf(“n”);32.编写一个程序,已知6a50,10b30,求出满足不定方程3a+2b=120的全部整数组解。如(20,30)就是其中的一组解。参考答案:#include<stdio.h>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.cppb.Cc.exed.obj2.设x和y均为逻辑值,则x && y为真的条件是x和y( )。a.均为假b.其中一个为真c.均为真d.其中一个为假3.在下列的符号常量定义中,正确的定义格式为( )。a.const char markb.const int M2 20c.#define M3 10d.#define M1 4.for循环语句能够被改写为( )语句。a.whileb.ifc.switchd.复合5.在下面的一维数组定义中,错误的定义格式为( )。a.int a=1,2,3;b.int a5;c.int a; d.int a10=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. *ad. ai 8.假定有定义为“int a10, x, *pa=a;”,若要把数组a中下标为3的元素值赋给x,则不正确的赋值为( )。a.x=*(a+3)b.x=*pa+3c.x=a3d.x=pa39.char类型的长度为_个字节。a.3b.1c.4d.210.向一个二进制文件中写入信息的函数为( )。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 a45;”,则该数组所含元素的个数为回答(20)。18.执行“typedef int ABC20;”语句把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<stdio.h> void main() int i,s=0; for(i=1;i<7;i+) s+=i*i; printf(“s=%dn”,s); 程序运行结果:s=9125.#include<stdio.h> #define N 6 void main() int i,aN=2,5,8,10,15,20; for(i=0; i<N; i+) if(ai%4=0) printf("%d ",ai); printf("n"); 程序运行结果:8 2026. #include<stdio.h> #include<string.h> void main() int i; unsigned int len; char* a5="stud","work","cadre","soldier","zan123" len=strlen(a0); for(i=1; i<5; i+) if(strlen(ai)>len) len=strlen(ai); printf("%dn",len); 程序运行结果:727.#include<stdio.h> 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 2128.#include<stdio.h> 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 %dn",x,y); 程序运行结果:5 8 8 5四、写出下列每个函数的功能(每小题6分,共12分)29.#include<math.h> 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<stdio.h>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<stdio.h>int FF(int a,int n)if(n=1) return a0;elsereturn a0*FF(a+1,n-1);main()int n=5,s,a5=1,2,3,4,5;s=FF(a,n);printf("%dn",s);综合练习3一、单选题(每小题2分,共20分)1.由C语言源程序文件编译而成的目标文件的默认扩展名为( )。a.objb.exec.cppd.c2.设x和y均为逻辑值,则x | y为假的条件是( )。a.它们均为假b.它们均为真c.其中一个为真d.其中一个为假3.枚举类型中的每个枚举常量的值都是一个( )。a.字符b.整数c.浮点数d.记录4.循环语句“for(i=0; i<=n; i+) S;”中循环体S被执行的次数为( )。a.n-1b.nc.n+1d.15.假定有定义为“int a45=1,3,5,2,8;”,则a11的值为( )。a.2b.8c.5d.36.在下面的选项中,不能作为函数值返回类型的是( )。a.newb.longc.voidd.int7.假定x的值为4,y的值为6,则表达式x+*+y的值为( )。a.35b.24c.30d.288.用calloc函数创建具有10个整型元素的动态存储空间的正确调用是( )。a.calloc(10,sizeof(char) b.calloc(10)c.calloc(sizeof(int),10,)d.calloc(10,sizeof(int) 9.假定有定义“int b10, *pb;”,则不正确的赋值为( )。a.pb=bb.pb=b+4c.pb=&b0d.pb=b510.标准输入设备的文件流标识符是( )。a.stderrb.stdoutc.stdind.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 a36;”,则该数组所占存储空间的字节数为(72)。18.使用“typedef char BBMN;”语句定义(BB)为含有M行N列的二维字符数组类型。19.字符串"a:xxk数据"的长度为(11)。20.假定p所指对象的值为20,p+1所指对象的值为30,则*+p的值为(30)。21.假定一个数据对象为int*类型,则指向该对象的指针类型为(int)。22.假定一个结构类型的定义为 “struct Aint a,b; A* c;”,则该类型的长度为(12)。23.假定要访问一个结构对象x中的数据成员a,则表示方式为(x.a)。三、写出下列每个程序运行后的输出结果(每小题6分,共30分)24.#include<stdio.h> void main() int i, s=0; for(i=1;i+) if(s>20) break; if(i%2) s+=i; printf("s=%dn",s); 程序运行结果:s=2525.#include<stdio.h> void main() int a9=36,25,48,24,55,40,18,30,20; int i, b1, b2; b1=b2=a0; for(i=1; i<9; i+) if(ai>b1) b1=ai; if(ai<b2) b2=ai; printf("%d %dn",b1,b2); 程序运行结果:55 1826.#include<stdio.h> 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 BB27.#include<stdio.h> #define M 6 void main() int i,x; int aM=10,15,22,37,46,58; for(i=0; i<M/2; i+) x=ai; ai=aM-1-i; aM-1-i=x; printf("%d %dn",a2,a4); 程序运行结果:37 1528.#include<stdio.h> struct Worker char name15; int age; float pay; ; void main() struct Worker x="wanghua",34,4250; struct Worker y, *p; y=x; p=&x; printf("%d %7.2fn", 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循环,计算并打印输出1+12+13+1n的值,其中正整数n值由键盘输入。假定求和变量用sum表示,计数变量用i表示,sum、i和n均定义为全局变量,sum和i的初值分别被赋予0和1。参考答案:#include<stdio.h> int n,i=1;double sum=0;void main() scanf(“%d”,&n); while(i<=n) sum+=(double)1/i+; printf(“sum=%1fn”,sum);32.根据函数原型“void DD(int a, int n, int MM)”编写函数定义,利用双重循环查找并打印输出数组an中任何两个元素的值等于MM值的元素值。假定ai+aj等于MM,则输出格式为:(ai,aj)。参考答案:void DD(int a,int n,int MM) int i,j;for(i=0;i<n;i+) for(j=i+1;j<n;j+) if(ai+aj=MM) printf(“%d,%dn”,ai,aj);综合练习4一、单选题(每小题2分,共20分)1.由C语言目标文件连接而成的可执行文件的缺省扩展名为( )。a.exeb.objc.cd.cpp2.设有两条语句为“int a=10; a+=a*a;”,则执行结束后,a的值为( )。a.100b.10c.20d.1103.带有随机函数调用的表达式rand()%50的值在( )区间内。a.150 b.149c.049 d.0504.for循环语句“for(i=0; i<n; i+=2) S;”中循环体S语句被执行的次数为( )。a.(n+1)/2 b.n-1c.n/2+1d.n/2-15.在下列的字符数组定义中,存在语法错误的是( )。a.char a15='1','2'b.char a20="abcdefg"c.char a10='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.10b.40c.70d.309.若要使p指向二维整型数组a1020,则p的类型为( )。a.int *b.int *c.int *20d.int(*)2010.表示文件结束符的符号常量为( )a.feofb.eofc.Eofd.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 aMN;”,则该数组所含元素的个数为(M N)。19.存储字符'a'需要占用存储器的(1)个字节空间。20.用于存储一个长度为n的字符串,需要的字符数组的长度至少为(n+1)。21.假定p所指对象的值为30,p+1所指对象的值为46,则执行表达式(*p)+后,p所指对象的值为(31)。22.假定p是一个指向整数对象的指针,则用(p)表示该整数对象。23.假定一个结构类型的定义为“struct Bint a5; char* b;”,则该类型的理论长度为(24)。三、写出下列每个程序运行后的输出结果(每小题6分,共30分)24. #include<stdio.h> void main() int i, s1=0, s2=0; for(i=0;i<=10;i+) if(i%2) s1+=i; else s2+=i; printf("%d %dn",s1,s2); 程序运行结果:25 3025.#include<stdio.h> 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 1026.#include<stdio.h> int a7=4,5,6,15,20,12,9; void main() int i,s1,s2; s1=s2=0; for(i=0; i<7; i+) switch(ai%2) case 0: s2+=ai;break; case 1: s1+=ai;break; printf("%d %dn",s1,s2); 程序运行结果:29 4227.#include<stdio.h> void main() int a33=3,15,7,9,11,10,6,8,20; int i,*p=&a00; for(i=0;i<9;i+) if(*p>10) printf("%d ",*p); p+; printf("n"); 程序运行结果:15 11 2028.#include<stdio.h> #include<string.h> struct Worker char name15; int age; float pay; void main() struct Worker x; char *t="liouti