结构体共用体.docx
《结构体共用体.docx》由会员分享,可在线阅读,更多相关《结构体共用体.docx(18页珍藏版)》请在冰豆网上搜索。
![结构体共用体.docx](https://file1.bdocx.com/fileroot1/2023-1/31/ce97132e-f1b5-424b-bfd5-79da749ff7f3/ce97132e-f1b5-424b-bfd5-79da749ff7f31.gif)
结构体共用体
习题十一结构体和共用体
选择题
1.设有以下语句
typedefstructTT{charc;inta[4];}CIN;
则下面叙述中正确的是______。
A、可以用TT定义结构体变量B、TT是struct类型的变量
C、可以用CIN定义结构体变量D、CIN是structTT类型的变量
2.有以下结构体说明、变量定义和赋值语句
structSTD
{charname[10];intage;charsex;
}s[5],*ps;ps=&s[0];
则以下scanf函数调用语句中错误引用结构体变量成员的是______。
A、scanf("%s",s[0].name);B、scanf("%d",&s[0].age);
C、scanf("%c",&(ps->sex));D、scanf("%d",ps->age);
3.有以下程序
typedefstruct{intb,p;}A;
voidf(Ac)/*注意:
c是结构变量名*/
{intj;
c.b+=1;c.p+=2;}
main()
{inti;
Aa={1,2};
f(a);
printf("%d,%d\n",a.b,a.p);}
程序运行后的输出结果是______。
A、2,3B、2,4C、1,4D、1,2
4.若有以下定义和语句
uniondate
{inti;charc;floatf;}x;inty;
则以下语句正确的是______。
A、x=10.5;B、x.c=101;C、y=x;D、printf("%d\n",x);
5.有以下程序段
typedefstructNODE
{intnum;structNODE*next;}OLD;
以下叙述中正确的是______。
A、以上的说明形式非法B、NODE是一个结构体类型
C、OLD是一个结构体类型D、OLD是一个结构体变量
6.以下对结构体类型变量td的定义中,错误的是______。
A、typedefstructaaB、structaa
{intn;{intn;
floatm;floatm;
}AA;}td;
AAtd;structaatd;
C、structD、struct
{intn;{intn;
floatm;floatm;
}aa;}td;
structaatd;
7.有以下程序:
structSTU{charname[10];intnum;};
voidf1(structSTUc)
{structSTUb={"LiSiGuo",2042};c=b;}
voidf2(structSTU*c)
{structSTUb={"SunDan",2044};*c=b;}
main()
{structSTUa={"YangSan",2041},b={"WangYin",2043};
f1(a);
f2(&b);
printf(“%d%d”,a.num,b.num)
}
执行后输出结果是______。
A、20412044B、20412043C、20422044D、20422043
8.有以下程序:
#include
unionpw{inti;charch[2];}a;
main()
{a.ch[0]=13;a.ch[1]=0;
printf("%d\n",a.i);}
程序的输出结果是(注意:
ch[0]在低字节,ch[1]在高字节)______。
A、13B、14C、208D、209
10.有以下程序:
structs
{intx,y;}data[2]={10,100,20,200};
main()
{structs*p=data;
printf("%d\n",++(p->x));}
程序运行后的输出结果是______。
A、10B、11C、20D、21
11.有以下程序段
typedefstructnode{intdata;structnode*next;}*NODE;
NODEp;
以下叙述中正确的是______。
A、p是指向structnode结构变量的指针的指针B、NODEp;语句出错
C、p是指向structnode结构变量的指针D、p是structnode结构变量
12.有以下程序段
structst
{intx;int*y;}*pt;
inta[]={1,2},b[]={3,4};
structstc[2]={10,a,20,b};pt=c;
以下选项中表达式的值为11的是______。
A、*pt->yB、pt->xC、++pt->xD、(pt++)->x
13.有以下说明和定义语句
structstudent
{intage;charnum[8];};
structstudentstu[3]={{20,"200401"},{21,"200402"},{19,"200403"}};
structstudent*p=stu;
以下选项中引用结构体变量成员的表达式错误的是______。
A、(p++)->numB、p->numC、(*p).numD、stu[3].age
14.已知字符0的ASCII码为十六进制的30,下面程序
main()
{union{unsignedcharc;
unsignedinti[4];}z;
z.i[0]=0x39;z.i[1]=0x36;
printf("%c\n",z.c);}
A、6B、9C、0D、3
15.有以下程序
#include
#include
typedefstruct{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];
}
main()
{STUc={"Qian",'f',95.0,92.0};
f(c);printf("%s,%c,%2.0f,%2.0f\n",c.name,c.sex,c.score[0],c.score[1]);
}
程序的运行结果是______。
A、Qian,f,95,92B、Qian,m,85,90C、Zhao,f,95,92D、Zhao,m,85,90
16.以下关于typedef的叙述错误的是______。
A、用typedef可以增加新类型
B、typedef只是将已存在的类型用一个新的名字来代表
C、用typedef可以为各种类型说明一个新名,但不能用来为变量说明一个新名
D、用typedef为类型说明一个新名,通常可以增加程序的可读性
17.以下结构体类型说明和变量定义中正确的是______。
A、typedefstruct
{intn;charc;}REC;
RECt1,t2;
B、structREC;
{intn;charc;};
RECt1,t2;
C、typedefstructREC;
{intn=0;charc='A';}t1,t2;
D、struct
{intn;charc;}REC;
RECt1,t2;
18.设有以下定义
uniondata
{intd1;floatd2;}demo;
则下面叙述中错误的是______。
A、变量demo与成员d2所占的内存字节数相同B、变量demo中各成员的地址相同
C、变量demo和各成员的地址相同D、若给demo.d1赋99后,demo.d2中的值是99.0
19.若程序中有以下的说明和定义:
structabc
{intx;chary;}//因为这里缺少分号
structabcs1,s2;
则会发生的情况是______。
A、编译时错B、程序将顺序编译、连接、执行
C、能顺序通过编译、连接、但不能执行D、能顺序通过编译、但连接出错
21.有以下程序
#include
structst
{intx,y;}data[2]={1,10,2,20};
main()
{structst*p=data;
printf("%d,",p->y);printf("%d\n",(++p)->x);
}
程序的运行结果是______。
A、10,1B、20,1C、10,2D、20,2
22.以下程序的输出结果是______。
main()
{union{chari[2];
intk;
}r;
r.i[0]=2;r.i[1]=0;
printf("%d\n",r.k);
}
A、2B、1C、0D、不确定
24.设有以下说明语句
structex
{intx;floaty;charz;}example;
则下面的叙述中不正确的是______。
A、struct是结构体类型的关键字B、example是结构体类型名
C、x,y,z都是结构体成员名D、structex是结构体类型
25.以下各选项企图说明一种新的类型名,其中正确的是______。
A、typedefv1int;B、typedefv2=int;C、typedefintv3;D、typedefv4:
int
26.以下程序的输出结果是______。
unionmyun
{struct
{intx,y,z;}u;
intk;
}a;
main()
{a.u.x=4;a.u.y=5;a.u.z=6;
a.k=0;
printf("%d\n",a.u.x);
}
A、4B、5C、6D、0
27.以下程序的输出结果是______。
structHAR
{intx,y;structHAR*p;}h[2];
main()
{h[0].x=1;h[0].y=2;
h[1].x=3;h[1].y=4;
h[0].p=&h[1];h[1].p=h;
printf("%d%d\n",(h[0].p)->x,(h[1].p)->y);
}
A、12B、23C、14D、32
28.设有以下说明语句
typedefstruct
{intn;
charch[8];
}PER;
则下面叙述中正确的是______。
A、PER是结构体变量名B、PER是结构体类型名
C、typedefstruct是结构体类型D、struct是结构体类型名
29.设有如下说明
typedefstruct
{intn;charc;doublex;}STD;
则以下选项中,能正确定义结构体数组并赋初值的语句是______。
A、STDtt[2]={{1,'A',62},{2,'B',75}};B、STDtt[2]={1,"A",62,2,"",75};
C、structtt[2]={{1,'A'},{2,'B'}};D、structtt[2]={{1,"A",62.5},{2,"B",75.0}};
30.设有如下定义:
structss
{charname[10];
intage;
charsex;
}std[3],*p=std;
下面各输入语句中错误的是______。
A、scanf("%d",&(*p).age);B、scanf("%s",&std.name);
C、scanf("%c",&std[0].sex);D、scanf("%c",&(p->sex));
七
1.若有定义“structAA{inta;charb;doublec;}x;”,则x占用空间大小为____11或13____字节。
2.当定义一个结构体变量时,系统分配给该变量的内存大小等于各成员所需内存大小的__和_____。
3.C提供的预处理命令有宏定义命令,条件编译命令和___文件包含命令_________。
4.共用体变量所占用的内存空间是其各个成员所占内存空间_____的最大值_______。
5.调用系统函数时,要先使用#include命令包含该系统函数的原型语句所在的___头文件_______。
6.在#include命令中所包含的头文件,可以是系统定义的头文件,也可以是__用户______定义的头文件。
7.使用#include命令可以包含一个头文件,也可以包含一个__程序____文件。
8.在C程序中包含一个头文件或程序文件的预编译命令为____#include______。
9.程序中的预处理命令是指以__#____字符开头的命令。
10.设有如下宏定义
#defineMYSWAP(z,x,y){z=x;x=y;y=z;}
以下程序段通过宏调用实现变量a,b内容的交换,请填空。
floata=5,b=16,c;
MYSWAP(__c____,a,b);标准答案为:
c
11.共用体变量(能/不能)__不能___用做函数的参数,函数(能/不能)__不能____返回共用体变量。
12.以下程序的的输出结果是______。
#include
#defineM5
#defineNM+M
main()
{intk;
k=N*N*5;printf("%d\n",k);
}
标准答案为:
55
13.有以下定义和语句,则sizeof(a)的值是__10或_16___,而sizeof(a.share)的值是__4____。
structdate
{intday;
intmouth;
intyear;
union{intshare1;
floatshare2;
}share;
}a;
14.下面程序的运行结果是:
__80____。
typedefunionstudent
{charname[10];
longsno;
charsex;
floatscore[4];
}STU;
main()
{STUa[5];
printf("%d\n",sizeof(a));
}
15.引用结构体变量中成员的一般形式是____结构体变量名.成员名__。
指针、结构体
1.人员的记录由编号和出生年、月、日组成,N名人员的数据已在主函数中存入结构体数组std中,且编号唯一。
函数fun的功能是:
找出指定编号人员的数据,作为函数值返回,由主函数输出,若指定编号不存在,返回数据中的编号为空串。
#include
#include
#defineN8
typedefstruct
{charnum[10];
intyear,month,day;
}STU;
__STU____fun(STU*std,char*num)
{inti;STUa={"",9999,99,99};
for(i=0;iif(strcmp(___std[i].num___,num)==0)
return(___std[i]___);
returna;
}
main()
{STUstd[N]={{"111111",1984,2,15},{"222222",1983,9,21},{"333333",1984,9,1},
{"444444",1983,7,15},{"555555",1984,9,28},{"666666",1983,11,15},
{"777777",1983,6,22},{"888888",1984,8,19}};
STUp;charn[10]="666666";
p=fun(std,n);
if(p.num[0]==0)
printf("\nNotfound!
\n");
else
{printf("\nSucceed!
\n");
printf("%s%d-%d-%d\n",p.num,p.year,p.month,p.day);
}
}
第1处内容为[STUfun(STU*std,char*num)]
第2处内容为[if(strcmp(std[i].num,num)==0)]
第3处内容为[return(std[i]);]
2.人员的记录由编号和出生年、月、日组成,N名人员的数据已在主函数中存入结构体数组std中。
函数fun的功能是:
找出指定出生年份的人员,将其数据放在形参k所指的数组中,由主函数输出,同时由函数值返回满足指定条件的人数。
#include
#defineN8
typedefstruct
{intnum;
intyear,month,day;
}STU;
intfun(STU*std,STU*k,intyear)
{inti,n=0;
for(i=0;iif(___std[i].year___==year)
k[n++]=___std[i]___;
return(___n___);
}
main()
{STUstd[N]={{1,1984,2,15},{2,1983,9,21},{3,1984,9,1},{4,1983,7,15},
{5,1985,9,28},{6,1982,11,15},{7,1982,6,22},{8,1984,8,19}};
STUk[N];inti,n,year;
printf("Enterayear:
");scanf("%d",&year);
n=fun(std,k,year);
if(n==0)
printf("\nNopersonwasbornin%d\n",year);
else
{printf("\nThesepersonswerebornin%d\n",year);
for(i=0;iprintf("%d%d-%d-%d\n",k[i].num,k[i].year,k[i].month,k[i].day);
}
}
第1处内容为[if(std[i].year==year)]
第2处内容为[k[n++]=std[i];]
第3处内容为[return(n);]
3.给定程序通过定义并赋初值的方式,利用结构体变量存储了一名学生的学号、姓名和3门课的成绩。
函数fun的功能是将该学生的各科成绩都乘以一个系数a。
#include
typedefstruct
{intnum;
charname[9];
floatscore[3];
}STU;
voidshow(STUtt)
{inti;
printf("%d%s:
",tt.num,tt.name);
for(i=0;i<3;i++)
printf("%5.1f",tt.score[i]);
printf("\n");
}
voidmodify(___STU___*ss,floata)
{inti;
for(i=0;i<3;i++)
ss->__score[i]__*=a;
}
main()
{STUstd={1,"Zhanghua",76.5,78.0,82.0};
floata;
printf("\nTheoriginalnumberandnameandscores:
\n");
show(std);
printf("\nInputanumber:
");scanf("%f",&a);
modify(__&std__,a);
printf("\nAresultofmodifying:
\n");
show(std);
}
第1处内容为[voidmodify(STU*ss,floata)]
第2处内容为[ss->score[i]*=a;]
第3处内容为[modify(&std,a);]
4.给定程序中,函数fun的功能是:
将形参指针所指结构体数组中的三个元素按num成员进行升序排列。
#include
typedefstruct
{intnum;
charname[10];
}PERSON;
voidfun(PERSON___1___)std[]或*std
{
___2___temp;PERSON
if(std[0].num>std[1].num)
{temp=std[0];std[0]=std[1];std[1]=temp;}
if(std[0].num>std[2].num)
{temp=std[0];std[0]=std[2];std[2]=temp;}
if(std[1].num>std[2].num)
{temp=std[1];std[1]=std[2];std[2]=temp;}
}
main()
{PERSONstd[]={5,"Zhanghu",2,"WangLi",6,"LinMin"};
inti;
fun(___3___);std
printf("\nTheresultis:
\n");
for(i=0;i<3;i++)
printf("%d,%s\n",std[i].num,std[i].name);
}
4.给定程序中,函数fun的功能是:
将形参std所指结构体数组中年龄最大者的数据作为函数值返回,并在main函数中输出。
#include
typedefstruct
{charname[10];
intage;
}STD;
STDfun(STDstd[],intn)
{STDmax;inti;
max=___1___;*std或std[0]
for(i=1;iif(max.age<___2___)max=std[i];
returnmax;
}
main()
{STDstd[5]={"aaa",17,"bbb",16,"ccc",18,"ddd",17,