第11章 结构体与共用体
一、选择题(在下列各题的A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项填涂在答题卡相应位置上。)11.1 C语言结构体类型变量在程序运行期间
A)TC环境在内存中仅仅开辟一个存放结构体变量地址的单元
B)所有的成员一直驻留在内存中
C)只有最开始的成员驻留在内存中
D)部分成员驻留在内存中
正确答案: B
11.2 下列各数据类型不属于构造类型的是
A)枚举型
B)共用型
C)结构型
D)数组型
正确答案: A
11.3 当说明一个结构体变量时系统分配给它的内存是
A)各成员所需内存量的总和
B)结构中第一个成员所需内存量
C)成员中占内存量最大者所需的容量
D)结构中最后一个成员所需内存量
正确答案: A
11.4 设有以下说明语句
typedef struct
{ int n;
char ch[8];
} PER;
则下面叙述中正确的是
A)PER 是结构体变量名
B)PER是结构体类型名
C)typedef struct 是结构体类型
D)struct 是结构体类型名
正确答案: B
11.5 已知有如下定义:struct a{char x; double y;}data,*t;,若有t=&data,则对data中的成员的正确引用是
A)(*t).data.x
B)(*t).x
C)t->data.x
D)t.data.x
正确答案: B
11.6 以下程序的运行结果是
#include "stdio.h"
main()
{ struct date
{ int year,month,day; } today;
printf("%d\n",sizeof(struct date));
}
A)6
B)8
C)10
D)12
正确答案: A
11.7 设有如下定义:
struck sk
{ int a;
float b;
} data;
int *p;
若要使P指向data中的a域,正确的赋值语句是
A)p=&a;
B)p=data.a;
C)p=&data.a;
D)*p=data.a;
正确答案: C
11.8 以下对结构体类型变量的定义中,不正确的是
A)typedef struct aa
{ int n;
float m;
} AA;
AA tdl;
B)#define AA struct aa
AA { int n;
float m;
} tdl;
C)struct
{ int n;
float m;
} aa;
struct aa tdl;
D)struct
{ int n;
float m;
} tdl;
正确答案: C
11.9 若有下面的说明和定义
struct test
{ int ml; char m2; float m3;
union uu { char ul[5]; int u2[2];} ua;
} myaa;
则sizeof(struct test )的值是
A)12
B)16
C)14
D)9
正确答案: A
11.10 以下程序的输出是
struct st
{ int x; int *y;} *p;
int dt[4]={ 10,20,30,40
};
struct st aa[4]={ 50,&dt[0],60,&dt[0],60,&dt[0],60,&dt[0]};
main()
{ p=aa;
printf("%d\n",++(p->x));
}
A)10
B)11
C)51
D)60
正确答案: C教育联展网
11.11 有以下程序:
#include
union pw
{ int i;
char ch[2];
}a;
main()
{ a.ch[0]=13;
a.ch[1]=0;
printf("%d\n",a.i);
}
程序的输出结果是
A)13
B)14
C)208
D)209
正确答案: A
11.12 已知学生记录描述为:
struct student
{ int no;
char name[20],sex;
struct
{ int year,month,day;
} birth;
};
struct student s;
设变量s中的“生日”是“1984年11月12日”,对“birth”正确赋值的程序段是
A)year=1984;month=11;day=12;
B)s.year=1984;s.month=11;s.day=12;
C)birth.year=1984;birth.month=11;birth.day=12;
D)s.birth.year=1984;s.birth.month=11;s.birth.day=12;
正确答案: D
11.13 有如下定义
struct person{char name[9];int age;};
struct person class[10]={"John",17,"paul",19,"Mary",18,"Adam",16,};
根据上述定义,能输出字母M的语句是
A)printf("%c\n",class[3].name);
B)printf("%c\n",class[3].name[1]);
C)printf("%c\n",class[2].name[1]);
D)printf("%c\n",class[2].name[0]);
正确答案: B
11.14 下列程序的输出结果是
struct abc
{ int a, b, c, s; };
main()
{ struct abc s[2]={{1,2,3},{4,5,6}}; int t;
t=s[0].a+s[1].b;
printf("%d\n",t);
}
A)5
B)6
C)7
D)8
正确答案: B
11.15 若有下面的说明和定义,则sizeof(struct aa)的值是
struct aa
{ int r1; double r2; float r3;
union uu{char u1[5];long u2[2];}ua;
} mya;
A)30
B)29
C)24
D)22
正确答案: D
11.16 有以下结构体说明和变量的定义,且指针p指向变量a,指针q指向变量b。则不能把结点b连接到结点a之后的语句是
struct node
{ char data;
struct node *next;
} a,b,*p=&a,*q=&b;
A)a.next=q;
B)p.next=&b;
C)p->next=&b;
D)(*p).next=q;
正确答案: B
11.17 下面程序的输出结果是
struct st
{ int x;
int *y;
} *p;
int dt[4]={10,20,30,40};
struct st aa[4]={50,&dt[0],60,&dt[1],70,&dt[2],80,&dt[3]};
main()
{ p=aa;
printf("%d\n",++p->x);
printf("%d\n",(++p)->x);
printf("%d\n",++(*p->y));
}
A)10
B)50
C)51
D)60
20 60 60 70
20 21 21 31
正确答案: C
11.18 以下程序的输出结果是
union myun
{ struct
{ int x, y, z; } u;
int k;
} a;
main()
{ a.u.x=4; a.u.y=5; a.u.z=6;
a.k=0;
printf("%d\n",a.u.x);
}
A)4
B)5
C)6
D)0
正确答案: D
11.19 有以下程序
struct STU
{ char num[10]; float score[3];
};
main()
{ struct STU s[3]={{"20021",90,95,85}, {"20022",95,80,75},{ "20023",100,95,90},},*p=s;
int i; float sum=0;
for(i=0;i<3;i++)
sum=sum+p->score[i];
printf("%6.2f\n",sum);
}
程序运行后的输出结果是
A)260.00
B)270.00
C)280.00
D)285.00
正确答案: B
11.20 有以下程序
#include
struct NODE
{ int num; struct NODE *next; };
main()
{ struct NODE *p,*q,*r;
p=(struct NODE*)malloc(sizeof(struct NODE));
q=(struct NODE*)malloc(sizeof(struct NODE));
r=(struct NODE*)malloc(sizeof(struct NODE));
p->num=10; q->num=20; r->num=30;
p->next=q;q->next=r;
printf("%d\n ",p->num+q->next->num);
}
程序运行后的输出结果是
A)10
B)20
C)30
D)40
正确答案: D
11.11 有以下程序:
#include
union pw
{ int i;
char ch[2];
}a;
main()
{ a.ch[0]=13;
a.ch[1]=0;
printf("%d\n",a.i);
}
程序的输出结果是
A)13
B)14
C)208
D)209
正确答案: A
11.12 已知学生记录描述为:
struct student
{ int no;
char name[20],sex;
struct
{ int year,month,day;
} birth;
};
struct student s;
设变量s中的“生日”是“1984年11月12日”,对“birth”正确赋值的程序段是
A)year=1984;month=11;day=12;
B)s.year=1984;s.month=11;s.day=12;
C)birth.year=1984;birth.month=11;birth.day=12;
D)s.birth.year=1984;s.birth.month=11;s.birth.day=12;
正确答案: D
11.13 有如下定义
struct person{char name[9];int age;};
struct person class[10]={"John",17,"paul",19,"Mary",18,"Adam",16,};
根据上述定义,能输出字母M的语句是
A)printf("%c\n",class[3].name);
B)printf("%c\n",class[3].name[1]);
C)printf("%c\n",class[2].name[1]);
D)printf("%c\n",class[2].name[0]);
正确答案: B
11.14 下列程序的输出结果是
struct abc
{ int a, b, c, s; };
main()
{ struct abc s[2]={{1,2,3},{4,5,6}}; int t;
t=s[0].a+s[1].b;
printf("%d\n",t);
}
A)5
B)6
C)7
D)8
正确答案: B
11.15 若有下面的说明和定义,则sizeof(struct aa)的值是
struct aa
{ int r1; double r2; float r3;
union uu{char u1[5];long u2[2];}ua;
} mya;
A)30
B)29
C)24
D)22
正确答案: D
11.16 有以下结构体说明和变量的定义,且指针p指向变量a,指针q指向变量b。则不能把结点b连接到结点a之后的语句是
struct node
{ char data;
struct node *next;
} a,b,*p=&a,*q=&b;
A)a.next=q;
B)p.next=&b;
C)p->next=&b;
D)(*p).next=q;
正确答案: B
11.17 下面程序的输出结果是
struct st
{ int x;
int *y;
} *p;
int dt[4]={10,20,30,40};
struct st aa[4]={50,&dt[0],60,&dt[1],70,&dt[2],80,&dt[3]};
main()
{ p=aa;
printf("%d\n",++p->x);
printf("%d\n",(++p)->x);
printf("%d\n",++(*p->y));
}
A)10
B)50
C)51
D)60
20 60 60 70
20 21 21 31
正确答案: C
11.18 以下程序的输出结果是
union myun
{ struct
{ int x, y, z; } u;
int k;
} a;
main()
{ a.u.x=4; a.u.y=5; a.u.z=6;
a.k=0;
printf("%d\n",a.u.x);
}
A)4
B)5
C)6
D)0
正确答案: D
11.19 有以下程序
struct STU
{ char num[10]; float score[3];
};
main()
{ struct STU s[3]={{"20021",90,95,85}, {"20022",95,80,75},{ "20023",100,95,90},},*p=s;
int i; float sum=0;
for(i=0;i<3;i++)
sum=sum+p->score[i];
printf("%6.2f\n",sum);
}
程序运行后的输出结果是
A)260.00
B)270.00
C)280.00
D)285.00
正确答案: B
11.20 有以下程序
#include
struct NODE
{ int num; struct NODE *next; };
main()
{ struct NODE *p,*q,*r;
p=(struct NODE*)malloc(sizeof(struct NODE));
q=(struct NODE*)malloc(sizeof(struct NODE));
r=(struct NODE*)malloc(sizeof(struct NODE));
p->num=10; q->num=20; r->num=30;
p->next=q;q->next=r;
printf("%d\n ",p->num+q->next->num);
}
程序运行后的输出结果是
A)10
B)20
C)30
D)40
正确答案: D教育联展网
二、填空题(请将每一个空的正确答案写在答题卡相应序号后。)11.26 以下定义的结构体类型拟包含两个成员,其中成员变量info用来存入整形数据;成员变量link是指向自身结构体的指针,请将定义补充完整。
struct node
{ int info;
【1】link;
};
正确答案: struct node *
11.27 设有以下结构体类型:
struct st
{ char name[8];
int num;
float s[4];
}student[50];
并且结构体数组student中的元素都已有值,若要将这些元素写到硬盘文件fp中,请将以下fwrite语句补充完整:
fwrite(student,【2】,1,fp);
正确答案: sizeof(struct st)*50
11.28 使用结构体处理数据的场合是【3】 。
正确答案: 把不同类型的数据作为整体处理。
11.29 以下程序的功能是:处理由学号和成绩组成的学生记录,N名学生的数据已在主函数中放入结构体数组s中,它的功能是:把分数最高的学生数据放在h所指的数组中,注意:分数高的学生可能不只一个,函数返回分数最高学生的人数。请填空。
#include
#define N 16
typedef struct
{ char num[10];
int s ;
} STREC;
int fun (STREC *a, STREC *
B)
{ int i,j=0,max=a[0].s;
for(i=0;iif(maxfor(i=0;iif(【4】) b[j++]=a[i];
return j;
}
main ()
{ STREC s[N]={{"GA005",85},{"GA003",76},{"GA002",69},{"GA004",85},{"GA001",91},
{"GA007",72},{"GA008",64},{"GA006",87},{"GA015",85},{"GA013",91},
{"GA012",64},{"GA014",91},{"GA011",66},{"GA017",64},{"GA018",64},
{"GA016",72} };
STREC h[N];
int i, n;FILE *out;
n=fun(s,h);
printf("The %d highest score :\n",n);
for (i=0; iprintf("%s M\n ",h[i].num,h[i].s);
printf("\n");
out=fopen("out15.dat", "w");
fprintf(out, "%d\n",n);
for(i=0; ifprintf(out, "M\n ",h[i].s);
fclose(out);
}
正确答案: max==a[i].s
11.30 若有以下说明和定义语句,则变量w在内存中所占的字节数是 【5】 。
union aa {float x; float y; char c[6]; };
struct st{ union aa v; float w[5]; double ave; } w;
正确答案: 34
11.31 阅读下列程序,则程序的输出结果为【6】。
#include "stdio.h"
struct ty
{ int data;
char c;
};
main()
{ struct ty a={30,′x′};
fun(a);
printf("%d%c",a.data,a.
C);
}
fun(struct ty
B)
{ b.data=20;
b.c=′y′;
}
正确答案: 30x
11.32 现有如下定义:struct aa{int a;float b;char c;}*p;现需用malloc函数动态的申请一个struct aa类型大小的空间(由p指向),则定义的语句为: 【7】 。
正确答案: p=(struct aa *) malloc (sizeof(struct aa));
11.33 阅读下列程序,则程序实现的功能是 【8】 。
#include "stdio.h"
struct node
{ char data;
struct node *next;
} *head;
fun(struct node *q)
{ if(head == NULL)
{ q->next=NULL;
head=q;
}
else
{ q->next=head;
head=q;
}
}
main()
{ char ch;
struct node *p;
head = NULL;
while((ch=getchar())!=′\n′)
{ p=(struct node *)malloc(sizeof(struct node));
p->data=ch;
fun(p);
}
p=head;
while(p!=NULL)
{ printf("%c",p->data);
p=p->next;
}
}
正确答案: 从键盘输入一行字符串,调用函数建立反序的链表,然后输出整个链表
11.34 以下函数set用来建立一个带头结点的单向链表,新产生的结点总是插入在链表的末尾。单向链表的头指针作为函数值返回,请填空。
struct node{char data; struct node *next; };
struct node *set()
{ struct node *t1,*t2,*t3;
char ch;
t1=(struct node*)malloc(sizeof(struct node));
t3=t2=t1;
ch=getchar();
while(ch!=′\n′)
{ t2= 【9】 malloc(sizeof(struct node));
t2->data=ch;
t3->next=t2;
t3=t2;
ch=getchar();
}
t3->next=′\0′ ;
【10】
}
正确答案: (struct node *) 正确答案: return(t1)