1、二级 C语言程序设计-6 及答案解析(总分:84.00,做题时间:90 分钟)一、B选择题/B(总题数:21,分数:42.00)1.有以下程序:#includestdio.h#define MIN(x, y)(x)(y)?(x):(y)main() int i, j, k;i=10; j=15; k=10*MIN(i, j); printf(“%d/n“, k);程序的运行结果是 A.15 B.100 C.10 D.150(分数:2.00)A.B.C.D.2.有以下程序:#includestdio.h#define N 2#define M N+1#define NUM(M+1)*M/2mai
2、n() int i;for(i=1; i=NUM; i+); printf(“%d/n“, i);程序中的 for循环执行的次数是 A.5 B.6 C.8 D.9(分数:2.00)A.B.C.D.3.有以下程序:#includestdio.h#define FUDGF(y) 2.84+y#define PR(a) printf(“%d“, (int)(a)#define PRINT1(a) PR(a); putchar(/n)main() int x=2;PRINT1(FUDGF(5)*x);程序的运行结果是 A.11 B.12 C.13 D.15(分数:2.00)A.B.C.D.4.有以下程
3、序:#includestdio.h#includestdlib.hfut(int*s, int p23) *s=p11; main()int a23=1, 3, 5, 7, 9, 11, *p;p=(int*) malloc(sizeof(int); fut( printf(“%d/n“, *p);程序的运行结果是 A.1 B.7 C.9 D.11(分数:2.00)A.B.C.D.5.设有以下语句:double *p;p=_malloc(sizeof(double);若要使指针 p指向一个 double类型的动态存储单元,在下划线处应填入的是 A.double B.double* C.(*do
4、uble) D.(double*)(分数:2.00)A.B.C.D.6.有以下程序:#includestdio.h#includestdlib.hvoid fun(float*p1, float*p2, float*s)s=(float*) calloc (1, sizeof(float);*s=*p1+*p2+;main()float a2=1.1, 2.2, b2=10.0, 20.0, *s=a;fun(a, b, s); printf(“%5.2f/n“, *s);程序的运行结果是 A.11.10 B.12.00 C.21.10 D.1.10(分数:2.00)A.B.C.D.7.以下叙
5、述中正确的是 A.用#include 包含的头文件的后缀不可以是“.a” B.若一些源程序中包含某个头文件,当该头文件有错时,只需对该头文件进行修改,包含此头文件的所有源程序不必重新进行编译 C.宏命令行可以看做是一行 C语句 D.C编译中的预处理是在编译之前进行的(分数:2.00)A.B.C.D.8.有以下定义:struct personchar name9; int age; ;struct person class10=“Johu“, 17,“Paul“, 19,“Mary“, 18,“Adam“, 16,;则下面能输出字母 M的语句是 A.printf(“%c/n“, class3.n
6、ame); B.printf(“%c/n“, class3.name1); C.prinff(“%c/n“, class2.name1); D.printf(“%c/n“, class2.name0);(分数:2.00)A.B.C.D.9.有以下程序:#includestdio.hmain() struct cmplxint x; int y; cnum2=1, 3, 2, 7;printf(“%d/n“, cnum0.y/cnum0.x*cnum1.x); 程序的运行结果是 A.0 B.1 C.3 D.6(分数:2.00)A.B.C.D.10.若有以下定义和语句:struct st int
7、n;struct st*next;struct st a3, *p;a0.n=5; a0.next= a1.n=7; a1.next= a2.n=9; a2.next=/0;p=则以下值为 6的表达式是 A.p+-n B.p-n+ C.+(*p).n D.+p-n(分数:2.00)A.B.C.D.11.有以下程序:#includestdio.hmain() union short i2;long k;char c4;r, *s=s-i0=0x39; s-i1=0x38;printf(“%x/n“, s-c0);已知字符 0的 ASCII码值的十进制数是 48,且数组的第 0个元素在低位。以上程
8、序的运行结果是 A.39 B.9 C.38 D.8(分数:2.00)A.B.C.D.12.有以下程序(若 long型和 int型数据均占 4字节):#includestdio.htypedef unionlong x2; int y4; char z8; MYTYPE;MYTYPE them;main()printf(“%d/n“, sizeof(them); 程序的运行结果是 A.32 B.16 C.8 D.24(分数:2.00)A.B.C.D.13.有以下程序:#includestdio.hstruct st int x;int *y;*p;int dt4=10, 20, 30, 40;s
9、truct st aa4=50, main()p=aa; printf(“%d/n“, +p-x);printf(“%d/n“, (+p)-x); printf(“%d/n“, +(*p-y);程序的运行结果是 A.10 20 20 B.50 60 21 C.51 60 11 D.60 70 31(分数:2.00)A.B.C.D.14.若已建立如图所示的链表结构,指针 p、s 分别指向图中所示结点:(分数:2.00)A.B.C.D.15.没有以下定义和语句:struct STDchar name10;int age; int sex;s5, *ps;ps=下面 scanf函数调用语句中对结构体
10、变量成员引用错误的是 A.scanf(“%s“, s0.name); B.scanf(“%d“, C.scanf(“%d“, D.scanf(“%d“, ps-age);(分数:2.00)A.B.C.D.16.有以下程序:#includestdio.hmain()char x=040;printf(“%d/n“, x=x (分数:2.00)A.B.C.D.17.设有定义语句:char a=3, b=6, c;则执行赋值语句 c=ab (分数:2.00)A.B.C.D.18.有以下程序:#includestdio.hmain()short int x=35; char z=A;printf(“%
11、d/n“, (x程序运行后的输出结果是 A.0 B.1 C.2 D.3(分数:2.00)A.B.C.D.19.有以下程序:#includestdio.hmain()short int a=5, b=6, c=7, d=8, m=2, n=2;printf(“%d/n“, (m=ab)程序运行后的输出结果是 A.0 B.1 C.2 D.3(分数:2.00)A.B.C.D.20.标准库函数 fgets(s, n, f)的功能是 A.从文件 f中读取长度为 n的字符串存入指针 s所指的内存 B.从文件 f中读取长度不超过 n-1的字符串存入指针 s所指的内存 C.从文件 f中读取 n个字符串存入指针
12、 s所指的内存 D.从文件 f中读取长度为 n-1的字符串存入指针 s所指的内存(分数:2.00)A.B.C.D.21.若 fp是指向某文件的指针,且已读到文件末尾,则库函数 feof(fp)的返回值是 A.EOF B.-1 C.非零值 D.NULL(分数:2.00)A.B.C.D.二、B填空题/B(总题数:15,分数:30.00)22.以下程序运行后的输出结果是_。 #includestdio.h #define PR(ar) printf(“ar=%d“, ar) main() int j, a=1, 3, 5, 7, 9, 11, 13, 15, *p=a+5; for(j=3; j;
13、j-) switch(j) case 1 : case 2 : PR(*p+); break; case 3 : PR(*(-p); (分数:2.00)填空项 1:_23.以下程序的功能是:调用 getone函数开辟一个动态存储单元,调用 assone函数把数据输入到此动态存储单元,调用 outone函数输出此动态存储单元中的数据。请填空。 #includestdlib.h #includestdio.h void getone(int *s)*s=(_) malloc (sizeof(int); void assone(int*s)scanf(“%d“, _); void outone(in
14、t*b)printf(“%d/n“, _); main() int*p; getone( assone(p); outone(p); (分数:2.00)填空项 1:_24.为了建立如图所示的存储结构(即每个结点含两个域,data 是数据域,next 是指向结点的指针域),请填空。 (分数:2.00)填空项 1:_25.以下 mymin函数的功能是:在如图所示的带有头结点的单向链表中,查找结点数据域的最小值作为函数值返回。请填空。 (分数:2.00)填空项 1:_26.以下函数 creat用来建立一个带头结点的单向链表,新产生的结点总是插在链表的末尾,单向链表的头指针作为函数值返回。请填空。 #
15、includestdio.h #includestdlib.h struct list char data; struct list*next; ; struct list*creat() struct list*h, *p, *q; char ch; h=_ malloc (sizeof(_); p=q=h; ch=getchar(); while(ch!=?) p=_ malloc (sizeof (_); p-data=ch; q-next=p; q=p; ch=getchai(); p-next=/0; _; (分数:2.00)填空项 1:_27.设变量 a的二进制数是 0010110
16、1,若想通过运算 ab使 a的高四位取反,低四位不变,则 b的二进制数应是 1。(分数:2.00)填空项 1:_28.a为任意整数。能将变量 a清零的表达式是 1。(分数:2.00)填空项 1:_29.a为八进制数 07101。能将变量 a中的各二进制位均置成 l的表达式是 1。(分数:2.00)填空项 1:_30.能将两字节变量 x的高八位全置 1,低八位字节保持不变的表达式是 1。(分数:2.00)填空项 1:_31.运用位运算,能将八进制数 012500除以 4,然后赋给变量 a的表达式是 1。(分数:2.00)填空项 1:_32.运用位运算,能将字符型变量 ch中的大写字母转换成小写字
17、母的表达式是 1。(分数:2.00)填空项 1:_33.以下 C程序将磁盘中的一个文件复制到另一个文件中,两个文件名已在程序中给出(假定文件名无误)。请填空。 #includestdio.h main() FILE*f1, *f2; f1=fopen(“file_a.dat“, “r“); f2=fopen(“file_b.dat“, “w“); while(_) fputc (fgetc(f1), _); _; _; (分数:2.00)填空项 1:_34.以下程序由终端键盘输入一个文件名,然后把终端键盘输入的字符依次存放到该文件中,用#号作为结束输入的标志。请填空。 #includestdi
18、o.h #includestdlib.h main() FILE*fp; char ch, fname10; printf(“Enter the name of file/n“); gets(fname); if(fp=_)=NULL)printf(“Open error/n“); exit(0); printf(“Enter data: /n“); while(ch=getchar()!=#) fputc(_, fp); fclose(fp); (分数:2.00)填空项 1:_35.以下程序用来统计文件中字符的个数。请填空。 #includestdio.h main() FILE*fp; l
19、ong num=0; fp=fopen(“fname.dat“, _); while _ _; nun+; printf(“nun=%ld/n“, nun); fclose(fp); (分数:2.00)填空项 1:_36.假定磁盘当前目录下有文件名为 a.dat、b.dat、c.dat 三个文本文件,文件中内容分别为:aaaa#、bbbb#和 cccc#,执行以下程序后将输出_。 #includestdio.h void fc(FILE*); main() FILE *fp; int i=3; char fname10=“a.dat“, “b.dat“, “c.dat“; while(-i=0
20、) fp=fopen(fnamei, “r“); fc(fp); fclose(fp); void fc(FILE*ifp) char *c; while (c=getc(ifp)!=#)putchar(c-32); (分数:2.00)填空项 1:_三、B编程题/B(总题数:1,分数:12.00)已知 head指向一个带头结点的单向链表,链表中每个结点包含数据域(data)和指针域(next),数据域为整型。请分别编写函数,在链表中查找数据域值最大的结点:(分数:12.00)(1).由函数值返回找到的最大值。(分数:3.00)_(2).由函数值返回最大值所在结点的地址值。(分数:3.00)_(
21、3).请调用 fputs函数,把 10个字符串输出到文件中;再从此文件中读入这 10个字符串放在一个字符串数组中;最后把字符串数组中的字符串输出到终端屏幕,以检验所有操作是否正确。(分数:3.00)_(4).从键盘输入 10个浮点数,以二进制形式存入文件中。再从文件中读出数据显示在屏幕上。(分数:3.00)_二级 C语言程序设计-6 答案解析(总分:84.00,做题时间:90 分钟)一、B选择题/B(总题数:21,分数:42.00)1.有以下程序:#includestdio.h#define MIN(x, y)(x)(y)?(x):(y)main() int i, j, k;i=10; j=1
22、5; k=10*MIN(i, j); printf(“%d/n“, k);程序的运行结果是 A.15 B.100 C.10 D.150(分数:2.00)A. B.C.D.解析:2.有以下程序:#includestdio.h#define N 2#define M N+1#define NUM(M+1)*M/2main() int i;for(i=1; i=NUM; i+); printf(“%d/n“, i);程序中的 for循环执行的次数是 A.5 B.6 C.8 D.9(分数:2.00)A.B.C. D.解析:3.有以下程序:#includestdio.h#define FUDGF(y)
23、2.84+y#define PR(a) printf(“%d“, (int)(a)#define PRINT1(a) PR(a); putchar(/n)main() int x=2;PRINT1(FUDGF(5)*x);程序的运行结果是 A.11 B.12 C.13 D.15(分数:2.00)A.B. C.D.解析:4.有以下程序:#includestdio.h#includestdlib.hfut(int*s, int p23) *s=p11; main()int a23=1, 3, 5, 7, 9, 11, *p;p=(int*) malloc(sizeof(int); fut( pri
24、ntf(“%d/n“, *p);程序的运行结果是 A.1 B.7 C.9 D.11(分数:2.00)A.B.C. D.解析:5.设有以下语句:double *p;p=_malloc(sizeof(double);若要使指针 p指向一个 double类型的动态存储单元,在下划线处应填入的是 A.double B.double* C.(*double) D.(double*)(分数:2.00)A.B.C.D. 解析:6.有以下程序:#includestdio.h#includestdlib.hvoid fun(float*p1, float*p2, float*s)s=(float*) callo
25、c (1, sizeof(float);*s=*p1+*p2+;main()float a2=1.1, 2.2, b2=10.0, 20.0, *s=a;fun(a, b, s); printf(“%5.2f/n“, *s);程序的运行结果是 A.11.10 B.12.00 C.21.10 D.1.10(分数:2.00)A.B.C.D. 解析:7.以下叙述中正确的是 A.用#include 包含的头文件的后缀不可以是“.a” B.若一些源程序中包含某个头文件,当该头文件有错时,只需对该头文件进行修改,包含此头文件的所有源程序不必重新进行编译 C.宏命令行可以看做是一行 C语句 D.C编译中的预
26、处理是在编译之前进行的(分数:2.00)A.B.C.D. 解析:8.有以下定义:struct personchar name9; int age; ;struct person class10=“Johu“, 17,“Paul“, 19,“Mary“, 18,“Adam“, 16,;则下面能输出字母 M的语句是 A.printf(“%c/n“, class3.name); B.printf(“%c/n“, class3.name1); C.prinff(“%c/n“, class2.name1); D.printf(“%c/n“, class2.name0);(分数:2.00)A.B.C.D.
27、 解析:9.有以下程序:#includestdio.hmain() struct cmplxint x; int y; cnum2=1, 3, 2, 7;printf(“%d/n“, cnum0.y/cnum0.x*cnum1.x); 程序的运行结果是 A.0 B.1 C.3 D.6(分数:2.00)A.B.C.D. 解析:10.若有以下定义和语句:struct st int n;struct st*next;struct st a3, *p;a0.n=5; a0.next= a1.n=7; a1.next= a2.n=9; a2.next=/0;p=则以下值为 6的表达式是 A.p+-n B
28、.p-n+ C.+(*p).n D.+p-n(分数:2.00)A.B.C.D. 解析:11.有以下程序:#includestdio.hmain() union short i2;long k;char c4;r, *s=s-i0=0x39; s-i1=0x38;printf(“%x/n“, s-c0);已知字符 0的 ASCII码值的十进制数是 48,且数组的第 0个元素在低位。以上程序的运行结果是 A.39 B.9 C.38 D.8(分数:2.00)A. B.C.D.解析:12.有以下程序(若 long型和 int型数据均占 4字节):#includestdio.htypedef union
29、long x2; int y4; char z8; MYTYPE;MYTYPE them;main()printf(“%d/n“, sizeof(them); 程序的运行结果是 A.32 B.16 C.8 D.24(分数:2.00)A.B. C.D.解析:13.有以下程序:#includestdio.hstruct st int x;int *y;*p;int dt4=10, 20, 30, 40;struct st aa4=50, main()p=aa; printf(“%d/n“, +p-x);printf(“%d/n“, (+p)-x); printf(“%d/n“, +(*p-y);程
30、序的运行结果是 A.10 20 20 B.50 60 21 C.51 60 11 D.60 70 31(分数:2.00)A.B.C. D.解析:14.若已建立如图所示的链表结构,指针 p、s 分别指向图中所示结点:(分数:2.00)A.B.C. D.解析:15.没有以下定义和语句:struct STDchar name10;int age; int sex;s5, *ps;ps=下面 scanf函数调用语句中对结构体变量成员引用错误的是 A.scanf(“%s“, s0.name); B.scanf(“%d“, C.scanf(“%d“, D.scanf(“%d“, ps-age);(分数:2
31、.00)A.B.C.D. 解析:16.有以下程序:#includestdio.hmain()char x=040;printf(“%d/n“, x=x (分数:2.00)A.B.C.D. 解析:17.设有定义语句:char a=3, b=6, c;则执行赋值语句 c=ab (分数:2.00)A. B.C.D.解析:18.有以下程序:#includestdio.hmain()short int x=35; char z=A;printf(“%d/n“, (x程序运行后的输出结果是 A.0 B.1 C.2 D.3(分数:2.00)A.B. C.D.解析:19.有以下程序:#includestdio
32、.hmain()short int a=5, b=6, c=7, d=8, m=2, n=2;printf(“%d/n“, (m=ab)程序运行后的输出结果是 A.0 B.1 C.2 D.3(分数:2.00)A. B.C.D.解析:20.标准库函数 fgets(s, n, f)的功能是 A.从文件 f中读取长度为 n的字符串存入指针 s所指的内存 B.从文件 f中读取长度不超过 n-1的字符串存入指针 s所指的内存 C.从文件 f中读取 n个字符串存入指针 s所指的内存 D.从文件 f中读取长度为 n-1的字符串存入指针 s所指的内存(分数:2.00)A.B. C.D.解析:21.若 fp是指
33、向某文件的指针,且已读到文件末尾,则库函数 feof(fp)的返回值是 A.EOF B.-1 C.非零值 D.NULL(分数:2.00)A.B.C. D.解析:二、B填空题/B(总题数:15,分数:30.00)22.以下程序运行后的输出结果是_。 #includestdio.h #define PR(ar) printf(“ar=%d“, ar) main() int j, a=1, 3, 5, 7, 9, 11, 13, 15, *p=a+5; for(j=3; j; j-) switch(j) case 1 : case 2 : PR(*p+); break; case 3 : PR(*(
34、-p); (分数:2.00)填空项 1:_ (正确答案:ar=9 ar=9 ar=11)解析:23.以下程序的功能是:调用 getone函数开辟一个动态存储单元,调用 assone函数把数据输入到此动态存储单元,调用 outone函数输出此动态存储单元中的数据。请填空。 #includestdlib.h #includestdio.h void getone(int *s)*s=(_) malloc (sizeof(int); void assone(int*s)scanf(“%d“, _); void outone(int*b)printf(“%d/n“, _); main() int*p;
35、 getone( assone(p); outone(p); (分数:2.00)填空项 1:_ (正确答案:int* s *b)解析:24.为了建立如图所示的存储结构(即每个结点含两个域,data 是数据域,next 是指向结点的指针域),请填空。 (分数:2.00)填空项 1:_ (正确答案:struct link*next)解析:25.以下 mymin函数的功能是:在如图所示的带有头结点的单向链表中,查找结点数据域的最小值作为函数值返回。请填空。 (分数:2.00)填空项 1:_ (正确答案:p-next mp-data 或 p-datam)解析:26.以下函数 creat用来建立一个带头
36、结点的单向链表,新产生的结点总是插在链表的末尾,单向链表的头指针作为函数值返回。请填空。 #includestdio.h #includestdlib.h struct list char data; struct list*next; ; struct list*creat() struct list*h, *p, *q; char ch; h=_ malloc (sizeof(_); p=q=h; ch=getchar(); while(ch!=?) p=_ malloc (sizeof (_); p-data=ch; q-next=p; q=p; ch=getchai(); p-next
37、=/0; _; (分数:2.00)填空项 1:_ (正确答案:(struct list*) struct list (struct list*) struct list return h)解析:27.设变量 a的二进制数是 00101101,若想通过运算 ab使 a的高四位取反,低四位不变,则 b的二进制数应是 1。(分数:2.00)填空项 1:_ (正确答案:11110000)解析:28.a为任意整数。能将变量 a清零的表达式是 1。(分数:2.00)填空项 1:_ (正确答案:a=a f1=fopen(“file_a.dat“, “r“); f2=fopen(“file_b.dat“, “
38、w“); while(_) fputc (fgetc(f1), _); _; _; (分数:2.00)填空项 1:_ (正确答案:!feof(f1) f2 fclose(f1) fclose(f2))解析:34.以下程序由终端键盘输入一个文件名,然后把终端键盘输入的字符依次存放到该文件中,用#号作为结束输入的标志。请填空。 #includestdio.h #includestdlib.h main() FILE*fp; char ch, fname10; printf(“Enter the name of file/n“); gets(fname); if(fp=_)=NULL)printf(
39、“Open error/n“); exit(0); printf(“Enter data: /n“); while(ch=getchar()!=#) fputc(_, fp); fclose(fp); (分数:2.00)填空项 1:_ (正确答案:fopen(fname, “w“) ch)解析:35.以下程序用来统计文件中字符的个数。请填空。 #includestdio.h main() FILE*fp; long num=0; fp=fopen(“fname.dat“, _); while _ _; nun+; printf(“nun=%ld/n“, nun); fclose(fp); (分
40、数:2.00)填空项 1:_ (正确答案:“r“ (!feof(fp) fgetc(fp))解析:36.假定磁盘当前目录下有文件名为 a.dat、b.dat、c.dat 三个文本文件,文件中内容分别为:aaaa#、bbbb#和 cccc#,执行以下程序后将输出_。 #includestdio.h void fc(FILE*); main() FILE *fp; int i=3; char fname10=“a.dat“, “b.dat“, “c.dat“; while(-i=0) fp=fopen(fnamei, “r“); fc(fp); fclose(fp); void fc(FILE*i
41、fp) char *c; while (c=getc(ifp)!=#)putchar(c-32); (分数:2.00)填空项 1:_ (正确答案:CCCCBBBBAAAA)解析:三、B编程题/B(总题数:1,分数:12.00)已知 head指向一个带头结点的单向链表,链表中每个结点包含数据域(data)和指针域(next),数据域为整型。请分别编写函数,在链表中查找数据域值最大的结点:(分数:12.00)(1).由函数值返回找到的最大值。(分数:3.00)_正确答案:(为了对链表进行操作,必须先建立链表。)解析:(2).由函数值返回最大值所在结点的地址值。(分数:3.00)_正确答案:(本题要
42、求编写的两个函数都是找结点数据域的最大值,区别在于函数的返回值不同:一个是结点的数值,一个是结点的地址值。因此,两个函数的首部不同,例如: int maxaval(struet node*head)/*返回结点的数值*/ struct node$maxadd(struet node*head)/*返回结点的地址值*/ 函数的核心程序段如下: p=head-next; /*p 指向第 1个结点*/ m=p-data; pmax=p; /*假设的最大值放入m,结点的地址放入 pmax*/ for(p=p-next; p; p=p-next)/*依次访问链表的各个结点*/ if(mp-data)m=p-data; pmax=p; /*记下当前的最大值及最大值所在结点的地址值*/ 对于第一个函数,需要返回的是 m;而第二个函数,需要返回的是 pmax。)解析:(3).请调用 fputs函数,把 10个字符串输出到文件中;再从此文件中读入这 10个字符串放在一个字符串数组中;最后把字符串数组中的字符串输出到终端屏幕,以检验所有操作是否正确。(分数:3.00)_