《第5章复杂构造数据类型.ppt》由会员分享,可在线阅读,更多相关《第5章复杂构造数据类型.ppt(28页珍藏版)》请在三一办公上搜索。
1、第五章 复杂构造数据类型,2/28,第五章 复杂构造数据类型,5.1 结构体5.2 共用体5.3 枚举类型,3/28,5.1.1 结构体的引出及使用,每条记录中数据的数据类型不相同,如何表示如下的数据信息?,结构体是由一些逻辑相关,但数据类型不同的分量组成的一组数据。,4/28,结构体的定义,注意不要忘了分号,struct 结构体类型名 数据类型 成员名1;数据类型 成员名2;:数据类型 成员名n;,用户定义的标识符,说明:定义了结构体类型,仅仅是定义了数据的组织形式,创立了一种数据类型,但并不会为这种结构体类型分配内存空间,只有定义了结构体变量,才会为变量分配空间。,例:struct stu
2、dent int num;char name10;char sex;int age;int score;char institute20;,5/28,定义结构体变量的方法(1)先定义结构体类型,再定义变量 struct student char name10;int age;int s1,s2;struct student st1,st2;,结构体 类型定义,结构体 变量定义,内存中结构体变量占有一片连续的存储单元,其占用的字节数可用sizeof 运算符算出:printf(“%dn”,sizeof(struct student);printf(“%dn”,sizeof(st1);结构体变量st
3、1和st2各自都需要16个字节的存储空间,nameages1s2,6/28,定义结构体变量的方法(2)定义结构体类型同时定义变量 struct student char name10;int age;int s1,s2;st1,st2;(3)直接定义结构体变量 struct char name10;int age;int s1,s2;st1,st2;,注意:这里没有结构体类型名,这种方式有时使用并不方便,因此不建议大家采用,7/28,结构体类型可以嵌套定义,例:struct date int year;int month;int day;struct stud char name10;stru
4、ct date birthday;int s1,s2;,或:struct stud char name10;struct date int year;int month;int day;birthday;int s1,s2;,8/28,结构体变量的引用格式:结构体变量名.成员名,struct student char name10;int age;int s1,s2;,struct student st1;strcpy(st1.name,“Mary”);st1.age=21;st1.s1=78;st1.s2=86;,成员运算符,9/28,说明结构体变量通常不能整体使用,不能整体输入、输出,只能
5、对单个成员分别引用。但当结构体变量作为函数参数或赋初值时,可以整体输入;或者两个相同类型的结构体变量,如果一个已经赋值,可以对另外一个整体赋值。例:如果s1已被赋值,则可以:s2=s1;如果成员本身又属于一个结构体类型,则这个成员也不能整体赋值,要用若干个成员运算符引用,如前面的birthday成员本身又是date类型的变量,则需:stu1.birthday.month=4;stu1.birthday.day=5;可以引用结构体变量成员的地址,也可以引用结构体变量的地址,要区分清楚。如:printf(“%x”,10/28,结构体变量的初始化,struct student char name10
6、;int age;int s1,s2;st1=“Mary”,21,78,86;,struct stud char name10;struct date birthday;int s1,s2;struct stud st2=“John”,1980,11,23,89,95;,struct student char name10;int age;int s1,s2;struct student st1;st1=“Mary”,21,78,86;,初始化,正确,这是赋值,错误C不允许这么做,初始化,正确,11/28,结构体变量的输入和输出C语言不允许结构体变量整体进行输入和输出,只能对结构体变量的成员进
7、行输入和输出,例:gets(st1.name);scanf(“%d%d%d”,12/28,5.1.2 结构体数组的引出及使用,一个结构体变量只能存放一个学生的信息,对于多个学生的信息,可以使用一个结构体数组来存放,结构体数组的每个元素是一个结构体类型的变量定义结构体数组的方法与定义普通数组的方法类似:结构体类型 数组名数组的长度;,13/28,结构体数组的定义及使用,1、定义结构体数组(1)先定义结构体类型 再定义结构体数组:struct student char name10;int age;int s1,s2;struct student st6;,(2)定义结构体类型的同时定义结构体数组
8、:struct student char name10;int age;int s1,s2;st6;,(3)直接定义结构体数组 struct char name10;int age;int s1,s2;st6;,不提倡使用该方法,14/28,结构体数组的初始化 将每个数组元素的数据用花括号 括起来。,struct student char name10;int age;int s1,s2;struct student st3=“Mary”,21,78,86,“Alex”,20,90,80,“Mike”,19,75,68;,15/28,结构体数组的引用引用某个数组元素的成员 例:puts(st0
9、.name);printf(“%d,%d”,st1.age,st1.s1);数组元素之间可以整体赋值,也可以将一个元素赋给一个相同类型的结构体变量例:struct student st3=“Mary”,21,78,86,“Alex”,.;struct student x;st2=st0;x=st1;输入和输出操作只能对数组元素的成员进行,16/28,例5-1:按成绩对学生信息进行从高到底的排序,#include#define N 30struct stud int n;char name10;int s;,void input(struct stud a)int i;for(i=0;iN;i+
10、)scanf(“%d%s%d”,void output(struct stud a)int i;for(i=0;iN;i+)printf(“%4d%10s%4dn”,ai.n,ai.name,ai.s);,注意ai.name前不加&,因name是数组名,因用%s,输入时名字不能加空格,17/28,void sort(struct stud a)int i,j;struct stud temp;for(i=0;iN-1;i+)for(j=i+1;jN;j+)if(ai.saj.s)temp=ai;ai=aj;aj=temp;,void main()struct stud stN;input(st
11、);sort(st);output(st);,注意进行比较的是元素ai和aj的成绩成员s,但进行交换的是元素ai和aj,EG501.C,18/28,5.1.3 结构体与指针,指向结构体变量的指针定义:struct student char name20;int age;int s1,s2;struct student stu,*p;p=,成员的引用格式结构体变量名.成员名 stu.Name(*指针变量名).成员名(*p).age指针变量名-成员名 p-s1,19/28,指向结构体数组的指针定义:struct student a3,*p;使用:for(p=a;pname);scanf(“%d%d
12、%d”,20/28,5.2 共用体,概念所谓“共用体”类型,是指使几个不同类型的变量共同占用同一段内存单元。定义,union 共用体类型名 数据类型 成员名1;数据类型 成员名2;:数据类型 成员名n;,例:union data int i;char ch;float f;,21/28,定义共用体类型的变量:形式也有3种,同结构体类型,1、先定义类型,再定义变量union student char name10;int age;float s;union student st1,st2;,2、定义类型同时定义变量union student char name10;int age;float s
13、;st1,st2;,3、直接定义共用体变量 union char name10;int age;float s;st1,st2;,22/28,共用体变量所占的内存空间共用体变量所占内存的长度等于最长的成员的长度,而不是各成员的长度之和,这一点不同于结构体。例:上例所占字节数为10共用体变量的引用格式:共用体变量.成员名例:st1.name=“zhang”;st1.age=20;st1.s=78.5;,23/28,共用体类型数据的特点每一瞬时只能存放其中的一个成员,而不是同时存放几种,即其它成员不起作用,只有最后一个存放的成员的值有效,其他成员将失去原值。如上例中的变量st1只有最后一个成员值s
14、t1.s=78.5是有效的。共用体变量的地址和它的成员地址都是同一地址,即&st1和st1.name、&st1.age、&st1.s的起始地址都是一样的。共用体变量不能初始化,也不能对变量名整体赋值,不能引用变量名来输出一个值,只能引用它的某个成员。共用体变量不能作为函数的参数,也不能作为函数返回值。但可以使用指向共用体变量的指针。共用体类型可以出现在结构体中,共用体成员也可以是结构体类型。可以定义共用体数组。,24/28,数据类型定义:整体是一个结构体类型;其中第5项可以用共用体来处理。,例:struct member int num;char name20;float score1;dou
15、ble score2;union int class;char position10;catagory;mem20;,25/28,5.3 枚举类型,概念枚举是指将变量的所有取值一一列举出来,变量的取值只限于列举出来的值的范围。该变量称之为枚举型变量,所列举的值叫做枚举元素(枚举常量)。定义 enum 枚举类型名 枚举元素,枚举元素,枚举元素n;例:enum weekdaysun,mon,tue,wed,thu,fri,sat;,26/28,变量的定义先定义类型,再定义变量 enum weekdaysun,mon,tue,wed,thu,fri,sat;enum weekday day;定义类型
16、同时定义变量 enum weekday sun,mon,tue,wed,thu,fri,sat day;直接定义共用体变量 enum sun,mon,tue,wed,thu,fri,sat day;,27/28,说明C语言中枚举元素按常量处理,它们是有值的。它们的值是系统按其定义顺序自动赋予的 0、1、2、3、。枚举元素的值也可以改变,但必须在定义时指定。如:enum weekday sun=7,mon=1,tue,wd,thu,fri,dat;如果定义时未指定值,则按顺序取默认值。枚举元素是常量,不是变量,不能在定义以外的任何位置对它们赋值,如sun=5是错误的枚举值可用来做判断比较,如:if(day=sun);if(daymon&dayfri)枚举变量取值只能是所列举的枚举元素,不能直接赋予一个整数值,如:day2;,28/28,小结,掌握结构体的定义和引用掌握结构体变量所占字节大小掌握指向结构体变量的指针变量的用法掌握共用体的特点及所占字节大小掌握枚举类型的特点,