第三讲结构体与共用体一、选择题1.在说明一个结构体变量时系统分配给它的存储空间是。A)该结构体中第一个成员所需存储空间B)该结构体中最后一个成员所需存储空间C)该结构体中占用最大存储空间的成员所需存储空间D)该结构体中所有成员所需存储空间的总和2.若有以下说明和语句:structworker{intno;char﹡name;}work,﹡p=&work;则以下引用方式不正确的是。*A)work.noB)(﹡p).noC)p-noD)work-no3.有如下定义:structdate{intyear,month,day;};structworklist{charname[20];charsex;structdatebirthday;}person;对结构体变量person的出生年份进行赋值时,下面正确的赋值语句是。*A)year=1958B)birthday.year=1958C)person.birthday.year=1958D)person.year=19584.以下对结构体类型变量的定义中不正确的是。*A)#defineSTUDENTstructstudentB)structstudentSTUDENT{intnum;{intnum;floatage;floatage;}std1;}std1;C)structD)struct{intnum;{intnum;floatage;floatage;}student;}std1;structstudentstd1;5.设有以下说明语句structstu{inta;floatb;}stutype;则下面的叙述不正确的是。*A)struct是结构体类型的关键字B)structstu是用户定义的结构体类型C)stutype是用户定义的结构体类型名D)a和b都是结构体成员名6.C语言结构体类型变量在程序执行期间。A)所有成员一直驻留在内存中B)只有一个成员主留在内存中C)部分成员驻留在内存中D)没有成员驻留在内存中7.以下程序的运行结果是。*#includestdio.hmain(){structdate{intyear,month,day;}today;printf(“%d\n”,sizeof(structdate));}A)6B)8C)10D)128.有如下定义structperson{charname[9];intage;};structpersonclass[10]={“Johu”,17,“Paul”,19“Mary”,18,“Adam16,};根据上述定义,能输出字母M的语句是。*A)prinft(“%c\n”,class[3].mane);B)pfintf(“%c\n”,class[3].name[1]);C)prinft(“%c\n”,class[2].name[1]);D)printf(“%^c\n”,class[2].name[0]);9.设有如下定义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))10.设有以下说明语句,则下面的叙述中不正确的是。*structex{intx;floaty;charz;}example;A)struct结构体类型的关键字B)example是结构体类型名C)x,y,z都是结构体成员名D)structex是结构体类型11.若程序中有下面的说明和定义:structstt{intx;charb;}structstta1,a2;则会发生的情况是。*A)程序将顺利编译、连接、执行。B)编译出错。C)能顺利通过编译、连接,但不能执行。D)能顺利通过编译,但连接出错。12.已知教师记录定义为:structstudent{intno;charname[30];struct{unsignedintyear;unsignedintmonth;unsignedintday;}birthday;}stu;structstudent*t=&stu;若要把变量t中的生日赋值为“1980年5月1日”,则正确的赋值方式为。*A)year=1980;B)t.year=1980;month=5;t.month=5;day=1;t.day=1;C)t.birthday.year=1980;D)t-birthday.year=1980;t.birthday.month=5;t-birthday.month=5;t.birthday.day=1;t-birthday.day=1;13.以下结构类型可用来构造链表的是。*A)structaa{inta;int*b;};B)structbb{inta;bb*b;};C)structcc{int*a;ccb;};D)structdd{int*a;aab;};14.以下程序的输出结果是。**amovep(int*p,inta[3][3],intn){inti,j;for(i=0;in;i++)for(j=0;jn;j++){*p=a[i][j];p++;}}main(){int*p,a[3][3]={{1,3,5},{2,4,6}};p=(int*)malloc(100);amovep(p,a,3);printf(%d%d\n,p[2],p[5]);free(p);}A)56B)25C)34D)程序错误15.以下程序的输出结果是。**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].x;h[1].p=&h[0].x;printf(%d%d\n,(h[0].p)-x,(h[1].p)-y);}A)12B)23C)14D)32二、填空题1.有如下定义:*struct{intx;inty;}s[2]={{1,2},{3,4}},﹡p=s;则:表达式++p-x的结果是。表达式++p-x的结果是。2.若有定义:**structnum{inta;intb;floatf;}n={1,3,5.0}};structnum﹡pn=&n;则表达式pn-b/n.a﹡++pn-b的值是,表达式(﹡pn).a+pn-f的值是。3.若要使指针p指向一个double类型的动态存储单元,请填空。*p=malloc(sizeof(double));4.设有以下结构类型说明和变量定义,则变量a在内存所占字节数是。*Structstud{charnum[6];ints[4];doubleave;}a,*p;三、程序填空题1.结构数组中存有三人的姓名和年龄,以下程序输出三人中最年长者的姓名和年龄。请填空。*staticstructman{charname[20];intage;}person[]={“li-ming”,18,“wang-hua”,19,”zhang-ping”,20};main(){structman*p,*q;intold=0;p=person;for(;(1))if(oldp-age){q=p;(2);}printf(“%s%d”,(3));}2.以下程序段的功能是统计链表中结点的个数,其中first为指向第一个结点的指针(链表不带头结点)。请填空。*structlink{chardata;structlink*next;};……structlink*p,*first;intc=0;p=first;while((1)){(2);p=(3);}3.已知head指向一个带头结点的单向链表,链表中每个结点包含数据域(data)和指针域(next),数据域为整型。以下函数求出链表中所有链结点数据域的和值,作为函数值返回。请填空。**structlink{intdata;structlink*next;};main(){structlink*head;...sum(head);...}sum((1)){structlink*p;ints=0;p=head-next;while(p){s+=(2);p=(3);}return(s);}4.已知head指向单链表的第一个结点,以下函数完成往降序单向链表中插入一个结点,插入后链表仍有序。请填空。**#includestdio.hstructstudent{intinfo;structstudent*link;};structstudent*insert(structstudent*head,structstudent*stud){structstudent*p0,*p1,*p2;p1=head;p0=stud;if(head==NULL){head=p0;p0-link=NULL;}elsewhile(p0-infop1-info)&&(p1-link!=NULL)){p2=p1;p1=p1-link;}if(p0-info=p1-info){if(head==p1){(1);head=p0;}else{p2-link=p0;(2);}}else{p1-link=p0;(3);}return(head);}四、读程序写结果题1.以下程序的运行结果是。*structn{intx;charc;};main(){structna={10,’x’};func(a);printf(“%d,%c”,a.x,a.c);}func(structnb){b.x=20;b.c=’y’;}2.以下程序的运行结果是。*main(){structEXAMPLE{struct{intx;inty;}ininta;intb;}e;e.a=1;e.b=2;e.in.x=e.a*e.b;e.in.y=e.a+e.b;printf(“%d,%d”,e.in.x,e.in.y);}3.以下程序的运行结果是。**main(){staticstructs1{charc[4],*s;}s1={“abc”,”def”};staticstructs2{char*cp;structs1ss1;}s2={“ghi”,{“jkl”,“mno”}};printf(“%c,%c\n”,s1.c[0],*s1.s);printf(“%s,%s\n”,s1.c,s1.s);printf(“%s,%s\n”,s2.cp,s2.ss1.s);printf(“%s,%s\n”,++s2.cp,++s2.ss1.s);}4.以下程序的运行结果是。*structs{inta;floatb;char*c;}main(){staticstructsx={19,83.5,”zhang”};structs*px=&x;printf(“%d%.1f%s\n”,x.a,x.b,x.c);printf(“%d%.1f%s\n”,px-a,(*px).b,px-c);printf(“%c%s\n”,*px-c-1,&px-c[1]);}5.以下程序的运行结果是。*structstru{intx;charc;};main(){structstrua={10,’x’},*p=&a;func(p);printf(“%d,%c”,a.x,a.c);}func(structstru*b){b-x=20;b-c=’y’;}6.以下程序的执行结果是。*#includestdio.hstructstu{intnum;charname[10];intage;};voidfun(structstu*p){printf(%s\n,(*p).name);}voidmain(void){structstustudents[3]={{9801,Zhang,20},{9802,Wang,19},{9803,Zhao,18}};fun(students+2);}