admin 管理员组

文章数量: 887021


2024年1月28日发(作者:copy函数用法)

第十章 结构体和杂类

一. 选择题

1. 如下说明语句,则下面叙述不正确的是( C )。

struct stu { int a ; float b ;} stutype;

是结构体类型的关键字 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(" %dn",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} (“%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. 结构体变量成员的引用方式是使用 . 运算符,结构体指针变量成员的引用方式是使用 -> 运算符。

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

main()

{ union { int a; char b[2]; } c;

c.a=65;

puts(c.b); printf("%dn",sizeof(c));

}

A

16或32

2. main()

{ union {

struct { int x,y; } in;

int a,b;

} e;

e.a=1; e.b=2;

.x=e.a*e.b; .y=e.a+e.b;

printf("%d %d",.x,.y);

}

2 4

3.

struct w { char low ; char high ; } ;

union u { struct w byte ; int word ; } uu;

main ( )

{ = 0x1234 ;

printf(“%04xn”, , ); printf(“%02xn”, ,

) ;

printf(“%02xn”, , ); = 0xff ;

printf(“%04xn”, , ) ;

}

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

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("nn ");

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]);

stu[i].sum=stu[i].score[0]+stu[i].score[1]+stu[i].score[2];

stu[i].aver=stu[i].sum/3.;

}

for(i=0,aver=0,max=0;i<10;i++)

{

aver+=stu[i].aver;

if(stu[i].aver>stu[max].aver)

max=i;

}

aver/=10;

printf("n 三门课的总平均成绩为:%f",aver);

printf("n 成绩最高的同学信息:");

printf("n 学号:%d",stu[max].num);

printf("n 姓名:");

puts(stu[max].name);

printf(" 三门课成绩:%d %d %d",stu[max].score[0],stu[max].score[1],stu[max].score[2]);

printf("n 平均成绩:%fn",stu[max].aver);

}

2. 13个人围成一圈,从第1个人开始顺序报号1、2、3。凡报到“3”者退出圈子,找出最后留在圈子中的人原来的序号。

#include

struct node

{

int num;

struct node *next;

};

main()

{

//建立一个不带头结点的循环链表

int i,n,count;

struct node *head,*p,*last;

for(i=1;i<=13;i++)

{

p=malloc(sizeof(struct node));

p->num=i;

if(i==1)

head=p;

else

last->next=p;

last=p;

}

last->next=head;

p=last;

n=13;

count=0;

while(n!=1)

{

count++;

if(count==3)

{

p->next=p->next->next;

count=0;

n--;

}

else

p=p->next;

}

printf("n %dn",p->num);

}

3. 建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。


本文标签: 变量 类型 结构 链表 成员