《第05章复杂构造数据类型.ppt》由会员分享,可在线阅读,更多相关《第05章复杂构造数据类型.ppt(34页珍藏版)》请在三一办公上搜索。
1、复杂构造数据类型,2,复杂构造数据类型,结构体共用体枚举类型,3,引入,对于同种类型的数据可以用数组来描述。在解决实际问题时,有时需要将多个不同数据类型的数据组合在一起表达一个整体的信息。如学生个人信息,包括姓名、学号、年龄等,就包含了字符数组和整型数据。,4,结构体,学生成绩表,在一条记录中既有整型数据(学号、分数等),又有字符串(姓名),像这样的数据是由几种不同类型的数据构成,是不能用前面学过的数组来表示的,因为数组的各个元素都是相同的数据类型。按照以前所学的数据类型是无法处理这种复杂数据的。为了解决这种问题,C语言将几种不同类型的数据组合到一起,这就是我们下面要介绍的结构体类型。,5,5
2、.1.1 结构体的引出及使用,(1)结构体的定义:由若干个不同类型的数据项组成的组合类型,在C语言中叫做结构体类型。,格式:struct 结构类型名 类型名1 成员名表1;类型名2 成员名表2;类型名n 成员名表n;,(1)结构体类型用struct关键字定义(2)花括号里的每一项称为结构体成员(3)结构体成员的类型可以是普通的数据类型(如int、char等),也可以是数组、指针或已经定义的结构体等任意的数据类型。,注意此处“;”不能省略,6,例如:职工的基本信息有以下几部分组成:编号、姓名、性别、年龄、班组、基本工资、奖金、保险、实发工资。分析:可以将每个工人的信息定义为一个结构体类型,设类型
3、名是worker,struct worker int num;char name20;char sex;int age;char branch20;float pay;float bonus;float insurance;float realpay;,7,注意:,结构体类型的定义并没有在内存中为其分配空间,仅仅定义了数据的组织形式,创立了一种数据类型,可以理解为以前学过的int、char等基本数据类型。只有在定义了结构体类型的变量后,才会在内存中为该变量分配空间。在为结构体变量分配存储空间时,每个结构体变量所占存储空间大小为其成员所占存储空间的总和。结构体类型在使用之前应先定义其类型结构,然
4、后再定义该类型变量,才能使用。,struct worker int num;char name20;char sex;int age;char branch20;float pay;float bonus;float insurance;float realpay;,共占2+20+1+2+20+4+4+4+4=61个字节,8,(2)定义结构体类型变量的方法,前面定义的worker同int、char等一样只是类型的名字,不是结构体变量,不能直接使用,需由此类型继续定义结构体变量才能使用。步骤:先定义一个结构体类型,再定义变量。struct 结构体类型名 变量名列表;注意:关键字struct 与结
5、构体类型标识符一起使用。例:struct worker w1,w2,w50;也可以在定义类型的同时定义结构体变量。还可以直接定义结构体变量,struct worker int num;char name20;char sex;int age;char branch20;float pay;float bonus;float insurance;float realpay;w1,w2,w50;,struct int num;char name20;char sex;int age;char branch20;float pay;float bonus;float insurance;float
6、realpay;w1,w2,w50;,注意:不出现类型名,9,定义了结构体变量后,系统为之分配内存单元,结构体的各成员在内存中是按顺序连续存放的,所以结构体变量在内存中占据的字节数是各个成员的长度和。可用求类型长度运算符求出 sizeof(类型名)如:sizeof(int)为2 sizeof(struct worker)为61;定义结构体变量必须指明具体的类型名,不同于定义int等标准数据类型变量,因为不同的结构体类型具有不同的结构组成。,struct w1,w2;,10,(3)结构体变量的引用,一般来说,在程序设计中不直接引用结构体变量,而是引用结构体变量的某个成员变量。成员的引用形式:结构
7、体变量名.成员名,struct student int num;char name10;char sex;int age;struct birth birthday;float score;char addr20;stu1;,stu1.num=9002;gets(stu1.name);stu1.sex=m;printf(“%d,%c”,stu1.num,stu1.sex);,11,结构体变量使用说明:,结构体变量通常不能整体使用,不能整体输入、输出,只能对单个成员分别引用。但当结构体变量作为函数参数或赋初值时,可以整体使用;或者两个相同类型的结构体变量,如果一个已经赋值,可以对另外一个整体赋值
8、。,如果student1已被赋值,则可以:student2=student1;,12,结构体成员也可以是另一个结构体变量,如前面的birthday成员本身又是birth类型的结构体变量,这个成员也不能整体赋值,要用若干个成员运算符引用。,stu1.birthday.month=4;stu1.birthday.day=5;stu1.birthday.year=1998;,例如:struct birth int month;int day;int year;,struct student int num;char name10;char sex;int age;struct birth birth
9、day;float score;char addr20;stu1;,13,(4)结构体变量的初始化,可以在定义结构体变量的同时,对其初始化例:struct student long int num;char name20;char sex;char addr20;a=9001,曹名,m,123 北京路;,相当于:a.num=9001;strcpy(a.name,“曹名”);a.sex=m;strcpy(a.addr,“123 北京路”);,14,5.1.2结构体数组的引出及使用,结构体数组中每一个数组元素都是一个结构体类型的数据,它们都分别包括各个成员项,例如一个班级的40名同学信息组成的数组
10、,每一个同学的数据都是一个结构体类型。,例:struct student int num;char name20;char sex;float score;char addr20;struct student stu40;,struct int num;char name20;char sex;float score;char addr20;stu40;,15,结构体数组各元素在内存中是连续存放的,各元素的成员也是按顺存放的。,16,结构体数组的初始化,例 struct student int num;char name20;char sex;float score;char addr20;s
11、tu3=10101,”Li Lin”,M,87.5,”103 Beijing”,10102,”Zu Feng”,F,98,”130 Shanghai”,10103,”Wang Mi”,M,78,”104 Jinan”;,17,5.1.4 结构体与指针,1.指向结构体变量的指针struct student long num;char name20;char sex;float score;stu1,*p;,p=*/,注:(1)此处*p相当于结构体变量(2)(*p).表示成员引用,()不能省略,因为成员运算符优先级最高。(3)可以用指向运算符来引用成员,例如可以用p-num来代替(*p).num,
12、18,3种引用结构体成员的方法 结构体变量.成员名(*p).成员名 p-成员名分析以下几种运算符:p-n p-n+p-n*p.num(错误!)应改为:(*p).num,19,2.指向结构体数组的指针,struct student int num;char name20;char sex;float score;struct student stu3,*p;for(p=stu;pnum,p-name,p-sex,p-score);,stu0,stu1,stu2,p,p+后指向 什么位置?,注意:p是指向结构体数组的元素的,不能用来指向数组元素中的某一成员,如 p=&stu1.num 是错误的。,
13、20,3.用结构体变量和其指针作为函数参数,结构体变量也是一种数据类型变量,因此也可以作为函数的参数。将一个结构体变量的值传递给一个函数有3个方法:(1)用结构体类型作参数。采用的是“值传递”的方式。调用时形参要占用内存单元,如果结构体复杂、规模大,其在时间和空间上的开销很大。而且值传递是单向的,使用不便。(2)用指向结构体变量的指针作实参,将结构体变量(或数组)的地址传递给形参。这种方法传递地址,既节省空间又可以双向传递值。(3)用结构体变量的成员分别作参数,用法和普通变量作实参是一样的,属于“值传递”。此时应当注意形参与实参的类型、顺序、个数等要保持一致。此种用法不多见。,21,5.3 共
14、用体,在某些实际问题中,所定义的两个结构体类型中只有一个或很少数的成员不同,其它大部分成员都是一样的,这样如果使用两类结构,会发现有大部分的程序代码是重复的。能否设计一种新数据类型,使属性相同的成员在同一结构里,而属性不同的成员随机可用?C语言提供了一种新的结构类型共用体类型,可以解决这个问题。,22,1.共用体的概念,所谓“共用体”类型,是指使几个不同类型的变量共同占用同一段内存单元。,23,2.共用体的定义,例1:union data int i;char ch;float f;aa,bb,cc;,union,共用体类型名,类型标识符1 成员名1;,类型标识符2 成员名2;.类型标识符n
15、成员名n;,;,共用体类型的变量声明形式也有3种,同结构体类型。,24,例2:union data int i;char ch;float f;;union data aa,bb;,例3:union int i;char ch;float f;aa,bb,cc;,25,共用体变量所占内存的长度等于最长的成员的长度。而不是各成员的长度之和,这一点不同于结构体。例如前面的例子data类型的变量aa,占据的内存空间为4个字节,而不是2+1+4=7个字节。,共用体变量所占的内存空间,26,3.共用体变量的引用,共用体变量只能引用它的成员,不能引用共用体变量本身。,共用体变量.成员名,例如前例中的变量a
16、a,可以引用它的成员 aa.i=56;aa.f=123.6432;aa.ch=A;,如下使用是错误的:printf(“%d”,aa);,27,4.共用体类型数据的特点,(1)每一瞬时只能存放其中的一个成员,而不是同时存放几种,即其它成员不起作用。,(2)只有最后一个存放的成员的值有效,其他成员将失去原值。如上例中的变量aa 只有最后一个成员值aa.ch=A是有效的。,(3)共用体变量的地址和它的成员地址都是同一地址。即&aa和&aa.i、&aa.ch、&aa.f的起始地址都是一样的。,(4)共用体变量不能初始化,也不能对变量名整体赋值,不能引用变量名来输出一个值,只能引用它的某个成员。,28,
17、(5)共用体变量不能作为函数的参数,也不能作为函数返回值。但可以使用指向共用体变量的指针。,(6)共用体类型可以出现在结构体中,共用体成员也可以是结构体类型。,(7)可以定义共用体数组。,29,例 设有若干个人员的数据,其中有学生和教师。学生的数据包括:姓名、号码、性别、职业、班级。教师的数据包括:姓名、号码、性别、职业、职务。现要求把他们放在同一表格中,见图。,如果job项为s,则第5项为class,如果job项为t,则第5项为position。要求输入人员的数据,然后再输出。,30,结构体类型member所占内存空间大小?2+20+1+1+10=34结构体类型数组mem所占内存空间大小?(
18、2+20+1+1+10)*20=680,struct member int num;char name20;char sex;char job;union int class;char position10;catagory;mem20;,31,5.3 枚举类型,所谓“枚举”,是指将变量的所有取值一一列举出来,变量的取值只限于列举出来的值的范围。该变量称之为枚举型变量。所列举的值叫做枚举元素(枚举常量)。,定义一个枚举类型名,再用它定义变量。enum 枚举类型名枚举元素,枚举元素,枚举元素n;enum 枚举类型名变量列表;,关键字,类型名和枚举元素名由用户自己命名,32,例1:enum wee
19、kdaysun,mon,tue,wd,thu,fri,dat;enum weekday day;,例2:enum weekday sun,mon,tue,wd,thu,fri,dat day;,例3:enum sun,mon,tue,wd,thu,fri,dat day;,33,说明:1、C语言中枚举元素按常量处理,它们是有值的。它们的值是系统按其定义顺序自动赋予的 0、1、2、3、4、。因此上例中的枚举元素sun的值为0,mon的值为1,依次类推。枚举变量的值即是它所取的枚举元素的值,此值可输出查看,如dayfri;则day的值为5,可以输出printf(“%d”,day);输出结果为5。,2、枚举元素的值也可以改变,但必须在定义时指定。如:enum weekday sun=7,mon=1,tue,wd,thu,fri,dat;此时tue=2,wd=3以此类推。如果定义时未指定值,则按顺序取默认值。,enum weekday sun7,mon,tue,wd,thu,fri,dat;此时:mon=8,tue=9,wd=10,34,3、枚举元素是常量,不是变量,不能在定义以外的任何位置对它们赋值,如sun=5;,4、枚举值可用来做判断比较,如:if(day=sun);if(daymon&dayfri),5、枚举变量取值只能是所列举的枚举元素,不能直接赋予一个整数值,如:day2;,
链接地址:https://www.31ppt.com/p-5635383.html