《自定义数据类型》PPT课件.ppt

上传人:xin****828 文档编号:15494297 上传时间:2020-08-12 格式:PPT 页数:29 大小:331.84KB
收藏 版权申诉 举报 下载
《自定义数据类型》PPT课件.ppt_第1页
第1页 / 共29页
《自定义数据类型》PPT课件.ppt_第2页
第2页 / 共29页
《自定义数据类型》PPT课件.ppt_第3页
第3页 / 共29页
资源描述:

《《自定义数据类型》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《自定义数据类型》PPT课件.ppt(29页珍藏版)》请在装配图网上搜索。

1、,基本的数据类型(如int、float、double、char等) 数组 用户可以自己声明的类型还有: 结构体(structure)类型 共用体(union)类型 枚举(enumeration)类型,第7章 自定义数据类型,7.1 结构体类型,7.1.1 结构体概述,有时需要将不同类型的数据组合成一个有机的整体。 例如,一个学生的学号、姓名、性别、年龄、成绩、家庭地址等项,都是这个学生的属性。见图7.1。,图7.1,结构体( struct ):将不同类型的数据组合成一个有机的整体 声明一个结构体类型的一般形式为 struct 结构体类型名 成员表列;,例如: struct Student /声

2、明一个结构体类型Student int num; /包括一个整型变量num char name20; /包括一个字符数组name,可以容纳20个字符 char sex; /包括一个字符变量sex int age; /包括一个整型变量age float score; /包括一个单精度型变量 char addr30; /包括一个字符数组addr,可以容纳30个字符 ; /最后有一个分号 Student就是结构体类型名。大括号内是该结构体中的全部成员(member),7.1.2 结构体类型变量的定义方法及其初始化,(2) 在声明类型的同时定义变量 例如: struct Student /声明结构体类

3、型Student int num; char name20; char sex; int age; student1,student2; /定义两个结构体类型Student的变量,这种形式的定义的一般形式为 struct 结构体名 成员表列 变量名表列;,关于结构体类型,有几点要说明:,(1) 结构体中的成员相当于普通变量。,struct Date /声明一个结构体类型Date int month; int day; int year; ; struct Student /声明一个结构体类型Student int num; char name20; char sex; Date birthda

4、y; /Date是结构体类型,birthday是Date类型的成员 student1,student2;,(3) 结构体中的成员名可以与程序中的变量名相同。例如,程序中可以另定义一个整型变量num,它与student中的num是两回事,互不影响。,(2) 成员也可以是一个结构体变量。即结构嵌套,如,2. 结构体变量的初始化 在定义时指定初始值。如 struct Student int num; char name20; char sex; int age; float score; char addr30; student1 = 10001,Zhang Xin,M,19,90.5,Shangh

5、ai;,也可以采取声明类型与定义变量分开的形式,在定义变量时进行初始化: Student student2=10002,Wang Li,F,20,98,Beijing; /Student是已声明的结构体类型,7.1.3 结构体变量的引用,在定义了结构体变量以后,可以引用这个变量。 (1) student1= student2;,(2) 可以引用一个结构体变量中的一个成员的值。 引用结构体变量中成员的一般方式为 结构体变量名.成员名 例如可以这样对变量的成员赋值: student1.num=10010;,(3) 不能将一个结构体变量作为一个整体进行输入和输出。coutstudent1;/错误 只

6、能对结构体变量中的各个成员分别进行输入和输出。 coutstudent1 .age;,(4) 对结构体变量的成员可以像普通变量一样进行各种运算。例如 student2.scorestudent1.score; sumstudent1.scorestudent2.score; student1.age+;,例7.1 引用结构体变量中的成员。 #include using namespace std; struct Date /声明结构体类型Date int month; int day; int year; ; struct Student /声明结构体类型Student int num; ch

7、ar name20; char sex; Date birthday; /声明birthday为Date类型的成员 float score; student1,student2=10002,Wang Li,f,5,23,1982,89.5; /定义Student 类型的变量student1,student2,并对student2初始化,int main( ) student1=student2; /将student2各成员的值赋予student1的相应成员 coutstudent1.numendl; /输出student1中的num成员的值 coutstudent1.nameendl; /输出

8、student1中的name成员的值 coutstudent1.sexendl; /输出student1中的sex成员的值 coutstudent1.birthday.month/student1.birthday.day/ student1.birthday.yearendl; /输出student1中的birthday各成员的值 coutstudent1.scoreendl; return 0; ,运行结果如下: 10002 Wang Li f 5/23/1982 89.5,1. 定义结构体数组 和定义结构体变量的方法相仿,定义结构体数组时只需声明其为数组即可。如 struct Stude

