第08章(06级)结构体、共用体和枚举类型.ppt

上传人:sccc 文档编号:5886633 上传时间:2023-08-29 格式:PPT 页数:37 大小:220.54KB
返回 下载 相关 举报
第08章(06级)结构体、共用体和枚举类型.ppt_第1页
第1页 / 共37页
第08章(06级)结构体、共用体和枚举类型.ppt_第2页
第2页 / 共37页
第08章(06级)结构体、共用体和枚举类型.ppt_第3页
第3页 / 共37页
第08章(06级)结构体、共用体和枚举类型.ppt_第4页
第4页 / 共37页
第08章(06级)结构体、共用体和枚举类型.ppt_第5页
第5页 / 共37页
点击查看更多>>
资源描述

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

1、第8章 结构体、共用体和枚举类型问题的提出,二维表格:学号 姓名 年龄 性别 成绩1 成绩2 平均成绩 1 AA 19 M 80 90 85 2 BB 18 F 78 70 74 3 CC 17 M 81 75 73 4 DD 18 F 80 60 70 5 EE 19 M 76 88 82,每行的数据类型不相同,如何表示此二维数据?如何交换两行值?能否将一行看成一个整体?,8.1 结构体的定义及应用概念 行:对象。列:属性。用具体属性值描述一个具体对象。定义一种类型,用于描述一类对象,,struct stud int num;/学号 char name20;/姓名 int age;/年龄 c

2、har sex;/性别 int score;/成绩;,一种新的数据类型,类型标识符为 struct stud 或 stud,构造类型:由基本类型派生出来,如数组、结构体、共用体,8.1.1 结构体类型的定义,一般形式:,struct 结构体名 类型名1 成员变量1;类型名2 成员变量2;.类型名n 成员变量n;;,说明:(1)结构体类型是一种构造数据类型,它与 int,char,float 等系统定义的 基本数据类型具有同等地位,是由用户自行定义的。,(2)系统在使用用户自定义的数据类型的变量时,会根据类型为其分配存储空间。,8.1.2 结构体类型变量的定义(三种方法)1.在定义结构体类型的

3、同时 定义变量 struct stud int num;char name20;int age;char sex;int score;stud1,stud2;,2.在结构体类型已定义 之后 定义变量 struct stud int num;char name20;int age;char sex;int score;struct stud stud3,stud4;,占用33字节,3.缺省结构体名,直接定义 struct int num;char name20;int age;char sex;int score;stud5,stud6;,特点:只能定义一次此种类型的结构体变量,之后该结构体类型

4、定义就无用了,除非重新定义结构体类型。,类型与变量是完全不同的概念。类型:抽象概念,不可赋值、存贮、运算;系统不分配空间。变量:具体对象,可赋值、存贮、运算;系统为其分配空间。应先定义结构类型,再定义该类型的变量。,结构体变量的初始化struct stud stud1=1000,Wu,19,M,80,stud2=2000,Li,18,F,80;,8.1.3 结构体变量及其成员的使用1.引用整体,如整体赋值struct stud stud3,stud4;stud3=stud1;,2.引用成员,对于一个具体的结构体变量来说 stud1.num-相当于一个整型变量 stud1.name-字符串 st

5、ud1.age-整型变量 stud1.sex-字符型变量 stud1.score-整型变量,3.使用结构体变量的成员,就象使用一个简单变量一样cin stud3.num;/输入cout stud3.num stud3.name;/输出stud3.age=stud2.age+1;/数学运算strcpy(stud3.name,Cheng);/字符串赋值stud3.sex=F;/字符赋值,注意:结构体变量不能进行整体输入输出,只能对其基本类型成员输入输出。,若要整体输入输出,需用到面向对象部分介绍的运算符重载技术。,#include struct complex double real;double

6、 image;void main(void)complex a=1.0,2.0,b=1.0,2.0,c;couta=(a.real,a.image)n;coutb=(b.real,b.image)n;c.real=a.real+b.real;c.image=a.image+b.image;couta+b=(c.real,c.image)n;,例:定义复数,实现复数加法(请记录),结构体类型的变量也可以作为函数的参数及返回值。改写本例,见下页,输出结果:a=(1,2)b=(1,2)a+b=(2,4),#include struct complex double real;double image

