自定义数据类型.ppt

上传人:小飞机 文档编号:6019638 上传时间:2023-09-15 格式:PPT 页数:29 大小:316.61KB
返回 下载 相关 举报
自定义数据类型.ppt_第1页
第1页 / 共29页
自定义数据类型.ppt_第2页
第2页 / 共29页
自定义数据类型.ppt_第3页
第3页 / 共29页
自定义数据类型.ppt_第4页
第4页 / 共29页
自定义数据类型.ppt_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《自定义数据类型.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/声明一个结构体类型Stude

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

3、har 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 birthday;/Date是结构体类型,birthday是Date类型的成员student1,student2

4、;,(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,Shanghai;,也可以采取声明类型与定义变量分开的形式,在定义变量时进行初始化:Student student2=10002,Wang

5、Li,F,20,98,Beijing;/Student是已声明的结构体类型,7.1.3 结构体变量的引用,在定义了结构体变量以后,可以引用这个变量。(1)student1=student2;,(2)可以引用一个结构体变量中的一个成员的值。引用结构体变量中成员的一般方式为结构体变量名.成员名例如可以这样对变量的成员赋值:student1.num=10010;,(3)不能将一个结构体变量作为一个整体进行输入和输出。coutstudent1;/错误只能对结构体变量中的各个成员分别进行输入和输出。coutstudent1.age;,(4)对结构体变量的成员可以像普通变量一样进行各种运算。例如 stud

6、ent2.scorestudent1.score;sumstudent1.scorestudent2.score;student1.age+;,例7.1 引用结构体变量中的成员。#include using namespace std;struct Date/声明结构体类型Dateint month;int day;int year;struct Student/声明结构体类型Studentint num;char name20;char sex;Date birthday;/声明birthday为Date类型的成员float score;student1,student2=10002,Wan

7、g Li,f,5,23,1982,89.5;/定义Student 类型的变量student1,student2,并对student2初始化,int main()student1=student2;/将student2各成员的值赋予student1的相应成员coutstudent1.numendl;/输出student1中的num成员的值coutstudent1.nameendl;/输出student1中的name成员的值coutstudent1.sexendl;/输出student1中的sex成员的值cout/student1.birthday.day/student1.birthday.ye

8、arendl;/输出student1中的birthday各成员的值coutstudent1.scoreendl;return 0;,运行结果如下:10002Wang Lif5/23/198289.5,1.定义结构体数组和定义结构体变量的方法相仿,定义结构体数组时只需声明其为数组即可。如struct Student/声明结构体类型Student int num;char name20;char sex;int age;float score;char addr30;Student stu3;/定义Student类型的数组stu,7.1.4 结构体数组每个数组元素都是一个结构体类型的数据。,2.结

9、构体数组的初始化与其他类型的数组一样,对结构体数组可以初始化。如struct Student int num;char name20;char sex;int age;float score;char addr30;sty3=10101,Li Lin,M,18,87.5,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个候选

10、人,最终只能有1人当选为领导。今有10个人参加投票,从键盘先后输入这10个人所投的候选人的名字,要求最后输出这3个候选人的得票结果。,可以定义一个候选人结构体数组,包括3个元素,在每个元素中存放有关的数据。程序如下:,#include struct Person/声明结构体类型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(

11、i=0;ileader_name;/先后输入10张票上所写的姓名 for(j=0;j3;j+)/将票上姓名与3个候选人的姓名比较if(strcmp(leader_name,leaderj.name)=0)leaderj.count+;/如果与某一候选人的姓名相同,就给他加一票 coutendl;for(i=0;i3;i+)/输出3个候选人的姓名与最后得票数coutleaderi.name:leaderi.countendl;return 0;,运行情况如下:Zhang(每次输入一个候选人的姓名)LiFunLiZhangLiZhangLiFunWangLi:4(输出3个候选人的姓名与最后得票数)

12、Zhang:3Fun:2,7.2 共用体,7.2.1 共用体的概念,有时需要使几种不同类型的变量存放到同一段内存单元中。例如,可把一个整型变量、一个字符型变量、一个双精度型变量放在同一个地址开始的内存单元中(见图7.12)。,图7.12,以上3个变量在内存中占的字节数不同,但都从同一地址开始存放。这种结构称为共用体(union)(有些书译为联合)。,声明共用体类型的一般形式为union 共用体类型名成员表列;,定义共用体变量的一般形式为共用体类型名 共用体变量名;,当然也可在声明共用体类型的同时定义共用体变量。如union data int i;char ch;double d;a,b,c;“

13、共用体”变量a,b,c各占8字节,而不是各占4+1+8=13个字节。,7.2.2 对共用体变量的访问方式,不能引用共用体变量,而只能引用共用体变量中的成员。正确的:cout a.i;(引用共用体变量中的整型成员i)错误的:couta;,7.2.3 共用体类型数据的特点,(1)使用共用体变量时,在每一瞬时只能存放其中一种,而不是同时存放几种。,(2)能够访问的是共用体变量中最后一次被赋值的成员,在对一个新的成员赋值后原有的成员就失去作用。,(3)不能在定义共用体变量时对它初始化;不能用共用体变量名作为函数参数。,例7.7 设有若干个人员的数据,其中有学生和教师。学生的数据中包括:姓名、号码、性别

14、、职业、年级。教师的数据包括:姓名、号码、性别、职业、职务。可以看出,学生和教师所包含的数据是不同的。现要求把它们放在同一表格中,见图7.13。,图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

15、/声明共用体类型 int grade;/年级char position10;/职务category;/成员category 为共用体变量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.

16、category.position;/若是教师 则输入职务coutendlNo.Name 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;elsecoutpersoni.numsetw(6)personi.name personi.sex personi.jobsetw(10)personi.category.positionendl;retu

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

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

19、它们赋值为0,1,2,3,。在上面的声明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 colo

20、r red,yellow,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(cl)/判断cl的值,输

21、出相应的“颜色”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 blue2 redyellow white3 red yellow black58 blackwhitered59black whiteyellow60 black whiteblu

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

23、NT来作为整型类型名: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代表上面指定的一个结构体类型。这样就可以用DATE定义变量:DATE birthday;,还可以进一步:typedef

24、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个字节分配空间。,

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

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


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号