admin 管理员组

文章数量: 1184232


2024年1月23日发(作者:制表软件excel)

第八单元 结构体和共用体

一、选择题

1、 说明一个结构体变量时系统分配给它的内存是 。

A. 各成员所需要内存量的总和

B. 结构体中第一个成员所需内存量

C. 成员中占内存量最大者所需的容量

D. 结构中最后一个成员所需内存量

2、 C 语言结构体类型变量在程序执行期间 。

A. 所有成员一直驻留在内存中

B. 只有一个成员驻留在内存中

C. 部分成员驻留在在内存中

D. 没有成员驻留在内存中

3、 设有以下说明语句

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

则下面的叙述不正确的是 。

A. struct 是结构体类型的关键字

B. struct stu 是用户定义的结构体类型

C. stutype 是用户定义的结构体类型名

D. a 和b 都是结构体成员名

4、 程序中有下面的说明和定义

struct abc { int x;char y;}

struct abc s1,s2;

则会发生的情况是 。

A. 编译出错

B. 程序将顺利编译、连接、执行

C. 能顺利通过编译、连接、但不能执行

D. 能顺利通过编译、但连接出错

5、 有如下定义

struct person { char name[9]; int age;};

struct person class[10]={ " Johu", 17,"Paul", 19,"Mary", 16};

根据上述定义,能输出字母M 的语句是 。

A. prinft(" %cn",class[3].name);

,"Adam",

1

18

B. printf(" %cn",class[3].name[1]);

C. prinft(" %cn",class[2].name[1]);

D. printf(" %cn",class[2].name[0]);

6、 下面程序的输出是 。

A. 0 B. 1 C. 3 D. 6

main()

{ struct cmplx { int x; int y;} cnum[2]={1,3,2,7};

printf("%dn",cnum[0].y/cnum[0].x*cnum[1].x);}

7、 设有如下定义:

struct sk {int a ;float b ;}data ,*p ;

若有p=&data ; ,则对data 中的a 域的正确引用是 。

A.(*p).data.a B.(*p).a C.p->data.a .a

8、 当说明一个共用体变量时系统分配给它的内存是 。

A. 各成员所需要内存量的总和

B. 共用体中第一个成员所需内存量

C. 成员中占内存量最大者所需的容量

D. 共用体中最后一个成员所需内存量

9、 以下对C 语言中共用体类型数据的叙述正确的是 。

A. 可以对共用体变量名直接赋值

B. 一个共用体变量中可以同时存放其所有成员

C. 一个共用体变量中不可以同时存放其所有成员

D. 共用体类型定义中不能出现结构体类型的成员

10、C 语言共用体类型变量在程序运行期间 。

A. 所有成员一直驻留在内存中

B. 只有一个成员驻留在内存中

C. 部分成员驻留在在内存中

D. 没有成员驻留在内存中

11、以下对枚举类型名的定义中正确的是 。

A. enum a={one ,two ,three} ;

B. enum a {one=9 ,two=-1 ,three} ;

C. enum a={"one" ,"two" ,"three"} ;

D. enum a {"one" ,"two" ,"three"} ;

12、设有如下枚举类型定义:

enum language { Basic=3 ,Assembly ,Ada=100 ,COBOL ,Fortran} ; 枚举量Fortran 的值为 。

2

A. 4 B. 7 C. 102 D. 103

13、下面对的叙述中不正确的是 。

A. 用typedef 可以定义各种类型名,但不能用来定义变量

B. 用typedef 可以增加新类型

C. 用typedef 只是将已存在的类型用一个新的标识符来代表

D. 使用typedef 有利于程序的通用和移植

14、以下各选项企图说明一种新的类型名,其中正确的是 。

A. typedef v1 int; B. typedef v2=int;

C. typedefv1 int v3; D. typedef v4: int;

15、设有以下说明语句

typedef struct

{ int n;

char ch[8];

}PER;

则下面叙述中正确的是 。

A. PER 是结构体变量名 B. PER 是结构体类型名

C. typedef struct 是结构体类型 D. struct 是结构体类型名

16、设有如下定义:

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;

二、读程序题,写出程序运行的结果。

1、

#include

struct abc { int a, b, c; };

main()

{ struct abc s[2]={{1,2,3},{4,5,6}};

int t;

t=s[0].a+s[1].b;

printf("%d n",t);

3

}

2、

#include

struct stu

{ int num;char name[10]; int age;};

void fun(struct stu *p)

{ printf("%sn" ,(*p).name); }

void main()

{ struct stu students[3]={{9801,"Zhang",20} ,{9802,"Wang", 19} ,

{9803,"Zhao",18} };

fun(students+2);

}

3、

#include

void main()