7、;complex add(complex a,complex b)/注意:形参及返回值 complex x;x.real=a.real+b.real;x.image=a.image+b.image;return x;void main(void)complex a=1.0,2.0,b=1.0,2.0,c;couta=(a.real,a.image)n;coutb=(b.real,b.image)n;c=add(a,b);/注意:实参及调用形式 couta+b=(c.real,c.image)n;,例:定义复数,实现复数加法(请记录),结构体类型的变量,可以作为函数的参数和返回值。,8.1.4

8、结构体数组 1.定义结构体数组 一个班30个学生 stud studs30;/stud 为已定义的结构体类型,含义:30个元素,每个元素都是一个结构体变量 studs0,studs1,studs29,2.结构体数组的初始化 stud studs30=1000,Wu,19,M,80,2000,Li,18,F,90,2900,Cheng,18,M,80;,struct stud int num;/*学号*/char name20;/*姓名*/int age;/*年龄*/char sex;/*性别*/int score;/*成绩*/;,存储状况,3.结构体数组元素的引用(1)整体赋值 stud st

9、ud1=,stud3=;stud studs30;studs0=stud1;studsi=stud3;,(2)对每个元素成员的引用 studs0.name,studs0.age studsi.num,studsi.sex,struct stud int num;char name20;int age;char sex;int score;void main(void)stud studs30=1000,Wu,19,M,80,2000,Li,18,F,90,2900,Cheng,18,M,80;int i,aver=0;for(i=0;i30;i+)aver+=studsi.score;aver

10、/=30;cout aver endl;,例:求一个班学生的平均成绩,结构体类型数组及数组元素的使用:,与一般数据类型相同,可以作为函数的参数及返回值。,例:8.2 建立一个学生档案的结构体数组,P127 输入并输出学生的数据。,#include struct studentint num;char name20;float score;student Input()/返回结构体变量student stud;coutstud.numstud.namestud.score;return stud;,void Output(student stud)/结构体变量做参数cout 学号为 stud.n

11、umn 姓名为 stud.namen成绩为 stud.scoreendl;void main()student studs3;for(int i=0;i3;i+)studsi=Input();/返回结构体变量for(i=0;i3;i+)Output(studsi);/结构体变量做参数coutendl;,改写 例8.2 P128,#include struct studentint num;char name20;float score;void Input(student/不需要 return 语句,void Output(student,#include struct studentint

