第7章自定义数据类型.08.ppt

上传人:本田雅阁 文档编号:2257764 上传时间:2019-03-12 格式:PPT 页数:44 大小:244.51KB
返回 下载 相关 举报
第7章自定义数据类型.08.ppt_第1页
第1页 / 共44页
第7章自定义数据类型.08.ppt_第2页
第2页 / 共44页
第7章自定义数据类型.08.ppt_第3页
第3页 / 共44页
亲,该文档总共44页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第7章自定义数据类型.08.ppt》由会员分享,可在线阅读,更多相关《第7章自定义数据类型.08.ppt(44页珍藏版)》请在三一文库上搜索。

1、1,第7章 自定义数据类型,2,本章内容,结构体类型 共用体 枚举类型 用typedef声明类型,3,教学目标,了解结构体类型、共用体类型、枚举类型的概念; 掌握结构体类型、共用体类型和枚举类型的定义与方法; 会用结构体类型、共用体类型与枚举类型定义变量; 会用结构体类型、与枚举类型解决实际问题;,4,定义:,将不同种类型的数据有序地组合在一起,构造出一个新的数据类型,这种形式称为结构体。,结构体是多种类型组合的数据类型。,5,struct 结构体名 成员列表 ;,struct student int num; char name20; char sex; char addr30; ;,结构体

2、名,关键字,不同数据类型组成的成员,分号不能少,6,定义结构体类型变量的方法,一、先定义结构体类型再定义变量名,struct student int num; char name20; char sex; int age; float score; char addr30; ;,student student1, student2;,结构体类型名,变量1,变量2,结构体类型只是一种数据类型,不占内存空间,只有定义结构体类型变量时才开辟内存空间。,7,二、在定义类型的同时定义变量,struct student int num; char name20; char sex; int age; fl

3、oat score; char addr30; student1, student2;,struct 结构体名 成员列表 变量名列表;,紧接着定义变量,8,三、直接定义结构体类型变量(不提倡),struct int num; char name20; char sex; int age; float score; char addr30; student1, student2;,struct 成员列表 变量名列表;,不出现结构体名。,9,2、在编译时,仅对变量分配空间,不对类型分配空间。,1、结构体类型的变量在内存依照其成员的顺序顺序排列,所占内存空间的大小是其全体成员所占空间的总和。,3、对

4、结构体中各个成员可以单独引用、赋值,其作用与变量等同。,格式:变量名.成员名 student1.num,“.”是成员运算符,它在所有运算符中优先级别最高,因此可以把student1.num当作一个整体来看待。,10,4、结构体的成员可以是另一个结构体类型。,struct date int month; int day; int year; ;,struct student int num; char name20; date birthday; ;,成员类型,成员名,5、成员名可以与程序中的变量名相同,二者分占不同的内存单元,互不干扰。例如,在程序中仍可以定义变量 int num;,11,对局

5、部变量类型的结构体变量初始化,void main(void) struct student long int num; char name20; char sex; char addr30; student1=9063101, “Li Lin”, M, “123 Beijing Road”; coutstudent1.nameendl;,对变量初始化,一一赋值,(1)在定义时给变量赋初值,(2)也可以用声明类型与定义变量分开的形式,在定义变量时进行初始化;,student student1 =9063110,”wang hong”,F,”chang zhou”;,12,结构体类型变量的引用(P

6、205),1、不能对结构体变量整体输入或输出,只能分别对各个成员引用。,cinstudent1;,cinstudent1.num; student1.num=100;,可以将一个结构体变量整体赋给另外一个相同类型的结构体变量。 student2=student1;,2、嵌套的结构体变量必须逐层引用。,student1.birthday.day=25;,3、结构体变量中的成员可以同一般变量一样进行运算。,student1.birthday.day+; student1.score+=60;,错误,必须用成员名引用,“.”是成员运算符,它在所有运算符中优先级别最高,因此可以把student1.nu

7、m当作一个整体来看待。,13,引用结构体变量中的成员(应用),#include using namespace std; struct Date int month; int day; int year; ; struct Student int num; char name20; char sex; Date birthday; float score; student1,student2=10002,“Wang Li“,f,5,23,1982,89.5;,int main() student1=student2; coutstudent1.numendl; coutstudent1.nam

