第九章结构体类型与公用体类型习题及其答案9-3编写程序,使用结构体类型,输出一年十二个月的英文名称及相应天数。
解:#include "stdio.h"
struct date
{
char month[10] ;
int daynumber ;
}
main()
{
int i ;
date a[12]
={{"January",31},{"February",29},{"March",31},{"Aprial",30}, {"May",31},{"June",30},{"july",31},{"August",31},{"September",30} ,{"October",31},{"November",30},{"December",31}} ;
for(i=0;i<12;i++);
printf("%d 月:%s %d\n",i+1,a[i].month,a[i].daynumber) ;
}
思考:如何对结构体变量进行初始化?对结构体变量的引用为何要体现为分量(或成员)的引用?
9-4 编写程序求空间任一点到原点的距离,点用结构体描述。并请考虑求空间中任意两点的距离的程序。
解:#include "stdio.h"
#include "math.h"
struct point
{
float x ;
float y ;
float z ;
}
void main()
{
double d1,d2,d ;
point p1,p2 ;
printf("请输入第一个点的坐标:");
scanf("%f,%f,%f",&p1.x,&p1.y,&p1.z);
printf("请输入第二个点的坐标:");
scanf("%f,%f,%f",&p2.x,&p2.y,&p2.z);
d1=sqrt(p1.x*p1.x+p1.y*p1.y+p1.z*p1.z);
d2=sqrt(p2.x*p2.x+p2.y*p2.y+p2.z*p2.z);
d=sqrt((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y)+(p2.z-p1.z)*( p2.z-p1.z));
printf("第一个点到原点的距离:%f\n",d1);
printf("第二个点到原点的距离:%f\n",d2);
printf("两点间的距离:%f\n",d);
}
9-5 编写输入、输出10个朋友数据的通讯录程序,每个朋友数据包括姓名、地址、邮编、电话、传呼、手机等数据。
解:#include "stdio.h"
struct AddressBook
{
char name[10] ;
char address[30] ;
char mailnumber[7] ;
char telphone[12] ;
char byphone[16] ;
char movephone[1] ;
}
void main()
{
int i ;
AddressBook fd[10] ;
for(i=0;i<10;i++)
{
printf("请输入第%d个朋友的信息:\n",i+1);
printf("姓名:");
scanf("%s",&fd[i].name) ;
printf("地址:");
scanf("%s",&fd[i].address) ;
printf("邮编:");
scanf("%s",&fd[i].mailnumber) ;
printf("电话:");
scanf("%s",&fd[i].telphone) ;
printf("传呼:");
scanf("%s",&fd[i].byphone) ;
printf("手机:");
scanf("%s",&fd[i].movephone) ;
}
for(i=0;i<10;i++)
{
printf("\n第%d个朋友的信息:\姓名:%s\n 地址:%s\n 邮
编:%s\n 电话:%s\n 传呼:%s\n 手
机:%s\n",i+1,fd[i].name,fd[i].address,fd[i].mailnumber,fd[i].telph
one,fd[i].byphone,fd[i].movephone) ;
}
}
思考:结构体类型变量的分量可以是各种基本数据类型(整型、实型、字符型等)或数组类型,是否可以是另一结构体类型?
9-6 用一个数组存放图书信息,每本图书包含书名、作者、出版年月、出版社、借出数目、库存数目等信息。编写程序输入若干本图书的信息,按出版年月排序后输出。
解:#include "stdio.h"
#include "string.h"
struct Book
{
char booktitle[30] ;
char author[10] ;
char publishday[10] ;
char publishunit[22] ;
char lendno[16] ;
char stockno[11] ;
}
#define N 100 //假设图书数量不超过110册
main()
{
int i,j,k,n;
Book ts[N] ,t;
printf("请输入欲处理的图书数量:");
scanf("%d",&n);
for(i=0;i { printf("请输入第%d本书的信息:\n",i+1); printf("书名:"); scanf("%s",&ts[i].booktitle) ; printf("作者:"); scanf("%s",&ts[i].author) ; printf("出版年月:"); scanf("%s",&ts[i].publishday) ; printf("出版社:"); scanf("%s",&ts[i].publishunit) ; printf("借出数:"); scanf("%s",&ts[i].lendno) ; printf("库存数:"); scanf("%s",&ts[i].stockno) ; } for(i=0;i { k=i; for(j=i+1;j if(strcmp(ts[k].publishday,ts[j].publishday)<0) k=j ; {t=ts[i],ts[i]=ts[j];ts[j]=t;} } printf("\n排序后的图书信息:"); for(i=0;i { printf("\n书名:%s, 作者:%s, 出版年月:%s, 出版 社:%s, 借出数:%s, 库存 数:%s\n",ts[i].booktitle,ts[i].author,ts[i].publishday,ts[i].publishu nit,ts[i].lendno,ts[i].stockno) ; } } 思考:在此程序中,ts[N]是一个什么类型的数组?每个数组的元素大约需占多少字节内存?为什么? 9-7 建立一张人员登记表,表中包括人员的姓名、性别、年龄、婚否,如为已婚,还包括爱人的姓名、年龄。将此表输出,假定人数不超过50人。 解:#include "stdio.h" #include "string.h" struct registerable { char name[10] ; char sex ; int age; char marry ; char wifename[10]; int wifeage ; } #define N 50 void main() { int i,n; struct registerable ts[N] ; printf("请输入欲录入人员数量:") ; scanf("%d",&n); for(i=0;i { printf("请输入第%d个人的信息:\n",i+1); printf("姓名:") ; scanf("%s",ts[i].name); printf("性别:") ; scanf("%s",ts[i].sex); printf("年龄:") ; scanf("%s",ts[i].age); printf("婚否(y/n):") ; scanf("%s",ts[i].marry); if(ts[i].marry=='y'||ts[i].marry=='Y') { printf("妻子姓名:"); scanf("%s",&ts[i].wifename); printf("妻子年龄:"); scanf("%s",&ts[i].wifeage); } else { ts[i].wifename=" " ; ts[i].wifeage=0 ; } } printf("\n通信录信息表:"); printf("\n 姓名性别年龄婚否妻子姓名妻子年龄\n") ; for(i=0;i { printf("%8s %c %d %c %8s %d\n",ts[i].name,ts[i].se x,ts[i].age,ts[i].marry,ts[i].wifename,ts[i].wifeage); } } 思考:结构体类型变量的分量与其对应类型的一般变量的区别是什么?在使用中有何不同? 9-8 定义一函数output(),输出学生的成绩数组。成绩数组中有20个学生的数据记录,每个记录包括学号、姓名及三门课的成绩。 解:#include "stdio.h" #include "string.h" #define STT struct student STT { int no ; char name[8] ; int c[3] ; } #define N 20 output(STT a[N]) { int i; printf("\n学生成绩信息表\n") ; printf(" 学号姓名成绩1 成绩2 成绩3\n") ; for(i=0;i { printf("%6d %8s %3d %3d %3d\n",a[i].no,a[i].name,a[i].c[0] ,a[i].c[1],a[i].c[2]); } } void main() { int i ; STT cs[N] ; printf("请输入学生的学号、姓名、成绩:"); for(i=0;i { printf("第%d个人的信息:\n",i+1); printf("学号:"); scanf("%d",&cs[i].no) ; printf("姓名:"); scanf("%d",&cs[i].name) ; printf("成绩:"); scanf("%d,%d,%d",&cs[i].c[0],&cs[i].c[1],&cs[i].c[2]) ; } output(cs) ; } 思考:能想象在此程序中与结构体STT等同功能语句吗?如果不用结构体,程序怎样描述? 9-9 在上题基础上,定义一个输出函数intput(),用来输入20个学生的数据到成绩数组。 解:#include "stdio.h" #include "string.h" #define STT struct student STT { int no ; char name[8] ; int c[3] ; }; #define N 20 int i; output(STT a[N]) { printf("\n学生成绩信息表\n") ; printf(" 学号姓名成绩1 成绩2 成绩3\n") ; for(i=0;i { printf("%6d %8s %3d %3d %3d\n",a[i].no,a[i].name,a[i].c[0] ,a[i].c[1],a[i].c[2]); } } input(STT a[N]) { printf("请输入学生的学号、姓名、成绩:"); for(i=0;i { printf("第%d个人的信息:\n",i+1); printf("学号:"); scanf("%d",&a[i].no) ; printf("姓名:"); scanf("%d",&a[i].name) ; printf("成绩:"); scanf("%d,%d,%d",&a[i].c[0],&a[i].c[1],&a[i].c[2]) ; } } void main() { STT cs[N] ; input(cs) ; output(cs); } 思考:函数的参数可以是结构体类型变量或数组,函数的返回类型也可以是结构体类型吗? 9-10 有十个学生,每个学生的数据包括学号、姓名、三门课的成绩,从键盘输入10个学生的数据,要求求出: (1) 每门课的平均成绩。 (2) 每个学生的总分及平均成绩。 解:#include "stdio.h" #include "string.h" #define STT struct student STT { int no; char name[8] ; int c[3]; int total; float aver; }; #define N 10 int i ; void output(STT a[N]) { printf("\n学生成绩信息表\n") ; printf(" 学号姓名成绩1 成绩2 成绩3 总分平均成绩\n") ; for(i=0;i { printf("%6d %8s %3d %3d %3d %3d %6.2f \n",a[i].no,a[i].name,a[i].c[0],a[i].c[1],a[i].c[2],a[i].total ,a[i].aver); } } void input(STT a[N]) { printf("请输入学生的学号、姓名、成绩:"); for(i=0;i { printf("第%d个人的信息:\n",i+1); printf("学号:"); scanf("%d",&a[i].no) ; printf("姓名:"); scanf("%d",&a[i].name) ; printf("三门课成绩:"); scanf("%d,%d,%d",&a[i].c[0],&a[i].c[1],&a[i].c[2]) ; a[i].total=a[i].c[0]+a[i].c[1]+a[i].c[2]; a[i].aver=a[i].total/N; } } void main() { STT cs[N],av; input(cs) ; for(i=0;i { av.c[0]=av.c[0]+cs[i].c[0]; av.c[1]=av.c[1]+cs[i].c[1]; av.c[2]=av.c[2]+cs[i].c[2]; av.aver=av.aver+cs[i].aver ; } output(cs) ; printf(" %8s %3d %3d %3d %6.2f\n",https://www.doczj.com/doc/9e6244085.html,,av.c[0]/N,av.c [1]/N,av.c[2]/N,av.aver/N) ; } 思考:在此程序中,av是否可以不是结构体类型?若是,请改用其它数据形式进行处理。 9-11 在上题的基础上,要求求出: (1) 平均分最高的学生的数据。 (2) 每门课高于平均成绩的学生人数。 (3) 每个学生第一门课程与平均成绩的分差。 解:#include "stdio.h" #include "string.h" #define STT struct student STT { int no; char name[8] ; int c[3]; int total; float aver,dfen; }; #define N 3 int i ,j; void output(STT a[N]) { printf("\n学生成绩信息表\n") ; printf(" 学号姓名成绩1 成绩2 成绩3 总分平均成绩分差\n") ; for(i=0;i { printf("%6d %8s %3d %3d %3d %3d %6.2f %6.2f\n",a[ i].no,a[i].name,a[i].c[0],a[i].c[1],a[i].c[2],a[i].total,a[i].aver,a[i].dfen); } } void input(STT a[N]) { printf("请输入学生的学号、姓名、成绩:"); for(i=0;i { printf("第%d个人的信息:\n",i+1); printf("学号:"); scanf("%d",&a[i].no) ; printf("姓名:"); scanf("%d",&a[i].name) ; printf("三门课成绩:"); scanf("%d,%d,%d",&a[i].c[0],&a[i].c[1],&a[i].c[2]) ; a[i].total=a[i].c[0]+a[i].c[1]+a[i].c[2]; a[i].aver=a[i].total/N; } } void main() { STT cs[N],av; int max_i=0,rnum[3]={0,0,0}; input(cs) ; for(i=0;i { av.c[0]=av.c[0]+cs[i].c[0]; av.c[1]=av.c[1]+cs[i].c[1]; av.c[2]=av.c[2]+cs[i].c[2]; av.aver=av.aver+cs[i].aver ; if(av.aver { av.aver=cs[i].aver; max_i=i ; //记录平均分最高的学生 } } for(i=0;i<3;i++) av.c[i]=av.c[i]/N; for(i=0;i { for(j=0;j<3;j++) if(cs[i].c[j]>av.c[j]) rnum[j]++ ;//统计每门课高于平均成绩的人 数 cs[i].dfen=cs[i].c[0]-av.c[0];//计算每个学生第一门课与第一门课 平均成绩的分差 } output(cs) ; printf(" %8s %3d %3d %3d %6.2f\n",https://www.doczj.com/doc/9e6244085.html,,av.c[0]/N,av.c [1]/N,av.c[2]/N,av.aver/N) ; printf("%6d %8s %3d %3d %3d %3d %6.2f %6.2f\n",cs[ma x_i].no,cs[max_i].no,cs[max_i].name,cs[max_i].c[0],cs[max_i].c[1],cs[m ax_i].c[2],cs[max_i].total,cs[max_i].aver,cs[max_i].dfen) ; } 思考:如果要计算每个学生第一门课程与该学生的平均成绩的分差,此程序应如何改动? 9-12 有若干个运动员,每个运动员包括编号、姓名、性别、年龄、身高、体重等信息。若性别为男,则运动项目为长跑、登上;若性别为女,则运动项目为短跑、跳绳。用一个函数输入运动员的信息,用另一个函数求每个项目的平均成绩,在用另一个函数输出运动员信息。 解:#include "stdio.h" #include "string.h" #define ATH struct athlete ATH { int no ; char name[8]; char sex; int age ; float high ; float weight ; float event1 ; float event2 ; }; #define N 100 int i ; output(ATH a[N]) { printf("\n运动员情况信息表\n"); printf(" 编号姓名性别年龄身高体重长跑登山短跑跳绳\n"); for(i=0;i { if(a[i].sex=='m'||a[i].sex=='M') printf(" %6d %8s %c %3d %5.1f %5.1f %6.2f %6.2f\n",a[i].no,a[i].na me,a[i].sex,a[i].age,a[i].high,a[i].weight,a[i].event1,a[i].event2); else printf(" %6d %8s %c %3d %5.1f %5.1f %6.2f %6.2f\n",a[i].no,a[i].na me,a[i].sex,a[i].age,a[i].high,a[i].weight,a[i].event1,a[i].event2); } } input(ATH a[N]) { printf("请输入运动员的编号、姓名等相关信息:\n"); { printf("第%d个运动员:\n",i+1); printf("编号:"); scanf("%d",&a[i].no); printf("姓名:"); scanf("%d",&a[i].name); printf("性别:"); scanf("%d",&a[i].sex); printf("年龄:"); scanf("%d",&a[i].age); printf("身高:"); scanf("%d",&a[i].high); printf("体重:"); scanf("%d",&a[i].weight); if(a[i].sex=='m'||a[i].sex=='M') { printf("输入该运动员的“长跑”与“登山”的成绩:") ; scanf("%f,%f",&a[i].event1,&a[i].event2) ; } else { printf("输入该运动员的“短跑”与“跳绳”的成绩:") ; scanf("%f,%f",&a[i].event1,&a[i].event2) ; } } } void main() { int msun=0,wsun=0 ; ATH cs[N],mav,wav; mav.event1=0; mav.event2=0; wav.event1=0; wav.event2=0; input(cs); { if(cs[i].sex=='m'||cs[i].sex=='M') { msun=msun+1; mav.event1=mav.event1+cs[i].event1; mav.event2=mav.event2+cs[i].event2; } else { wsun=wsun+1 ; mav.event1=mav.event1+cs[i].event1; mav.event2=mav.event2+cs[i].event2; } } mav.event1/=msun;mav.event2/=msun; wav.event1/=wsun;wav.event2/=wsun; output(cs) ; printf("平均成绩:\n 长跑=%6.2f, 登山=%6.2f,短跑=%6.2f,跳绳=%6.2f\n ",mav.event1,mav.event2,wav.event1,wav.event2); } 9-13 编写程序,用结构体类型实现复数的加、减、乘、除运算,每种运算用函数完成。 解:#include "stdio.h" struct complex { float real ; float imag ; }; struct complex add(struct complex a ,struct complex b) { struct complex temp ; temp.real=a.real+b.real ; temp.imag=a.imag+b.imag ; return temp ; } struct complex sub(struct complex a ,struct complex b) { struct complex temp ; temp.real=a.real-b.real ; temp.imag=a.imag-b.imag ; return temp ; } struct complex mul(struct complex a ,struct complex b) { struct complex temp ; temp.real=a.real*b.real-a.imag*b.imag; temp.imag=a.real*b.imag+a.imag*b.real; return temp ; } struct complex div(struct complex a ,struct complex b) { struct complex temp ; float t ; t=(b.real*b.real+b.imag*b.imag); temp.real=(a.real*b.real+a.imag*b.imag)/t; temp.imag=(b.real*a.imag-a.real*b.imag)/t; return temp ; } struct complex disp(struct complex t) { printf("%8.3f",t.real) ; if(t.imag>0) printf("+") ; if(t.imag!=0) printf("%8.3f\n",t.imag) ; return t ; } void main() { struct complex x,y ; struct complex s1,s2,s3,s4; printf("请输入第一个数的实部,虚部:"); scanf("%f,%f",&x.real,&x.imag); printf("请输入第二个数的实部,虚部:"); scanf("%f,%f",&y.real,&y.imag); s1=add(x,y); s2=sub(x,y); s3=mul(x,y); s4=div(x,y); printf("所求复数的和=");disp(s1); printf("所求复数的差=");disp(s2); printf("所求复数的积=");disp(s3); printf("所求复数的商=");disp(s4); } 思考:函数在返回时,传给调用函数的值是一个吗?为什么?结构体类型也可以作为返回类型吗? 9-14 编写程序,计算四边形的面积和周长,要求用结构体类型描述四边形。 解:#include "stdio.h" #include "math.h" struct point //点的结构体 { float x; float y ; }; struct sbx //四边形结构体用四个顶点表示 { struct point p[4] ; }; float dist(struct point p1 ,struct point p2) //求两点距离 { float x=0; x=sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)) ; return x ; } void main() { struct sbx a ; float zc,mj ; int i ; float d01,d12,d23,d30,d02; float c1,c2; for( i=0;i<4;i++) { printf("请输入第%d个点的坐标:\n",i+1); printf("(x,y)"); scanf("%f,%f",&a.p[i].x,&a.p[i].y); } /*计算四边形的周长*/ d01=dist(a.p[0],a.p[1]); d12=dist(a.p[1],a.p[2]); d23=dist(a.p[2],a.p[3]); d30=dist(a.p[3],a.p[0]); zc=d01+d12+d23+d30; /*计算面积(将四边形分割为俩个三角形)*/ d02=dist(a.p[0],a.p[2]) ; c1=(d01+d12+d02)/2; c2=(d30+d23+d02)/2; mj=sqrt(c1*(c1-d01)*(c1-d12)*(c1-d02))+sqrt(c2*(c2-d30)*(c2-d23)*(c2 -d02)); /*输出结果*/ printf("周长=%7.2f,面积=%7.2f\n",zc,mj); } 思考:如果把此题中的四边形改为平行四边形,程序该如何改写?9-15 编写程序,用枚举类型实现俩个数的加、减、乘、除运算,每 种运算用函数完成,并请考虑多个数的运算如何实现。 解:#include "stdio.h" float add(float a,float b) { float temp ; temp=a+b; return temp ; } float sub(float a,float b) { float temp ; temp=a-b; return temp ; } float mul(float a,float b) { float temp ; temp=a*b; return temp ; } float div(float a,float b) { float temp ; temp=a/b; return temp ; } void main() { enum yunsuanfu{a,b,c,d}js; //用a,b,c,d分别表示加、减、乘、除float x,y,s; printf("输入第一个数据:"); scanf("%f",&x); printf("输入第二个数据:"); scanf("%f",&y); 试卷编号:825 所属语言:C语言 试卷方案:结构体与共用体 试卷总分:90分 共有题型:5种 ━━━━━━━━━━━━━━ 一、填空共5题(共计10分) ━━━━━━━━━━━━━━ 第1题(2.0分)题号:205 结构体是不同数据类型的数据集合,作为数据类型, 必须先说明结构体【1】,再说明结构体变量. 答案: =======(答案1)======= 类型 第2题(2.0分)题号:208 将函数funl 的入口地址赋给指针变量p的语句是【1】. 答案: =======(答案1)======= p=funl; 第3题(2.0分)题号:232 设有以下结构类型说明和变量定义,且sizeof(int)=2,则变量a在内存所占字节数是【1】. struct stud { char num[6]; int s[4]; double ave; } a,*p; 答案: =======(答案1)======= 22 第4题(2.0分)题号:345 若在程序中用到"strlen()"函数时,应在程序开头写上包含命令# include "【1】". 答案: =======(答案1)======= string.h 第5题(2.0分)题号:803 预处理命令行都必须以【1】号开始. 答案: =======(答案1)======= # ━━━━━━━━━━━━━━━━━ 二、单项选择共20题(共计40分) ━━━━━━━━━━━━━━━━━ 第1题(2.0分)题号:464 以下描述中,正确的是()。 A:预处理是指完成宏替换和文件包含中指定的文件的调用 B:预处理指令只能位于C源文件的开始 C:C源程序中凡是行首以#标识的控制行都是预处理指令 D:预处理就是完成C编译程序对C源程序第一遍扫描,为编译词法和语法分析作准备答案:C 第2题(2.0分)题号:472 下列程序运行结果为: #define P 3 #define S(a) P*a*a main() {int ar; ar=S(3+5); printf("\n%d",ar); } A:192 B:29 C:27 结构体与共用体小结 一,结构体得概念与定义 1,结构体得定义 struct 结构体名 { 数据类型成员名1; 数据类型成员名1; 、、、 }; 这里数据类型可以就是复合类型,例如又就是一个结构体类型,即嵌套; 2,结构体变量得定义 struct 结构体名变量名1,变量名2,,,变量名n; 或: struct 结构体名 { 数据类型成员名1; 数据类型成员名1; 、、、 }结构体变量1,结构体变量2; 或: struct { 数据类型成员名1; 数据类型成员名1; 、、、 }结构体变量1,结构体变量2; 三种方式,第三种方式得话,每次要定义这个类型得结构体变量都要重复得写这一段代码; 其实定义了结构体后,struct 结构体名就就是一种新得类型,上述语句就像声明变量一样; 3,结构体变量得引用 只能对结构体变量中得各个成员分别输出,不能对一个结构体变量作为一个整体输出; 嵌套得结构体类型得引用: 结构体变量名、结构体类型成员名、内嵌结构体得成员名; 4,结构体变量得初始化 struct 结构体名变量名= {初始化数据}; 或者在定义得时候就初始化: struct 结构体名 { 数据类型成员名1; 数据类型成员名1; 、、、 }变量名= {初始化数据}; 二,结构体数组 1,结构体数组得定义举例struct stu { int stu_nu; char name[20]; float score; }; struct stu student[5]; 或者: struct stu { int stu_nu; char name[20]; float score; }student[5]; 或者: struct { int stu_nu; char name[20]; float score; }student[5]; 跟定义结构体变量得三种形式就是一样得,只不过这里每次定义得结构体变量就是一个数组;每一个student[i]都就是struct stu类型得; 2,结构体数组得初始化与引用 略; 三,结构体与指针 1,指向结构体得指针得定义,同上,也就是三种形式; struct employees employee1,*p1; 或者: struct employees 第十一章习题结构体与共用体 1.以下C语言共用体类型数据的描述中,不正确的是( ) A) 共用体变量占的内存大小等于所需内存最大的成员所占的内存 B) 共用体类型可以出现在结构体类型定义中 C) 在定义共用体变量的同时允许对第一个成员的值进行初始化 D) 同一共用体中各成员的首地址不相同 2.下列对结构体类型变量定义不正确的是( ) A)struct teacher B) struct { int num; { int num; int age; }teach1; int age; }teach1,teach2; C) struct D) struct teacher { int num; { int num; int age; }teacher; int age; }; struct teacher teach1; struct teacher teach1; 3.若有定义: struct teacher { int num; char name[10]; char sex; int age; float score;}teacher1; 则变量teacher1所占用的内存字节数是( ) A) 5 B)14 C) 19 D) 20 4.以下程序的运行结果是( ) #include 习题六 1. 从下列四个选项中选择一个正确的填入括号中。 (1)在说明一个结构体变量时系统分配给它的存储空间是(D)。 A该结构体中第一个成员所需存储空间 B该结构体中最后一个成员所需存储空间 C该结构体中占用最大存储空间的成员所需存储空间 D该结构体中所有成员所需存储空间的总和 (2)在说明一个共用体变量时系统分配给它的存储空间是(D )。 A该共用体中第一个成员所需存储空间 B该共用体中最后一个成员所需存储空间 C该共用体中占用最大存储空间的成员所需存储空间 D该共用体中所有成员所需存储空间的总和 (3)共用体类型在任何给定时刻, (B)。 A所有成员一直驻留在内存中 B只有一个成员驻留在内存中 C部分成员驻留在内存中 D没有成员驻留在内存中 (4)以下定义结构体类型的变量st1,其中不正确的是(A ) A typedef stuct student { int num; int age; }STD; STD st1; B struct student { int num,age; }st1; C struct { int num; float age; }st1; D struct student { int num; int age; }; struct student st1; (5)已知职工记录描述为: struct workers { int no; char name[20]; char sex; struct { int day; int month; int year; }birth; }; struct workers w; 设变量w中的”生日”应是”1993年10月25日”,下列对”生日”的正确赋值方式是(C)。 A day=25; month=10; year=1993; B w.day=25w.month=10; w.year=1993; C w.birth.day=25; w.birth.month=10; w.birth.year=1993; D birth.day=25; birth.month=10; birth.year=1993; (6)设有如下定义: struct sk { int a; float b; }data,*p; 若有p=&data;则对data中的a成员的正确引用是(B)。 A (*p).data.a B (*p).a C p->data.a D p.data.a 2.填空 (1)若有以下说明和定义且数组w和变量k已正确赋值,则对w数组中第k个元素中各成员的正确引用形式是w[k-1].b、w[k-1].c 、w[k-1].d 。 struct aa { int b; char c; double d; }; struct aa w[10]; int k=3; (2)若有以下说明和定义,则对x.b成员的另外两种引用形式是x->b-> 和p.b. 。 struct st { int a; struct st *b; }*p, x; 第十章结构体与共用体 一、选择题 1.在说明一个结构体变量时系统分配给它的存储空间是。(0级) A)该结构体中第一个成员所需存储空间 B)该结构体中最后一个成员所需存储空间 C)该结构体中占用最大存储空间的成员所需存储空间 D)该结构体中所有成员所需存储空间的总和 2.若有以下说明和语句: struct worker { int no; char ﹡name; }work, ﹡p=&work; 则以下引用方式不正确的是。(1级) A) work.no B) (﹡p).no C) p->no D)work->no 3.有如下定义: struct date { int year, month, day; }; struct worklist { char name[20]; char sex; struct date birthday; }person; 对结构体变量person的出生年份进行赋值时,下面正确的赋值语句是。 (1级) A) year=1958 B) birthday.year=1958 C) person.birthday.year=1958 D) person.year=1958 4.以下对结构体类型变量的定义中不正确的是。(1级) A)#define STUDENT struct student B) struct student STUDENT { int num; { int num; float age; float age; }std1; }std1; C) struct D) struct { int num; { int num; float age; float age; } student; }std1; struct student std1; 5.设有以下说明语句 struct stu { int a; float b; }stutype; 则下面的叙述不正确的是。(1级) A)struct是结构体类型的关键字 B)struct stu是用户定义的结构体类型 C)stutype是用户定义的结构体类型名 D)a和b都是结构体成员名 6.C语言结构体类型变量在程序执行期间。(0级) A)所有成员一直驻留在内存中 B)只有一个成员主留在内存中 C)部分成员驻留在内存中 结构体与共用体 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.设有以下结构类型说明和变量定义,则变量a在内存所占字节数是【】。 struct stud { char num[6]; int s[4]; double ave; } a,*p; 5.程序中有下面的说明和定义 struct abc { int x;char y;} struct abc s1,s2; 则会发生的情况是 A)编译出错B)程序将顺利编译、连接、执行 C)能顺利通过编译、连接、但不能执行 D)能顺利通过编译、但连接出错 6.有如下定义 struct person { char name[9]; int age;}; struct person class[10]={ " Johu", 17,"Paul", 19,"Mary", 18,"Adam", 16}; 根据上述定义,能输出字母M的语句是 A) prinft(" %c\n",class[3].name); B) printf(" %c\n",class[3].name[1]); C) prinft(" %c\n",class[2].name[1]); D) printf(" %c\n",class[2].name[0]);7.下面程序的输出是 A)0 B)1 C)3 D)6 main() { struct cmplx { int x; int y;} cnum[2]={1,3,2,7}; printf("%d\n",cnum[0].y/cnum[0].x*cnum[1].x);} 8.下列程序的输出结果是 A)5 B)6 C)7 D)8 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);} 9.有以下程序 struct stu { int num;char name[10];int age;}; void fun(struct stu *p) { printf("%s\n" ,(*p).name); } main() { struct stu students[3]={{9801,"Zhang",20} ,{9802,"Wang", 19} , {9803,"Zhao",18} }; fun(students+2);} 输出结果是 A)Zhang B)Zhao C)Wang D)18 10.设有如下定义: struct sk {int a ;float b ;}data ,*p ; 若有p=&data ;,则对data中的a域的正确引用是 A)(*p).data.a B)(*p).a C)p->data.a D)p.data.a 11.下面程序的输出结果为 2013年结构体与联合体习题 选择题 1、若程序中有以下的说明和定义: struct abc { int x;char y; } 花括号后少了分号。 struct abc s1,s2; 则会发生的情况是______。 A) 编译时错B) 程序将顺序编译、连接、执行 C) 能顺序通过编译、连接、但不能执行D) 能顺序通过编译、但连 接出错 2、有以下程序段 struct st { int x; int *y;}*pt; int a[]={1,2};b[]={3,4}; struct st c[2]={10,a,20,b}; pt=c; 以下选项中表达式的值为11的是 A) *pt->y B) pt->x C) ++pt->x D) (pt++)->x 3、有以下说明和定义语句 struct student { int age; char num[8];}; struct student stu[3]={{20,"200401"},{21,"200402"},{19,"200403"}}; struct student *p=stu; 以下选项中引用结构体变量成员的表达式错误的是______。 A) (p++)->num B) p->num C) (*p).num D) stu[3].age 4、设有如下枚举类型定义 enum language {Basic=3,Assembly=6,Ada=100,COBOL,Fortran}; 枚举量Fortran的值为______。 A) 4 B) 7 C) 102 D) 103 5、以下叙述中错误的是_________。 A)可以通过typedef增加新的类型 B)可以用typedef将已存在的类型用一个新的名字来代表 C)用typedef定义新的类型名后,原有类型名仍有效 D)用typedef可以为各种类型起别名,但不能为变量起别名 6、有以下程序段 typedef struct NODE 一、填空题 1.若有如下结构体定义: struct student { int num; float age; char sex; }stud; 则stud所占的内存空间是9 字节。 2.已有定义和语句: union data { int i; char c; float f; }a,*p; p=a; 则对a中成员c的正确访问形式可以是 a.c 或: p->c或:(*p).c。(只需 写出一种) 二、单项选择题: 1.若有下列定义: struct b { float a[5]; double c; int d;}x; 则变量x在内存中所占的字节为下列哪一个:( C ) A.6 B. 10 C. 30 D. 14 2.设有以下说明语句,则下面的叙述不正确的是( C ) struct stu { int a; float b; } stutype; A. struct 是结构体类型的关键字。 B. struct stu 是用户定义的结构体类型。 C. stutype是用户定义的结构体类型名。 D. a和b都是结构体成员名。 3.下面程序的运行结果是( ) #include }today; printf(“%d\n”,sizeof(struct date)); } A. 6 B. 8 C. 10 D. 12 4.设有以下说明语句,则下面的叙述正确的是( B ) typedef struct { int a; float b; } stutype; A. stutype是结构体变量名。 B. stutype 是结构体类型名。 C. struct是结构体类型名。 D. typedef struct是结构体类型名。 三、填程序 1.结构数组中存有三人的姓名和年龄,以下程序输出三人中最年长者的姓名和年龄。请填 空。 static struct man { char name[20]; int age; }person[ ]={{“LiMing”,18},{“WangHua”,19},{“ZhangPing”,20}}; main( ) { struct man *p,*q; int old=0; p=person; for(; p 第九章结构体类型与公用体类型习题及其答案9-3编写程序,使用结构体类型,输出一年十二个月的英文名称及相应天数。 解:#include "stdio.h" struct date { char month[10] ; int daynumber ; } main() { int i ; date a[12] ={{"January",31},{"February",29},{"March",31},{"Apri al",30},{"May",31},{"June",30},{"july",31},{"August",31}, {"September",30},{"October",31},{"November",30},{"Decembe r",31}} ; for(i=0;i<12;i++); printf("%d 月:%s %d\n",i+1,a[i].month,a[i].daynumber) ; } 思考:如何对结构体变量进行初始化?对结构体变量的引用为何要体现为分量(或成员)的引用? 9-4 编写程序求空间任一点到原点的距离,点用结构体描述。并请考虑求空间中任意两点的距离的程序。 解:#include "stdio.h" #include "math.h" struct point { float x ; float y ; float z ; } void main() { double d1,d2,d ; point p1,p2 ; printf("请输入第一个点的坐标:"); scanf("%f,%f,%f",&p1.x,&p1.y,&p1.z); printf("请输入第二个点的坐标:"); scanf("%f,%f,%f",&p2.x,&p2.y,&p2.z); d1=sqrt(p1.x*p1.x+p1.y*p1.y+p1.z*p1.z); d2=sqrt(p2.x*p2.x+p2.y*p2.y+p2.z*p2.z); d=sqrt((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y)+(p 2.z-p1.z)*(p2.z-p1.z)); printf("第一个点到原点的距离:%f\n",d1); printf("第二个点到原点的距离:%f\n",d2); printf("两点间的距离:%f\n",d); } 9-5 编写输入、输出10个朋友数据的通讯录程序,每个朋友数据包括、地址、邮编、、传呼、手机等数据。 解:#include "stdio.h" struct AddressBook { char name[10] ; char address[30] ; char mailnumber[7] ; char telphone[12] ; char byphone[16] ; char movephone[1] ; } void main() { int i ; AddressBook fd[10] ; for(i=0;i<10;i++) { 1.定义一结构体,成员项包括一个字符型、一个整型。编程实现结构体变量成员项的输入、输出,并通过说明指针引用该变量。 #include getchar(); } for(b=0,a=stu[0].score,i=0;i https://www.doczj.com/doc/9e6244085.html,/2005/03/25/12365.html 所谓共用体类型是指将不同的数据项组织成一个整体,它们在内存中占用同一段存储单元。其定义形式为: union 共用体名 {成员表列}; 7.5.1 共用体的定义 union data { int a ; float b ; d o u b l e c ; c h a r d ; } obj; 该形式定义了一个共用体数据类型union data ,定义了共用体数据类型变量o b j。共用体 数据类型与结构体在形式上非常相似,但其表示的含义及存储是完全不同的。先让我们看一个小例子。 [例7 - 8 ] union data /*共用体* / { int a; float b; double c; char d; } m m ; struct stud /*结构体* / { int a; float b; double c; char d; } ; m a i n ( ) { struct stud student printf("%d,%d",sizeof(struct stud),sizeof(union data)); } 程序的输出说明结构体类型所占的内存空间为其各成员所占存储空间之和。而形同结构体的 共用体类型实际占用存储空间为其最长的成员所占的存储空间。详细说明如图7 - 6所示。 对共用体的成员的引用与结构体成员的引用相同。但由于共用体各成员共用同一段内存 空间,使用时,根据需要使用其中的某一个成员。从图中特别说明了共用体的特点,方便程序设计人员在同一内存区对不同数据类型的交替使用,增加灵活性,节省内存。 7.5.2 共用体变量的引用 可以引用共用体变量的成员,其用法与结构体完全相同。若定义共用体类型为: union data /*共用体* / { int a; float b; double c; char d; } m m ; 其成员引用为:m m . a , m m . b , m m . c , m m . d 但是要注意的是,不能同时引用四个成员,在某一时刻,只能使用其中之一的成员。 [例7-9] 对共用体变量的使用。 m a i n ( ) { union data { int a; float b; double c; char d; } m m ; m m . a = 6 ; printf("%d\n",mm.a); m m . c = 6 7 . 2 ; p r i n t f ( " % 5 . 1 l f \ n " , m m . c ) ; m m . d = ' W ' ; m m . b = 3 4 . 2 ; p r i n t f ( " % 5 . 1 f , % c \ n " , m m . b , m m . d ) ; } 实验九参考程序 实验 9- 1 /**************************************************************** * 实验 9.1 * * ( 1 )为某商店的商品设计合适的结构体 (PRODUCT) 。每一种商品包含编号 (number) 、 * 名称 (name) 、价格 (price) 、折扣 (discount)4 项信息,根据表 9-1 ,为这些信 息选择合适的数据类型。 * (2)建立 2个函数,以实现对商品的操作。 input 函数实现商品的输入; * display 函数显示商品信息。要求这 2个函数都以商品的结构体 (PRODUCT) 指针为 参数。 * (3 )在主函数中为商品键盘定义一个结构体变量 (keyboard) ,利用 input 函数实现键 盘信息的输入; * 定义一个结构体数组 (elec_device[3]) ,利用 input 函数实现冰箱、 空调、电视 信息的输入; * 最后利用 display 函数显示 4 种商品的信息。 * * 表 9-1 #include 最终排名 Time Limit: 1000MS Memory limit: 65536K 题目描述 第四届山东理工大学ACM网络编程擂台赛比赛完后需要产生一个最终排名,排名按照题数多少来决定。但是有太多的队伍参与,手动计算排名已经不能满足比赛的需求。现在有一份名单记录各个队伍的ID和做出的题目数,需要你写一个程序,产生最终的排名。 为了简化题目,这里的排名规则为:做出题目数量多的队伍排在前面,如果题数相等,保持输入时的相对顺序不要改变。 输入 第一行包含一个正整数T( 1≤T≤15),表示有T组测试数据。每组数据第一行有一个正整数N(1< N≤10000),表示队伍数量。接下来N 行包含两个整数,1≤ID≤10^7, 0≤M≤100。ID为队伍的编号,M为做出的题数。 输出 每组数据输出包含N行,第i行有两个整数,ID和M表示排在第i位的队伍的ID和做出的题数。 示例输入 1 8 1 2 16 3 11 2 20 3 3 5 26 4 7 1 22 4 示例输出 3 5 26 4 22 4 16 3 20 3 1 2 11 2 7 1 #include 习题六 1、从下列四个选项中选择一个正确得填入括号中。 (1)在说明一个结构体变量时系统分配给它得存储空间就是( D)。 A该结构体中第一个成员所需存储空间 B该结构体中最后一个成员所需存储空间 C该结构体中占用最大存储空间得成员所需存储空间 D该结构体中所有成员所需存储空间得总与 (2)在说明一个共用体变量时系统分配给它得存储空间就是(D )。 A该共用体中第一个成员所需存储空间 B该共用体中最后一个成员所需存储空间 C该共用体中占用最大存储空间得成员所需存储空间 D该共用体中所有成员所需存储空间得总与 (3)共用体类型在任何给定时刻, ( B)。 A所有成员一直驻留在内存中 B只有一个成员驻留在内存中 C部分成员驻留在内存中 D没有成员驻留在内存中 (4)以下定义结构体类型得变量st1,其中不正确得就是(A ) A typedef stuct student { int num; int age; }STD; STD st1; B struct student { int num,age; }st1; C struct { int num; float age; }st1; D struct student { int num; int age; }; struct student st1; (5)已知职工记录描述为: struct workers { int no; char name[20]; char sex; struct { int day; int month; int year; }birth; }; struct workers w; 设变量w中得”生日”应就是”1993年10月25日”,下列对”生日”得正确赋值方式就是( C)。 A day=25; month=10; year=1993; B w、day=25w、month=10; w、year=1993; C w、birth、day=25; w、birth、month=10; w、birth、year=1993; D birth、day=25; birth、month=10; birth、year=1993; (6)设有如下定义: struct sk { int a; float b; }data,*p; 若有p=&data;则对data中得a成员得正确引用就是( B)。 A (*p)、data、a B (*p)、a C p->data、a D p、data、a 2、填空 (1)若有以下说明与定义且数组w与变量k已正确赋值,则对w数组中第k个元素中各成员得正确引用形式就是 w[k-1]、b、 w[k-1]、c 、 w[k-1]、d 。 struct aa { int b; char c; double d; }; struct aa w[10]; int k=3; (2)若有以下说明与定义,则对x、b成员得另外两种引用形式就是 x->b-> 与 p、b、。 struct st { int a; struct st *b; }*p, x; p=&x; 3、阅读下面程序,写出运行结果。 (1),ffffffcc #include 第九章结构体与共用体 一、选择题 1.在说明一个结构体变量时系统分配给它的存储空间是。(0级) A)该结构体中第一个成员所需存储空间 B)该结构体中最后一个成员所需存储空间 C)该结构体中占用最大存储空间的成员所需存储空间 D)该结构体中所有成员所需存储空间的总和 2.若有以下说明和语句: struct worker { int no; char ﹡name; }work, ﹡p=&work; 则以下引用方式不正确的是。(1级) A) work.no B) (﹡p).no C) p->no D)work->no3.有如下定义: struct date { int year, month, day; }; struct worklist { char name[20]; char sex; struct date birthday; }person; 对结构体变量person的出生年份进行赋值时,下面正确的赋值语句是。 (1级) A) year=1958 B) birthday.year=1958 C) person.birthday.year=1958 D) person.year=1958 4.以下对结构体类型变量的定义中不正确的是。(1级) A)#define STUDENT struct student B) struct student STUDENT { int num; { int num; float age; float age; }std1; }std1; C) struct D) struct { int num; { int num; float age; float age; } student; }std1; struct student std1; 5.设有以下说明语句 struct stu { int a; float b; }stutype; 则下面的叙述不正确的是。(1级) A)struct是结构体类型的关键字 B)struct stu是用户定义的结构体类型 C)stutype是用户定义的结构体类型名 D)a和b都是结构体成员名 6.C语言结构体类型变量在程序执行期间。(0级) A)所有成员一直驻留在内存中 B)只有一个成员主留在内存中 C)部分成员驻留在内存中 D)没有成员驻留在内存中 实验10 结构体与公用体 1.实验目的、要求 (1)掌握结构体类型变量的定义和使用。 (2)掌握结构体类型数组的概念和使用。 (3)掌握公用体的概念与使用。 2.实验内容 (1)输入程序并运行,观察运行结果 #include “stdio.h” int main( ) { struct cmplx { int x; int y; } cnum[2]={1 , 3 , 2 , 7}; printf(“%d\n”, cnum[0].y / cnum[0].x * cnum[1].x ); return(0); } 运行此程序:按F2保存源程序,按F9完成一次编译连接,无提示错误,按任意键返回源程序行,按ctrl+F9运行,按alt+F5看结果,结果显示:6 (2)输入程序并运行,观察运行结果 union ks { int a; int b; }; union ks s[4]; union ks *p; #include “stdio.h” int main( ) { int n=1, i; printf(“\n”); for(i=0;i<4;i++) { s[i].a=n; s[i].b=s[i].a+1; n=n+2; } p=&s[0]; printf(“%d,”,p->a); printf(“%d” ,++ p->a); return(0); } 运行此程序:按F2保存源程序,按F9完成一次编译连接,无提示错误,按ctrl+F9运行,按任意键返回源程序行,按alt+F5看结果,结果显示:23 (3)编写程序 有10个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入10个学生数据,要求打印出3门课总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课成绩、平均分数)。要求用input 函数输入10个学生数据;用average函数求总平均分;用 第9章结构体与共用体 9.1典型考试题剖析 9.1.1选择题 【例1】若指针p已经正确定义,要使p指向两个连续的整型动态存储单元,不正确的语句是。 A) p=2*(int *)malloc(sizeof(int)); B) p=(int *)malloc(2*sizeof(int)); C) p=(int *)malloc(2*2); D) p=(int *)calloc(2,sizeof(int)); ?考点:动态存储分配函数。 ?分析:根据动态存储分配函数malloc和calloc的函数原型可以知道, calloc函数的调用形式为:void * calloc(unsigned n,unsigned size); 表示在动态存储区中分配n个长度为size的连续空间,函数返回一个指 向分配域起始地址的指针,因此答案D是正确的。malloc函数的调用形 式为:void * malloc(unsigned int size);表示是在内存的动态存储区 分配一个长度为size的连续空间,并返回一个指向分配域起始地址的指 针,答案B和C中malloc的参数分别为:2*(sizeof(int))和2*2, 都是整型数,因此调用形式正确。答案A中(int *)malloc(sizeof(int)) 的返回值为一个地址值,将地址的值乘以2是没有意义的。 ?答案:A 【例2】若有以下说明和定义: struct test { int m1; char m2; float m3; union uu { char u1[5]; int u2[2]; }ua; }myaa; 则sizeof(struct test)的值是。 A) 12 B) 16 C) 14 D) 9 ?考点:结构体类型和共用体类型所占内存的字节数。 ?分析:sizeof(struct test)的功能是求结构体类型test所占用的内 存字节数。它应该等于结构体每个成员所占的字节数之和。m1为int型,占2字节,m2为char型,占1字节,m3为float型,占4字节,接下 来是一个共用体类型uu,共用体所占的字节数应该等于成员中最长者所 占的字节数,u1占5字节,u2占4字节,那么该共用体类型应该占用5 字节,所以2+1+4+5=12。 ?答案:A结构体与共用体
结构体与共用体小结
第8章练习 结构体与共用体
结构体和共用体习题
结构体与共用体
结构体与共用体相关题目练习
结构体与联合体习题含答案
练习题-第十章 结构体与共用体(有答案)
第9章结构体类型与共用体类型习题及答案
结构体共用体与枚举课后习题
c语言结构体与共用体之间的区别
C语言结构体和共用体实验报告
结构体、共用体、枚举
结构体和共用体习题
第九章 结构体与共用体
C程序实验报告十 结构体与共用体
C语言各章节单元测试题及答案——结构体与共用体