用户自己建立数据类型.pptx

上传人:牧羊曲112 文档编号:6592236 上传时间:2023-11-15 格式:PPTX 页数:142 大小:536.66KB
返回 下载 相关 举报
用户自己建立数据类型.pptx_第1页
第1页 / 共142页
用户自己建立数据类型.pptx_第2页
第2页 / 共142页
用户自己建立数据类型.pptx_第3页
第3页 / 共142页
用户自己建立数据类型.pptx_第4页
第4页 / 共142页
用户自己建立数据类型.pptx_第5页
第5页 / 共142页
点击查看更多>>
资源描述

《用户自己建立数据类型.pptx》由会员分享,可在线阅读,更多相关《用户自己建立数据类型.pptx(142页珍藏版)》请在三一办公上搜索。

1、9.1 定义和使用结构体变量9.2 使用结构体数组9.3 结构体指针9.4 用指针处理链表9.5 共用体类型9.6 使用枚举类型9.7 用typedef声明新类型名,第9章 用户自己建立数据类型,1,9.1.1 自己建立结构体类型9.1.2 定义结构体类型变量9.1.3 结构体变量的初始化和引用,9.1 定义和使用结构体变量,2,用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体例如,一个学生的学号、姓名、性别、年龄、成绩、家庭地址等项,是属于同一个学生的,因此组成一个组合数据,如student_1的变量,反映它们之间的内在联系,9.1.1 自己建立结构体类型,3,struct S

2、tudent int num;char name20;char sex;int age;float score;char addr30;,9.1.1 自己建立结构体类型,由程序设计者指定了一个结构体类型struct Student它包括num,name,sex,age,score,addr等不同类型的成员,4,声明一个结构体类型的一般形式为:struct 结构体名 成员表列;,9.1.1 自己建立结构体类型,类型名 成员名;,5,说明:(1)结构体类型并非只有一种,而是可以设计出许多种结构体类型,例如struct Teacherstruct Workerstruct Date等结构体类型各自包

3、含不同的成员,9.1.1 自己建立结构体类型,6,说明:(2)成员可以属于另一个结构体类型。struct Date int month;int day;int year;struct Stu int num;char name20;char sex;int age;struct Date birthday;char addr30;,9.1.1 自己建立结构体类型,7,说明:(2)成员可以属于另一个结构体类型。,9.1.1 自己建立结构体类型,8,前面只是建立了一个结构体类型,它相当于一个模型,并没有定义变量,其中并无具体数据,系统对之也不分配存储单元。相当于设计好了图纸,但并未建成具体的房屋。

4、为了能在程序中使用结构体类型的数据,应当定义结构体类型的变量,并在其中存放具体的数据。,9.1.2 定义结构体类型变量,9,1.先声明结构体类型,再定义该类型变量声明结构体类型struct Student,可以用它来定义变量 struct Student student1,student2;,9.1.2 定义结构体类型变量,结构体类型名,结构体变量名,10,1.先声明结构体类型,再定义该类型变量声明结构体类型struct Student,可以用它来定义变量 struct Student student1,student2;,9.1.2 定义结构体类型变量,student1,student2,1

5、1,2.在声明类型的同时定义变量struct Student int num;char name20;char sex;int age;float score;char addr30;student1,student2;,9.1.2 定义结构体类型变量,12,3.不指定类型名而直接定义结构体类型变量其一般形式为:struct 成员表列 变量名表列;指定了一个无名的结构体类型。,9.1.2 定义结构体类型变量,13,(1)结构体类型与结构体变量是不同的概念,不要混同。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型是不分配空间的,只对变量分配空间。(2)结构体类型中

6、的成员名可以与程序中的变量名相同,但二者不代表同一对象。(3)对结构体变量中的成员(即“域”),可以单独使用,它的作用与地位相当于普通变量。,9.1.2 定义结构体类型变量,14,例9.1 把一个学生的信息(包括学号、姓名、性别、住址)放在一个结构体变量中,然后输出这个学生的信息。解题思路:自己建立一个结构体类型,包括有关学生信息的各成员用它定义结构体变量,同时赋以初值输出该结构体变量的各成员,9.1.3 结构体变量的初始化和引用,15,#include int main()struct Student long int num;char name20;char sex;char addr20