8、eendl; coutstudent1.sexendl; coutstudent1.birthday.month/student1.birthday.day/; coutstudent1.birthday.yearendl; coutstudent1.scoreendl; return 0; ,14,关于结构类型变量的使用,说明以下几点: 1、同类型的结构体变量之间可以直接赋值。这种赋值等同于各个成员的依次赋值。 2、结构体变量不能直接进行输入输出,它的每一个成员能否直接进行输入输出,取决于其成员的类型,若是基本类型或是字符数组,则可以直接输入输出。 3、结构体变量可以作为函数的参数,函数也可

9、以返回结构体的值。当函数的形参与实参为结构体类型的变量时,这种结合方式属于值调用方式,即属于值传递。,15,结构体数组,结构体数组中的每个元素都是一个结构体类型的变量,其中包括该类型的各个成员。数组各元素在内存中连续存放。,16,一、结构体数组的定义,struct student int num; char name20; char sex; int age; float score; char addr30; ; student stu30;,struct student int num; char name20; char sex; int age; float score; char a

10、ddr30; stu30;,直接定义,17,二、结构体数组的初始化,struct student int num; char name20; char sex; stu3= 1011, “Li Lin“,M, 1012,“Wang Lan“,F, 1013,“Liu Fang“,F;,指定元素个数,给数组初始化,18,struct student int num; char name20; char sex; stu = 1011,“Li Lin“,M, 1012,“Wang Lan“,F, 1013,“Liu Fang“,F;,不指定元素个数,给数组初始化,一个结构体常量应该包括结构体中全部

11、成员的值。,19,以下程序的结果是:,/ceshi7-1 int main(void) struct date int year, month, day; today; coutsizeof(date)endl; coutsizeof(today)endl; return 0; ,12,20,根据下面的定义,能打印出字母M的语句是:,struct person char name9; int age; ; person class4= “Jone”,17, “Paul”,19, “Mary”,18, “Adam”,16; coutclass3.nameendl; coutclass3.name

12、1endl; coutclass2.name1endl; coutclass2.name0endl;,输出:Adam,输出:d,输出:a,输出:M,21,例7.2 对候选人得票统计程序。设有3个人,最终只能1人当选为领导。今有10人参加投票,从键盘输入10人所投的候选人的姓名,要求最后输出这3个候选人的得票结果。(使用字符数组),#include #include using namespace std; struct Person char name20; int count; ; int main() Person leader3=“Li“,0,“Zhang“,0,“Fu“,0; int