12、num;char name20;float score;void Input(student studs,int n)/结构体数组做参数,注意形参的写法for(int i=0;istudsi.score;/输入部分值double Average(student studs,int n)/注意形参double av=0;for(int i=0;in;i+)av+=studsi.score;return(av/n);,结构体类型数组做函数的参数:,void Output(student studs,int n)/注意形参for(int i=0;in;i+)coutstudsi.numtstudsi

13、.namet studsi.scoreendl;void main()student studs4=101,“Wang”,/初始化部分值 102,Zhang,103,Cheng,104,Liu;double aver;Input(studs,4);/结构体数组做参数,注意实参的写法aver=Average(studs,4);Output(studs,4);coutAverage=averendl;,运算符 sizeof(类型标识/变量名)求某类变量所占字节数,例 short i;float x;struct stud stud1;sizeof(short)sizeof(i),结果均为2,siz

14、eof(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;/*成绩*/;,8.2 共用体的定义及应用 问题的提出:表格“学生:班级/教师:职务”,struct people char name10;int num;char sex;char job;union int class;char positio

15、n20;category;,Class 和 Position的使用是互斥的,可分成两列,为节省空间,合并成一列。,8.2.1 共用体类型的定义 union data short i;char c;float f;x,y;,特点:三个成员共享存储单元,即三个成员起始地址相等。(部分存储单元共用)同一时刻,只能有一个成员有效!,图 c 占 1 个字节 i 占 2 个字节 f 占 4 个字节,类型标识符为:union data 或 data,8.2.2 共用体变量的定义和使用,union data short i;char c;float f;x,y;union data x,y;(1)引用整体 x

16、=y;(2)引用成员 x.i=1;x.f=1.5;x.c=A;,8.2.3 公用数据类型的体特点,(2)每一时刻,只能一个成员起作用。,(1)存储字节 union data x,y;sizeof(union data)=sizeof(x)=sizeof(y)=4 其长度是其占用字节数 最长的成员 的长度。,(3)结构体和公用体可以互相嵌套。,union data short i;char c;float f;x,y;,(4)作为一种数据类型,公用体变量也可以作为函数的参数及返回值。,定义共用体的目的有两个:节省空间;特殊效果,比如分别取出一个整数的四个字节。例8.4分别取出一个整数的四个字节。

17、#include void main()union int i;char c4;a;cout a.i;cout=0;k-)cout(int)a.ckt;/一个整数的四个字节分别对应/字符数组的每个元素 coutendl;,运行情况如下:请输入一个整数:511整数的四个字节中的数分别为:001-1,例:#include void main(void)union exam struct int x;int y;in;int a,b;e;e.a=1;e.b=2;e.in.x=e.a*e.b;e.in.y=e.a+e.b;cout sizeof(exam);cout e.in.x,e.in.y end

18、l;问题:变量 e 占有几个字节存储空间?输出什么?,8 字节 4,8,在函数中定义的变量,先定义的后分配空间。而结构体内部成员的存储空间分配是按顺序的。,enum weekday Sun,Mon,Tue,Wed,Thu,Fri,Sat;用户取名 枚举常量,8.3 枚举类型一、定义枚举类型 有时需将一个变量的取值范围限定在某个集合内如 一周内天数:周一、周二、周三、周四、周五、周六、周日 三基色:红、绿、兰可将其定义成枚举类型枚举-将变量的取值范围列举出来,enum basic_color Red,Green,Blue;,0 1 2 3 4 5 6,类型标识符为:enum weekday 或

19、weekday,二、定义枚举类型变量 enum weekday Sun,Mon,Tue,Wed,Thu,Fri,Sat;weekday day1,day2 意义:变量 day1,day2 的值只能取上述括号中的值 如:day1=Sun;day2=Wed;,三、特点1.不能对枚举常量赋值 如 Sun=7,2.枚举常量有默认值,为 0,1,2,.,3.在定义时,可以改变枚举常量的值(通常周日是一周的第七天)enum weekday Sun=7,Mon=1,Tue,Wed,Thu,Fri,Sat;Tue 以后的枚举常量虽然没有显式赋值,但它们已有值了。,4.不能直接通过键盘输入枚举变量的值,但可以输

20、出枚举常量和变量的值,实际上输出的是序号。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,P132 例8.6:穷举法,结果有60种情况#include 此算法较好!enum color red,yellow,blue,white,black;void Print(color col)switch(col)case red:cout red t;break;case yellow:cout yello

21、w t;break;case blue:cout blue t;break;case white:cout white t;break;case black:cout black t;break;default:break;,void main()color i,j,k;int n=0;/计数器:记录共有几种取法 for(i=red;i=black;i=(color)(int(i)+1)for(j=red;j=black;j=(color)(int(j)+1)for(k=red;k=black;k=(color)(int(k)+1)if(i!=j,讲述几点:学生问题调试程序程序书写风格结构体编

22、程,结构体对象-成员的输入本章讲稿共享,(1)输入 a=input();(2)输出 output(a);(3)加 c=add(a,b);对应实部相加,对应虚部相加(4)减 c=sub(a,b);对应实部相减,对应虚部相减(5)乘 c=mul(a,b);c.real=a.real*b.real-a.image*b.image;c.image=a.real*b.image+a.image*b.real;(6)除 c=div(a,b);fm=b.real*b.real+b.image*b.image;c.real=(a.real*b.real+a.image+b.image)/fm;c.image=

23、(a.real*b.real-a.image*b.image)/fm;,struct complex double real;double image;complex a,b,c;,有关复数运算:输入、输出、加、减、乘、除,实验八 第2题 程序总体结构 提示:,struct complex.;complex input()complex x;cin x.real x.image;return x;void output(complex x).void main()complex a,b,c;coutPlease input complex number a and b:;a=input();b

24、=input();c=add(a,b);cout”c=;output(c);.,实验八 第3题 程序总体结构 提示:,struct point.;point input(point 提示并输入a、b两点坐标。求出a、b两点间距离len。输出a、b两点坐标及其两点间的距离len。,实验八 第4题 程序总体结构 提示:,struct student.;void input(student studs,int n)/只输入三门课成绩.void average(student studs,int n).void main()student studs10=wang,99011,/初始化姓名、学号 liu,99021,;int n;cout n;input(studs,n);average(studs,n);sort(studs,n);output(studs,n);,

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

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号