{ enum team { my ,your=4 ,his ,her=his+10};

printf("%d%d%d%dn",my,your,his,her);

}

4、

#include

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

void main()

{ p=aa;

printf("%d, ", ++p->x);

printf("%d, ",(++p)->x);

printf("%dn",++(*p->y));

}

5、

#include

union myun

{ struct

{ int x, y, z; } u;

int k;

4

} a;

void main()

{ a.u.x=4; a.u.y=5; a.u.z=6;

a.k=0;

printf("%dn",a.u.x);

}

6、

#include

struct STU

{ char num[10]; float score[3]; };

void 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.2fn”,sum);

}

7、

#include

#include

struct NODE

{ int num; struct NODE *next; };

void 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(“%dn”,p->num+q->next->num);

}

8、

#include

typedef union student

5

{ char name[10];

long sno;

char sex;

float score[4];

} STU;

void main()

{ STU a[5];

printf(“%dn”,sizeof(a));

}

三、填空题

1. 在C语言中,要定义一个结构体类型的变量,可采用三种方法,即 、 和 。

2. 编写一个程序,首先定义一个复数数据类型,即结构类型。然后按照复数的运算规则进行计算,并按照复数表示的格式进行输出。

main()

{ struct complex

{ int re;

int im;

}x,y,s,p;

scanf("%d%d",&,&);

scanf("%d%d",&,&);

= (1) ;

= (2) ;

printf(" sum=%5d+i*%5dn",,);

= (3) ;

=*+*;

printf("product=%5d+i*%5dn",,);

}

3. 有n个学生,每个学生的数据包括学号(num),姓名(name[20]),性别(sex),年龄(age),三门课的成绩(score[3])。要求在main函数中输入这n个学生的数据, 然后调用一个函数count,在该函数中计算出每个学生的总分和平均分, 然后打印出所有各项数据(包括原有的和新求出的)。

struct student

6

{ int num;

char name[20];

char sex;

int age;

float score[3];

float total;

float ave;

};

void count( (1) b[],int n)

