国家二级C语言机试(结构体、共用体、位运算及文件操作)模拟试卷1_第1页
国家二级C语言机试(结构体、共用体、位运算及文件操作)模拟试卷1_第2页
国家二级C语言机试(结构体、共用体、位运算及文件操作)模拟试卷1_第3页
国家二级C语言机试(结构体、共用体、位运算及文件操作)模拟试卷1_第4页
国家二级C语言机试(结构体、共用体、位运算及文件操作)模拟试卷1_第5页
已阅读5页,还剩53页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

国家二级C语言机试(结构体、共用

体、位运算及文件操作)模拟试卷第1

一、选择题(本题共36题,每题1.0分,共36分。)

1、以下关于typedef的叙述错误的是

A、typcdef只是将已存在的类型用一个新的名字来代表

B、用typedef可以为各种类型说明一个新名,但不能用来为变量说明一个新名

C、用typedef可以增加新类型

D、用typcdcf为类型说明一个新名,通常可以增加程序的可读性

标准答案:C

知识点解析:C语言允许用typedef说明一种新的类型名,莫一般形式为:typedef

类型名标识符;在此“类型名”必须是在此语句之前已有定义的类型标识符。“标识

符''是一个用户定义标识符,用作新的类型名。Typedef语句的作用仅仅是用“标识

符''来代表己存在的“类型名”,并未产生新的数据类型,原来的类型名依然有效,

这样可以增加程序的可读性。

2、以下叙述中错误的是

A、可以用typedef将己存在的类型用一个新的名字来代表

B、可以通过typcdcf增加新的类型

C、用lypedef定义新的类型名后,原有类型名仍有效

D、用typedef可以为各种类型起别名,但不能为变量起别名

标准答案:B

知识点解析:C语言允许用lypedef说明一种新类型名。typedef类型名标识符:其

中“类型名”必须是在此语句之前已定义的类型标识符:“标识符”是一个用户定义标

识符,用作新的类型名:typcdcf语句的作用仅仅是用“标识符”来代表已存在的“类

型名“,并未产生新的数据类型,原有类型名依然有效。

若有定义typedefchaiT[10];Tea;上述定义中a的类型与下面选项中完全相同

的是

A、char(+a)[10];

B、char*a;

C、chara[I0J;

D、char*a[10];

标准答案:D

知识点解析:题目中利用lypedef定义了字符数组类型T,而后定义了该类型的指

针a,因此a为指针数组。

4、以下叙述中正确的是

A、使用typedef说明新类型名时,其格式是:typedef新类型名原类型名;

B、使用typedef说明新类型名时,后面不能加分号

C、在程序中,允许用typedef来说明一种新的类型名

D、在使用typedef改变原类型的名称后,只能使用新的类型名

标准答案:C

知识点解析:C语言允许用typedef说明一种新类型名。定义形式如下:typedef类

型名标识符;其中“类型名”必须是在此语句之前已定义的类型标识符;“标识符''是

一个用户定义标识符,用作新的类型名;typedef语句的作用仅仅是用“标识符”来

代表已存在的“类型名”,并未产生新的数据类型,原有类型名依然有效。

5、有以下程序#includeVstdio.h>typedefstmct{intb,p;)A;voidf(Ac)/*注意:

C是结构变量名*/{intj;c.b+=l;c.p+=2;}main(){i;Aa={l,2);f(a);

printfC%d,%d\n”,a.b,a.p);)程序运行后的输出结果是

A、274

B、1,2

C、I,4

D、2,3

标准答案:B

知识点解析:在C语言中,数据只能从文参单向传递给形参,称为“按值“传递。

也就是说,当简单变量作为实参时,用户不可能在函数中改变对应实参的值。所以

本题中在main()函数f(a)语句中结构体实参a作为值,传递给函数f(AC中的形参

c;这种值传递的方式不会对实参a产生任何影响,所以结构体实参a的值不会发

生变化。

6、设有定义:structcomplex(intreal,unreal:)datal=(1,8),data2;则以下赋值

语句中错误的是

A、data2=(2,6);

B、data2=datal:

C、data2.real=data1.real;

D、data2.real=daM.unreal:

标准答案:A

知识点解析:本题主要考查结构体变量的定义与初始化。题目中定义了complex类

犁的结构体变量datal和data2,并对datal进行了初始化。可以用一个结构体变量

对另一个结构体变量赋值,用一个结构体变量的成员对另一个结构体变量的成员赋

值。

7、有以下程序#includeVstdio.h>#include<string.h>

typedefstruct(charname[9]:charsex:intscore[2];}STU;STUfSTUa)

{STUb={,,Zhao,\'m',85,90);inti;slrcpy(a.name,b.name);

a.sex=b.sex;for(i=0:i<2;i++)a.score[i]-b.score[i];returna:}main()

{STUc={''Qian'','f,95192),d:d=f(c);printf'%s,%c,%d,%d,“,

d.name,d.sex,d。score[0],d.score|1]);printf("%s,%c,%d,%d,”,

c.name,C.sex,C.score[0],C.score[l]);}

A、Zhao,m,85,90,Zhao,m,85,90

B、Qian,f,95,92,Qian,f,95,92

C、Zhao»m,85,90,Qian,f,95,92

D、Qian,f,95,92,Zhao,m,85,90

标准答案:c

知识点.析:在C语言中,函数实参与形参之间数据的传递是传值,也就是说在

用实参调用形参时,是任实参的值拷贝i份给形参,而实参的值并不变化,仍是原