13、i,j; char leader_name20;,for(i=0;ileader_name; for(j=0;j3;j+) if ( strcmp( leader_name , leaderj.name ) = 0) leaderj.count + ; coutendl; for(i=0;i3;i+) cout leaderi.name “:“ leaderi.count endl; return 0; ,22,例7.2 对候选人得票统计程序。设有3个人,最终只能1人当选为领导。今有10人参加投票,从键盘输入10人所投的候选人的姓名,要求最后输出这3个候选人的得票结果。(使用字符串),#inc

14、lude #include using namespace std; struct Person string name; int count; ; int main() Person leader3=“Li“,0,“Zhang”,0,“Fan“,0; int i,j; string leader_name;,for(i=0;ileader_name; for(j=0;j3;j+) if (leader_name = leaderj.name ) leaderj.count+; coutendl; for(i=0;i3;i+) cout leaderi.name “:“ leaderi.cou

15、nt endl; return 0; ,23,指向结构体变量的指针,一个结构体变量的指针就是该变量所占据的内存段的起始地址.可以用一逐步形成指针变量,用来指向一个结构体变量。 通过指针变量引用结构体变量中的成员; (*指针变量).成员 指针变量成员,24,例7 .3指向结构体变量的应用,#include #include using namespace std; int main() struct student int num; string name; char sex; float score; ; student stu; student *p=,stu.name=“Wang Fun“

16、; stu.sex=f; stu.score=89.5; coutnumnamesexscoreendl; return 0; ,25,共用体(不作介绍),C+语言中,允许不同的数据类型使用同一存储区域,即同一存储区域由不同类型的变量共同表示。这种数据类型就是共用体。,union 共用体名 成员表列; 变量表列;,union data int i; char ch; float f; a, b, c;,union data a, b, c;,这几个成员在共用体变量中存放在同一地址,相互覆盖,其长度为最长的成员的长度。,26,共用体变量的引用,不能整体引用共用体变量,只能引用变量中的成员。,a.

17、i 表示为整型 a.ch 表示为字符型 a.f 表示为符点型,27,共用体变量的特点,1、共用体的空间在某一时刻只有一个成员在起作用。,2、共用体变量中的成员是最后一次放入的成员。,3、共用体变量不能在定义时赋初值。,4、共用体变量不能作为函数的参数或函数值,但可使用指向共用体的指针变量。,5、共用体可以作为结构体的成员,结构体也可以作为共用体的成员。,28,union un int i; double y; ; struct st char a10; union un b; ; coutsizeof(struct st)endl;,18,29,/ceshi7-2 union un short

18、 int a; char c2; w; w.c0=A; w.c1=a; coutoctw.aendl; cout decw.aendl;,低字节低地址 高字节高地址,a,A,w.c1,w.c0,2000H,2001H,输出:060501,a,65 ?,56 ?,30,int main(void) union EXAMPLE struct int x; int y; in; int a,b; e; e.a=1; e.b=2; e.in.x=e.a*e.a; e.in.y=e.b+e.b; coute.in.xte.in.yendl; return 0; ,in,x,y,a,b,b,1,2,4,8

19、,输出:4 8,31,枚举类型,如果一个变量只有几种可能的值,可以定义为枚举类型。,枚举类型就是将变量的值一一列举出来,变量的值仅限于列举出来的值的范围内。,32,enum weekday sun, mon, tue, wed, thu, fri, sat;,weekday workday, weekend ;,workday 和 weekend 值只能是sun 到 sat 其中之一。,enum sun, mon, tue, wed, thu, fri, sat workday, weekend ;,其中sun, mon,sat称为枚举元素或枚举常量,为用户定义的标识符,所代表的意义由用户决定

20、,在程序中体现出来。,数据类型,可能取的值,变量,另一种定义变量的方法,33,1、枚举元素为常量,不可赋值运算。 sun=0; mon=1;,2、在定义枚举类型的同时,编译程序按顺序给每个枚举元素一个对应的序号,序号从0开始,后续元素依次加1。,enum weekday sun, mon, tue, wed, thu, fri, sat; 0 , 1, 2, 3, 4, 5, 6,3、可以在定义时人为指定枚举元素的序号值。,enum weekday sun=9, mon=2, tue, wed, thu, fri, sat; 9 , 2, 3, 4, 5, 6 , 7,4、只能给枚举变量赋枚举

21、值,若赋序号值必须进行强制类型转换。,day=mon ; day=1; day=weekday(1);,34,5、枚举元素可以用来进行比较判断。,if (workday= = mon) if (workdaysun),6、枚举值可以进行加减一个整数n的运算,得到其前后第n个元素的值。,workday=sun; workday=(weekday)(workday+2);,workday= = tue,7、枚举值可以按整型输出其序号值。,workday=tue; coutworkday;,2,35,/ceshi7-3 int main(void) enum team qiaut, cubs=4,

22、pick, dodger=qiaut-2; coutqiauttcubst; coutpicktdodgerendl; return 0; ,输出:0,4,5,-2,36,例7-8 口袋中有红、黄、蓝、白、黑5种颜色的球若干个。每次从口袋中任意取出3个球,问得到3种不同颜色的球的可能取法,输出每种排列情况。,分析:球的颜色只有5种,每一个球的颜色只能是这5种中的一种,因此可以用枚举类型来处理。 设每次取出的球的颜色分别是i,j,k,显然I,j,k都是以上5种颜色之一,根据题意,要求I,j,k三者互不相同,可以用穷举法,对每一种颜色分别进行测试,看哪一组符合条件。,37,例7-8(续),#inc

23、lude #include using namespace std; int main() enum color red , yellow , blue , white , black ; color pri; int i,j,k,n=0,loop; for (i=red;i=black;i+) for (j=red;j=black;j+) if (i!=j) for (k=red ; k = black ; k+) if (k!=i) ,for (loop=1;loop=3;loop+) switch (loop) case 1: pri=color(i);break; case 2: pr

24、i=color(j);break; case 3: pri=color(k);break; default: break; switch (pri) case red: cout setw(8) “red“ ; break; case yellow:cout setw(8) “yellow“ ; break; case blue: cout setw(8) “blue“ ; break; case white: cout setw(8) “white“ ; break; case black: cout setw(8) “black“ ; break; default : break; ,38

25、,例7-8(续),coutendl; cout“total:“nendl; return 0; ,39,本章小结,结构体是由若干个数据成员导出 的自定义数据类型,声明结构时不产生内存空间的分配,只在定义变量时,才分配内存空间; 一般格式:struct 结构体名 成员列表; 枚举类型 是某种数据可能的取值的集合;每个元素都有一个序号值与之对应,该序号值可以在定义枚举类型时赋给元素,也可取其默认序号,默认序号从0开始依次加1。 枚举类型变量可进行赋值运算与比较运算。枚举类型变量不能用cin输入赋值,只能用赋值运算符给其赋值;可以用cout输出其值 ,输出的是其序号而不是元素值。,40,实验6 自定

26、义数据类型,一、实验目的: 掌握结构体类型、结构体变量、结构体数组的定义格式; 学会使用结构体变量与结构体数组处理如投票、学生成绩处理等问题; 初步学会用枚举类型变量处理有限元素组成的集合问题; 二、实验内容 题1:模仿例7.2处理4个候选人得票统计情况。假设四名候选人姓名分别是“Wang”、”Liu”、”Fang”、”Hu”等,有15人投票,请统计出各人的得票数。 题2: (P227)课后习题5 题3:模仿例7.8 :从A、B、C、D四个字母中任取3个不同的字母;共有多少种取法?编写程序,输出所有字母排列。,41,实验题1:,#include #include using namespace

27、 std; struct person char name10; int count; ; int main() person leader4 = “Wang“ , 0 , “Liu“ , 0 ,“Fang“ , 0 , “Hu“ , 0 ; int i , j ; string leader_name;,for(i=1 ; ileader_name; for(j=0;j4;j+) if(leader_name= leaderj.name ) leaderj.count+; cout endl; for(j=0;j4;j+) cout leaderj.name “:“ leaderj.coun

28、t endl; return 0; ,42,实验题2: (课后习题5),#include #include using namespace std; const int n=10; struct student char num6; char name8; int score4; float avr; stun;,int main() int i,j,max,maxi,sum; float average; for (i=0;istui.num; coutstui.name; for (j=0;jstui.scorej; coutendl; ,43,average=0; max=0; maxi

29、=0; for (i=0;imax) max=sum; maxi=i; average/=n;,cout“ NO. name score1 score2 score3 average“endl; for (i=0;in;i+) coutsetw(8)stui.num“ “setw(10)stui.name“ “; for (j=0;j3;j+) coutsetw(3)stui.scorej“ “; coutstui.avrendl; cout“average=“averageendl; cout“The highest score is :“stumaxi.name“, score total

30、:“maxendl; return 0; ,44,实验题3:,#include #include using namespace std; int main() enum letter A,B,C,D; letter let; int i,j,k,n=0,loop; for(i=A ;i=D; i+) for(j=A;j=D;j+) if( I != j ) for(k=A;k=D;k+) if(i!=k),for (loop=1;loop=3;loop+) switch(loop) case 1 : let=letter(i);break; case 2 : let=letter(j);break; case 3 : let=letter(k);break; default: break; switch(let) case A : coutsetw(5)A;break; case B : coutsetw(5)B;break; case C : coutsetw(5)C;break; case D : coutsetw(5)D;break; default : break; coutendl; cout“total:“nendl; return 0; ,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1