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

上传人:m**** 文档编号:586571038 上传时间:2024-09-05 格式:PPT 页数:44 大小:244.52KB
返回 下载 相关 举报
第7章自定义数据类型.08_第1页
第1页 / 共44页
第7章自定义数据类型.08_第2页
第2页 / 共44页
第7章自定义数据类型.08_第3页
第3页 / 共44页
第7章自定义数据类型.08_第4页
第4页 / 共44页
第7章自定义数据类型.08_第5页
第5页 / 共44页
点击查看更多>>
资源描述

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

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

2、uct student int num; char name20; char sex; char addr30; ;结构体名结构体名关键字关键字不同数据不同数据类型组成类型组成的的成员成员分号不能少分号不能少5定义结构体类型变量的方法定义结构体类型变量的方法一、先定义结构体类型再定义变量名一、先定义结构体类型再定义变量名struct student int num; char name20; char sex; int age; float score; char addr30; student student1, student2;结构体类型名结构体类型名变量变量1变量变量2结构体类型只是一

3、种数据结构体类型只是一种数据类型,不占内存空间,只类型,不占内存空间,只有定义结构体类型有定义结构体类型变量变量时时才开辟内存空间。才开辟内存空间。6二、在定义类型的同时定义变量二、在定义类型的同时定义变量struct student int num; char name20; char sex; int age; float score; char addr30; student1, student2;structstruct 结构体名结构体名 成员列表成员列表 变量名列表;变量名列表; 紧接着定紧接着定义变量义变量7三、直接定义结构体类型变量三、直接定义结构体类型变量(不提倡不提倡)str

4、uct int num; char name20; char sex; int age; float score; char addr30; student1, student2;struct 成员列表成员列表 变量名列表;变量名列表; 不出现结构体名。不出现结构体名。82 2、在编译时,仅对、在编译时,仅对变量变量分配空间,不对分配空间,不对类型类型分配空间。分配空间。1 1、结构体类型的变量在内存、结构体类型的变量在内存依照其成员的顺序依照其成员的顺序顺序排列,顺序排列,所占内存空间的大小是其全体成员所占空间的所占内存空间的大小是其全体成员所占空间的总和总和。3 3、对结构体中各个成员可以

5、单独引用、赋值,其作用与变、对结构体中各个成员可以单独引用、赋值,其作用与变量等同。量等同。格式:格式:变量名变量名. .成员名成员名 student1.numstudent1.num“.”是成员运算符,它在所有运算符中是成员运算符,它在所有运算符中优先级别优先级别最高,最高,因此可以把因此可以把student1.num当作一个整体来看待。当作一个整体来看待。94 4、结构体的成员可以是另一个结构体类型。、结构体的成员可以是另一个结构体类型。struct date int month; int day; int year; ;struct student int num; char name2

6、0; date birthday; ;成员类型成员类型成员名成员名5 5、成员名可以与程序中的变量名相同,二者分占不同的内、成员名可以与程序中的变量名相同,二者分占不同的内存单元,互不干扰。例如,在程序中仍可以定义变量存单元,互不干扰。例如,在程序中仍可以定义变量 intint num; num;10对局部变量类型的结构体变量初始化对局部变量类型的结构体变量初始化void main(void) struct student long int num; char name20; char sex; char addr30; student1=9063101, “Li Lin”, M, “123

7、Beijing Road”;coutstudent1.namestudent1;student1;cincinstudent1.num; student1.num=100;student1.num; student1.num=100;可以将一个结构体变量可以将一个结构体变量整体整体赋给另外一个相同类型的结构赋给另外一个相同类型的结构体变量。体变量。 student2=student1;student2=student1;2 2、嵌套的结构体变量必须逐层引用。、嵌套的结构体变量必须逐层引用。student1.student1.birthday.birthday.dayday=25;=25;3 3

8、、结构体变量中的成员可以同一般、结构体变量中的成员可以同一般变量一样进行运算。变量一样进行运算。student1.birthday.day+; student1.birthday.day+; student1.score+=60;student1.score+=60;错误错误必须用成员名引用必须用成员名引用“.”是成员运算符,是成员运算符,它在所有运算符中它在所有运算符中优先级别优先级别最高,因最高,因此可以把此可以把student1.num当作当作一个整体来看待。一个整体来看待。12引用结构体变量中的成员(应用)引用结构体变量中的成员(应用)#include using namespace

9、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.nameendl; coutstudent1.sexendl;coutstudent1.birthday.month/stude

10、nt1.birthday.day/;coutstudent1.birthday.yearendl; coutstudent1.scoreendl; return 0;13关于结构类型变量的使用,说明以下几点关于结构类型变量的使用,说明以下几点: :1 1、同类型的结构体变量之间可以直接赋值。这种、同类型的结构体变量之间可以直接赋值。这种赋值等同于各个成员的依次赋值。赋值等同于各个成员的依次赋值。 2 2、结结构构体体变变量量不不能能直直接接进进行行输输入入输输出出,它它的的每每一一个个成成员员能能否否直直接接进进行行输输入入输输出出,取取决决于于其其成成员员的的类类型型,若若是是基基本本类类型

11、型或或是是字字符符数数组组,则则可可以以直直接接输输入入输出。输出。3 3、结结构构体体变变量量可可以以作作为为函函数数的的参参数数,函函数数也也可可以以返返回回结结构构体体的的值值。当当函函数数的的形形参参与与实实参参为为结结构构体体类类型型的的变变量量时时,这这种种结结合合方方式式属属于于值值调调用用方方式式,即即属属于值传递。于值传递。14结构体数组结构体数组结构体数组中的结构体数组中的每个元素都是一个结构体类型的变每个元素都是一个结构体类型的变量量,其中包括该类型的各个成员。数组各元素在内,其中包括该类型的各个成员。数组各元素在内存中连续存放。存中连续存放。15一、结构体数组的定义一、