来的值。所以对于本题来说,在主函数中调f(e)后,实参e的值并不会变化,仍是

原值。在函数f中把局部变量b的值依次返回给变量d。

8、有以下结构体说明、变量定义和赋值语句slructSTD{chamame[10|;inlage;

charsex;}s[5],*ps;ps=&s[OJ;则以下scanf函数调用语句有错误的是

A、scanf''%d't,&s[0].age);

B、scanf&(ps->sex));

C、scanfP'%s'',s[0].name);

D、scanfP'%dt3ps->age);

标准答案:D

知识点解析:程序段定义了结构体变量数组s[5]和指针变量ps,然后ps指向数组

s[5]中的第一个元素,因而ps->age引用s[0].age,因为在输入scan()函数中,第

2个参数应该表示为地址变量,而选项A表示的值,而不是一个地址值。

9、有以下程序#}includeVstdio.h>#include<string.h>StructA{inta;

charb[IO]:doublec:):structAf(striictAt):main()

{structAa={1001/,ZhangDa,,,1098.0);a=f(a);printf(''%d,%s,%6.

a.a,a.b,a.c);}structAfStructAt){t.a=1002:strcpy(t.b,"ChangRong");

t.C=1202.0;returnt;}程序运行后的输出结果是

A、1002,ZhangDa,1202.0

B、1002,ChangRong,1202.0

C>1001,ChangRong,1098.0

D、1001,ZhangDa,1098.0

标准答案:B

知识点解析:在主函数中定义结构体A的变量a,并对其赋初值,再调用函数

f(a),在函数f(a)中对结构体变量a的各个成员重新进行了赋值操作,并把其值返

回在屏幕上输出。

10、有以下程序#inchideslructord{intx,y;)dt[2]={1,2,3,4);

main(){structord*p=dt;printf'%d,",++(p->x));printf("%d\n”,++(p->y));)程

序运行后的输出结果是

A、4,1

B、2,3

C、3,4

D、1,2

标准答案:B

知识点解析:在题目中定义了结构体。rd类型的数组变量dt,并对其赋初值。在程

序中定义了指向结构体ord类型的指针变量p,并且它指向变量数组dl的第一个元

素出[0],所以此时成员变量p->x的值等于1,成员变量p->y的值等于2,在输

出时分别加1,所以输巴结果为选项B。

11、有下列程序:struclS{intn;inta[20];);voidflint*a,intn){inti;for(i=0;i<

n-1;i++)a[i]+:i;)main()(inti;structSs={10,{2,3,1,6,8,7,5,4,10,

9));f(s.a,s.n);for(i=0;i<s.n;i++)printW"%d,”,s.a|i]);)程序运行

后的输出结果是

A、3,4,2,7,9,8,6,5,11,10,

B、2,3,1,6,8,7,5,4,10,9,

C、2,4,3,9,12,12,11,11,18,9,

D、1,2,3,6,8,7,5,4,10,9

标准答案:C

知识点解析:voidf(int*a,intn)函数的功能是对数组叫的每一个元素加上其下标的

值。所以在main()函数中f(s.as.n)语句会调用intn)函数,此时指针a指

向数组s.a={2,3,I,6,8,7,5,4,10,9),n=10:然后执行for(i=0;i<

n.1;i++)a[i]+=i;语句,也就是从0开始到8对数组s.a={2,3,1,6,8,7,

5,4,10,9}中的每一个元素加上其下标值。

12、假定已建立以下链表结构,且指针p和q已指向如图所示的节点:

datanext

则以下选项中可将q所指节点从链

表中删除并释放该节点的语句组是

A、p=q->next;free(q);

B、p=:q;free(q);

C、(*p).next=(*q).next:free(p);

D、p->next=q—>next;frcc(q);

标准答案:D

知识点解析:本题考查了在线性链表删除一个节点的方法,要删除q所指向的节

点,只需要把q所指向的节点的前一个节点中的后继指针指向q所指向的节点的下

一个节点即可,即p->next二q->next=再释放q所指向的节点,即free(q)。

13、有以下定义和语句:structworkers{intnum;chamame[20];chare;struct

{intday;intmonth:intyear:)s;);structworkersw,*pw;pw=&w:能给W中

year成员赋1980的语石是

A、w.yea―1980;

B、pw->year=1980:

C^w.S.year=1980;

D、*pw.year=1980;

标准答案:C

知识点解析:本题主要考查的是结构体变量的嵌套定义,也就是说一个结构体变量

也可以是一个结构体。在本题中works这个结构体中包含了结构体s。所以对结构

体变量w中year成员的引用是w.s.year。

14^有以卜程序#includc〈stdio.h>#includc''string.h’‘

lypedefstruct{charname[9];charsex;floatscore[2];|STU;voidf(STUa)

{STUb={,,Zhao,,,,m\85.0,90.0);inti:strcpy(a.name,b.name);

a.sex=b.sex;for(i=0;i<2;i++)a.score[i]=b.score|i];|程序的运行结果是

A、Qian,m,85,90

B、Zhao,m,85,90

C、Zhao,f,95,92

D、Qian,f,95,92

标准答案:B

知识点解析:本题考查在结构体中函数的实参和形参的传递,调用ffcl后,实参

传向形参,进行f()函数功能的实现,但程序中没有返回语句,故形参不能将值传

回实参,它们值的传递具有不可逆性,所与printf输出的还是c中实参的值。

15、有以下程序structA{inta;charb[10J;doublec;);voidf(structAt);

,,,

main(){structAao{1001,ZhangDa\1098.0);ffa);prinlff'%%%s,%

6.a.a,a.b,a.c):)voidf(structAt){t.a=1002:

strcpy(t.b,"ChangRong");t.c=1202.0;)程序运行后的输出结果是