{ int i,j;

for(i=0;i

{ (2) ;

for(j=0;j<3;j++)

b[i].total= (3) ;

(4) ;

}

}

void main()

{ int i;flaot s1,s2,s3;

(5) ;

struct student a[3];

for(i=0;i<3;i++)

{ scanf("%d%s %c%d%f%f%f",&a[i].num,a[i].name,&a[i].sex,

&a[i].age,&s0,&s1,&s2);

a[i].score[0]=s0;a[i].score[1]=s1;a[i].score[2]=s2;

printf("%d %s %c %d %4.1f %4.1f %4.1fn",a[i].num,a[i].name,

a[i].sex,a[i].age,a[i].score[0],a[i].score[1],a[i].score[2]);

}

count(a,3);

printf("==============================================n");

printf("NO name sex age score[0] score[1] score[2] total aven");

for(i=0;i<3;i++)

printf("%d %s %c %d %5.1f %5.1f %5.1f %5.1f %5.1fn",

a[i].num,a[i].name,a[i].sex,a[i].age,a[i].score[0],

a[i].score[1],a[i].score[2],a[i].total,a[i].ave);

7

}

4. 将上题改为用指针方法处理,即用指针变量逐次指向数组元素,然后向指针变量所指向的数组元素输入数据,并将指针变量作为函数参数将地址值传给count函数,

在函数count中作统计,再将数据返回到main函数,在main函数中输出。

struct student

{ int num;

char name[20];

char sex;

int age;

float score[3];

float total;

float ave;

}a[3];

void count( (1) ,int n)

{ int i,j;

for( (2) )

{ (3) ;

for(j=0;j<3;j++)

b->total= (4) ;

b->ave=b->total/3;

}

}

main()

{int i;

float s0,s1,s2;

struct student *p;

for(p=a;p

{scanf("%d%s %c%d%f%f%f",&p->num,p->name,&p->sex,&p->age,&s0,&s1,&s2);

p->score[0]=s0; p->score[1]=s1; p->score[2]=s2;

printf("%d %s %c %d %4.1f %4.1f %4.1fn",p->num,p->name,p->sex,

p->age,p->score[0],p->score[1],p->score[2]);

}

(5) ;

count(p,3);

printf("=============================================n");

8

printf("NO name sex age score[0] score[1] score[2] total aven");

for( (6) )

printf("%d %s %c %d %5.1f %5.1f %5.1f %5.1f %5.1fn",p->num,

p->name,p->sex,p->age,p->score[0],p->score[1],p->score[2],

p->total,p->ave);

}

5. 有四名学生,每个学生包括学号、姓名、成绩, 要求找出成绩最高者的学号、姓名和成绩(用指针方法)。

main()

{ struct student

{ int num;

char name[20];

float score;

};

struct student stu[4];

struct student *p;

int i,temp=0;

(1) ;

for( (2) )

{ scanf("%d%s%f",&p->num,p->name,&s0);

p->score=s0;

}

for( (3) ;i<4;i++)

if(stu[i].score>amax)

{amax=stu[i].score;temp=i;}

(4) ;

printf(" NO: %dn name: %sn score: %4.1fn",p->num,p->name,p->score);

}

6. 有四名学生,每个学生包括学号、姓名、成绩, 要求按学生成绩由高到低进行排序(要求用指针数组方法)。

struct student

{ int num;

char name[10];

float score;

};

9

int n=4;

main()

{ (1) stu[4]={1,"sdff",34.5,2,"hfhf",67.0,3,"dgdg",90.0,4,"yd",85.0};

struct student *p[4],*pp;

int i,j;

for(i=0;i<4;i++)

(2) ;

printf("*********************************n");

for(i=0;i<4;i++)

printf("%4d %-10s %7.1fn",stu[i].num,stu[i].name,stu[i].score);

for(i=0;i

for(j=i+1;j

if( (3) )

{ pp=p[i];p[i]=p[j];p[j]=pp;}

printf("*********************************n");

for( (4) )

printf("%4d %-10s %7.1fn",p[i]->num,p[i]->name,p[i]->score);

printf("*********************************n");

}

7. 打鱼还是晒网

中国有句俗语是叫“三天打鱼两天晒网”。某人从1990年1月1日起开始“三天打鱼两天晒网”, 问这个人在以后的某一天中是在“打鱼”, 还是在“晒网”。

解题过程可分三步:

(1) 计算从1990年1月1日开始到指定日期一共有多少天;

注意:要判断经历年份中是否有闰年。如果:年能被4除尽且不能被100除尽;或能被400除尽,则是闰年,否则不是闰年。

(2) 由于“打鱼”和“晒网”的周期为5天,所以将算出的天数用5去除;

(3) 根据余数判断他是在“打鱼”还是在“晒网”;若余数为 1、2、3,则他是在打鱼,否则是在“晒网”。

struct date

{ int year;

int month;

int day;

};

main()

10

{ struct date today,term;

int yearday,year,day;

scanf("%d%d%d",&,&,&);

=12;=31;

for(yearday=0,year=1990;year<;year++)

{ =year; yearday+=days(term); }

yearday+= (1) ;

day= (2) ;

if(day>0&&day<4) printf("he was fishing at that day.n");

(3) printf("he was sleeping at that dayn");

}

days(struct date day)

{ static int day_tab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},

{0,31,29,31,30,31,30,31,31,30,31,30,31}};

int i,lp;

lp=%4==0&&%100!=0||%400==0;

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

+=day_tab[lp][i];

(4) ();

}

8. 已有a,b两个按学号升序排列的链表,每个链表中的结点包括学号、成绩。要求把两个链表合并, 按学号升序排列。

#include "stdio.h"

#define NULL 0

#define LEN sizeof(struct student)

struct student

{ long num;

int score;

(1) *next;

};

struct student listA,listB;

int n,sum=0;

main()

{ (2) *creat();

struct student *insert();

11

void print();

struct student *ahead,*bhead,*abh;

int gs=0;

ahead=creat();

gs=sum=n;print(ahead);printf("n");

bhead=creat();gs+=n;sum=n;

print(bhead);printf("n");

sum=gs;

abh=insert(ahead,bhead);

print(abh);

}

struct student *creat()

{ struct student *p1,*p2,*head;

n=0;

p1=p2=(struct student *)malloc(LEN);

scanf("%ld,%d",&p1->num,&p1->score);

head=NULL;

while(p1->num!=0)

{ (3) ;

if(n==1)head=p1;

else p2->next=p1;

p2=p1;

p1=(struct student *)malloc(LEN);

scanf("%ld,%d",&p1->num,&p1->score);

}

p2->next=NULL;

return(head);

}

(4) *insert(struct student *ah, struct student *bh)

{ struct student *pa1,*pa2,*pb1,*pb2;

pa2=pa1=ah;

pb2=pb1=bh;

do

{ while ((pb1->num>pa1->num)&&(pa1->next!=NULL))

{ pa2=pa1;

12

pa1=pa1->next;

}

while(pb1->num<=pa1->num)

{ if(ah==pa1) ah=pb1;

else pa2->next=pb1;

pb1=pb1->next; pb2->next=pa1;

pa2=pb2; pb2=pb1;

}

if (pb1==NULL&&pa1->next!=NULL)

while(pa1->next!=NULL)

{ pa2=pa1; pa1=pa1->next;

}

}while((pa1->next!=NULL)||(pa1==NULL&&pb1!=NULL));

if((pb1->num>pa1->num)&&(pa1->next==NULL))

pa1->next=pb1;

return(ah);

}

void print(struct student *head)

{ struct student *p;

printf("n%dn",sum);

p=head;

if(p!=NULL)

do {

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

p=p->next;

}while(p!=NULL);

}

9. 有两个链表a,b。设结点中包含学号、姓名。从a链表中删去与b链表中所有相同学号的那些结点。

#define LA 4

#define LB 5

#define NULL 0

struct student

{ char num[6];

char name[8];

13

struct student *next;

}a[LA],b[LB];

main()

{ struct student a[LA]={{"101","wang"},{"102","li"},

{"105","chang"},{"106","wei"}};

struct student b[LB]={{"103","chang"},{"104","ma"},

{"105","zhang"},{"107","gou"},{"108","liu"}};

int i,j;

struct student *p,*p1,*p2,*pt,*head1,*head2;

head1=a;head2=b;

for(p1=head1,i=1;p1

{ p=p1;

p1->next=a+i;

printf("%8s%8sn",p->num,p->name);

(1) ;

}

p->next=NULL;

for(p2=head2,i=1;p2

{ p=p2; p2->next=b+i;

printf("%8s%8sn",p2->num,p2->name);

(2) ;

}

p->next=NULL;

printf("n");

(3) ;

while(p1!=NULL)

{ (4) ;

while(p2!=NULL&&strcmp(p1->num,p2->num)!=0)

p2=p2->next;

if(strcmp(p1->num,p2->num)==0)

if(p1==head1)

head1=p1->next;

else

p->next=p1->next;

p=p1;

14

(5) ;

}

p1=head1;

printf("n");

while(p1!=NULL)

{ printf("%7s %7sn",p1->num,p1->name);

p1=p1->next;

}

}

10. 将一个链表按逆序排列,即将链头当链尾,链尾当链头。

#define NULL 0

struct line

{ int num;

(1) *next;

};

main()

{ int len=1,i;

struct line *p1,*p2,*head,*new,*newhead;

p1=p2=head=(struct line *)malloc(sizeof(struct line));

scanf("%d",&p1->num);

while(p1->num!=0)

{ p1=(struct line *)malloc(sizeof(struct line));

scanf("%d",&p1->num);

if(p1->num==0) p2->next=NULL;

else

{ (2) ; p2=p1; (3) ; }

}

p1=head;

do {

printf("%4d",p1->num);

if(p1->next!=NULL)

p1=p1->next;

}while(p1->next!=NULL);

printf("%4d",p1->num);

for(i=0;i

15

{ p2=p1=head;

while(p1->next!=NULL)

{ p2=p1; p1=p1->next; }

if(i==0) newhead=new=p1;

else new=new->next=p1;

p2->next=NULL;

}

p1= (4) ;

printf("n");

for(i=0;i

{ printf("%4d",p1->num); p1=p1->next;}

printf("n");

}

二、编程

1. 定义一个结构体其中包括: 职工号、职工名、性别、年龄、工资、地址。按结构体类型定义一个结构体数组, 从键盘输入每个结构体元素所需的数据,然后逐个输出这些元素的数据(可设数组只有三个元素)。

2. 有一批图书,每本书有:书名(name),作者(author) , 编号(num),出版日期(date)四个数据,希望输入后按书名的字母顺序将各书的记录排列好,供以后查询。今输入一本书的书名,如果查询到库中有此书,打印出此书的书名,作者,编号和出版日期。如果查不到此书,则打印出“无此书”。

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

4. 编写一个程序,输入n个(少于10个)学生的姓名、性别、 成绩、出生年月日及入学年月日,输出成绩在80分以上的学生的姓名、性别、成绩、出生和入学的年份。

5. 将上题改为“输出成绩在80分以上的18岁以下的女生的姓名、成绩、出生和入学的年份”,试编写程序实现之。

6. 有10个学生,每个学生的数据包括学号、姓名、三门课的成绩,从键盘输入10个学生数据,要求打印出三门课总平均成绩,以及最高分的学生的数据(包括学号、 姓名、三门课成绩、平均分数)。

7. 设链表中每个结点包括学号、成绩、和指针三个字段, 试编程序打印出链表中第1,3,结点。

8. 设链表中每个结点包括学号、成绩、和指针三个字段, 试编程序将大于平均成绩的各个结点打印出来。

9. 设链表中每个结点包括学号、成绩、和指针三个字段, 试编程序将成绩最高的结点 16

作为链表的第一个结点,成绩最低的结点作为尾结点。

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

17


本文标签: 成绩 结构 类型 变量 数据