9、nt /声明结构体类型Student int num; char name20; char sex; int age; float score; char addr30; ; Student stu3; /定义Student类型的数组stu,7.1.4 结构体数组 每个数组元素都是一个结构体类型的数据。,2. 结构体数组的初始化 与其他类型的数组一样,对结构体数组可以初始化。如 struct Student int num; char name20; char sex; int age; float score; char addr30; sty3=10101,Li Lin,M,18,87.5

10、,103 Beijing Road, 10102,Zhang Fun,M,19,99,130 Shanghai Road, 10104,Wang Min,F,20,78.5,1010,Zhongshan Road;,3. 结构体数组应用举例 下面举一个简单的例子来说明结构体数组的定义和引用。 例7.2 对候选人得票的统计程序。设有3个候选人,最终只能有1人当选为领导。今有10个人参加投票,从键盘先后输入这10个人所投的候选人的名字,要求最后输出这3个候选人的得票结果。,可以定义一个候选人结构体数组,包括3个元素,在每个元素中存放有关的数据。 程序如下:,#include struct Pers

11、on /声明结构体类型Person char name20; int count; ;,int main( ) Person leader3=Li,0,Zhang,0,Fun,0; /定义Person类型的数组,内容为3个候选人的姓名和当前的得票数 int i,j; char leader_name20; /leader_name为投票人所选的人的姓名 for(i=0;ileader_name; /先后输入10张票上所写的姓名 for(j=0;j3;j+) /将票上姓名与3个候选人的姓名比较 if(strcmp(leader_name,leaderj.name)=0) leaderj.coun

12、t+; /如果与某一候选人的姓名相同,就给他加一票 coutendl; for(i=0;i3;i+) /输出3个候选人的姓名与最后得票数 coutleaderi.name:leaderi.countendl; return 0; ,运行情况如下: Zhang (每次输入一个候选人的姓名) Li Fun Li Zhang Li Zhang Li Fun Wang Li:4 (输出3个候选人的姓名与最后得票数) Zhang:3 Fun:2,7.2 共用体,7.2.1 共用体的概念,有时需要使几种不同类型的变量存放到同一段内存单元中。例如,可把一个整型变量、一个字符型变量、一个双精度型变量放在同一个

13、地址开始的内存单元中 (见图7.12)。,图7.12,以上3个变量在内存中占的字节数不同,但都从同一地址开始存放。这种结构称为共用体(union) (有些书译为联合)。,声明共用体类型的一般形式为 union 共用体类型名 成员表列 ;,定义共用体变量的一般形式为 共用体类型名 共用体变量名;,当然也可在声明共用体类型的同时定义共用体变量。如 union data int i; char ch; double d; a,b,c; “共用体”变量a,b,c各占8字节,而不是各占4+1+8=13个字节。,7.2.2 对共用体变量的访问方式,不能引用共用体变量,而只能引用共用体变量中的成员。 正确的

14、: cout a.i ; (引用共用体变量中的整型成员i) 错误的: couta;,7.2.3 共用体类型数据的特点,(1) 使用共用体变量时, 在每一瞬时只能存放其中一种,而不是同时存放几种。,(2) 能够访问的是共用体变量中最后一次被赋值的成员,在对一个新的成员赋值后原有的成员就失去作用。,(3) 不能在定义共用体变量时对它初始化;不能用共用体变量名作为函数参数。,例7.7 设有若干个人员的数据,其中有学生和教师。学生的数据中包括: 姓名、号码、性别、职业、年级。教师的数据包括: 姓名、号码、性别、职业、职务。可以看出,学生和教师所包含的数据是不同的。现要求把它们放在同一表格中,见图7.1

15、3。,图7.13,如果job项为s(学生),则第5项为class(班)。即Li是501班的。如果job项是t(教师),则第5项为position(职务)。Wang是prof(教授)。显然对第5项可以用共用体来处理(将class和position放在同一段内存中)。,#include #include #include using namespace std; struct int num; char name10; char sex; char job; union P /声明共用体类型 int grade; /年级 char position10; /职务 category; /成员cate

16、gory 为共用体变量 person2; /定义共用体数组person,含两个元素,要求输入人员的数据,然后再输出。为简化起见,只设两个人(一个学生、一个教师)。程序如下:,int main( ) int i; for(i=0;ipersoni.numpersoni.namepersoni.sexpersoni.job; if(personi.job=s) cinpersoni.category.grade; /若是学生则输入 年级 else if (personi.job=t) cinpersoni.category.position;/若是教师 则输入职务 coutendlNo. Name

17、 sex job grade/positionendl; for(i=0;i2;i+) if (personi.job=s) coutpersoni.numsetw(6)personi.name personi.sex personi.jobsetw(10)personi.category.gradeendl; else coutpersoni.numsetw(6)personi.name personi.sex personi.jobsetw(10)personi.category.positionendl; return 0; ,运行情况如下: 101 Li fs 3(注意在输入的字母f和

18、s之间无空格) 102 Wang mt prof (注意在输入的字母m和t之间无空格) No.Namesexjobgrade/position 101 Li f s 3 102 Wang m t prof 为了使输出结果上下对齐,在cout语句中用了setw控制符和插入空格。,7.3 枚举类型,如果一个变量只有几种可能的值,可以定义为枚举类型(enumeration) 。所谓“枚举”是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内。,声明枚举类型用enum开头。例如 enum weekdaysun,mon,tue,wed,thu,fri,sat;,上面声明了一个枚举类型weekd

19、ay,花括号中sun,mon,sat等称为枚举元素或枚举常量。表示这个类型的变量的值只能是以上7个值之一。,声明枚举类型的一般形式为 enum 枚举类型名 枚举常量表列;,在声明了枚举类型之后,可以用它来定义变量。如 weekday workday,week_end; 这样,workday和week_end被定义为weekday类型的变量。,根据对枚举类型weekday的声明, weekday类型的变量的值只能是sun到sat之一。例如 workday=mon; week_end=sun;,说明: 枚举元素作为常量,它们是有值的,C+编译按定义时的顺序对它们赋值为0,1,2,3,。在上面的声明

20、 enum weekdaysun,mon,tue,wed,thu,fri,sat;中,sun的值为0,mon的值为1sat为6。 也可以在声明枚举类型时另行指定枚举元素的值,如 enum weekdaysun=7,mon=1,tue,wed,thu,fri,sat; 指定sun为7,mon=1,以后按顺序加1,sat为6。,例7.8 口袋中有红、黄、蓝、白、黑5种颜色的球若干个。每次从口袋中任意取出3个球,问得到3种不同颜色的球的可能取法。,#include #include /在输出时要用到setw控制符 using namespace std; enum color red,yellow,

21、blue,white,black; /声明枚举类型color void print_color(int);/与书本方法不同,print_color根据枚举值输出相应颜色的英文 int main( ) int i,j,k,n=0; /n是累计不同颜色的组合数 for (i=red;i=black;i+) /i :第1个球的颜色 for (j=red;j=black;j+) /j :第2个球的颜色 if (i!=j) /若前两个球的颜色不同 for (k=red;k=black;k+) /k:第3个球的颜色 if (k!=i) ,void print_color(int cl) switch (c

22、l) /判断cl的值,输出相应的“颜色” case red: coutsetw(8)red; break; case yellow: coutsetw(8)yellow; break; case blue: coutsetw(8)blue; break; case white: coutsetw(8)white; break; case black: coutsetw(8)black; break; default : break; ,运行结果如下: 1 red yellow blue 2 redyellow white 3 red yellow black 58 blackwhitered

23、59black whiteyellow 60 black whiteblue total:60,不用枚举常量,而用常数0代表“红”,1代表“黄”也可以。但显然用枚举变量更直观,因为枚举元素都选用了令人“见名知意”的标识符。,7.4 用typedef声明类型,除了用以上方法声明结构体、共用体、枚举等类型外,还可以用typedef声明一个新的类型名代替已有的类型名。如 typedef int INTEGER; /指定用标识符INTEGER代表int类型 typedef float REAL; /指定用REAL代表float类型 这样,以下两行等价: int i,j; float a,b; INTE

24、GER i,j; REAL a,b;,如果在一个程序中,整型变量是专门用来计数的,可以用COUNT来作为整型类型名: typedef int COUNT; /指定用COUNT代表int型 COUNT i,j; /将变量i,j定义为COUNT类型,即int类型 在程序中将变量i,j定义为COUNT类型,可以使人知道它们是用于计数的。,也可以声明结构体类型: typedef struct /在struct之前用了关键字typedef,表示是声明新类型名 int month; int day; int year; DATE; /注意DATE是新类型名,而不是结构体变量名,所声明的新类型名DATE代表

25、上面指定的一个结构体类型。这样就可以用DATE定义变量:DATE birthday;,还可以进一步: typedef int NUM100; /声明NUM为整型数组类型,包含100个元素NUM n; /定义n为包含100个整型元素的数组 如有 int a10,b10,c10,d10; 可以用以下来代替: typedef int ARR10; ARR a,b,c,d;,使用typedef有利于程序的通用与移植。假如某系统A用2个字节来存放int型数据,用4个字节来存放long型数据,而另一系统B则以4个字节存放int。,如果把一个程序从系统B移植到系统A,需要将定义变量中的每一个int改为long,这样才能在移植后使原来的整型变量保持4个字节。例如将“int a,b,c;”改为“long a,b,c;”。如果程序中有多处用int定义变量,则要改动多处。 如果系统B中的程序中用了typedef声明: typedef int INTEGER; 而且在程序中所有整型变量都用INTEGER定义,如 INTEGER x,y; 这样这些变量都是int型的,按4个字节分配空间。 在移植时只需改动typedef定义语句为 typedef long INTEGER; 在新的编译系统中,把用INTEGER定义的变量作为long类型处理,按4个字节分配空间。,

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!