A、1002,ChangRong,1202.0

B、1001,ZhangDa,1098.0

C、1001,ChangRong,1098.0

D、1002,ZhangDa,1202.0

标准答案:B-

知识点解析:在主函数中定义结构体A的变量a,并对其赋初值,再调用函数

f(a),形参t接收实参的数据,在函数f⑴中对结构体变量t的各个成员进行了赋值

操作,需要注意的,形参和实参之间是数据传递,因此对形参的操作对实参不产生

影响,因此在主函数输出仍然输出变量a的数据

16、若有以下程序lypedefstructstu{char*name,gender;intscore;)STU;

voidf(char*p){p=(char*)inalloc(10);strcpy(p,“Qian");)

main(){STUa二fNULL,'m',290),b;a.name=(char*)malloc(10);

strcpy(a.name,''Zhao'');b=a=f(b.name);b.gender=T:b.score=350:

primf(''%s,%c,%d,a.name,a.gender,a.score);printf(''%s,%c,%

dha”,b.name,b.gender,b.score);)则程序的输出结果是

A、Zhao,m,290,Qian,f,350

B、Qian,f,350,Qian,f,350

C、Qian,m,290,Qian,f,350

D、Zhao,m,290,Zhao,f,350

标准答案:D

知识点解析:函数f(char*p)的主要功能申请字符串的存储空间,然后存入字符串

“Qian”,但当程序调用结束以后,形参指针变量p撤销,存储的字符串地址丢失,

而不能更改实参指针的值。主函数中结构体变量定义同时赋初值,初始情况其

name指针成员存储空,而后语句为其分配存储空间,存入字符串,,zhao1执行

b=a;语句后,b的数据和a的数据相同,调用函数f以后,b的name成员的值没

变。

17、若有以卜程序typedefslructstu{charname[10],gender;intscore;)STU;

voidf(char*P){strcpy(P,''Qian'');}main(){STUa={,,Zhao,\'m',290},b;

b=a;f(b.name);b.gendcr=,f;b.score=350;printf(''%s,%c,%d,

a.name,a.gender,a.score);printfi(''%s,%c,b.name,

b.gender,b.score);}则程序的输出结果是

A、Zhao,m,290,Zhao,m,290

B、Qian,f,350,Qian,f350

C、Zhao,m,290,Qian,f,35O

D^Zhao,m,290,Zhao,C350

标准答案:C

知识点解析:主函数中结构体变量定义同时赋初值。执行b=a;语句后,b的数据

和a的数据相同,调用函数f(b-name),形参指针p接收实参b.name的地址,此

时p和b.name指向同一个存储空间,流程转到f执行,p指向的存储空间存放字

符串"oianH流程结束返回主函数。主函数中变量b的其他成员存放数据。因此a

的数据{"zhao",290),b的数据为厂QJan”,f,350}。注意本题结构为

STU类型变量a和b中的name成员为数组,不是指针,它具有白己的存储空间。

