《结构体共、用体与枚举类型.ppt》由会员分享,可在线阅读,更多相关《结构体共、用体与枚举类型.ppt(87页珍藏版)》请在三一办公上搜索。
1、第9章 结构体、共用体与枚举类型,本章要求为什么要引入结构体,结构体与数组有什么本质不同?如何定义结构体,有几种定义形式?结构体变量与结构体指针变量有何区别,它们如何各自引用结构体成员?结构体数据如何作为函数的参数?为什么要引入链表,如何利用链表对内存进行动态管理?本章重点结构体变量的定义和使用链表的概念本章难点动态链表的常见操作,第9章 结构体、共用体与枚举类型,9.1 问题的提出与示例9.2 结构体类型的说明与变量定义9.3 结构体指针变量9.4 结构体数组9.5结构体与函数9.6 链表与动态内存管理 9.7 结构体综合应用举例,9.1 问题的提出与示例,9.1.1 结构体概述,例如,描述
2、一个学生的数据实体包含学号、姓名、性别、出生年月、课程成绩、家庭住址、联系电话等数据项。各个数据项的类型是不同的,学号可为整型或字符串形式;性别为字符型;出生年月又分为年,月,日,它们可以分别为整型表示;课程成绩可以是整型或实型;家庭住址应为字符串;电话号码可以是整型或字符串形式。对于这样一个实体,不能统一用数组来描述,因为数组中各元素的类型、长度必须一致。如果用独立的简单数据项或数组分别表示它们,就不能体现一个实体数据的整体性和相互关联性,也难以操作。对于这种由多种不同类型的数据组成的数据实体,C语言专门用结构体数据类型来描述,结构体中所包含的数据项称为结构体的成员,结构体由用户根据实际来定
3、义。,9.1 问题的提出与示例,下表是一张100个学生成绩管理表,要求计算并打印出每个学生的平均成绩。,9.1 问题的提出与示例,如果按照以前学过的数组方法,可以定义如下的多个数组并赋初值如下:int stu_id100=84773801,84773802,84773803,84773804,84773805,84773806;/*定义一维数组存放每个学生的学号*/char stu_name1008=“陈云”,“沈栋栋”,“易婷婷”,“谢浩杰”,“郑强”;/*定义字符串数组存放每个学生的姓名*/char stu_sex100=m,m,f m,m;/*定义字符数组存放每个学生的性别*/int s
4、tu_year100=1989,1989,1990,1988,1988;/*定义一维数组存放每个学生的出生年份*/.,这些数组的数据在内存中的存储顺序是:先存储所有学生的学号、再接着存储所有学生的姓名、接着性别、出生年份、出生月份、联系电话、课程成绩、平均成绩。也就是把所有学生的同一个类别(上表中某一列)以定义某一个数组的形式单独放在一起,相当于所有学号放在一个数组里里,所有姓名放在另一个数组里,依次类推,要处理某一个学生的信息如计算平均值并打印某个学生的信息,要分别查询所有不同的数组,很容易出错且效率不高。这样为每一项内容分别定义变量或数组的方法导致存储结构零乱,处理过程非常繁琐,一般不采用
5、这种方法。,未了解决这个问题,C语言定义了一种可由用户自定义的数据类型,根据实际问题,将不同数据类型集中一起,把内在有联系的不同类型的数据统一成一个整体,设计符合要求的新的数据类型,称为结构体类型。这样利用结构体的特性可以把某一个学生的所有相关的不同类型的数据项都顺序存储在一起,便于一个个学生的处理。,如针对上述要求,可以定义为如下的学生的结构体:struct student int stu_id;/*学生的学号*/char stu_name8;/*学生的姓名*/char stu_sex;/*学生的性别*/struct int year;/*学生的出生年份*/int month;/*学生的出生
6、月份*/birthday;int stu_phone;/*学生的联系电话*/char stu_address30;/*学生的家庭地址*/int stu_course3;/*学生的三门课成绩*/float stu_average;/*学生的平均成绩*/;,声明了一种新的数据类型struct student。这个数据类型仅相当于一种结构模式,与int,float,char等类型具有同等地位,也就是用户自定义了一种新的数据类型,但并没有为struct student分配相应的存储空间,就像系统并没有为int分配存储空间一样,而是需要定义一个整型变量,为这个整型变量分配存储空间。同样的,也需要一个结构
7、体变量,为这个结构体变量分配存储空间。,【例9-1】按表9-1的形式从键盘依次输入每个学生的学号,姓名,出生年月,三门课的成绩,计算并打印出每个学生的平均成绩。分析:这里首先要定义一个描述学生学号,姓名,出生年月,三门课,平均成绩的结构体类型,再定义一个结构体变量,通过循环语句对这个结构体变量的各个成员的引用,读入某一个学生的各个数据项,再计算出某一个学生的平均成绩并打印某个学生的各个数据项。接着读下一个学生的数据项,再计算和打印各个数据项。,#include#define M 10struct student/*定义一个学生的结构体*/int stu_id;char stu_name8;st
8、ruct date/*定义一个内嵌的结构体*/int year;int month;birthday;float stu_course3;float stu_ave;,void main()int i;struct student p;/*定义一个结构体变量,具有struct student类型*/for(i=0;iM;i+)/*读入某一个学生的各个数据项*/printf(input studentid:n);scanf(%d,scanf(%f%f%f,9.1问题的提出与示例,说明:使用结构体数据,可将一个学生的数据有机组合起来,例中的stu是个结构体数组,stui表第i个学生的数组,stui
9、.num表第i个学生的学号,stui.name表第i个学生的姓名等。结构体的每一个成员都是通过其名字来引用,引用形式如下:结构体变量名.成员名结构体的引入为处理复杂的数据结构提供了有力的手段(如链表等),也为函数间传递一组不同类型的数据提供了方便。特别是对于数据结构比较复杂的大型程序提供了方便。,9.2结构体类型的说明与变量定义,9.2.1 结构体的声明 定义结构体类型的一般形式:struct 结构体名 结构成员1;结构成员2;结构成员n;其中,struct为结构体定义的关键字,不能省略。结构体名由用户给定,即是定义的结构体类型名。用两个花括号括住的内容是该结构体中的各个成员,每个成员又有自己
10、的数据类型,它们可以是整型、实型、字符型、指针或结构类型等,它们都应进行类型说明。,9.2结构体类型的说明与变量定义,有关结构体的几点说明:结构体类型的定义只是说明了一种结构体的组织形式,在编译时并不为它分配存储空间。只是在定义结构体类型变量后,才为变量按照其组织形式分配内存空间。结构体的成员可以是简单变量、数组、指针,还可以是另一个已定义的结构体或共用体变量。当定义一个结构体的成员又是一个结构体类型,这称为结构体的嵌套定义。struct date int year;int month;int day;,struct student int num;char name20;char sex;s
11、truct date birthday;float score;,9.2结构体类型的说明与变量定义,结构体定义可以在函数内部,也可在函数外部。在函数内部定义的结构体,只有在函数内部使用,在函数外部定义的结构体,从定义点起到源文件尾之间的所有函数都可使用。结构体成员的名字可以同程序中的其他变量名相同,两者的意义不同,不会相混。,9.2结构体类型的说明与变量定义,9.2.2 结构体变量定义先说明结构体类型,再定义变量,struct student int stu_id;char stu_name8;char stu_sex;struct int year;int month;birthdayflo
12、at stu_sc3;float stu_ave;,这里定义了一个结构体类型struct student,用它来定义结构体变量。例如:struct student std;这里定义了std为struct student类型的结构体变量,std的存储结构如图9-1所示。结构体变量中的各成员在内存中按说明中的顺序依次排列,具有这一结构体类型的变量中只能存放一个学生的档案。如果要存放多个学生的档案,就要使用结构体数组。,9.2结构体类型的说明与变量定义,在声明类型的同时定义变量 struct 结构体名 成员列表;变量名表列;struct student int num;char name20;cha
13、r sex;int age;float score;stu1,stu2;,9.2 结构体类型的说明与变量定义,直接定义结构类型变量 struct 成员表列;变量名表列;struct int num;char name20;char sex;int age;float score;stu1,stu2;,4.使用typedef 说明一个结构体类型名,再用新类型名来定义变量。其一般形式为:typedef struct STU;STU std;这里STU是一个具体的结构体类型名,能够唯一地标识这种结构体类型。可以用它来定义变量,如同使用int,float一样,不需要再写关键字struct。这种定义方式
14、较为常见。,9.2 结构体类型的说明与变量定义,对结构体变量,系统要为其分配存储空间。一个结构体变量所占存储空间的大小,是其所含结构体成员所占存储空间的总和,这些结构体成员所占的存储空间是由一组连续的存储空间所组成。也可用sizeof运算来求得,一个变量或数据类型在内存中所占内存空间的字节数,使用形式是:sizeof(变量名)或 sizeof(类型标识符),9.2 结构体类型的说明与变量定义,9.2.3 结构体变量的引用C语言中除两个相同类型结构体变量可以相互整体赋值外,不能对结构体变量名直接引用,只能对结构体变量中的成员分别进行引用,即对结构变量的操作,如赋值、输入、输出、运算等都是通过结构
15、变量的成员来实现的。结构体变量的引用格式 结构体变量名.成员名 stu1.num=10001;strcpy(stu1.name,zhang);/*此处不能写成 stu1.name=zhang*/stu1.sex=M;stu1.age=19;stu1.score=88;,9.2 结构体类型的说明与变量定义,9.2.3 结构体变量的引用不能把结构变量作为整体进行输入输出,下面的引用方式是错误的:scanf(%d%s%c%d%f,stu1);正确的引用方式可以是:gets(stu1.name);scanf(%d%c%d%f,9.2 结构体类型的说明与变量定义,结构体嵌套时逐级引用 struct da
16、te int month;int day;int year;struct person char name20;char sex;struct date birthday;struct person person1;person1.birthday.month,9.2 结构体类型的说明与变量定义,同类型结构体变量间的整体赋值 结构体变量可以通过整体赋值,将一个结构体变量中的所有数据,赋给另一个结构体类型相同的结构体变量中对应的数据成员。例8-2 建立一个学生的基本情况表,然后将其打印输出。#include#include main()struct student int num;char na
17、me20;char sex;int age;float score;stu1,stu2;,9.2 结构体类型的说明与变量定义,stu1.num=10001;strcpy(stu1.name,zhang);stu1.sex=M;stu1.age=19;stu1.score=88;stu2=stu1;/*同类结构体变量之间可以赋值*/printf(stu1:%d,%s,%c,%d,%6.2fn,stu1.num,stu1.name,stu1.sex,stu1.age,stu1.score);printf(stu2:%d,%s,%c,%d,%6.2fn,stu2.num,stu2.name,stu2
18、.sex,stu2.age,stu2.score);,9.2 结构体类型的说明与变量定义,2.结构体变量的初始化 结构体变量定义时的初始化形式如下:struct结构体名 变量名=各成员值列表;#include#include main()struct student int num;char name20;char sex;int age;float score;stu2,stu1=10001,zhang,M,19,88;stu2=stu1;printf(stu1:%d,%s,%c,%d,%6.2fn,stu1.num,stu1.name,stu1.sex,stu1.age,stu1.scor
19、e);printf(stu2:%d,%s,%c,%d,%6.2fn,stu2.num,stu2.name,stu2.sex,stu2.age,stu2.score);,3.结构体变量的输入与输出C 语言不能把一个结构体变量作为一个整体进行输人或输出,应该按成员变量输人输出。例如:struct worker char name12;char addr20;float salary;work=Wang Jun,JiangDong Road 20,2100.0结构体变量work的初始值在内存中的存储是按成员变量依次存放的,,由于变量work 包含两个字符串数据和一个浮点型数据,因此输出work 变量
20、,应该使用如下方式:printf(%s,%s,%fn,work.name,work.addr,work.salary);输入work变量各成员的值,则用如下语句:scanf(%s%s%f,work.name,work.addr,/*输出work.name数组中的字符串*/,9.3 结构体指针变量,9.3.1 指向结构体的指针 可以用一个指针指向结构体变量,指向结构体变量的指针的值是该结构体变量所分配的存储区域的首地址。结构指针变量的定义 struct student int num;char name20;char sex;int age;float score;stu1=10001,zhan
21、g,M,19,88;struct student*p=,9.3 结构体指针变量,通过指针访问结构体变量的成员(结构体类型数据的间接引用)结构变量中简单成员的引用形式有下面3种:结构变量名.成员名(名字引用)结构指针-成员名(指针引用)(*结构指针).成员名,9.3 结构体指针变量,例 使用指向结构变量的指针来访问输出结构变量的各个成员的值。#include#include void main()struct student int num;char name20;char sex;int age;float score;stu1=10001,zhang,M,19,88;struct stude
22、nt*p=,【例9-2】输入某个职工的姓名,工资,奖金和扣款,在原来工资的基础上增加%5,计算该职工的实发工资并输出每个职工的工资条。分析:首先要定义一个描述职工具体信息的结构体,然后定义一个结构体变量和指针变量,通过指针变量引用结构体成员读入该职工的信息,计算该职工新的工资和实发工资,最后输出该职工的工资情况。,#include struct worker char name12;float salary;float bonus;float deduction;float income;,void main()struct worker staff,*pwork;/*定义指针变量*/int
23、i;pwork=/*输出工资条*/,9.4 结构体数组,一个结构体变量中可以存放一组数据(如一个学生的学号、姓名、成绩等数据)如果有多个学生的数据需要参加运算和处理,就要使用结构体数组。数组是相同数据类型的集合,结构体数组与以前介绍过的数值型数组不同之处在于数组元素都是结构体类型的数据。9.4.1 结构体数组的定义 struct student int num;char name20;char sex;int age;float score;struct student stu10;,9.4 结构体数组,9.4.2 结构体数组的初始化 struct 结构体名 结构体数组名=第0个元素各成员 第
24、1个元素各成员,;例如:struct student int num;char name20;char sex;int age;float score;stu4=10001,Zhang,M,19,88,10002,Li,M,18,90,10003,He,F,20,92,10004,Cheng,F,18,70;,9.4 结构体数组,9.4.3 结构体数组与指针 可以用一个指针指向结构体数组,指向结构体数组的指针的值是该结构体数组所分配的存储区域的首地址。struct student int num;char name20;char sex;int age;float score;struct s
25、tudent*p;struct student stu10;p=stu;,9.4 结构体数组,p-num;/*引用stu0.num*/p+;/*p+1后指向stu1起始地址*/p-num;/*引用stu1.num*/,9.4.4 结构体数组应用实例,例9-4 建立10名学生的信息表,每个学生的数据包括学号、姓名、及三门课的成绩。要求从键盘输入这10名学生的信息,并按照每一行显示一名学生信息的形式将10名学生的信息显示出来。#define N 10/*N代表学生人数*/#include#include struct student/*定义student结构体类型*/int num;char na
26、me20;float score3;,9.4.4 结构体数组应用实例,void main()int i,j;struct student stuN;for(i=0;iN;i+)/*用for循环输入10名学生的信息*/scanf(%d,%s,9.4.4 结构体数组应用实例,例9-5 用指向结构体数组的指针改写例9-4 void main()int i,j;struct student*p,stuN;p=stu;for(i=0;inum);printf(%s,p-name);printf(%6.1f,%6.1f,%6.1fn,p-score0,p-score1,p-score2);,9.5 结构体
27、与函数,9.5.1 结构体变量作为函数参数例9-6 在例8-4中,10名学生的信息输出改为通过调用print函数完成。void main()int i,j;struct student stuN;void print(struct student stu);for(i=0;iN;i+)scanf(%d%s,9.5 结构体与函数,9.5.2 结构体数组作函数参数 例9-7 将例9-5中的结构体数组的输入与输出都写成函数,在main函数中调用这些函数实现10名学生的信息输入及输出。void main()int i,j;struct student stuN;void myscan(struct s
28、tudent stu,int n);/*函数声明*/void myprint(struct student stu,int n);/*函数声明*/myscan(stu,N);myprint(stu,N);getch();,9.5 结构体与函数,void myscan(struct student stu,int n)/*输入n个学生记录函数*/int i,j;for(i=0;in;i+)scanf(%d%s,9.5 结构体与函数,void myprint(struct student stu,int n)/*输出n个学生记录函数*/int i,j;for(i=0;in;i+)printf(%d
29、%s,stui.num,stui.name);for(j=0;j3;j+)printf(%6.1f,stui.scorej);printf(n);,9.5 结构体与函数,9.5.4 返回结构体指针的函数例9-8 建立10名学生的信息表,每个学生的数据包括学号、姓名、及三门课的成绩。输出总分最高的学生记录,要求将查找该记录的过程编制为函数。#include#include#define N 10struct student int num;char name20;float score3;float sum;,9.5 结构体与函数,main()struct student*search_max(
30、struct student*x,int n);int i,j;struct student stuN,*p;for(i=0;inum,p-name);printf(%6.1f,%6.1f,%6.1f,%6.1fn,p-score0,p-score1,p-score2,p-sum);,9.5 结构体与函数,/*查找最高分学生的记录函数,返回值为指向该记录的指针*/struct student*search_max(struct student*x,int n)int i,k=0;for(i=1;isum-(x+k)sum)k=i;/*与if(xi.sumxk.sum)k=i;等价*/retur
31、n x+k;/*返回最高分记录的指针*/,【书上台阶例9-4】用结构体类型描述复数,编写程序,计算并输出复数的加、减运算结果,要求复数加、减和输出都用函数完成。分析:首先用一个结构体的二个成员定义一个复数的实部和虚部,再定义二个具有这个结构体变量x,y。在主函数中,输入二个复数的虚实部,通过调用函数add和sub,把结构体变量x,y作为实参传递给形参,也就是把从键盘得到的二个复数的虚实部的值传给形参x,y,在函数内部作二个复数的加减运算后,返回到主函数,通过调用打印函数print_out,把复数的加减运算结果输出。,#include typedef struct complex/*定义复数类型
32、*/float re;float im;comp;comp add(comp,comp);comp sub(comp,comp);void print_out(comp);,void main()comp x,y,z;printf(Input two complex number please:n);printf(第一个复数 a+bi:);scanf(%f+%fi,comp add(comp x,comp y)/*复数的加法运算*/comp z;z.re=x.re+y.re;z.im=x.im+y.im;return z;comp sub(comp x,comp y)/*复数的减法运算*/co
33、mp z;z.re=x.re-y.re;z.im=x.im-y.im;return z;,void print_out(comp z)/*复数的输出*/printf(%.2f,z.re);if(z.im0)printf(+%.2f in,z.im);else printf(-%.2f in,-z.im);,9.6 链表与动态内存管理,【例9-7】一个简单的链表。#include stdio.hstruct node int data;struct node*next;void main()struct node a,b,c,*h,*p;a.data=70;b.data=80;c.data=90
34、;h=,9.6 链表与动态内存管理,9.6 链表与动态内存管理,1、malloc函数 void*malloc(unsigned int size);在内存的动态存储区中分配一个长度为size的连续空间,函数的返回值为指向该区域起始地址的指针(基类型为void);若分配不成功则返回NULL。例如语句:struct node*p;p=(struct node*)malloc(sizeof(struct node);表示分配一个struct node类型的内存空间,将函数的返回值强制转换为指向struct node类型的指针,且把该指针赋予指针变量p。,9.6 链表与动态内存管理,2、calloc函
35、数 void*calloc(unsigned n,unsigned size);在内存的动态存储取中分配n个长度为size的连续空间,函数的返回值为指向该区域起始地址的指针(基类型为void);若分配不成功则返回NULL。3、free函数 void free(void*p);释放由p指向的内存区,使这部分内存区能被其他变量使用。p是调用malloc或calloc函数时的返回值。free()函数无返回值。,9.6 链表与动态内存管理,创建一个链表一般需要以下几个步骤:(1)定义链表的数据结构。(2)读取数据。(3)生成新结点,即利用malloc()函数向系统申请分配一个结点。如:struct n
36、ode*head;head=(struct node*)malloc(sizeof(struct node);(4)将数据存入结点的成员变量中。(5)将新结点插入到链表中。(6)判断是否有后续结点要接入链表,若有转到(3),否则结束。,9.6 链表与动态内存管理,【例9-8】编写函数cerat,创建一个存放正整数的单链表,结点数据域中的数值从键盘输入,以-1作为输入结束标志。#includestdio.h#includestdlib.hstruct node/*定义链表结构*/int num;struct node*next;typedef struct node SNODE;/*说明新的类型
37、标识符SNODE*/,9.6 链表与动态内存管理,SNODE*creat()/*用于创建链表的函数*/int data;SNODE*h,*s,*r;h=(SNODE*)malloc(sizeof(SNODE);/*生成头结点*/r=h;scanf(%d,9.6 链表与动态内存管理,9.6 链表与动态内存管理,【例9-9】编写函数print,顺序输出存放正整数的单向链表各结点数据域中的内容。,void print(SNODE*head)/*用于输出链表的函数*/SNODE*p;p=head-next;/*p指向头结点后的第一个结点*/if(p=0)printf(nLinkList is NULL
38、!n);/*链表为空,只有头结点*/elseprintf(head);doprintf(-%d,p-num);/*输出当前结点数据域中的值*/p=p-next;/*p指向下一结点*/while(p!=NULL);printf(-endn);,9.6 链表与动态内存管理,int main()SNODE*head;/*定义头指针*/head=creat();/*调用建立链表的函数*/print(head);/*调用输出链表的函数*/return 0;,9.6 链表与动态内存管理,9.6 链表与动态内存管理,【例9-10】编写函数del,在单向链表中删除一个结点。SNODE*del(SNODE*he
39、ad,int number)/*用于删除结点的函数*/SNODE*p1,*p2;if(head=NULL)printf(nList is NULL!n);return(head);p1=head;while(number!=p1-num,9.6 链表与动态内存管理,int main()SNODE*head,*head2;int del_num;/*要删除的结点的数据*/printf(输入若干整型数据建立链表,以-1结束:);head=creat();/*调用建立链表的函数*/printf(原链表内容为:n);print(head);/*调用输出链表的函数*/printf(n输入要删除的数据:)
40、;scanf(%d,9.6 链表与动态内存管理,9.6 链表与动态内存管理,【例9-11】编写函数insert,在单向链表中插入一个结点。具体功能为:在值为x的结点前,插入值为y的结点;若值为x的结点不存在,则插在表尾。,9.6 链表与动态内存管理,SNODE*insert_node(SNODE*head,int x,int y)/*用于插入结点的函数*/SNODE*s,*p,*q;s=(SNODE*)malloc(sizeof(SNODE);/*生成新结点*/s-num=y;/*新结点中存入y*/q=head;p=head-next;/*p指向第一个结点,q为p的前趋*/while(p!=0
41、),9.7 结构体综合应用举例,【例9-12】编写一个程序实现对学生数据的操作,每个学生结点包括学号和一门课程的成绩,要求:(1)输入若干学生的学号和成绩建立链表;(2)能对链表进行输出;(3)能根据学号删除指定的学生结点;(4)能插入给定的学生结点。,9.7 结构体综合应用举例,struct nodelong number;float score;struct node*next;typedef struct node SNODE;,9.7 结构体综合应用举例,SNODE*insert_node(SNODE*head,long x,long y,float z)/*用于插入结点的函数*/SN
42、ODE*s,*p,*q;s=(SNODE*)malloc(sizeof(SNODE);/*生成新结点*/s-number=y;s-score=z;/*新结点中存入学号和分数*/q=head;p=head-next;/*p指向第一个结点,q为p的前趋*/while(p!=0),9.7 结构体综合应用举例,SNODE*del_node(SNODE*head,long x)/*用于删除结点的函数*/SNODE*p1,*p2;if(head=NULL)printf(nList is NULL!n);return(head);p1=head;while(x!=p1-number,9.7 结构体综合应用举
43、例,void print(SNODE*head)/*用于输出链表的函数*/SNODE*p;p=head-next;if(p=0)printf(nLinkList is NULL!n);elseprintf(head);doprintf(-%ld,%.0f,p-number,p-score);p=p-next;while(p!=NULL);printf(-endn);,9.7 结构体综合应用举例,SNODE*creat()/*用于创建链表的函数*/long num;float sco;SNODE*h,*s,*r;h=(SNODE*)malloc(sizeof(SNODE);r=h;printf(
44、n请输入学号(-1结束):);scanf(%ld,9.7 结构体综合应用举例,int main()SNODE*head,*head2,*head3;long ins_num;/*要插入的学号*/float ins_score;/*要插入的分数*/long x;/*插入位置*/long del_num;/*要删除的学号*/head=creat();/*调用建立链表的函数*/printf(原链表内容为:n);print(head);/*调用输出链表的函数*/printf(n输入要插入的位置(学号):);scanf(%ld,*9.8 共用体与枚举类型,union 共用体名成员表列;变量表列;如:un
45、ion dataint i;char ch;num1,num2;,*9.8 共用体与枚举类型,【例9-13】结构体和共用体结合,描述客车和货车。struct vehicleint wheel;/*车轮*/union float load;/*货车载重量*/int passengers;/*客车载客数*/;bus,truck;int main()bus.wheel=4;bus.passengers=40;truck.wheel=6;truck.load=15000;printf(The bus carries passengers:%dn,bus.passengers);printf(The t
46、ruck carries goods:%.0fn,truck.load);/*以下为不正确的使用方式*/printf(-n);bus.load=4000;printf(The bus load=%.0f,passengers=%dn,bus.load,bus.passengers);return 0;,*9.8 共用体与枚举类型,【例9-14】设有若干人员的数据,其中有教师和学生。教师数据中包括:教师号,姓名,性别,职业,职务。学生数据中包括:学号,姓名,性别,职业,班级。见图9-12。要求编写程序输入人员的数据,然后再输出。,*9.8 共用体与枚举类型,struct P/*人员结构体*/in
47、t num;char name10;char gender;char job;union/*表示第5项的共用体*/int s_class;char position10;category;person20;,*9.8 共用体与枚举类型,main()int i=0,j;printf(n输入号码(-1结束):);scanf(%d,*9.8 共用体与枚举类型,/*以下为输出部分*/printf(nNO.Name gender job class/positionn);for(j=0;ji;j+)if(personj.job=s)printf(%-6d%-12s%-8c%-8c%-10dn,perso
48、nj.num,personj.name,personj.gender,personj.job,personj.category.s_class);elseprintf(%-6d%-12s%-8c%-8c%-10sn,personj.num,personj.name,personj.gender,personj.job,personj.category.position);return 0;,*9.8 共用体与枚举类型,enum 枚举名 标识符,标识符 标识符枚举变量;例如:enum date1 Monday,Tuesday,Wednesday,Thursday,Friday workday;,
49、*9.8 共用体与枚举类型,【例9-15】设某月的第一天是星期一,编程实现输入该月的任意一天,由程序给出这一天是星期几。main()enum weeksun,mon,tue,wed,thu,fri,satday32;int i,j,num;j=1;/*某月的第一天为星期一,枚举元素mon对应1*/for(i=1;i32;i+)/*给每一天赋上对应的星期几*/dayi=(enum week)j;/*将整数强制转换为枚举类型后再赋值*/if(j=6)j=0;else j=j+1;printf(nInput day:);scanf(%d,*9.8 共用体与枚举类型,switch(daynum)case 0:printf(%d is Sundayn,num);break;case 1:printf(%d is Mondayn,num);break;case 2:printf(%d is Tuesdayn,num);break;case 3:printf(%d is Wednesdayn,num);break;case 4:printf(%d is Thursdayn,num);break;case 5:printf(%d is Fridayn,num);break;case 6:printf(%d is Saturdayn,num);break;return 0;,