第十章 结构体和杂类
一. 选择题
1. 如下说明语句,则下面叙述不正确的是( C )。
struct stu { int a ; float b ;} stutype;
A.struct是结构体类型的关键字 B.struct stu是用户定义结构体类型
C. stutype是用户定义的结构体类型名(变量名) D. a和b都是结构体成员名
2. 在16位PC机中,若有定义:struct data { int i ; char ch; double f; } b ; 则结构变量b占用内存的字节数是( D )。
A.1 B.2 C.8 D.11
3. 设有定义语句:enum t1 {a1, a2 = 7, a3, a4 = 15} time;则枚举常量a2和a3的值分别为 ( D )。
A. 1和2 B. 2和3 C. 7和2 D. 7和8
4. 以下程序的输出结果是( D )。
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
5. 当定义一个共用体变量时,系统分配给它的内存是( C )。
A.各成员所需内存量的总和 B.结构中第一个成员所需内存量
C.成员中占内存量最大的容量 D.结构中最后一个成员所需内存量
6. 若有以下程序段:
union data { int i ; char c; float f;} a;
int n;
则以下语句正确的是( C )。
A.a=5; B.a={2,’a’,1.2} C.printf(“%d”,a); D.n=a;
7. 设struct {int a; char b; } Q, *p=&Q;错误的表达式是( d )。
A.Q.a B.(*p).b C.p->a D.*p.b
9. 以下对C语言中共用体类型数据的叙述正确的是( c )。
A. 可以对共用体变量直接赋值
B.一个共用体变量中可以同时存放其所有成员
C.一个共用体变量中不能同时存放其所有成员
D.共用体类型定义中不能出现结构体类型的成员
10. 下面对typedef的叙述中不正确的是( b )。
A.用typedef可以定义多种类型名,但不能用来定义变量
B.用typedef可以增加新类型
C.用typedef只是将已存在的类型用一个新的标识符来代表
D.使用typedef有利于程序的通用和移植
二. 判断题
1. 共用体类型的变量的字节数等于各成员字节数之和。F
2. 结构体类型的变量的字节数等于各成员字节数之和。t
3. typedef实际上是用来定义新的数据类型。f
三. 填空题
1. 结构体变量成员的引用方式是使用 . 运算符,结构体指针变量成员的引用方式是使用 -> 运算符。
c语言struct头文件
2. 设struct student{ int no;char name[12];float score[3]; } sl,* p = &sl;
用指针法给sl的成员no赋值1234的语句是____p->no=1234_______________。
3. 运算sizeof是求变量或类型的 占用内存字节个数 ,typedef的功能是 。
4. C语言可以定义枚举类型,其关键字为 enum 。
5. 设union student { int n;char a[100]; } b; 则sizeof(b)的值是_______100____________。
四. 程序分析题
1. #include <stdio.h>
main()
{ union { int a; char b[2]; } c;
c.a=65;
puts(c.b); printf("%d\n",sizeof(c));
}
A
16或32
2. main()
{ union {
struct { int x,y; } in;
int a,b;
} 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);
}
2 4
3.
struct w { char low ; char high ; } ;
union u { struct w byte ; int word ; } uu;
main ( )
{ uu.word = 0x1234 ;
printf(“%04x\n”, , uu.word); printf(“%02x\n”, , uu.byte.high) ;
printf(“%02x\n”, , uu.byte.low); uu.byte.low = 0xff ;
printf(“%04x\n”, , uu.word) ;
}
1234
12
34
12ff
五. 程序填空
1. 下面的函数是将p所指的结点插入head(形参中)所指的单向链表中。设链表已按学号(num)从小到大顺序排列,要求将p(形参)所指的结点插入后链表保持有序,函数返回插入后的链表的头指针。
结点结构为:
typedef struct node { int num; struct node *next; } NODE;
函数为:
NODE *insert(NODE *head ,NODE * p)
{ NODE *front,*rear;
front=head;
while (front!=NULL && front->num < p->num) {
rear=front; front=front->next ;
}
if (front==NULL ) {
if (head==NULL) head=p; ;
else rear->next=p;
p->next=NULL ;
}
else { if (head==front) head=p; else rear->next=p;
p->next=front ;
}
return head ;
}
2. 下面的函数create是建立单向链表的函数,它返回已建立的链表的头指针。(先输入的结点值在头,后输入的值在尾)
结点结构为:
typedef struct node { int num; struct node *next; } NODE;
函数为:
NODE *create()
{
NODE *head,*tail,*p;
int num;
head=NULL; /* 给表头指针初始化 */
scanf("%d",&num);
while (num!=0) {
p=(NODE *)malloc(sizeof(NODE));
if ( !p ) {
printf("No enugh memory!\n");exit(1);
}
p->num=num;
if (head==NULL) head=p;
else tail->next=p ;
tail=p; /* 给表尾指针tail赋值 */
scanf("%d",&num); ;
}
tail->next= NULL ;
return head ;
}
六. 程序编写
1.有10个学生,每个学生的数据包括学号,姓名,3门课的成绩,从键盘输入10个,要求打印出3门课总平均成绩,以及最高分的学生的数据(包括学号,姓名,3门课的成绩,平均分数)。
#include <stdio.h>
struct student
{
int num;
char name[10];
int score[3];
int sum;
float aver;
};
main()
{
struct student stu[10];
int i,max;//max记录平均成绩最高的同学的下标
float aver;
printf("\n\n ");
for(i=0;i<10;i++)
{
printf("\n 请输入学号:");
scanf("%d",&stu[i].num);
fflush(stdin);//清掉缓冲区的数据,主要是为了清掉刚刚学号输入时最后的换行
printf("\n 请输入姓名:");
gets(stu[i].name);
printf("\n 请输入三门课的成绩:");
scanf("%d%d%d",&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论