18、若有以下程序段struct$t{intn;structst*next;);structsta[3]={5,&a[l],7,

&a[2],9,3(T},*p:p=&a[0]:则以下选项中值为6的表达式是

A、++(p->n)

B、(*p).n

C^p->n++

D、p->n

标准答案:A

知识点解析:选项A中表达式++(p->n)为前缀自加表达式,p->n和a[0].n等

价,其他为5,前缀自加后值为6。选项B中表达式(*可.n和选项D的表达式

p.>n含义相同,表示取结构指针p所指向的成员,因此值为5。选项C中表达

式p->n++为后缀白加表达式,相当于(p->n)++,表达式值为5。

19、以下叙述中正确的是

A、结构体类型中的各个成分均不能是数组或指针

B、结构体类型的变量,不能在声明结构体类型组成时一起定义

C、使用typcdef定义新类型名后,新类型名与原类型名实际上是等价的

D、元素为结构体类型的数组,只能在声明过结构体类型之后,单独进行定义

标准答案:C

知识点解析:C语言允许用typcdef说明一种新类型名,typcdct语句的作用仪仪是

用“标识符”来代表已存在的“类型名”,并未产生新的数据类型,原有类型名依然有

效。结构体变量定义有下而三种形式:(1)先定义结构,冉说明结构变量。(2)在定

义结构类型的同时说明结构变量。(3)直接说明结构变量。

20、以下叙述中正确的是

A、结构体变量的地址不能作为实参传给函数

B、结构体数组名不能作为实参传给函数

C、即使是同类型的结构体变量,也不能进行整体赋值

D、结构体中可以含有指向木结构体的指针成员

标准答案:D

知识点解析:一个结构体变量包含若干成员,这些成员可以是数值类型、字符类

型、数组类犁,也可以是指针类型,甚至可以是正存定义的结构体类型指针。用结

构体变量作实参时,采取的是''值传递''的方式,将结构体变量所占的内存单元的内

容全部顺序传递给形参。形参也必须是同类犁的结构体变量。结构体小数组作为参

数时,采取了“地址传递”的方式,形参须为同类型的结构指针或者形态结构数组。

21>有以下程序structS{inta;intb;);main(){structSa,*p=&a;a.a=99;

prinlfC%d\n",——卜}程序要求输出结构体中成员a的数据,以下不能填入横线

处的内容是

A、a.a

B、*p.a

C^p->a

D、(*p).a

标准答案:B

知识点解析:如果D指向结构体,那么下面三种形式都可以访问结构体的成员:

结构体变量.成员名、(*p).成员名、p->成员名。

22、有以下程序#include<stdio.h>structSTU{charname[9];charsex;

,,,,,

intscore[2]:voidf(structSTUa[]){structSTUb={zhao;m,85,90);a[l]=

b;}main(){structSTUc[2]={{t'Qian'','r,95,92),{.Sun",,m',98,99}};

f(c);printf(''%s,%c,%d,%d,",c[0].name,c[01.sex,c[0].scorefO],

c|0|.score[1]);printff'%s,%c,%d,%d\n,",c[1].name,c|1].sex,

c[l].score[0],c[l].score[l]);}程序运行后输出结果是

A、Qian,f,95,92,Sun,m,98,99

B、Zhao,m,85,90,Sun,m,98,99

C>Qian,f,95,92,Zhao,m,85,90

D、Zhao,m,85,90,Qian,f,95,92

标准答案:C

知识点解析:在主函数中,定义了结构体sTu数组c[2],并对其赋初始值。执行

f(C时,存函数f()中,把结构体变量b的值赋给了c[l]。

23、有以下程序main(){unsignedchara=2,b=4,c=5,d;d=aJb;d&=c;

printf『%d\n'd);)程序运行后的输出结果是

A、3

B、5

C、4

D、6

标准答案:C

知识点解析•:本题考查位运算,|为按位或运算,&为按位与运算,按位与(&)运算

符的作用是:把参加运算的两个运算数按对应的二进制位分别进行,'与"运算,当两

个相应的位都为1时,该位的结果为1;否则为0。按位或(1)的运算规则是:参加

运算的两个运算数中,只要两个相应的二进制位中一个为1,则该何的运算结果即

为1;只有当两个相应位的数都为。时,该位的运算结果才为0。首先d=2l4值为

6,d=6&5值为4。

24>有以下程序main(){inta=l,b=2,c=3»x;x=(aAb)&c;prints"%d\n’‘,

x);)程序的运行结果是

A、1

R、2

C、3

D、0

标准答案:C

知识点解析:1、2、3的二进制形式分别为00000001、00000010.0000001k首先

计算1与2的或运算,即「2=(00000001)"(00000010)=00000011,再将其与3进

行“与“运算,结果为(00000011)&(00000011)=00000011,即十进制数3。

25、有以下程序#includeVstdio.h>main(){chara=4;printf(''%dha'',a=a<<

1);)

A、8

B、16

C、40

D、4

标准答案:A

知识点解析:本题主要考查按位右移运算。a=4.的二进制为00000100,aVVl后

为00001000,其值为十进制数值8。

26>若变量已正确定义,则以下语句的输出结果是s=32;sA=32:printf(“%d,

s);

A、-1

B、1

C、32

D、0

标准答案:D

知识点解析:按位异或”运算的规则是:参与运算的两个运算数中相对应的二制位

上,若数相同,则该位的结果为0;若数不同,则该位的结果为1。因为语句

s=32;s,=32;相当于s与自身做按位异或运算,所以其结果等于0。

27、若有以下程序main(){inic;C=1315;pfintf("%d\nLc);}则程序的输出结

果是

A、15

B、18

C、13

D、5

标准答案:C

知识点解析:按位或(I)的运算规则是:参加运算的两个运算数中,只要两个相应的

二进制位中一个为1,则该位的运算结果即为1;只有当两个相应位的数都为O

时,该位的运算结果才为0。13的二进制位1101,5的二进制位0101,或运算的

结果为1101,因此值为13o

28、有以下程序main(){inti=l;i=iAi;printf(-%d\n'\1);}程序运行后的输出

结果是

A、-1

B、0

C、1

D、7

标准答案:B

知识点解析:按位异或(人)的运算规则是:参与运算的两个运算数中相对应的二进

制位上,若数相同,则该位的结果为0:若数不同,该位的结果为I。本题中表达

式内的值必为0,因为i的各个位置的二进制值相同。

29、下列关于C语言文件的叙述中正确的是

A、文件由结构序列组成,可以构成二进制文件或文本文件

B、文件由一系列数据依次排列组成,只能构成二进制文件

C、文件由数据序列组成,可以构成二进制文件或文本文件

D、文件由字符序列组成,其类型只能是文本文件

标准答案:C

知识点解析:在C语言中,对输入、输出的数据都按“数据流”的形式进行处理。

数据可以按文本形式或二进制形式存放在介质上,因此文件可以按数据的存放形式

分为文本文件和二进制文件。

30、有以下程序#inckideVstdio.h>main(){FILE*f;

,,,

f^fopenCfilea.fprintf(f;abc):fclose(f);}若文本文件filea.txt中

原有内容为:hello,则运行以上程序后,文件filea.ixi中的内容为

A、abclo

B>abc

C、helloabc

D、abchello

标准答案:B

知识点解析:本题考查文件打开办式。格式:文件指针名二fopen(文件名,使用文

文件使用方式意义

“rC只读打开一个文本文件,只允许读数据

“wt”只。打开或建立一个文△文件,只允许写数据

*at"出加打开一个文本文件,并在文件末年写歌据

“rb”只读打开一个二进制文件,只允许读数据

“wb”只写打开或建一个.进制文件,只允许写数据

-ab-追抑打开一个二进制文件,并在文件末尾写数据

读写打开一个文本文n,允许读和写

-wt+“该可打开或建》一个文本文件,允许次与

读写打开一个文本文件,允许读,或在文件末追

-at+w

加数据

"rb+”读号打开一个二进制文件,允许谈和写

读耳打开或建比一个二进制文仰.允注读和写

读写打开一个二进制文件,允许该,或在文件未

迫加数据

件方式)需要

注意的是:用“w”打开的文件只能向该文件写入。若打开的文件不存在,则以指定

的文件名建立该文件,若打开的文件已经存在,则将该文件删去,重建一个新文

件。

31、有下列程序:#include<stdio.h>main(){FILE*fp;inta[10]={1,2,3),i,

n;fp=fbpenCdl.dat","w");for(i=0;i<3;i++)fprintf^fp;,%d,\a[i]);

,,,

fprintf(fp/\n);fclose(fp);a=opcn(''dl.dat",O')fscanfi(fp,‘'%d'',&n);

fclose(fp);printf(,,%d\n,\n);)程序的运行结果是

A、12300

B、123

C、1

D、321

标准答案:B

知识点解析:本题考查以读和写的方式打开文件对文件内容操作的不同,

fp=fopen(4tdl.dat“,"w");以可写的方式为输出建立新文本文件,调用prinlf,输

出“123",fp=fbpen(,,dl,dat","产);以只读的方式打开文本文件,不能对文件内

容进行操作。

32、有以F程序#include<stdio.h>main(){FILE*pf;

char*sl=,,China,\*s2=,'Beijing'':pf=fbpen(''abc.dat",''wb+'>fwrite(s2,7,

1,pt);rcwind(pt);产又存位置指针回到文件开头刃fwntc(sl,5,1,pt);

fclose(pf);}以上程序执行后abc.dat文件的内容是

A、Chinang

B、China

C、ChinaBeijing

D、BeijingChina

标准答案:A

知识点解析:本题主考查函数fwrite的使用。函数fwrile的调用形式为:

intfwrite(char*pt,unsignedsize,unsignedn,FILE。fp);其功能是把pt所指向的n*size

个字节输出到fp所指文件中。在本题中fwritc(s2,7,1,pO;的功能是把字符

串“Beijing”输入到文件abc.dat中,然后调用rewind(pf),把文件位置指针回到文

件开头,再调用fwrite®,5,1,pD把字符串"China”写入到文件abc.dat中,所

以此时文件abc.dat的内容为Chinang。

33、有下列程序:#include<stdio.h>main(){FILE*fjp;inta[10]={1,2,3,0,

0),i;m=fbpen(''d2.dat",‘'wb'');fwtite(a,sizeof(int),5,fp);fwrite(a,

sizeof(int),5,fp);fclose(fp);a=fbpcn(''d2.dat'',''rb'');fread(a,sizeof(int),

,,,

10,fp);fclose(fp);for(i=0;i<10;i++)printf(%d\a[i]);}程序的运行结果

A、I,2,3,1,2,3,0,0,0,0,

B、1,2,3,0,0,1,2,3,0,0,

C、123,0,0,0,0,123,0,0,0,0,

D、1,2,3,0,0,0,0,0,0,0

标准答案:B

知识点解析:首先用函数fopen()以“wb”的方式开打文件”d2.dat”,然后调用两次

fwrite函数将数组a的5个元素,依次输出到文件fp中,共10个字节,关闭文

件。再次打开文件,使用文件指针指向文件的开头,调用fread函数从文件fp中读

取这10个字节的数据到数组a中,此时数组a的内容就变为{1,2,3,0,0,1,

2,3,0,0),最后的输出结果为“1,2,3,0,0,11,23,0,0”。

34、有以下程序程ncludeVstdio.h>main(){FILE*fp;charstr[10];

a=fbpcn(''myfile.fputs(,,abc,,,fp);fclose(fp);

a=fbpen(''myfile.dat",''a+'');fprintRfp,‘'%d'',28);rewind(fp);

fscanf(fp,''%s''.str);puts(str);fclose(fp);}程序运行后的输出结果是

A、28c

B、abc28

C>abc

D、因类型不一致而出错

标准答案:B

知识点解析:在程序中首先把字符串abc写入到文件myfile.dat中,然后再把整

数28追加到字符串abc的后面,最后把文件myfile.dat的内容读入到字符串str

中,并把其内容输出。

35、以下程序用来统计文件中字符的个数(函数feof用以检查文件是否结束,结束

时返回非零)#includeVstdio.h>main())FILE*fp;longnum=0:

m=fbpen(''fhame.dal‘T'r'');while(){fgetc(fp);num++;)

printfC'num=%din",num);fclose(fp);)下面选项口,填入横线处不能得到正确结

果的是

A、feof(fp)

B、reot(rp)=NULL

C、!feof(fp)

D、feof(fp)=0

标准答案:C

知识点解析:fcof函数用来判断文件是否结束。如果遇到文件结束,函数feof(fl))

的值为1,否则为0。题目横线用于判断文件不结束,读出字符。文件不结束feof

值为0,若执行循环则应用表达式!feof(fb)。

36、若fp已定义为指向某文件的指针,且没有读到该文件的末尾,则C语言函数

feof(fp)的函数返回值是

A、0

B、非0

C、.1

D、EOF

标准答案:A

知识点解析:feof用来判断文件是否结束。如果遇到文件结束,函数feof(fp)的值

为1,否则为0。

国家二级C语言机试(结构体、共用

体、位运算及文件操作)模拟试卷第2

一、选择题(本题共39题,每题1.0分,共39分。)

1、以下叙述中错误的是

A、可以用typcdcf将已存在的类型用一个新的名字来代表

B、可以通汪lypedef增加新的类型

C、用typedef定义新的类型名后,原有类型名仍有效

D、用typedef可以为各种类型起别名,但不能为变量起别名

标准答案:B

知识点解析:C语言允许用typedef说明一种新类型名,说明新类型名的语句一般

形式为:typcdcf类型名标识符;在此,“类型名”必须是在此语句之前已有定义的

类型标识符。“标误符”是一个用户定义标识符,用作新的类型名。1ypedef语句的

作用仅仅是用“标识符”来代表己存在的“类型名”,并未产生新的数据类型,原有类

型名依然有效。

2、以下结构体类型说明和变量定义中正确的是

A、typedefstructfintn:chare:)REC;RECtl,t2;

B>structREC;{intn;charc;);RECtl,t2;

C>typedefstructREC;{intn=0;charc=,A,;)tl,t2;

D、struct)intn:chare:)REC;REC11,t2;

标准答案:A

知识点解析:定义结构体类型的一般形式为:slruc[结构体名f成员列表,:slruct

结构体名后不能加“;”号,所以选项B)、C)错误,选项D)中定义无名称的结构体

类型同时定义结构体变量形式应为structtl,出;选项A)为用户自定义类型,其为

