1、国家二级 C语言(结构体和共用体、文件)机试模拟试卷 2及答案与解析 一、选择题 1 若有语句 typedef struet Sint g; char h; T;,则下列叙述中正确的是 ( )。 ( A)可用 S定义结构体变量 ( B)可用 T定义结构体变量 ( C) S是 struct类型的变量 ( D) T是 struet S类型的变量 2 设有语句 typedef struet TTchar c; int a4; CIN;,则下列叙述中正确的是( )。 ( A) CIN是 struet TT类型的变量 ( B), IT是 struct类型的变量 ( C)可以用 TT定义结构体变量 ( D
2、)可以用 CIN定义结构体变量 3 下列叙述中错误的是 ( )。 ( A)可以用 typedef将已存在的类型用一个新的名字来代表 ( B)可以通过 typedef增加新的类型 ( C)用 typedef定义新的类型名后,原有类型名仍有效 ( D)用 typedef可以为各种类型起别名,但不能为变量起别名 4 有以下程序: #include stdio h main() struet STU char name9; char sex: double score2; ; struct STU a=“Zhao“, m, 85 0, 90 0, b=“Qian“, f, 95 0, 92 0; b=
3、a; printf(“ s, c, 2 0f, 2 0f n“, b name, b sex, b score0,b score1); 程序的运行结果是 ( )。 ( A) Qian, m, 85, 90 ( B) Zhao, m, 85, 90 ( C) Zhao, f, 95, 92 ( D) Qian, f, 95, 92 5 下列结构体类型说明和变量定义中正确的是 ( )。 ( A) struet REC; int n; char c; ; REC t1, t2; ( B) typedef struet int n; ehar c; REC; REC t1, t2; ( C) type
4、def struet REC; int n=0; char c=A; t1, t2; ( D) struet int n; char c; REC; REC t1, t2; 6 下列结构体的定义语句中错误的是 ( )。 ( A) gtruet ordint x; int y; int z; struct ord a; ( B) struet ordint x; int y; int z; ; struet ord a; ( C) struct ordint x; int y; int z; a; ( D) struetint x; int y; int z; a; 7 设有定义: struet
5、 complex int real, unreal; data1=1, 8, data2; 则下列赋值语句中错误的是 ( )。 ( A) data2=(2, 6); ( B) data2=datal; ( C) data2 real=datal real; ( D) data2 real=data1 unreal; 8 有以下程序: struet stint x; int*y; *pt; int a=1, 2, b=3, 4; struet st c2=10, a, 20, b; pt=c; 以下选项中表达式值为 11的是 ( )。 ( A) +pt- X ( B) pt- x ( C) *p
6、t- y ( D) (pt+)- x 9 有以下定义和语句: struet worker8 int num; char name20; char c; struet int day; int month; int year; s; ; struct workers w, *pw; pw=&w: 能给 w中 year成员赋 1980的语句是 ( )。 ( A) pw- year=1980; ( B) w year=1980; ( C) w s year=1980; ( D) *pw year=1980; 10 有以下程序: #include stdio h struet ttint x; str
7、uet tt*y; *p; struet tt a4=20, a+1, 15, a+2, 30, a+3, 17, a; main() int i; p=a: for(i=1; i =2; i+) printf(“ d, “, p- X); p=p- y: 程序的运行结果是 ( )。 ( A) 20, 30, ( B) 30, 17 ( C) 15, 30, ( D) 20, 15, 11 设有定义: struetchar mark12; int num1; double num2; t1, t2;,若变量均已正确赋初值,则一中错误的是 ( )。 ( A) t1=t2; ( B) t2 num
8、1=t1 num1; ( C) t2 mark=t1 mark; ( D) t2 hum2=t1 num2: 12 有以下程序: #inelude stdio h struet S int a, b; data2=10, 100, 20, 200; main() struet S p=data1; printf(“ d n“, +(p a); 程序的运行结果是 ( )。 ( A) 10 ( B) 11 ( C) 20 ( D) 21 13 有以下结构体说明、变量定义和赋值语句: struct STDchar name10; int age; char sex; srs, *ps; ps=&g0
9、; 则下列 scanf函数调用语句有错误的是 ( )。 ( A) scanf(“ s“, s0 name); ( B) seanf(“ d“, &s0 age); ( C) scanf(“ c“, &(ps- sex); ( D) seanf(“ d“, ps- age); 14 有以下程 序: #include stdio h typedef struetintb, p; A; void f(A C) *注意: c是结构变量名 * int j; c b+=1; c p+=2: main() int i; A a=1, 2; f(a); printf(“ d, d n“, a b, a p);
10、 程序的运行结果是 ( )。 ( A) 2, 4 ( B) 1, 2 ( C) 1, 4 ( D) 2, 3 15 有以下程序: #include stdio h struet S int n; int a20; ; void f(street S*p) int i, j, t; for(i=0; i p- n-1; i+) for(j=i+1; j p- n; j+) if(p- ai p- aj) t=p- ai; p- ai=p- aj; p- aj=t; main() int i: struct S s=10, 2, 3, 1, 6, 8, 7, 5, 4, 10, 9; f(&s);
11、 flor(i=0; i s n; i+) printf(“ d, “, s ai); 程序的运行结果是 ( )。 ( A) 2, 3, 1, 6, 8, 7, 5, 4, lO, 9, ( B) 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, ( C) 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ( D) 10, 9, 8, 7, 6, 1, 2, 3, 4, 5, 16 程序中已构成如下不带头节点的单向链表结构,指针变量 s、 p、 q均已正确定义,并用于指向链表节点,指针变量 s总是作为指针指向链表的第一个节点。若有以下程序段: q=s; s=s- nex
12、t:p=s; while(p- next)p=p- next; p- next=q; q- next=NULL;该程序段实现的功能是 ( )。 ( A)删除尾节点 ( B)尾节点成为首节点 ( C)删除首节点 ( D)首节点成为尾节点 17 假定已建立以下链表结构,且指针 p和 q已指向如图所示的节点。则下列选项中可将 q所指节点从链表中删除并释放该节点的语句组是 ( )。 ( A) p- next=q- next; free(q); ( B) p=q- next; free(q); ( C) p=q; free(q); ( D) (*p) next=(*q)=next; free(p); 1
13、8 下列关于 C语言文件的叙述中正确的是 ( )。 ( A)文件由一系列数据依次排列组成,只能构成二进制文件 ( B)文件由结构序列组成,可以构成二进制文件或文本文件 ( C)文件由数据序列组成,可以构成二进制文件或文本文件 ( D)文件由字符序列组成,其类型只能是文本文件 19 下列叙述中正确的是 ( )。 ( A)当对文件的读 (写 )操作完成之后,必须将它关闭,否则可能导致数据丢失 ( B)打开一个已存在的文件并进行写操作后,原有文件中的全部数据必定被覆盖 ( C)在一个程序中对文件进行写操作后,必须先关闭该 文件然后再打开才能读到第一个数据 ( D) C语言中的文件是流式文件,因此只能
14、顺序存取数据 20 有以下程序: #include stdio h main() FILE*fp; int a10=1, 2, 3, i, n; fp=fopen(“d1 dat“, “w“); for(i=0; i 3; i+) fprintf(fp, “ d“, ai); fprintf(fp, “ n“); fclose(fp); fp=fopen(“d1 dat“, “r“); fscanf(fp, “ d“, &n); fclose(fp); printf(“ d n“, n); 程序的运行结果是 ( )。 ( A) 321 ( B) 12300 ( C) 1 ( D) 123 21
15、 设文件指针 fp已定义,执行语句 fp=fopen(“file“, “w“);后,下列针对文本文件 file操作叙述的选项中正确的是 ( )。 ( A)只能写不能读 ( B)写操作结束后可以从头开始读 ( C)可以在原有内容后追加写 ( D)可以随意读和写 22 有以下程序: #include stdio h main() FILE*f: f=fopen(“filea txt“, “w“); fprintf(f, “abc“); fclose(f); 若文本文件 filea txt中原有内容为 hello,则运行以上程序后,文件 filea txt中的内容为 ( )。 ( A) abclo
16、( B) abc ( C) helloabc ( D) abchello 23 读取二进制文件的函数调用形式为: fread(buffer, size, count, fp);,其中buffer代表的是 ( )。 ( A)一个内存块的字节数 ( B)一个整型变量,代 表待读取的数据的字节数 ( C)一个文件指针,指向待读取的文件 ( D)一个内存块的首地址,代表读入数据存放的地址 24 有以下程序: #include stdio h main() FILE*pf; char*s1=“China“, *s2=“Beijing“; pf=fopen (“abc dat“, “wb+“); fwri
17、te(s2, 7, 1, pf); rewind(pf); *文件位置指针回到文件开头 * fwrite(s1, 5, 1, pf); fclose(pf); 程序执行后, abc dat文件的内容是 ( )。 ( A) China ( B) Chinang ( C) ChinaBeijing ( D) BeijingChina 25 有以下程序: #include stdio h main() FILE*fp; charstr10; fp=fopen(“myfile dat“, “w“); fputs(“abc“, fp); fclose(fp); fp=fopen(“myfile dat“
18、, “a+“); fprintf(fp, “ d“, 28); rewind(fp); fscanf(fp, “ s“, str); puts(str); fclose(fp); 程序的运行结果是 ( )。 ( A) abc ( B) 28c ( C) abc28 ( D)因类型不一致而出错 26 设 fp为指向某二进制文件的指针,且已读到此文件末尾,则函数 feof(fp)的返回值为 ( )。 ( A) 0 ( B) 0 ( C)非 0值 ( D) NULL 国家二级 C语言(结构体和共用体、文件)机试模拟试卷 2答案与解析 一、选择题 1 【正确答案】 B 【试题解析】 本题考查 type
19、def重新声明一种结构体类型。那么 T为结构体类型,而不是结构体变量,所以 B选项正确。 【知识模块】 结构体和共用体 2 【正确答案】 D 【试题解析】 本题考查 typedef重新声明一种结构体类型。其中 CIN为结构体类型名,而不是结构体变量,所以 D选项正确。 【知识模块】 结构体和共用体 3 【正确答案】 B 【试题解析】 本题考查 typedef的用法。 typedef并不是增加一种新的类型,而是对已存在的类型用一个新的名字来代表,所以 B选项错误。 【知识模块】 结构体 和共用体 4 【正确答案】 B 【试题解析】 本题考查结构体初始化操作。本题中可以直接将结构体 a赋值给b,所
20、以输出的结果和 a一样, B选项正确。 【知识模块】 结构体和共用体 5 【正确答案】 B 【试题解析】 本题考查结构体的相关知识。选项 A中 struct REC后面不能有分号, C选项中 typedefstruct REC的后面也不能有分号,选项 D中 REC已经是结构体变量,不能当作结构体类型来使用。 【知识模块】 结构体和共用体 6 【正确答案】 A 【试题解析】 A选项错误,不能在定义结构体的同时,又用结构体类型名定义变量,应该写成 B选项或者 D选项的格式。 【知识模块】 结构体和共用体 7 【正确答案】 A 【试题解析】 A选项中可以在声明变量的同时为 data2赋值,但是 da
21、ta2=(2,6);应写作 data2=2, 6;,所以选择 A选项。 【知识模块】 结构体和共用体 8 【正确答案】 A 【试题解析】 本题考查结构体数组初始化以及结构体变量的引用。题目中定义了一个结构体数组 c并初始化,指针 pt指向 c的第一个元素,那么 pt- x为 10,+pt- x为 11,球 pt- y为 1, (pt+)- x为 20,所以选择 A选项。 【知识模块】 结构体和共用体 9 【正确答案】 C 【试题解析】 本题考查结构体变量的引用。题目中定义了一个结构体,其中结构体中的变量又是一个结构体, w为外层结构体,如果给内层结构体赋值,先要得到内层结构体变量,即 w s,
22、若要给 year赋值,表示为 w s year即可,选项C正确。 【知识模块】 结构体和共用体 10 【正确答案】 D 【试题解析】 本题考查结构体变量的引用以及结构体数组。 p指向 a数组的第一个元素,所以 p- x为 20,然后 p=p- y后, p指向数组 a的第二个元素,所以输出 15,选项 D正确。 【知识模块】 结构体和共用体 11 【正确答案】 C 【试题解析】 本题考查结构体变量的引用。 C选项中 mark为结构体中的数组,不能直接赋值,所以 C选项错误。 【知识模块】 结构体和共用体 12 【正确答案】 D 【试题解析】 声明 data是结构 S数组,初始化 data0 a=
23、10;data0 b=100; data1 a=20; data1 b=200。主函数中 p=data1;即p a=data1 a; p b=data1 b;,执行语句 printf(“ d n“,+(p a);,打印输出时, p a先增 1再打印, p a=data1 a=20,先增 1等于 21。 【知识模块】 结构体和共用体 13 【正确答案】 D 【试题解析】 本题考查结构体的相关知识。题目中需要输入一个变量, scarff要求参数为指针,而 D选项中 ps- age为一个变量,不是指针,所以错误。 【知识模块】 结构体和共用体 14 【正确答案 】 B 【试题解析】 结构体变量可以作
24、为函数的参数和返回值。作为函数的实参时,可以实现函数的传值调用。当使用结构体变量作为函数的形参时,实参也应该是结构体变量名,以实现传值调用,实参将副本给形参,在被调用函数中改变形参值对于调用函数中的实参没有影响,所以选择 B选项。 【知识模块】 结构体和共用体 15 【正确答案】 C 【试题解析】 本题中子函数 f的功能是对结构体变量 s中第二个成员数组中的所有数据进行从小到大的冒泡排序,所以结果是 C选项。 【知识模块】 结构体和共用体 16 【正确答案】 D 【试题解析】 本题考查链表的操作。本题中首先是 s指向了它的下个节点,题目中说明了 s总是指向链表的第一个节点。然后 while循环
25、找到链表的最后一个元素,最后一个元素指向了之前链表的头节点,之前头节点指向了空节点,所以本题实现的效果是使首节点成为尾节点,选项 D正确。 【知识模块】 结构体和共用体 17 【正确答案】 A 【试题解析】 本题考查删除链表中的节点操作。其方法是将要删除节点的上个节点的下个节点指向要删除节点的下个节点,然后释放该要删除的节点,所以选项A正确。 【知识模块】 结构体和共用体 18 【正确答案】 C 【试题解析】 本题考查文件的概念。文件由数据序列组成,可以构成二进制文件或文本文件,所以答案为 C选项。 【知识模块】 文件 19 【正确答案】 A 【试题解析】 B选项中打开一个已存在的文件并进行写
26、操作后,原有文件中的全部数据不一定被覆盖,也可以对源文件进行追加操作等。 C选项中在一个程序中对文件进行写操作后,不是先关闭该文件然后再打开才能读到第 个数据,用fseek()函数进行重新定位即可。 D选项中, C语言中的文件可以进行随 机读写。 【知识模块】 文件 20 【正确答案】 D 【试题解析】 程序首先将数组 a10中的元素 1、 2、 3分别写入了文件 d1 dat文件中,然后又将 d1 dat文件中的数据 123整体写到变量 n的空间中,所以打印 n时输出的数据为 123。 【知识模块】 文件 21 【正确答案】 A 【试题解析】 考查文件操作函数 fopen的基础知识。以 w方
27、式打开文件时只能写不能读。 【知识模块】 文件 22 【正确答案】 B 【试题解析】 本题考查文件操作函数。执行 fprintf(f, “abc“);后, f文件的内容就变为了 abc,所以 B选项正确。 【知识模块】 文件 23 【正确答案】 D 【试题解析】 fread(void*buffer, size t size, size t count, FILE*stream)的功能是从一个文件流中读数据,读取 count个元素,每个元素 size字节,如果调用成功,返回 count。 buffer用于接收数据的内存地址,大小至少是 size*count字节;size是单个元素的大小,单位是字
28、节; count是元素的个数,每个元素是 size字节; stream是输入流。 【知识模块】 文件 24 【正确答案】 B 【试题解析】 本题考查文件操作函数: fwrite和 rewind函数。题目中先是将 s2字符串写入 adc dat中,然后将写指针回到文件开头,然后写入 s1字符串,那么s1字符串就将前 5个字符覆盖,所以最终结果为 Chinang, B选项正确。 【知识模块】 文件 25 【正确答案】 C 【试题解析】 本题考查文件操作函数: fprintf()函数。 fprintf()函数向文件输出,将输出的内容输出到硬盘上的文件 ,或是相当于在文件的设备上执行两次 fprintf后,文件中有 abe28,所以 C选项正确。 【知识模块】 文件 26 【正确答案】 C 【试题解析】 本题考查文件的定位。 feof函数的用法是从输入流读取数据,如果到达文件末尾 (遇文件结束符 ), eof函数值为非零值,否则为 0,所以 C选项正确。 【知识模块】 文件