C语言习题 结构体和杂类(答案)

更新时间:2024-01-01 20:59:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第十章 结构体和杂类 一. 选择题

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(\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. 结构体变量成员的引用方式是使用 . 运算符,结构体指针变量成员的引用方式是使用 -> 运算符。

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(\} 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(\ } 2 4

3.

struct w { char low ; char high ; } ;

union u { struct w byte ; int word ; } uu; main ( )

{ uu.word = 0x1234 ;

printf(“x\\n”, , uu.word); printf(“x\\n”, , uu.byte.high) ;

printf(“x\\n”, , uu.byte.low); uu.byte.low = 0xff ; printf(“x\\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(\ while (num!=0) {

p=(NODE *)malloc(sizeof(NODE)); if ( !p ) {

printf(\ }

p->num=num;

if (head==NULL) head=p;

else tail->next=p ; tail=p; /* 给表尾指针tail赋值 */ scanf(\ }

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(\\for(i=0;i<10;i++) {

printf(\请输入学号:\scanf(\

fflush(stdin);//清掉缓冲区的数据,主要是为了清掉刚刚学号输入时最后的换行

printf(\请输入姓名:\gets(stu[i].name); printf(\请输入三门课的成绩:\

scanf(\);

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(\三门课的总平均成绩为:%f\printf(\成绩最高的同学信息:\printf(\学号:%d\printf(\姓名:\puts(stu[max].name); printf(\三门课成绩:%d %d %d\2]);

printf(\平均成绩:%f\\n\ }

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(\%d\\n\ }

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

本文来源:https://www.bwwdw.com/article/fidx.html

Top