正确的定义形式。

若有定义typedefint*T;Ta[10];则a的定义与下面明6个语句等价

A、int*a|10];

B、int(*a)[IO];

C>int*a;

D、inta[I0J;

标准答案:A

知识点解析:typedef的主要功能是为存在的类型命名,后面的代码中可以利用该

新定义的类型名定义变量,题目中定义了整型指针类型T,而后利用T定义了整型

指针数组a,含有10个元素,选项A)中定义了整型指针数组a,选项B)定义了一

个指向一维数组的指针a,选项C)定义指针变量,而选项D)为定义整型数组最常

用的形式,数组a中可以存放10个数据元素。

4、以下结构体说明和变量定义中,正确的是

A、typedefstructabc{intn:doublem;)ABC;ABCx,y;

B、structabc{intn;doublem);structabcx,y;

C、structABC{intn;doublem;)structABCx,y;

D、structabcfintn;doublem;);abcx,y;

标准答案:A

知识点解析:选项B)中结构体定义中每个成员后面的分号都不能省略,doublem

后没分号,因此错误。选项C)结构体类型定义完毕后,}外没加分号。选项D)中

定义变量要加上关键字structo

5、以下叙述中错误的是

A、typedef的作用是用一个新的标识符来代表已存在的类型名

B、typedef说明的新类型名必须使用大写字母,否则会出编译错误