12、结构体数组的定义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 addr30; stu30;直接定义直接定义16二、结构体数组的初始化二、结构体数组的初始化struct student int num; char name20; char sex; stu3= 1011, Li Lin,M, 1012,

13、Wang Lan,F, 1013,Liu Fang,F;指定元素个数,给数组初始化指定元素个数,给数组初始化17struct student int num; char name20; char sex; stu = 1011,Li Lin,M, 1012,Wang Lan,F, 1013,Liu Fang,F;不指定元素个数,给数组初始化不指定元素个数,给数组初始化一个结构体常量应该包括结构体中一个结构体常量应该包括结构体中全部成员全部成员的值。的值。18以下程序的结果是:以下程序的结果是:/ceshi7-1int main(void) struct date int year, month

14、, day; today; coutsizeof(date)endl; coutsizeof(today)endl; return 0; 1219根据下面的定义,能打印出字母根据下面的定义,能打印出字母M的语句是:的语句是:struct person char name9; int age; ;person class4= “Jone”,17, “Paul”,19, “Mary”,18, “Adam”,16;A)coutclass3.nameendl;B)coutclass3.name1endl;C)coutclass2.name1endl;D)coutclass2.name0endl;输出:

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

16、0,Zhang,0,Fu,0; int 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; 21例7.2 对候选人得票统计程序。设有3个人,最终只能1人当选为领导。今有10人参加投票,从键盘输入10人所投的候选人的姓名,要求最后输出这3个候选人的得

17、票结果。(使用字符串)#include #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 :“ lead

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

19、&stu; stu.num=10301; stu.name=Wang Fun; stu.sex=f; stu.score=89.5; coutstu.num stu.name stu.sex stu.scoreendl; cout(*p).num (*p).name (*p).sex (*p).scoreendl;coutnum name sex scoreendl; return 0;24共用体(共用体(不作介绍不作介绍)C+语言中,允许语言中,允许不同的数据类型使用不同的数据类型使用同一存储区域同一存储区域,即,即同一存储区域由不同类型的变量共同表示。这种数据类型同一存储区域由不同类型的变

20、量共同表示。这种数据类型就是共用体。就是共用体。union 共用体名共用体名 成员表列;成员表列; 变量表列;变量表列;union data int i; char ch; float f; a, b, c;union data a, b, c;这几个成员在共用体变量中存放在同一地址,相互覆盖,这几个成员在共用体变量中存放在同一地址,相互覆盖,其长度为最长的成员的长度其长度为最长的成员的长度。25共用体变量的引用共用体变量的引用不能整体引用共用体变量,只能引用变量中不能整体引用共用体变量,只能引用变量中的成员。的成员。a.i 表示为整型表示为整型a.ch 表示为字符型表示为字符型a.f 表示为

21、符点型表示为符点型26共用体变量的特点共用体变量的特点1、共用体的空间在某一时刻只有一个成员在起作、共用体的空间在某一时刻只有一个成员在起作用。用。2、共用体变量中的成员是最后一次放入的成员。、共用体变量中的成员是最后一次放入的成员。3、共用体变量不能在定义时赋初值。、共用体变量不能在定义时赋初值。4、共用体变量不能作为函数的参数或函数值,但、共用体变量不能作为函数的参数或函数值,但可使用指向共用体的指针变量。可使用指向共用体的指针变量。5、共用体可以作为结构体的成员,结构体也可以、共用体可以作为结构体的成员,结构体也可以作为共用体的成员。作为共用体的成员。27union un int i;

22、double y;struct st char a10; union un b;coutsizeof(struct st)endl;1828/ceshi7-2union un short int a; char c2; w;w.c0=A; w.c1=a;coutoctw.aendl; cout decw.aendl;低字节低地址低字节低地址高字节高地址高字节高地址aAw.c1w.c02000H2001H输出:输出:0605010 1 1 0 0 0 0 1 0 1 0 0 0 0 0 1a65 ?56 ?652000H2001H29int main(void) union EXAMPLE st

23、ruct 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.ysun)6、枚举值可以进行加减一个整数、枚举值可以进行加减一个整数n的运算,得到其前后第的运算,得到其前后第n个元素的值。个元素的值。workday=sun;workday=(weekday)(workday+2);workday= = tue7、枚举值可以按整型输出其序号值。、枚举值可以按整型输出其序号值。workday=tue;coutworkday;234/ceshi7-3int main(vo

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

25、一组符合条件。36例7-8(续)#include #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) & (k!=j) n=n+1; coutn; for (loop=1;loop=3;loop+) switch (loop

26、) case 1: pri=color(i);break; case 2: pri=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) b

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

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

29、 #include using namespace 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 :“ leade

30、rj.count endl;return 0;41实验题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;in;i+) coutinput scores of student i+1endl; coutstui.num; coutstui.name; for (j=0;j3;j

31、+) coutscore j+1stui.scorej; coutendl; 42average=0; max=0; maxi=0; for (i=0;in;i+) sum=0; for (j=0;jmax) max=sum; maxi=i; average/=n;cout NO. name score1 score2 score3 averageendl; 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

32、average=averageendl; coutThe highest score is :stumaxi.name, score total:maxendl; return 0; 43实验题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)&(j!=k) n+; coutsetw(3)n; for (lo

33、op=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; couttotal:nendl;return 0;44

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号