结构体、共用体和枚举类型.ppt

上传人:文库蛋蛋多 文档编号:2204158 上传时间:2023-01-30 格式:PPT 页数:71 大小:429KB
返回 下载 相关 举报
结构体、共用体和枚举类型.ppt_第1页
第1页 / 共71页
结构体、共用体和枚举类型.ppt_第2页
第2页 / 共71页
结构体、共用体和枚举类型.ppt_第3页
第3页 / 共71页
结构体、共用体和枚举类型.ppt_第4页
第4页 / 共71页
结构体、共用体和枚举类型.ppt_第5页
第5页 / 共71页
点击查看更多>>
资源描述

《结构体、共用体和枚举类型.ppt》由会员分享,可在线阅读,更多相关《结构体、共用体和枚举类型.ppt(71页珍藏版)》请在三一办公上搜索。

1、第10章 结构体、共用体和枚举类型,本章要点,了解结构了解关于结构的各种操作理解怎样使用结构操作数据理解结构和函数之间的关系、掌握结构作为参数传递与返回结构的函数方法理解结构中数组的用法理解怎样创建结构数组了解共用体的特点了解枚举类型,问题的提出,学号 姓名 年龄 性别 成绩1 成绩2 平均成绩 1 AA 19 M 80 90 90 2 BB 18 F 78 70 73 3 CC 17 M 81 75 79 4 DD 18 F 80 60 75 5 EE 19 M 76 83 83,每行的数据类型不相同,如何表示此二维数据?如何交换两行值?能否将一行看成一个整体?,定义一种类型,把不同的数据作

2、为一个整体来处理结构体,数据类型,数组-有相同类型的数据集合结构体-不同类型的数据集合,构造数据类型:由简单数据类型(int、float、char)组合而成的(有机整体)数据类型。,基本类型:整型、实型、字符型.,主要内容,结构体类型的定义结构体类型的变量和结构体类型数组共用体枚举类型,结构体类型的定义,定义了一种新的数据类型 struct 结构体名或结构体名,struct 结构体名 类型标识符 成员名1 类型标识符 成员名2.类型标识符 成员名n;,可为简单类型也可为构造类型,不能少,例,以学生档案为例,假设包括如下数据项 学号(num):整型 姓名(name):字符串 性别(sex):字符

3、型 出生日期(birthday):date结构体 四门课成绩(sc):一维实型数组,例,依此格式定义上例struct date int year,month,day;struct student int num;char name12;char sex;date birthday;float sc4;,如struct date 没事先说明可写成:struct student int num;char name12;char sex;struct int year;int month;int day;birthday;float sc4;,例,例1:一组相关变量 定义结构体类型,新数据类型,结构

4、体成员,int month;int day;int year;,struct date int year;int month;int day;,不同数据类型的成员,例2:一组相关变量 定义结构体类型,说明,(1)结构体类型是一种构造数据类型,它与int,char,float等系统定义的基本数据类型具有同等地位,是由用户自行定义的。,(2)结构体类型不分配任何存储空间。相应结构体类型的变量、数组及动态开辟的存储单元占存储空间。,构造的数据类型可以用来定义变量,结构体类型的变量和数组的定义方法,先定义结构体类型,再单独进行定义在定义类型的同时定义结构体变量在定义一个无名结构体类型的同时,直接进行定

5、义,方法一,先声明结构体类型再定义结构体变量,struct 结构体名 成员列表;struct 结构体名 变量名列表;或结构体名 变量名列表,例,struct student int num;char name12;char sex;date birthday;float sc4;struct student std,pers3;或student std,pers3;,std:结构体变量pers:结构体数组,(三个元素均为结构体类型变量),变量std的结构,birthday,注意:各成员按顺序排列,方法二,在声明类型的同时定义结构体变量,struct student int num;char n