C、可以用typedef说明的新类型名米定义变量

D、用typedef可以说明一种新的类型名

标准答案:B

知识点解析:typedef语句的作用仅仅是用“标识符”来代表已存在的“类型名”,并未

产生新的数据类型,原来类型名依然有效。为了便于识别,一般习惯将新的类型名

用大写字母表示。

6、有以下程序#includetypedefstruct]intb,p;)A;voidf(Ac)/*注意:c是结构

变量名*/{intj;c.b+=l;c.p+=2;}main(){i;Aa={1,2);f(a);printf("%

d,%d\n",a.b,a.p);)程序运行后的输出结果是

A、2,4

B、1,2

C、1,4

D、2,3

标准答案:B

知识点解析:在C语言中,数据只能从实参单向传递给形参,称为“按值”传递。

也就是说,当简单变量作为实参时,用户不可能在函数中改变对应实参的值。所以

本题中在main。函数坟a)语句中结构体实参a作为值,传递给函数f(Ac)中的形参

c:这种值传递的方式不会对实参a产生任何影响,所以结构体实参a的值不会发

生变化。

7、设有定义:structcomplex{intreal,unreal;)datal={1,8),data2;则以下赋值

语句中错误的是

A、data2=(2,6);

B、data2=datal;

C^data2.real=datal.real;

D、data2.real=datal.unreal;

标准答案:A

知识点解析:本题主要考查结构体变量的定义与初始化。题目中定义了complex类

型的结构体变量data1和data2,并对data1进行了初始化。可.以用一个结构体变量对

另一个结构体变量赋值,用一个结构体变量的成员对另一个结构体变量的成员赋

值。

8、WIUbfSff#include#inckidetypedefstruct)charname|9];charsex;int

score[2];)STU:STUf(STUa){STUb={"Zhao',,'m',85,90|;inti;

strcpy(a.name,b.name):a.sex=b.sex;for(i=0:i<2;

i++)a.score[i]=b.scorefil;returna;)main(){STUc={,'Qian",T,95,92),

cl:d=f(c);printf("%s,%c,%d,%d,”,d.name,d.sex,d.score[0],

d.score[l]);primf("%s,%c,%d,%d,",c.name,c.sex,c.score[0]»

c.score。]);}

A、Zhao,m,85,90,Zhao,m,85,90

B、Qian,f,95,92,Qian,f,95,92

C>Zhao,m,85,90,Qian,f,95,92

D、Qian,f,95,92,Zhao,m,85,90

标准答案:C

知识点解析:在C语言中,函数实参与形参之间数据的传递是传值,也就是说在

用实参调用形参时,是史实参的值拷贝一份给形参,而实参的值并不变化,仍是原

来的值。所以对于本题来说,在主函数中调f(e)后,实参e的值并不会变化,仍是

原值。在函数f中把局部变量b的值依次返回给变量d。

9、有以下结构体说明、变量定义和赋值语句structSTD{charname[10];intage;

charsex;}s[5],“ps;ps=&s|01;则以下scanf函数调用语句有错误的是

A、scanf("%dn,&s[0].age);

B、scanf("%c",&(ps->sex));

C、scanf("%s",s[0].name);

D、scanf("%d"ps->age);

标准答案:D-

知识点解析:程序段定义了结构体变量数组s[5]和指针变量ps,然后ps指向数组

s[5]中的第一个元素,因而ps->age引用s[0].age。因为在输入scanf()函数中,第

2个参数应该表示为地址变量,而选项A)表示的值,而不是一个地址值。

10、有以下程序,#include<stdio.h>#include<stnng.h>StmctA{inta;char

b[10];doublec;};structAf(structAt);main(){structAa={1001,"ZhangDa",

1098.0);a=f(a);printf("%d,%s,%6.1f\n",a.a,a.b,a.c);)structA