7、;a=10101,“Li Lin”,M,“123 Beijing Road”;printf(NO.:%ldnname:%sn sex:%cnaddress:%sn,a.num,a.name,a.sex,a.addr);return 0;,16,#include int main()struct Student long int num;char name20;char sex;char addr20;a=10101,“Li Lin”,M,“123 Beijing Road”;printf(NO.:%ldnname:%sn sex:%cnaddress:%sn,a.num,a.name,a.se

8、x,a.addr);return 0;,17,#include int main()struct Student long int num;char name20;char sex;char addr20;a=10101,“Li Lin”,M,“123 Beijing Road”;,a.num=10010;对,printf(“%sn”,a);不对,18,#include int main()struct Student long int num;char name20;char sex;char addr20;a=10101,“Li Lin”,M,“123 Beijing Road”;,b=a

9、;对,struct Student b;,b.num+;对,19,#include int main()struct Student long int num;char name20;char sex;char addr20;a=10101,“Li Lin”,M,“123 Beijing Road”;,scanf(%ld,对,printf(%o,对,scanf(“%ld,%s,%c,%sn”,错,20,#include int main()struct Date int month;int day;int year;struct Stu int num;char name20;char sex

10、;int age;struct Date birthday;char addr30;a,b;,a.birthday.month=12;对,a.age=10;b.age=9;对,sum=a.age+b.age;对,21,例9.2 输入两个学生的学号、姓名和成绩,输出成绩较高学生的学号、姓名和成绩解题思路:(1)定义两个结构相同的结构体变量student1和student2;(2)分别输入两个学生的学号、姓名和成绩;(3)比较两个学生的成绩,如果学生1的成绩高于学生2,就输出学生1的全部信息,如果学生2的成绩高于学生1,就输出学生2的全部信息。如果二者相等,输出2个学生的全部信息,22,#incl