6、ame12;char sex;struct date birthday;float sc4;std,pers3;,struct 结构体名 成员列表 变量名列表;,struct int num;char name12;char sex;date birthday;float sc4;std,pers3;,方法三,直接定义结构体变量,struct 成员列表 变量名列表;,无结构体名,结构体类型的几点说明,结构体中的成员可以象变量一样使用。,成员名可以与程序中的变量同名,结构体中的成员也可为结构体变量,类型与变量是完全不同的概念。先定义结构类型,再定义变量为该类型。类型:不可赋值、存贮、运算;系统不

7、分配空间。变量:可赋值、存贮、运算;系统要分配空间。,结构体类型变量初值,struct student int num;char name12;char sex;date birthday;float sc4;std=10101,LiMing,M,1962,5,10,88,76,85.5,90;,注意:一一对应赋初值,不允许跳跃赋值。可只给前面的成员赋值,给结构体数组赋初值,数组中的每个元素是一个结构体类型的数据,因此将此成员的值依次放在一对花括号中,例:struct bookcard char num5;float money;bk3=NO.1,35.5,NO.2,25.0,NO.3,66.

8、7;,给二维结构体数组赋初值例,struct char ch;int i;float x;arr23=a,1,3e10,a,2,4e10,a,3,5e10,b,1,6e5,b,2,7e5,b,3,8e5;,结构体类型变量及其成员的引用,两种方式引用成员结构体变量名.成员名引用整体struct t int i,j;char name10;t t1=12,48,LiLi,t2;t2=t1;其中“t2=t1;”等同于:t2.i=t1.i;t2.j=t1.j;strcpy(t2.name,t1.name);,结构体变量的成员可以像普通变量一样进行各种运算,如stud1.num+、stud1.sex=s

9、tud2.sex;,结构体变量不能进行整体输入输出,优先级:1 结合性:左 例:有定义:struct date 对变量today作成员选择运算:int year;today.year int型 int month;today.month int型 int day;today.day int型 today;成员选择运算的结果是得到了该结构变量的某个成员,其数据类型是定义该结构体类型时成员列表中定义的类型。,成员运算符“.”,例,struct data int month;int day;int year;struct student char name20;char sex;data birth

10、day;int sc4;std,arr5;,(1)引用sex std.sex(通过结构体变量引用),引用arr0中的sex:arr0.sex不能写作 arr.sex,例,struct data int month;int day;int year;struct student char name20;char sex;data birthday;int sc4;std,arr5;,(2)引用sc中的元素,如sc1std.sc1(通过结构体变量引用),不能写成std.scC+语言不允许对数组整体访问(字符串除外),例,struct data int month;int day;int year;

11、struct student char name20;char sex;data birthday;int sc4;std,arr5;,(3)成员为字符串如name std.name(通过结构体变量引用)arr0.name,例,struct data int month;int day;int year;struct student char name20;char sex;data birthday;int sc4;std,arr5;,(4)内嵌结构体成员的引用逐层使用成员名定位引用std中的出生年份std.birthday.year,只可引用最低一级成员,例std.name是字符串,可以对