f(StructAt){t.a=1002;strcpy(t.b,"ChangRong");t.c=1202.0;returnt;)

程序运行后的输出结果是

A、1002,ZhangDa,1202.0

B、1002,ChangRong,1202.0

C、1001,ChangRong,1098.0

D、1001,ZhangDa,1098.0

标准答案:B

知识点解析:在主函数中定义结构体A的变量a,并对其赋初值,再调用函数

f(a),在函数f(a)中对结构体变量a的各个成员重新进行了赋值操作,并把其值返

回在屏幕上输出。

11、有以卜程序#includestructord{intx,y;)dt[2]={1,2,3,4);main(){struct

ord*p=dt;printf("%d,",++(p->x));printf("%d\n",++(p->y));}程序运行后

的输出结果是

A、4』

B、2,3

C、3,4

D、1,2

标准答案:B

知识点解析:在题目中定义了结构体。rd类型的数组变量dt,并对其赋初值。在程

序中定义了指向结构体。rd类型的指针变量p,并且它指向变量数组出的第一个元

素dt[O],所以此时成员变量p->x的值等于1,成员变量p->y的值等于2,在输

出时分别加1,所以输H结果为选项B)。

12、有下列程序:structS{intn;inta[20];};voidflint*a,intn){inti;for(i=0;i

<n-l;i++)a[i]+=i;)main(){inti;structSs={10,{2,3,1,6,8»7,5,4,

10,9));f(s.a,s.n);for(i=0;i<s.n;i++)printf("%d,",s.a[i]);}程序

运行后的输出结果是

A、3,4,2,7,9,8,6,5,11,10,

B、2,3,1,6,8,7,5,4,10,9,

C、2,4,3,9,12,12,11,11,18,9,

D、1,2,3,6,8,7,5,4,10,9,

标准答案:C

知识点解析:voidf(int*a,intn)函数的功能是对数组叫的每一个元素加上其下标的

值。所以在main。函数中f(s.a,s.n)语句会调用f(int*a,intn)函数,此时指针a指

向数组s.a={2,3,1,6,8,7,5,4,10,9),n=10;然后执行for(i=0;i<n-l;i++)a[i]+=i;

语句,也就是从0开始到8对数组s.a={2,3,1,6,8,7,5,4,10,9)中的每一个元素加上

其下标值。

13、假定已建立以下链表结构,且指针p和q已指向如图所示的节点:

datanext____________

head一一.a——>b—.c

fpM则以下选项中可将q所指节点

从链表中删除并释放该节点的语句组是

A、p=q->next;free(q);

B、p=q;free(q);

C^(*p).next=(*q).next;free(p);

D、p->next=q->next;free(q);

标准答案:D

知识点解析:本题考查了在线性链表删除一个节点的方法,要删除q所指向的节

点,只需要把q所指向的节点的前一个节点中的后继指针指向q所指向的节点的下

一个节点即可,即p->next二q->next。再释放q所指向的节点,即f-ree(q)。

14、有以下定义和语句:structworkers{intnum;charname|20];chare;struct

{intday;intmonth;intyear;)s;);structworkersw,*pw;pw=&w:能给w中

year成员赋1980的语句是

A、w.year=1980;

pw->year=1980;

C、w.s.year=1980;

D、*pw.year=1980;

标准答案:C

知识点浦析:本题主要考查的是结构体变量的嵌套定义,也就是说一个结构体变量

也可以是一个结构体。在本题中works这个结构体中包含了结构体s。所以对结构

体变量w中year成员的引用是w.s.year。

15、有以卜程序#include#includc"string.h"typedefstruct{charname[9];charsex;

floatscore[2];}STU;voidf(STUa){STUb={"Zhao",'m',85.0,90.0);int

i;strcpy(a.name,b.name);a.sex=b.sex;for(i=O;i<2;

i++)a.score[i]=b.score[i|;)程序的运行结果是

A、Qian,m,85,90

B、Zhao,m,85,90

C、Zhao,f,95,92

D、Qian,f,95,92

标准答案:B

知识点解析:本题考查在结构体中函数的实参和形参的传递,调用f(c)后,实参传

向形参,进行f()函数功能的实现,但程序中没有返回语句,故形参不能将值传回

实参,它们值的传递具有不可逆性,所与primf输出的还是c中实参的值。

16、有以下程序structAfinta;charb[10];doublec;);voidf(structAt);