11、ude int main()struct Student int num;char name20;float score;student1,student2;scanf(%d%s%f,不能加&,23,printf(The higher score is:n);if(student1.scorestudent2.score)printf(%d%s%6.2fn,student1.num,student1.name,student1.score);else if(student1.scorestudent2.score)printf(%d%s%6.2fn,student2.num,student2.

12、name,student2.score);else printf(%d%s%6.2fn,student1.num,student1.name,student1.score);printf(%d%s%6.2fn,student2.num,student2.name,student2.score);return 0;,24,定义结构体数组9.2.2 结构体数组的应用举例,9.2 使用结构体数组,25,例9.3 有3个候选人,每个选民只能投票选一人,要求编一个统计选票的程序,先后输入被选人的名字,最后输出各人得票结果。解题思路:设一个结构体数组,数组中包含3个元素每个元素中的信息应包括候选人的姓名(

13、字符型)和得票数(整型)输入被选人的姓名,然后与数组元素中的“姓名”成员比较,如果相同,就给这个元素中的“得票数”成员的值加1输出所有元素的信息,定义结构体数组,26,#include#include struct Person char name20;int count;leader3=“Li”,0,“Zhang”,0,“Sun”,0;,全局的结构体数组,name,count,leader0,Li,0,Zhang,0,Sun,0,27,int main()int i,j;char leader_name20;for(i=1;i=10;i+)scanf(“%s”,leader_name);fo

14、r(j=0;j3;j+)if(strcmp(leader_name,leaderj.name)=0)leaderj.count+;for(i=0;i3;i+)printf(%5s:%dn“,leaderi.name,leaderi.count);return 0;,leaderj.count=leaderj.count+1;,28,int main()int i,j;char leader_name20;for(i=1;i=10;i+)scanf(“%s”,leader_name);for(j=0;j3;j+)if(strcmp(leader_name,leaderj.name)=0)lead

15、erj.count+;for(i=0;i3;i+)printf(%5s:%dn“,leaderi.name,leaderi.count);return 0;,29,说明:(1)定义结构体数组一般形式是 struct 结构体名 成员表列 数组名数组长度;先声明一个结构体类型,然后再用此类型定义结构体数组:结构体类型 数组名数组长度;如:struct Person leader3;,30,说明:(2)对结构体数组初始化的形式是在定义数组的后面加上:初值表列;如:struct Person leader3=Li,0,Zhang,0,Fun,0;,31,例9.4 有n个学生的信息(包括学号、姓名、成绩

16、),要求按照成绩的高低顺序输出各学生的信息。解题思路:用结构体数组存放n个学生信息,采用选择法对各元素进行排序(进行比较的是各元素中的成绩)。,9.2.2 结构体数组的应用举例,32,#include struct Student int num;char name20;float score;int main()struct Student stu5=10101,Zhang,78,10103,Wang,98.5,10106,Li,86,10108,“Ling”,73.5,10110,“Fun”,100;struct Student temp;const int n=5;int i,j,k;,

17、常变量,若人数变为30,30,33,#include struct Student int num;char name20;float score;int main()struct Student stu5=10101,Zhang,78,10103,Wang,98.5,10106,Li,86,10108,“Ling”,73.5,10110,“Fun”,100;struct Student temp;const int n=5;int i,j,k;,#define N 5,注意temp的类型,34,printf(The order is:n);for(i=0;istuk.score)k=j;te

18、mp=stuk;stuk=stui;stui=temp;for(i=0;in;i+)printf(%6d%8s%6.2fn,stui.num,stui.name,stui.score);printf(n);return 0;,写法上与普通变量一致,35,9.3.1 指向结构体变量的指针9.3.2 指向结构体数组的指针9.3.3 用结构体变量和结构体变量的指针作函数参数,9.3 结构体指针,36,指向结构体对象的指针变量既可以指向结构体变量,也可以用来指向结构体数组中的元素。指针变量的基类型必须与结构体变量的类型相同。例如:struct Student*pt;,9.3.1 指向结构体变量的指针,

19、37,例9.5 通过指向结构体变量的指针变量输出结构体变量中成员的信息。解题思路:在已有的基础上,本题要解决两个问题:怎样对结构体变量成员赋值;怎样通过指向结构体变量的指针访问结构体变量中成员。,9.3.1 指向结构体变量的指针,38,#include#include int main()struct Student long num;char name20;char sex;float score;,39,struct Student stu_1;struct Student*p;p=,stu_1,10101Li LinM89.5,p,40,struct Student stu_1;stru

20、ct Student*p;p=,stu_1,10101Li LinM89.5,p,41,说明:为了使用方便和直观,C语言允许把(*p).num用p-num来代替(*p).name等价于p-name如果p指向一个结构体变量stu,以下等价:stu.成员名(如stu.num)(*p).成员名(如(*p).num)p-成员名(如p-num),42,例9.6 有3个学生的信息,放在结构体数组中,要求输出全部学生的信息。解题思路:用指向结构体变量的指针处理(1)声明struct Student,并定义结构体数组、初始化(2)定义指向struct Student类型指针p(3)使p指向数组首元素,输出元素

21、中各信息(4)使p指向下一个元素,输出元素中各信息(5)再使p指向结构体数组的下一个元素,输出它指向的元素中的有关信息,9.3.2 指向结构体数组的指针,43,#include struct Student int num;char name20;char sex;int age;struct Student stu3=10101,Li Lin,M,18,10102,Zhang Fun,M,19,10104,Wang Min,F,20;,44,int main()struct Student*p;printf(No.Name sex agen);for(p=stu;pnum,p-name,p-

22、sex,p-age);return 0;,stu0,stu1,stu2,45,int main()struct Student*p;printf(No.Name sex agen);for(p=stu;pnum,p-name,p-sex,p-age);return 0;,p,stu0,stu1,stu2,46,int main()struct Student*p;printf(No.Name sex agen);for(p=stu;pnum,p-name,p-sex,p-age);return 0;,p,stu0,stu1,stu2,47,int main()struct Student*p;

