1、国家二级 C语言(结构体和共用体、文件)机试模拟试卷 1及答案解析(总分:54.00,做题时间:90 分钟)一、选择题(总题数:27,分数:54.00)1.若有语句 typedef struet Sint g;char h;T;,则下列叙述中正确的是( )。(分数:2.00)A.可用 S定义结构体变量B.可用 T定义结构体变量C.S是 struct类型的变量D.T是 struet S类型的变量2.设有语句 typedef struet Trchar c;int a4;CIN;,则下列叙述中正确的是( )。(分数:2.00)A.CIN是 struct TT类型的变量B.TT是 struct类型的
2、变量C.可以用 TT定义结构体变量D.可以用 CIN定义结构体变量3.下列叙述中错误的是( )。(分数:2.00)A.可以用 typedef将已存在的类型用一个新的名字来代表B.可以通过 typedef增加新的类型C.用 typedef定义新的类型名后,原有类型名仍有效D.用 typedef可以为各种类型起别名,但不能为变量起别名4.有以下程序: #include main() struet STU char name9; char sex: double score2; ;struct STU a=“Zhao”,m,850,900,b=“Qian“,f,950,920; b=a: prinf
3、f(“s,c,20f,20fn”,bname,bsex,bscore0,b8core1); 程序的运行结果是( )。(分数:2.00)A.Qian,m,85,90B.Zhao,m,85,90C.Zhao,f,95,92D.Qian,f,95,925.下列结构体类型说明和变量定义中正确的是( )。(分数:2.00)A.struct REC; int n;char C; REC t1,t2;B.typedef struct int n;char c;REC; REC t1,t2;C.typedef struct REC; int n=0;char c=A;t1,12;D.struct int n;
4、char c:REC; REC t1,t2;6.下列结构体的定义语句中错误的是( )。(分数:2.00)A.stmct ordint x;int y;int z;struct ord a;B.struct ordint x;int y;int z;struct ord a;C.struct ordint x;int y;int z;a;D.structint x;int y;int z;a;7.设有定义: struct complex int real,unreal; datal=1,8,data2;则下列赋值语句中错误的是( )。(分数:2.00)A.data2=(2,6);B.data2=
5、datal;C.data2real=datalreal;D.data2real=datalunreal;8.有以下程序: #include int a; char b10; double c; ; stmct A f(stmct A t); main() stmct A a=1001,“ZhangDa”,10980; a=f(a); prinff(“d,s,61fn”,aa,ab,ae); struct A f(stmct A t) ta=1002; strcpy(tb,“ChangRong”); tc=12020;return t; 程序的运行结果是( )。(分数:2.00)A.1002,Z
6、hangDa,12020B.1002,ChangRong,12020C.1001,ChangRong,10980D.1001,ZhangDa,109809.有以下程序: struct stint x;int*y;*pt; int a=1,2,b=3,4; struct st e12=10,a,20,b;以下选项中表达式值为 11的是( )。(分数:2.00)A.+ptxB.pt一xC.*pt一yD.(pt+)一x10.有以下定义和语句: int Rum; char name20;char c; struct int day; int month; int year; s; ; stmct wo
7、rkers w,*pw; pw=&w:能给 w中 year成员赋 1980的语句是( )。(分数:2.00)A.pw一year=1980;B.wyear=1980;C.wsyear=1980;D.*pwyear=1980;11.有以下程序: #include struct ttint x;struct *y;*P; struct tt a4=20,a+1,15,a+2,30,a+3,17,a; main() int i; p=a: for(i=1;ix); P=P 一y: 程序的运行结果是( )。(分数:2.00)A.20,30,B.30,17C.15,30,D.20,15,12.设有定义:s
8、tructchar mark12;int numl;double num2;t1,t2;,若变量均已正确赋初值,则下列语句中错误的是( )。(分数:2.00)A.t1=t2;B.t2numl=t1,num1;C.t2mark=t1mark;D.t2num2=t1hum2;13.有以下程序: #include struct S int a,b; data2=10,100,20,200; main() struct S P=data1; prinff(“dn”,+(Pa); 程序的运行结果是( )。(分数:2.00)A.10B.11C.20D.2114.有以下结构体说明、变量定义和赋值语句:str
9、uct STDchar name10;int age;char sex;$5,*ps;ps=&s0;则下列 scanf函数调用语句有错误的是( )。(分数:2.00)A.scanf(“s”,s0name);B.scant(“d”,&s0age);C.scanf(“c”,&(ps 一sex);D.scanf(“d”,ps 一age);15.有以下程序:#includestdiohtypedef structint b,P;A;void f(AC)*注意:c 是结构变量名* int j; cb+=1; cP+=2:main() int i; A a=1,2; f(a); prinff(“d,dn”
10、,ab,aP);程序的运行结果是( )。(分数:2.00)A.2,4B.1,2C.1,4D.2,316.有以下程序: #include struet S int n;int a20; void f(8truer S*p) int i,j,t; fbr(i=0;in 一 1;i+) flor(j=i+1;jn;j+) if(P 一aiP 一aj) t=P 一ai; P 一ai=P一aj; P 一aj=t; main() int i; struet S s=10,2,3,1,6,8,7,5,4,10,9;f(&s); for(i=0;iA.2,3,1,6,8,7,5,4,10,9,B.10,9,8
11、,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,17.程序中已构成如下不带头节点的单向链表结构,指针变量 s、P、q 均已正确定义,并用于指向链表节点,指针变量 s总是作为指针指向链表的第一个节点。 (分数:2.00)A.删除尾节点B.尾节点成为首节点C.删除首节点D.首节点成为尾节点18.假定已建立以下链表结构,且指针 P和 q已指向如图所示的节点。 (分数:2.00)A.P一next=q 一next;free(q);B.p=q一next;free(q);C.P=q;free(q);D.(*P)next=(*q)nex
12、t;free(P);19.下列关于 C语言文件的叙述中正确的是( )。(分数:2.00)A.文件由一系列数据依次排列组成,只能构成二进制文件B.文件由结构序列组成,可以构成二进制文件或文本文件C.文件由数据序列组成,可以构成二进制文件或文本文件D.文件由字符序列组成,其类型只能是文本文件20.下列关于 C语言文件的叙述中正确的是( )。(分数:2.00)A.当对文件的读(写)操作完成之后,必须将它关闭,否则可能导致数据丢失B.打开一个已存在的文件并进行写操作后,原有文件中的全部数据必定被覆盖C.在一个程序中对文件进行写操作后,必须先关闭该文件然后再打开才能读到第一个数据D.C语言中的文件是流式
13、文件,因此只能顺序存取数据21.有以下程序: #include main() FILE*fp;int a10=1,2,3,i,n; fp=fopen(“d1dat”,”W”); for(i=0;iA.321B.12300C.1D.12322.设文件指针 fp已定义,执行语句 fp=fopen(“file”,“W”);后,下列针对文本文件 file操作叙述的选项中正确的是( )。(分数:2.00)A.只能写不能读B.写操作结束后可以从头开始读C.可以在原有内容后追加写D.可以随意读和写23.有以下程序: #include main() FILE*f: f=fopen(“fileatxt”,“w”
14、); fprinff(f,“abc”); fclose(f); 若文本文件 fileatxt 中原有内容为 hello,则运行以上程序后,文件 filea,txt 中的内容为( )。(分数:2.00)A.abcloB.abcC.helloabcD.anchelle24.读取二进制文件的函数调用形式为:fread(buffer,size,count,fp);,其中 buffer代表的是( )。(分数:2.00)A.一个内存块的字节数B.一个整型变量,代表待读取的数据的字节数C.一个文件指针,指向待读取的文件D.一个内存块的首地址,代表读人数据存放的地址25.有以下程序: #includestdi
15、oh main() FILE* pf; char*s1=“China”,*s2=“Beijing”;pf=fopen(“abedat”,“wb+”); fwrite(s2,7,1,pf); rewind(pf);*文件位置指针回到文件开头* fwrite(s1,5,1,pf); fclose(pf); 程序执行后,abedat 文件的内容是( )。(分数:2.00)A.ChinaB.ChinangC.ChinaBeijingD.BeijingChina26.有以下程序: #include main() FILE* fp;char str10; fp=fopen(”myfiledat”,“w”)
16、;fputs(“abe”,fp); fclose(fp); fp=fopen(“myfiledat”,“a+”); fprintf(fp,“d”,28); rewind(fp); fscanf(fp,“s”,str); puts(str); fclose(fp); 程序的运行结果是( )。(分数:2.00)A.abeB.28cC.abc28D.因类型不一致而出错27.设 fp为指向某二进制文件的指针,且已读到此文件末尾,则函数 feof(fp)的返回值为( )。(分数:2.00)A.0B.0C.非 0值D.NULL国家二级 C语言(结构体和共用体、文件)机试模拟试卷 1答案解析(总分:54.0
17、0,做题时间:90 分钟)一、选择题(总题数:27,分数:54.00)1.若有语句 typedef struet Sint g;char h;T;,则下列叙述中正确的是( )。(分数:2.00)A.可用 S定义结构体变量B.可用 T定义结构体变量 C.S是 struct类型的变量D.T是 struet S类型的变量解析:解析:本题考查 typedef重新声明一种结构体类型。那么 T为结构体类型,而不是结构体变量,所以 B选项正确。2.设有语句 typedef struet Trchar c;int a4;CIN;,则下列叙述中正确的是( )。(分数:2.00)A.CIN是 struct TT类
18、型的变量B.TT是 struct类型的变量C.可以用 TT定义结构体变量D.可以用 CIN定义结构体变量 解析:解析:本题考查 typedef重新声明一种结构体类型。其中 CIN为结构体类型名,而不是结构体变量,所以 D选项正确。3.下列叙述中错误的是( )。(分数:2.00)A.可以用 typedef将已存在的类型用一个新的名字来代表B.可以通过 typedef增加新的类型 C.用 typedef定义新的类型名后,原有类型名仍有效D.用 typedef可以为各种类型起别名,但不能为变量起别名解析:解析:本题考查 typedef的用法。typedef 并不是增加一种新的类型,而是对已存在的类型
19、用一个新的名字来代表,所以 B选项错误。4.有以下程序: #include main() struet STU char name9; char sex: double score2; ;struct STU a=“Zhao”,m,850,900,b=“Qian“,f,950,920; b=a: prinff(“s,c,20f,20fn”,bname,bsex,bscore0,b8core1); 程序的运行结果是( )。(分数:2.00)A.Qian,m,85,90B.Zhao,m,85,90 C.Zhao,f,95,92D.Qian,f,95,92解析:解析:本题考查结构体初始化操作。本题中
20、可以直接将结构体 a赋值给 b,所以输出的结果和 a一样,B 选项正确。5.下列结构体类型说明和变量定义中正确的是( )。(分数:2.00)A.struct REC; int n;char C; REC t1,t2;B.typedef struct int n;char c;REC; REC t1,t2; C.typedef struct REC; int n=0;char c=A;t1,12;D.struct int n;char c:REC; REC t1,t2;解析:解析:本题考查结构体的相关知识。选项 A中 struct REC后面不能有分号,C 选项中 typedef struct
21、REC的后面也不能有分号,选项 D中 REC已经是结构体变量,不能当作结构体类型来使用。6.下列结构体的定义语句中错误的是( )。(分数:2.00)A.stmct ordint x;int y;int z;struct ord a; B.struct ordint x;int y;int z;struct ord a;C.struct ordint x;int y;int z;a;D.structint x;int y;int z;a;解析:解析:A 选项错误,不能在定义结构体的同时,又用结构体类型名定义变量,应该写成 B选项或者D选项的格式。7.设有定义: struct complex in
22、t real,unreal; datal=1,8,data2;则下列赋值语句中错误的是( )。(分数:2.00)A.data2=(2,6); B.data2=datal;C.data2real=datalreal;D.data2real=datalunreal;解析:解析:A 选项中可以在声明变量的同时为 data2赋值,但是 data2=(2,6);应写作 data2=2,6;,所以选择 A选项。8.有以下程序: #include int a; char b10; double c; ; stmct A f(stmct A t); main() stmct A a=1001,“ZhangDa
23、”,10980; a=f(a); prinff(“d,s,61fn”,aa,ab,ae); struct A f(stmct A t) ta=1002; strcpy(tb,“ChangRong”); tc=12020;return t; 程序的运行结果是( )。(分数:2.00)A.1002,ZhangDa,12020B.1002,ChangRong,12020 C.1001,ChangRong,10980D.1001,ZhangDa,10980解析:解析:本题考查结构体变量的引用以及作为函数参数。题目虽然看似复杂,其实比较容易。f 函数的参数是结构体变量,然后对参数重新赋值并返回,所以选择
24、 B选项。9.有以下程序: struct stint x;int*y;*pt; int a=1,2,b=3,4; struct st e12=10,a,20,b;以下选项中表达式值为 11的是( )。(分数:2.00)A.+ptx B.pt一xC.*pt一yD.(pt+)一x解析:解析:本题考查结构体数组初始化以及结构体变量的引用。题目中定义了一个结构体数组 c并初始化,指针 pt指向 c的第一个元素,那么 pt一x 为 10,+pt 一x 为 11,*pt 一y 为 1,(pt+)一x 为20,所以选择 A选项。10.有以下定义和语句: int Rum; char name20;char c
25、; struct int day; int month; int year; s; ; stmct workers w,*pw; pw=&w:能给 w中 year成员赋 1980的语句是( )。(分数:2.00)A.pw一year=1980;B.wyear=1980;C.wsyear=1980; D.*pwyear=1980;解析:解析:木题考查结构体变量的引用。题目中定义了一个结构体,其中结构休中的变量又是一个结构体,w 为外层结构体,如果给内层结构体赋值,先要得到内层结构体变量,即 ws,若要给 year赋值,表示为 wsyear 即可,选项 C正确。11.有以下程序: #include
26、struct ttint x;struct *y;*P; struct tt a4=20,a+1,15,a+2,30,a+3,17,a; main() int i; p=a: for(i=1;ix); P=P 一y: 程序的运行结果是( )。(分数:2.00)A.20,30,B.30,17C.15,30,D.20,15, 解析:解析:本题考查结构体变量的引用以及结构体数组。p 指向 a数组的第一个元素,所以 p一x 为20,然后 p=p一y 后,p 指向数组 a的第二个元素,所以输出 15,选项 D正确。12.设有定义:structchar mark12;int numl;double num
27、2;t1,t2;,若变量均已正确赋初值,则下列语句中错误的是( )。(分数:2.00)A.t1=t2;B.t2numl=t1,num1;C.t2mark=t1mark; D.t2num2=t1hum2;解析:解析:本题考查结构体变量的引用。C 选项中 mark为结构体中的数组,不能直接赋值,所以 C选项错误。13.有以下程序: #include struct S int a,b; data2=10,100,20,200; main() struct S P=data1; prinff(“dn”,+(Pa); 程序的运行结果是( )。(分数:2.00)A.10B.11C.20D.21 解析:解析
28、:声明 data是结构 s数组,初始化data0a=10;data0b:100;data1a=20:data1b=200。主函数中 p=data1;即pa=data1a;pb=data1b;,执行语句 printf(“dn”,+(pa);,打印输出时,pa 先增 1再打印,pa=data1a=20,先增 1等于 21。14.有以下结构体说明、变量定义和赋值语句:struct STDchar name10;int age;char sex;$5,*ps;ps=&s0;则下列 scanf函数调用语句有错误的是( )。(分数:2.00)A.scanf(“s”,s0name);B.scant(“d”,
29、&s0age);C.scanf(“c”,&(ps 一sex);D.scanf(“d”,ps 一age); 解析:解析:本题考查结构体的相关知识。题目中需要输入一个变量,scanf 要求参数为指针,而 D选项中 ps一age 为一个变量,不是指针,所以错误。15.有以下程序:#includestdiohtypedef structint b,P;A;void f(AC)*注意:c 是结构变量名* int j; cb+=1; cP+=2:main() int i; A a=1,2; f(a); prinff(“d,dn”,ab,aP);程序的运行结果是( )。(分数:2.00)A.2,4B.1,2
30、 C.1,4D.2,3解析:解析:结构体变量可以作为函数的参数和返回值。作为函数的实参时,可以实现函数的传值调用。当使用结构体变量作为函数的形参时,实参也应该是结构体变量名,以实现传值调用,实参将副本给形参,在被调用函数中改变形参值对于调用函数中的实参没有影响,所以选择 B选项。16.有以下程序: #include struet S int n;int a20; void f(8truer S*p) int i,j,t; fbr(i=0;in 一 1;i+) flor(j=i+1;jn;j+) if(P 一aiP 一aj) t=P 一ai; P 一ai=P一aj; P 一aj=t; main(
31、) int i; struet S s=10,2,3,1,6,8,7,5,4,10,9;f(&s); for(i=0;iA.2,3,1,6,8,7,5,4,10,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,解析:解析:本题中子函数 f的功能是对结构体变量 s中第二个成员数组中的所有数据进行从小到大的冒泡排序,所以结果是 C选项。17.程序中已构成如下不带头节点的单向链表结构,指针变量 s、P、q 均已正确定义,并用于指向链表节点,指针变量 s总是作为指针指向链表的第一个节点。 (分数:2.00)
32、A.删除尾节点B.尾节点成为首节点C.删除首节点D.首节点成为尾节点 解析:解析:本题考查链表的操作。本题中首先是 s指向了它的下个节点,题目中说明了 s总是指向链表的第一个节点。然后 while循环找到链表的最后一个元素,最后一个元素指向了之前链表的头节点,之前头节点指向了空节点,所以本题实现的效果是使首节点成为尾节点,选项 D正确。18.假定已建立以下链表结构,且指针 P和 q已指向如图所示的节点。 (分数:2.00)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);
33、解析:解析:本题考查删除链表中的节点操作。其方法是将要删除节点的上个节点的下个节点指向要删除节点的下个节点,然后释放该要删除的节点,所以选项 A正确。19.下列关于 C语言文件的叙述中正确的是( )。(分数:2.00)A.文件由一系列数据依次排列组成,只能构成二进制文件B.文件由结构序列组成,可以构成二进制文件或文本文件C.文件由数据序列组成,可以构成二进制文件或文本文件 D.文件由字符序列组成,其类型只能是文本文件解析:解析:本题考查文件的概念。文件由数据序列组成,可以构成二进制文件或文本文件,所以答案为C选项。20.下列关于 C语言文件的叙述中正确的是( )。(分数:2.00)A.当对文件
34、的读(写)操作完成之后,必须将它关闭,否则可能导致数据丢失 B.打开一个已存在的文件并进行写操作后,原有文件中的全部数据必定被覆盖C.在一个程序中对文件进行写操作后,必须先关闭该文件然后再打开才能读到第一个数据D.C语言中的文件是流式文件,因此只能顺序存取数据解析:解析:B 选项中打开一个已存在的文件并进行写操作后,原有文件中的全部数据不一定被覆盖,也可以对源文件进行追加操作等。C 选项中在一个程序中对文件进行写操作后,不是先关闭该文件然后再打开才能读到第一个数据,用 fseek()函数进行重新定位即可。D 选项中,C 语言中的文件可以进行随机读写。21.有以下程序: #include mai
35、n() FILE*fp;int a10=1,2,3,i,n; fp=fopen(“d1dat”,”W”); for(i=0;iA.321B.12300C.1D.123 解析:解析:程序首先将数组 a10中的元素 1、2、3 分别写入了文件 d1dat 文件中,然后又将d1dat 文件中的数据 123整体写到变量 n的空间中,所以打印 n时输出的数据为 123。22.设文件指针 fp已定义,执行语句 fp=fopen(“file”,“W”);后,下列针对文本文件 file操作叙述的选项中正确的是( )。(分数:2.00)A.只能写不能读 B.写操作结束后可以从头开始读C.可以在原有内容后追加写D
36、.可以随意读和写解析:解析:考查文件操作函数 fopen的基础知识。以 w方式打开文件时只能写不能读。23.有以下程序: #include main() FILE*f: f=fopen(“fileatxt”,“w”); fprinff(f,“abc”); fclose(f); 若文本文件 fileatxt 中原有内容为 hello,则运行以上程序后,文件 filea,txt 中的内容为( )。(分数:2.00)A.abcloB.abc C.helloabcD.anchelle解析:解析:本题考查文件操作函数。执行 fprintf(f,“abc”);后,f 文件的内容就变为了 abc,所以 B选
37、项正确。24.读取二进制文件的函数调用形式为:fread(buffer,size,count,fp);,其中 buffer代表的是( )。(分数:2.00)A.一个内存块的字节数B.一个整型变量,代表待读取的数据的字节数C.一个文件指针,指向待读取的文件D.一个内存块的首地址,代表读人数据存放的地址 解析:解析:fread(void 术 buffer,size t size,size t count,FILE* stream)的功能是从一个文件流中读数据,读取 count个元素,每个元素 size字节,如果调用成功,返回 count。buffer 用于接收数据的内存地址,大小至少是 size*
38、count字节;size 是单个元素的大小,单位是字节;count 是元素的个数,每个元素是 size字节;stream 是输入流。25.有以下程序: #includestdioh main() FILE* pf; char*s1=“China”,*s2=“Beijing”;pf=fopen(“abedat”,“wb+”); fwrite(s2,7,1,pf); rewind(pf);*文件位置指针回到文件开头* fwrite(s1,5,1,pf); fclose(pf); 程序执行后,abedat 文件的内容是( )。(分数:2.00)A.ChinaB.Chinang C.ChinaBeij
39、ingD.BeijingChina解析:解析:本题考查文件操作函数:fwrite 和 rewind函数。题目中先是将 s2字符串写入 adcdat 中,然后将写指针回到文件开头,然后写入 s1字符串,那么 s1字符串就将前 5个字符覆盖,所以最终结果为chinang,B 选项正确。26.有以下程序: #include main() FILE* fp;char str10; fp=fopen(”myfiledat”,“w”);fputs(“abe”,fp); fclose(fp); fp=fopen(“myfiledat”,“a+”); fprintf(fp,“d”,28); rewind(fp
40、); fscanf(fp,“s”,str); puts(str); fclose(fp); 程序的运行结果是( )。(分数:2.00)A.abeB.28cC.abc28 D.因类型不一致而出错解析:解析:本题考查文件操作函数:fprintf()函数。fprintf()函数向文件输出,将输出的内容输出到硬盘上的文件,或是相当于在文件的设备上执行两次 fprintf后,文件中有 abc28,所以 C选项正确。27.设 fp为指向某二进制文件的指针,且已读到此文件末尾,则函数 feof(fp)的返回值为( )。(分数:2.00)A.0B.0C.非 0值 D.NULL解析:解析:本题考查文件的定位。feof 函数的用法是从输人流读取数据,如果到达文件末尾(遇文件结束符),eof 函数值为非零值,否则为 0,所以 C选项正确。