main(){structAa={1001,"ZhangDa",1098.0);f(a);prinlf("%d,%s,%6.1

f\n".a.a.a.b.a.c):)voidffstnictAt){t.a=1002:strcpy(t.b,

"ChangRong");t.c=1202.0;}程序运行后的输出结果是

A、1002,ChangRong,1202.0

B、1001,ZhangDa,1098.0

C、1001,ChangRong,1098.0

D、1002,ZhangDa,1202.0

标准答案:B-

知识点解析:在主函数中定义结构体A的变量a,并对其赋初值,再调用函数

f(a),形参t接收实参的数据,在函数f⑴中对结构体变量t的各个成员进行了赋值

操作,需要注意的,形参和实参之间是数据传递,因此对形参的操作对实参不产生

影响,因此在主函数输出仍然输出变量a的数据

17、若有以下程序lypedefstructstu{char*name,gender;intscore;}STU;void

f(char*p){p=(char*)malloc(10):strcpy(p,"Qian");)main(){STUa={NULL,'m',

290),b;a.name=(char*)malloc(10);strcpy(a.name,"Zhao");b=a;

f(b.name);b.gender='f:b.score=350;prinlf("%s,%c,%(1,",a.name,

a.gender,a.score);printf("%s,%c,%d\n",b.name,b.gender,

b.score);)则程序的输出结果是

A、Zhao,m,290,Qian,f,350

Qian,C350,Qian,f,350

C、Qian,m,290,Qian,f,350

D、Zhao,m,290,Zhao,f,350

标准答案:D

知识点解析:函数f(char*p)的主要功能申请字符串的存储空间,然后存入字符串

“Qian”,但当程序调用结束以后,形参指针变量p撤销,存储的字符串地址丢失,

而不能更改实参指针的值。主函数中结构体变量定义同时赋初值,初始情况其

name指针成员存储空,而后语句为其分配存储空间,存入字符串“Zha。”。执行

b=a;语句后,b的数据和a的数据相同,调用函数f以后,b的name成员的值没

变。

18、若有以卜程序typedefstructslu{charname[10],gender;intscore;}STU;void

f(char*P){strcpy(p,"Qian");)main(){STUa={,,Zhao",,m',290),b;b=a;

f(b.name);b.gender='f:b.score=350:printf("%s,%c,%d,”,a.name,

a.gender,a.score);printf("%s,%c,%d\n",b.name,b.gender,

b.score);}则程序的输出结果是

A、Zhao,m,290,Zhao,m,290

B、Qian,f,350,Qian,f,350

C、Zhao,m,290,Qianf,350

D^Zhao,m,290,Zhao,f,350

标准答案:C

知识点解析:主函数中结构体变量定义同时赋初值。执行b=a;语句后,b的数据

和a的数据相同,调用函数f(b.name),形参指针p接收实参b.name的地址,此

时p和b.name指向同一个存储空间,流程转到f执行,p指向的存储空间存放字

符串“Qia。”,流程结束返回主函数。主函数中变量b的其他成员存放数据。因比a

的数据{“Zhao”,,m',290),b的数据为{“Qian”,f,350)。注意本题结构体STU

类型变量a和b中的name成员为数组,不是指针,它具有自己的存储空间。

19、若有以下程序段structst{intn;structst*next;);structsta[3]={5,&a[l],

99

7,&a[2],9,\0)f*p;p=&a[0];则以下选项中值为6的表达式是

A、++(p->n)

B、(*p).n

C^p->n++

D、p->n

标准答案:A

知识点解析:选项A)中表达式++(p->n)为前缀自加表达式,p->n和a[0].n等

价,其值为5,前缀自加后值为6。选项B)中表达式(*p).n和选项D)的表达式p-

>n含义相同,表示取结构指针p所指向的成员,因此值为5。选项C)中表达式p-

>n++为后缀自加表达式,相当于(p->)++,表达式值为5。

20、以下叙述中正确的是

A、结构体类型中的各个成分均不能是数组或指针

B、结构体类型的变量,不能在声明结构体类型组成时一起定义

C、使用typcdcf定义新类型名后,新类型名与原类型名实际上是等价的

D、元素为结构体类型的数组,只能在声明过结构体类型之后,单独进行定义

标准答案:C

知识点解析:C语言允许用typcdcf说明一种新类型名,typcdcf语句的作用仅仅是

用“标识符”来代表已存在的“类型名”,并未产生新的数据类型,原有类型名依然有

效。结构体变量定义有下面三种形式:(1)先定义结构,再说明结构变量。(2)在定

义结构类型的同时说明结构变量。(3)直接说明结构变量。

21、以下叙述中正确的是

A、结构体变量的地址不能作为实参传给函数

B、结构体数组名不能作为实参传给函数

C、即使是同类型的结构体变量,也不能进行整体赋值

D、结构体中可以含有指向木结构体的指针成员

标准答案:D

知识点解析:一个结构体变量包含若干成员,这些成员可以是数值类型、字符类

型、数组类型,也可以是指针类型,甚至可以是正在定义的结构体类型指针。用结

构体变量作实参时,采取的是“值传递''的方式,将结构体变量所占的内存单元的内

容全部顺序传递给形参。形参也必须是同类型的结构体变量。结构体数组作为参数

时,采取了“地址传递”的方式,形参须为同类型的结构指针或者形参结构数组。

22>有以下程序5皿d5{加@;由11););main(){structSa,*p=&a;a.a=99;

pfintfC%d\n\);)程序要求输出结构体中成员a的数据,以下不能填

入横线处的内容是

A、a.a

B、*p.a

C

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论