23、printf(No.Name sex agen);for(p=stu;pnum,p-name,p-sex,p-age);return 0;,p,stu0,stu1,stu2,48,将一个结构体变量的值传递给另一个函数,有3个方法。,9.3.3 用结构体变量和结构体变量的指针作函数参数,49,(1)用结构体变量的成员作参数。例如,用stu1.num或stu2.name作函数实参,将实参值传给形参。用法和用普通变量作实参是一样的,属于“值传递”方式。应当注意实参与形参的类型保持一致。,50,(2)用结构体变量作实参。用结构体变量作实参时,将结构体变量所占的内存单元的内容全部按顺序传递给形参,形参也

24、必须是同类型的结构体变量在函数调用期间形参也要占用内存单元。这种传递方式在空间和时间上开销较大在被调用函数期间改变形参(也是结构体变量)的值,不能返回主调函数一般较少用这种方法,51,(3)用指向结构体变量(或数组元素)的指针作实参,将结构体变量(或数组元素)的地址传给形参。,52,例9.7 有n个结构体变量,内含学生学号、姓名和3门课程的成绩。要求输出平均成绩最高的学生的信息(包括学号、姓名、3门课程成绩和平均成绩)。解题思路:将n个学生的数据表示为结构体数组。按照功能函数化的思想,分别用3个函数来实现不同的功能:用input函数输入数据和求各学生平均成绩用max函数找平均成绩最高的学生用p

25、rint函数输出成绩最高学生的信息在主函数中先后调用这3个函数,用指向结构体变量的指针作实参。最后得到结果。本程序假设n=3,53,#include#define N 3struct Student int num;char name20;float score3;float aver;,4个成员,前3个成员值输入得到,最后成员值计算得到,54,int main()void input(struct Student stu);struct Student max(struct Student stu);void print(struct Student stu);struct Student