12、它进行对任何字符串允许的操作,包括输入输出。,对结构体变量中的每个成员,可对它进行同类变量所允许的任何操作。,对结构体变量中的成员进行操作,例,struct data int month;int day;int year;struct student char name20;char sex;data birthday;int sc4;std,pers5;,(1)对name的操作cinstd.name;或cin.getline(std.name,80);(2)对sex的操作cinstd.sex;for(i=0;ipersi.sex;std.sex=M;,注意:不能写成std.name=Li M

13、ing,struct data int month;int day;int year;struct student char name20;char sex;data birthday;int sc4;std,pers5;,例,(3)对birthday中year的操作cinstd.birthday.year;std.birthday.year=1962;,结构体数组,struct studentint num;char name20;char sex;int age;float score;char addr30;stud4=23901,Zang Li,F,19,78.5,35 Shangha

14、i Road,23902,Wang Fang,F,19,92,101 Taiping Road,23905,Zhao Qiang,M,20,87,56 Ninghai Road,23908,Li Hai,M,19,95,48 Jiankang Road;,内存存储情况,stud0,stud1,结构体数组的应用,问题:建立一个学生档案的结构体数组,输入并输出学生的信息。#include/li0802_2.cpp 输入输出学生信息#include struct studentchar num16;char name20;float score;student Input(student stud)

15、coutstud.numstud.namestud.score;return stud;,结构体数组的应用,void Output(student stud)coutsetw(10)stud.numsetw(10)stud.name setw(10)stud.scoreendl;void main()student studs3;for(int i=0;i3;i+)studsi=Input(studsi);coutsetw(10)学号setw(10)姓名setw(20)程序设计成绩 endl;for(i=0;i3;i+)Output(studsi);coutendl;,传值调用,演示,引用调用

16、,#include/输入输出学生信息#include struct studentchar num16;char name20;float score;void Input(student,引用调用,void Output(student,求若干学生的平均成绩,struct stud int num;char name20;int age;char sex;int score;,#include float average(stud studs,int n)float aver=0;for(int i=0;in;i+)aver+=studsi.score;aver/=n;return aver

17、;void main(void)stud studs4=020110101,Wu,19,M,80,;float aver;aver=average(studs,4);cout 平均成绩为:aver endl;,结构体变量所占字节数,结果均为2,sizeof(float)sizeof(x),结果均为4,sizeof(struct stud)sizeof(stud)sizeof(stud1),结果均为33 实际运行输出36(4的倍数),struct stud int num;/*学号*/char name20;/*姓名*/int age;/*年龄*/char sex;/*性别*/int score

18、;/*成绩*/;,例 short i;float x;struct stud stud1;sizeof(short)sizeof(i),用sizeof(类型标识/变量名),10.2 结构与指针,结构变量的成员可以通过点操作符进行访问,也可以通过指针进行访问。若定义一个结构指针,并把一个结构变量的地址赋给它,则通过该指针可对结构变量的成员进行访问。结构指针定义格式如下:person*p;/定义指向结构类型的指针 person pr1;/定义结构类型变量 若p=(*p).salary 等效于p-salary.,在使用指针访问成员时,通常使用箭头操作符“-”。例如:下面程序中,定义了结构指针,通过结

19、构指针访问结构成员。#include#include strut person char name20;unsigned long id;float salary;,void main()person pr1;person*p;p=结果为:Wang ming 12345678 4800.0,如果一个数组的元素是同一种结构类型的变量,那么这种数组称为结构数组。要定义一个结构数组,必须先定义一个结构类型,然后再定义具有这种结构类型的一个数组。例如,定义一个包含100个元素的person 结构数组:struct person char name20;unsigned long id;float sa

20、lary;person allone100;,10.3 结构与数组,数组中每个元素是一个完整的结构变量,它包含name、id、salary三个成员分量。allone0 访问第一个数组元素;allone99访问最后一个数组元素。例如:下面程序对一个person 结构数组中的元素进行“冒泡法”排序,工资高的排在后面。#include struct person char name20;unsigned long id;float salary;,person allone6=“jone”,12345,3390.0,“david”,13916,4490.5,“marit”,27519,3110.0,

21、“jasen”,42876,6230.5,“peter”,23987,4000.2,“yoke”,12335,5110.0;void main()person temp;for(int i=1;iallonej+1.salary)/工资高的后移 temp=allonej;allonej=allonej+1;alonej+1=temp;,for(int k=0;k6;k+)coutallonek.name“”allonek.id“”allonek.salaryendl;运行结果为:marit 27519 3110.0jone 12345 3390.0peter 23987 4000.2david

22、 13916 4490.5yoke 12335 5110.0jasen 42876 6230.5,结构变量也可以作为实参数进行函数调用。可以采用传值、传址、传引用的三种方式传递参数。一、传递结构变量值 因为传递的是实参结构变量中拷贝的数值,所以实参结构变量的数值不会因为函数的调用而被修改。例如:下面是一个传值调用的例子#include struct person char name20;unsiged long id;float saslary;,10.4 传递结构参数,void print(person pr)coutpr.name“”pr.id“”pr.salaryendl;person

23、allone4=“jone”,12345,3390.0,“david”,13916,4490.5,“marit”,27519,3110.0,“yoke”,12335,5110.0;void main()for(int i=0;i4;i+)print(allonei);/实参数为结构数组元素 结果为:jone 12345 3390.0 david 13916 4490.5 marit 27519 3110.0 yoke 12335 5110.0,二、传递结构变量的引用 结构变量也可以按引用方式传递,此时仅把实参的地址传给形参。由于传递的是地址,可以实现由形参直接修改实参的作用。引用传递没有传递值

24、的拷贝数据过程,节省了传送时间和所需的存储空间,传递效率提高。,例如,将前面的程序改为用引用传递结构变量,只需在print()函数定义时,将形参说明为引用。其函数调用方式与传递方式相同。void print(person三、传递结构变量的地址 传递结构变量地址与传递引用的功能类似,都能实现双向传递。若将前面程序改为传递结构变量的地址,只需定义print()函数时,将形参说明为指向结构变量的指针,函数调用时传递实参结构变量的地址。,返回值为结构类型的函数称为结构函数。一、返回结构变量 一个函数可以返回一个结构变量。在main()中,调用结构函数的返回值必须赋于具有相同结构类型的变量。例如:#in

25、clude struct person char name20;unsigned long id;float salary;,10.5 结构函数,person getperson()/定义返回结构变量的函数 person temp;couttemp.name;couttemp.idtemp.salary;return temp;/返回结构变量tempvoid print(person,void main()person employee3;for(int i=0;i3;i+)employeei=getperson();/返回值赋给同类型的结构变量 print(employeei);结果:Ple

26、ase enter a name for one person:maritPlease enter ones ID number and his salary:3110.0marit 27519 3110.0,如果将上例中的getperson()函数改为引用传递,则可提高程序运行效率,省去函数返回值赋以同类型结构变量的操作。改写后的程序如下:#include struct person char name20;unsigned long id;float salary;void getperson(person,void print(person 二、返回结构的引用 一个函数可以返回一个结构引

27、用,也可以返回一个结构指针。,一、结构的嵌套 结构可以嵌套,即结构中可以是另一个结构类型的成员变量。例如:struct person struct date char name10;int month;int age;int day;float wage;int year;data payday;worker;也可以表示为:,10.6 链表结构,struct person char name10;int wage;struct date int month;int day;int year;payday;worker;结构变量payday 是嵌套在结构person 内的一个成员分量。在访问嵌套

28、结构的成员时,可以使用多个点操作符,从最外层到最内层逐个列出成员名:worker.wage=5000.0;worker.payday.month=11;,二、链表结构 结构成员变量不能包含有自身的结构变量,但可以是指向该结构变量的指针。通过包含一个指向自身结构的指针,可以实现不连续分布的结构变量的遍历。如下面的结构:strct list char name20;list*pn;其中,name成员含有实际的信息;pn 是指向另一个list 结构变量的指针。,显然,通过结构变量中的指针成员链接,能构成任意长度的结构链,这样的结构链称为链表。链表中的每个list 结构变量称为一个结点。,链首指针,0

29、074:8AC2,0074:8854,0074:28F6,0074:38FA,0074:88F2,链表是由一个个有序的结点组成的,每个结点是同类型的结构变量。通过程序可以建立和显示链表,可以插入、删除及增加结点来维护链表。链表总是包含有链首指针,链表的操作一般都先由链首指针引导。三、链表的创建与遍历例如:下面程序建立一个链表,并输出该链表。#include struct student long number;float score;student*next;,student*head;/链首指针student*greate()/创建链表函数 student*ps;/创建新结点指针 stude

30、nt*pend;/移动的链尾指针,用于在其后插入结点 ps=new student;/动态申请新建结点的存储空间 cinps-numberps-score;/结点赋值 head=NULL;/开始时链表为空 pend=ps;while(ps-number!=0)if(head=NULL)head=ps;else pend-next=ps;,pend=ps;/S点 ps=new student;cinps-numberps-score;pend-next=NULL;delete ps;return(head);void showlist(student*head)coutnumberscorene

31、xt;,void main()showlist(greate();输入:结果:85.0 The items of list are:73.0 401,85.0 91.0 410,73.0 68.0 425,91.0 82.0 413,68.00 0 432,82.0,在main()中,把建立链表函数greate()的返回值head(指向链表指针)作为实参数调用showlist()函数。,greate()函数中,链表创建过程如下图所示:进入循环之前:head NULL第一次进入循环到达S点:pend ps head第一次循环结束后:head pend ps,第二次循环到达S点时:head pen

32、d ps第二次循环结束时:head pend ps程序结束时:head,NULL,共用体的定义及应用,问题的提出:表格“学生班级/教师职务”,struct people char name10;int num;char sex;char job;union int class;char position20;category;,Class 和 Position的使用是互斥的,可分成两列,为节省空间,合并成一列。,共用体变量的定义,不同数据类型的一组变量使用同一组内存单元。,union data char c;float f;int i;;union data a,b,c;或data a,b,c

33、;,union data char c;float f;int i;a,b,c;,union char c;float f;int i;a,b,c;,共用体变量的定义同结构体一样有三种形式:,关键字,共用体名,共用体类型,使用共用体变量,引用成员a.i/引用共用体变量中的整型变量ia.c/引用共用体变量中的字符变量ca.f/引用共用体变量中的实型变量f引用整体a.i=2;b=a;/引用整体,unionshort int i;char c;float f;a,b,c;,共用体类型的特点,f,i,c,特点:三个成员共享存储单元,即三个成员起始地址相等(部分存储单元共用)同一时刻,只能有一个成员有效

34、!,图 c 占 1 个字节 i占 2 个字节 f占 4 个字节,(1)采用内存覆盖技术,使不同数据类型的各个成员变量共用同一存储区。(2)共用体变量所占内存长度为其最长成员的长度。sizeof(union data)=sizeof(a)=sizeof(b)=4(3)结构体和共用体可以互相嵌套。(4)作为一种数据类型,共用体变量也可以作为函数的参数及返回值。,枚举类型,有时需将一个变量的取值范围限定在某个集合内如 一周内天数:周一、周二、周三、周四、周五、周六、周日三基色:红、绿、兰可将其定义成枚举类型枚举-将变量的取值范围列举出来,enum weekday Sun,Mon,Tue,Wed,Th

35、u,Fri,Sat;用户取名 枚举常量,enum basic_color Red,Green,Blue;,0 1 2 3 4 5 6,类型标识符为:enum weekday 或 weekday,枚举类型变量的定义,enum weekday Sun,Mon,Tue,Wed,Thu,Fri,Sat;weekday day1,day2意义:变量 day1,day2 的值只能取上述括号中的值 如:day1=Sun;day2=Wed;,特点,不能对枚举常量赋值 如 Sun=7 枚举常量有默认值,为 0,1,2,.在定义时,可以改变枚举常量的值(通常周日是一周的第七天)enum weekday Sun=7,Mon=1,Tue,Wed,Thu,Fri,Sat;Tue 以后的枚举常量虽然没有显式赋值,但它们已有值,特点,不能直接通过键盘输入枚举变量的值,可以输出枚举常量和变量的值,实际上输出的是序号。enum weekday Sun,Mon,Tue,Wed,Thu,Fri,Sat;weekday day1,day2;cin day2;/此行错 cout Sun t Sat endl;day1=Tue;cout day1 n;,输出?,062,

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

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号