26、stuN,*p=stu;input(p);print(max(p);return 0;,55,void input(struct Student stu)int i;printf(请输入各学生的信息:学号、姓名、三门课成绩:n);for(i=0;iN;i+)scanf(%d%s%f%f%f,输入第1个成员值,输入第2个成员值,stu0,stu1,stu2,stu,10101,Li,78 89 98,88.33,i=0,56,void input(struct Student stu)int i;printf(请输入各学生的信息:学号、姓名、三门课成绩:n);for(i=0;iN;i+)scan

27、f(%d%s%f%f%f,输入第1个成员值,输入第2个成员值,stu0,stu1,stu2,stu,10101,Li,78 89 98,88.33,10103,Wang,98.5 87 69,84.83,i=1,57,void input(struct Student stu)int i;printf(请输入各学生的信息:学号、姓名、三门课成绩:n);for(i=0;iN;i+)scanf(%d%s%f%f%f,输入第1个成员值,输入第2个成员值,stu0,stu1,stu2,stu,10101,Li,78 89 98,88.33,10103,Wang,98.5 87 69,84.83,101

28、06,Sun,88 76.5 89,84.5,i=2,58,struct Student max(struct Student stu)int i,m=0;for(i=0;istum.aver)m=i;return stum;,stu0,stu1,stu2,stu,10101,Li,78 89 98,88.33,10103,Wang,98.5 87 69,84.83,10106,Sun,88 76.5 89,84.5,最大,返回,59,void print(struct Student stud)printf(n成绩最高的学生是:n);printf(学号:%dn姓名:%sn 三门课成绩:%5.

29、1f,%5.1f,%5.1fn 平均成绩:%6.2fn”,stud.num,stud.name,stud.score0,stud.score1,stud.score2,stud.aver);,stud,10101,Li,78 89 98,88.33,10103,Wang,98.5 87 69,84.83,10106,Sun,88 76.5 89,84.5,num,name,score,aver,stu0,stu1,stu2,60,以上3个函数的调用,情况各不相同:调用input函数时,实参是指针变量,形参是结构体数组,传递的是结构体元素的地址,函数无返回值。调用max函数时,实参是指针变量,形

30、参是结构体数组,传递的是结构体元素的地址,函数的返回值是结构体类型数据。调用print函数时,实参是结构体变量,形参是结构体变量,传递的是结构体变量中各成员的值,函数无返回值。,61,什么是链表9.4.2 建立简单的静态链表9.4.3 建立动态链表9.4.4 输出链表,9.4 用指针处理链表,62,链表是一种常见的重要的数据结构它是动态地进行存储分配的一种结构,什么是链表,head,1249,1249,A,1356,1356,1475,B,1475,C,1021,1021,D,NULL,头指针,各结点地址不连续,各结点含有两个部分,表尾,63,链表是一种常见的重要的数据结构它是动态地进行存储分

31、配的一种结构链表必须利用指针变量才能实现,什么是链表,64,struct Student int num;float score;struct Student*next;a,b,c;,a结点,b结点,c结点,a.next=,b.next=,num,score,next,65,例9.8 建立一个如图所示的简单链表,它由3个学生数据的结点组成,要求输出各结点中的数据。,9.4.2 建立简单的静态链表,a结点,b结点,c结点,num,score,next,66,解题思路:,9.4.2 建立简单的静态链表,a结点,b结点,c结点,num,score,next,head,head=,a.next=,b.

32、next=,NULL,c.next=NULL;,67,#include struct Student int num;float score;struct Student*next;,68,int main()struct Student a,b,c,*head,*p;a.num=10101;a.score=89.5;b.num=10103;b.score=90;c.num=10107;c.score=85;head=,69,p=head;do printf(“%ld%5.1fn”,p-num,p-score);p=p-next;while(p!=NULL);return 0;,a结点,b结点

33、,c结点,num,score,next,head,NULL,p,相当于p=,70,p=head;do printf(“%ld%5.1fn”,p-num,p-score);p=p-next;while(p!=NULL);return 0;,a结点,b结点,c结点,num,score,next,head,NULL,p,相当于p=,71,p=head;do printf(“%ld%5.1fn”,p-num,p-score);p=p-next;while(p!=NULL);return 0;,a结点,b结点,c结点,num,score,next,head,NULL,p,相当于p=,72,p=head;

34、do printf(“%ld%5.1fn”,p-num,p-score);p=p-next;while(p!=NULL);return 0;,a结点,b结点,c结点,num,score,next,head,NULL,p,相当于p=,73,p=head;do printf(“%ld%5.1fn”,p-num,p-score);p=p-next;while(p!=NULL);return 0;,a结点,b结点,c结点,num,score,next,head,NULL,p,相当于p=NULL;,静态链表,74,所谓建立动态链表是指在程序执行过程中从无到有地建立起一个链表,即一个一个地开辟结点和输入各

35、结点数据,并建立起前后相链的关系。,9.4.3 建立动态链表,75,例9.9 写一函数建立一个有3名学生数据的单向动态链表。,9.4.3 建立动态链表,76,解题思路:定义3个指针变量:head,p1和p2,它们都是用来指向struct Student类型数据,struct Student*head,*p1,*p2;,77,解题思路:用malloc函数开辟第一个结点,并使p1和p2指向它,p1,p1=p2=(struct Student*)malloc(LEN);,p2,78,解题思路:读入一个学生的数据给p1所指的第一个结点,p1,scanf(%ld,%f,p2,1010189.5,79,解

36、题思路:读入一个学生的数据给p1所指的第一个结点使head也指向新开辟的结点,head,p1,p2,scanf(%ld,%f,1010189.5,80,解题思路:再开辟另一个结点并使p1指向它,接着输入该结点的数据,head,p1,p2,1010189.5,81,解题思路:再开辟另一个结点并使p1指向它,接着输入该结点的数据,head,p1,p2,1010189.5,p1=(struct Student*)malloc(LEN);scanf(%ld,%f,1010390,82,解题思路:使第一个结点的next成员指向第二个结点,即连接第一个结点与第二个结点使p2指向刚才建立的结点,head,p

37、1,p2,1010189.5,p2-next=p1;,1010390,83,解题思路:使第一个结点的next成员指向第二个结点,即连接第一个结点与第二个结点使p2指向刚才建立的结点,head,p1,p2,1010189.5,p2-next=p1;,1010390,p2=p1;,84,解题思路:再开辟另一个结点并使p1指向它,接着输入该结点的数据,head,p1,p2,1010189.5,1010390,85,解题思路:再开辟另一个结点并使p1指向它,接着输入该结点的数据,head,p1,p2,1010189.5,1010390,p1=(struct Student*)malloc(LEN);s

38、canf(%ld,%f,1010785,86,解题思路:使第二个结点的next成员指向第三个结点,即连接第二个结点与第三个结点使p2指向刚才建立的结点,head,p1,p2,1010189.5,1010390,1010785,p2-next=p1;,87,解题思路:使第二个结点的next成员指向第三个结点,即连接第二个结点与第三个结点使p2指向刚才建立的结点,head,p1,p2,1010189.5,1010390,1010785,p2-next=p1;,p2=p1;,88,解题思路:再开辟另一个结点并使p1指向它,接着输入该结点的数据,head,p1,p2,1010189.5,1010390

39、,1010785,89,解题思路:再开辟另一个结点并使p1指向它,接着输入该结点的数据,head,p1,p2,1010189.5,1010390,1010785,p1=(struct Student*)malloc(LEN);scanf(%ld,%f,90,解题思路:输入的学号为0,表示建立链表的过程完成,该结点不应连接到链表中,head,p1,p2,1010189.5,1010390,1010785,NULL,p2-next=NULL;,91,#include#include#define LEN sizeof(struct Student)struct Student long num;f

40、loat score;struct Student*next;int n;,struct Student类型数据的长度,92,struct Student*creat(void)struct Student*head,*p1,*p2;n=0;p1=p2=(struct Student*)malloc(LEN);scanf(“%ld,%f”,p1总是开辟新结点p2总是指向最后结点用p2和p1连接两个结点,93,int main()struct Student*pt;pt=creat();printf(“nnum:%ldnscore:%5.1fn”,pt-num,pt-score);return

41、0;,94,例9.10 编写一个输出链表的函数print。,9.4.4 输出链表,100167.5,100387,100599,NULL,p,95,解题思路:输出p所指的结点使p后移一个结点,p,100167.5,100387,100599,NULL,printf(%ld%5.1fn,p-num,p-score);,96,100167.5,100387,100599,NULL,p=p-next;,解题思路:输出p所指的结点使p后移一个结点,printf(%ld%5.1fn,p-num,p-score);,p,97,100167.5,100387,100599,NULL,解题思路:输出p所指的新

42、结点使p后移一个结点,printf(%ld%5.1fn,p-num,p-score);,p,98,100167.5,100387,100599,NULL,p=p-next;,解题思路:输出p所指的新结点使p后移一个结点,printf(%ld%5.1fn,p-num,p-score);,p,99,100167.5,100387,100599,NULL,p=p-next;,解题思路:输出p所指的新结点使p后移一个结点,printf(%ld%5.1fn,p-num,p-score);,p,相当于p=NULL;,100,void print(struct Student*p)printf(nThese

43、%d records are:n,n);if(p!=NULL)do printf(%ld%5.1fn,p-num,p-score);p=p-next;while(p!=NULL);,101,9.5.1 什么是共用体类型9.5.2 引用共用体变量的方式9.5.3 共用体类型数据的特点,9.5 共用体类型,102,有时想用同一段内存单元存放不同类型的变量。使几个不同的变量共享同一段内存的结构,称为“共用体”类型的结构。,9.5.1 什么是共用体类型,1000,1001,1002,1003,字符ch,整 型 变 量 i,实 型 变 量 f,103,定义共用体类型变量的一般形式为:union共用体名

44、成员表列变量表列;例如:union Data int i;char ch;float f;a,b,c;,union Data int i;char ch;float f;union Data a,b,c;,104,“共用体”与“结构体”的定义形式相似,但它们的含义是不同的。结构体变量所占内存长度是各成员占的内存长度之和,每个成员分别占有其自己的内存单元。而共用体变量所占的内存长度等于最长的成员的长度。,105,只有先定义了共用体变量才能引用它,但应注意,不能引用共用体变量,而只能引用共用体变量中的成员。例如,前面定义了a,b,c为共用体变量,下面的引用方式是正确的:a.i a.ch a.f,9

45、.5.2 引用共用体变量的方式,106,在使用共用体类型数据时要注意以下一些特点:同一个内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一个成员,而不是同时存放几个。可以对共用体变量初始化,但初始化表中只能有一个常量。共用体变量中起作用的成员是最后一次被赋值的成员,在对共用体变量中的一个成员赋值后,原有变量存储单元中的值就取代。共用体变量的地址和它的各成员的地址都是同一地址。不能对共用体变量名赋值,也不能企图引用变量名来得到一个值。,9.5.3 共用体类型数据的特点,107,在使用共用体类型数据时要注意以下一些特点:以前的C规定不能把共用体变量作为函数参数,但可以使用指向共用体变

46、量的指针作函数参数。C99允许用共用体变量作为函数参数。共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。,9.5.3 共用体类型数据的特点,108,例9.11 有若干个人员的数据,其中有学生和教师。学生的数据中包括:姓名、号码、性别、职业、班级。教师的数据包括:姓名、号码、性别、职业、职务。要求用同一个表格来处理。,9.5.3 共用体类型数据的特点,109,解题思路:学生和教师的数据项目多数是相同的,但有一项不同。现要求把它们放在同一表格中,110,解题思路:如果job项为s,则第项为class。即Li是501班

47、的。如果job项是t,则第项为position。Wang是prof(教授)。,111,解题思路:对第5项可以用共用体来处理(将class和position放在同一段存储单元中),112,#include struct int num;char name10;char sex;char job;union int clas;char position10;category;person2;,外部的结构体数组,共用体变量,113,#include union Categ int clas;char position10;struct int num;char name10;char sex;cha

48、r job;union Categ category person2;,声明共用体类型,定义共用体类型变量,114,int main()int i;for(i=0;i2;i+)scanf(%d%s%c%c“,115,for(i=0;i2;i+)if(personi.job=s)printf(%-6d%-10s%-4c%-4c%-10dn,personi.num,personi.name,personi.sex,personi.job,personi.category.clas);else printf(%-6d%-10s%-4c%-4c%-10sn,personi.num,personi.na

49、me,personi.sex,personi.job,personi.category.position);return 0;,116,如果一个变量只有几种可能的值,则可以定义为枚举类型所谓“枚举”就是指把可能的值一一列举出来,变量的值只限于列举出来的值的范围内,9.6 使用枚举类型,117,声明枚举类型用enum开头。例如:enum Weekdaysun,mon,tue,wed,thu,fri,sat;声明了一个枚举类型enum Weekday然后可以用此类型来定义变量enum Weekday workday,weekend;,9.6 使用枚举类型,枚举元素,枚举变量,118,workday

50、=mon;正确weekend=sun;正确weekday=monday;不正确,9.6 使用枚举类型,119,说明:(1)C编译对枚举类型的枚举元素按常量处理,故称枚举常量。不要因为它们是标识符(有名字)而把它们看作变量,不能对它们赋值。例如:sun=0;mon=1;错误,120,说明:(2)每一个枚举元素都代表一个整数,语言编译按定义时的顺序默认它们的值为0,1,2,3,4,5在上面定义中,sun的值为0,mon的值为1,sat的值为6如果有赋值语句:workday=mon;相当于workday=1;,121,说明:(2)每一个枚举元素都代表一个整数,语言编译按定义时的顺序默认它们的值为0,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号