CC++语言程序设计第6章结构体共用体和枚举精选课件_第1页
CC++语言程序设计第6章结构体共用体和枚举精选课件_第2页
CC++语言程序设计第6章结构体共用体和枚举精选课件_第3页
CC++语言程序设计第6章结构体共用体和枚举精选课件_第4页
CC++语言程序设计第6章结构体共用体和枚举精选课件_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1第六章 结构体、共用体和枚举C/C+语言程序设计龚尚福,贾澎涛主编C/C+语言程序设计西安电子科技大学出版社第1页,共74页。2第6章 结构体、共用体与枚举6.1 结构体类型的声明 6.2 结构体变量的定义、引用和初始化 6.3 结构体数组6.4 结构体与指针6.5 结构体与函数6.6 共用体6.7 枚举类型6.8 类型定义语句typedef6.9 小结第2页,共74页。3 一个学生的信息有学号、姓名、性别、年龄、住址、成绩等。 一本图书的信息有分类编号、书名、作者、出版社、出版日期、价格、库存量等。 如何描述这些类型不同的相关数据?6.1 结构体类型的声明 ?信息管理结构体一种构造数据类型

2、 结构体由若干不同类型的数据项组成, 构成结构体的各个数据项称为结构体成员。 第3页,共74页。4 6.1 结构体类型的声明结构体类型定义的一般形式: struct为关键字,不能省略;结构体名是该结构体类型的名称,命名应符合标识符的定义要求。 成员可以是任何类型的变量,包括基本数据类型和构造数据类型,如整型、浮点型和字符型,数组和指针等,也可以是另一个结构体类型的结构体变量或自身结构体的指针,还可以是共用体变量。struct 结构体名 数据类型1 成员名1; 数据类型2 成员名2; 数据类型n 成员名n; ;第4页,共74页。5例6.1一个学生的基本信息由学号、姓名、性别、成绩组成,声明相应的

3、结构体类型。struct student int num ; /* 学号是整型 */ char name20; /* 姓名是字符数组类型 */ char sex; /* 性别是字符型 */ float score; /* 成绩是实型*/ ;6.1 结构体类型的声明num4个字节name20个字节sex1个字节score4个字节第5页,共74页。66.1 结构体类型的声明例如图书类型的定义: struct bookcard char num10; /*图书分类编号是字符数组类型*/ char name30; /*书名是字符数组类型*/ char author30; /*作者是字符数组类型*/ c

4、har publisher60; /*出版社是字符数组类型*/ float price; /*价格是单精度实型*/ int n; /*库存量是整型*/ ;第6页,共74页。6.1 结构体类型的声明例6.2 在学生基本信息中增加出生日期,声明学生信息结构体类型。struct date int year; int month; int day; ;7struct student int num;char name20;char sex; struct date birthday; /* birthday成员为date 结构体类型*/float score;num4个字节name20个字节sex1个

5、字节birthdayyear4个字节month4个字节day4个字节score4个字节第7页,共74页。6.1 结构体类型的声明说明:(1) 结构体声明的位置,可以在函数内部,也可以在函数外部。在函数内部声明的结构体,只能在函数内部使用;在函数外部声明的结构体,其有效范围是从声明处开始,直到它所在的源程序文件结束。(2) 数据类型相同的数据项,既可逐个、逐行分别声明,也可以合并成一行声明。如例6.2中的日期结构体类型,也可改为如下声明形式:struct date int year,month,day;8第8页,共74页。6.1 结构体类型的声明(3) 同一结构体类型中的各成员不可以互相重名,但

6、不同结构体类型间的成员可以重名。成员名可以和程序中的变量名相同,两者代表不同的对象,互不干扰。如下声明是正确的:int x,y; /*基本数据类型变量*/struct point int x, y; /*结构体point中的一个成员 */;9第9页,共74页。6.1 结构体类型的声明(4)结构体中成员的类型不能是被描述的结构体本身。如下描述是非法的: struct invalid int n; struct invalid iv; ;10若成员类型是描述的结构体本身的指针是合法的。如: struct invalid int n; struct invalid *iv; ;第10页,共74页。1

7、16.2 结构体变量的定义、引用和初始化 例如: struct student stu1,stu2,*p,stu10; 1. 先定义结构体,再说明结构体变量。 6.2.1 结构体变量的定义 struct 结构体名 若干成员说明; struct 结构体名 结构体变量名表;第11页,共74页。126.2 结构体变量的定义、引用和初始化 也可以使用宏定义用一个符号常量来表示一个结构体类型。例如:#define STU struct studentstruct student int num; char name20; char sex; float score; ;STU stu1,stu2; 6.

8、2.1 结构体变量的定义 第12页,共74页。136.2 结构体变量的定义、引用和初始化2、在定义结构体类型的同时定义变量例如: struct student int num; char name20; char sex; float score; stu1,stu2;6.2.1 结构体变量的定义 struct 结构体名 若干成员说明 结构体变量名表;第13页,共74页。146.2 结构体变量的定义、引用和初始化3、直接说明结构体类型变量 例如: struct char name20 ; char sex; int num; float score; stu1,stu2;6.2.1 结构体变量

9、的定义 struct 若干成员说明 结构体变量名表;第14页,共74页。156.2 结构体变量的定义、引用和初始化注意: 结构体类型与结构体变量是两个不同的概念,其区别如同int类型与int型变量的区别一样。编译系统不为结构体类型分配空间,只对结构体变量分配空间。结构体类型变量所占内存空间是各成员变量所占内存单元的总和,各成员间占用的存储单元是连续的。 结构体变量中的成员可以单独使用,它的作用与地位相当于普通变量。 6.2.1 结构体变量的定义 第15页,共74页。166.2 结构体变量的定义、引用和初始化6.2.2 结构体变量引用结构体变量成员引用的一般形式: 结构体变量a的各成员可分别表示

10、为a.num、、a.sex、a.birthday、a.score struct date int year, month, day; struct student int num;char name20, sex; struct date birthday; float score; a;“.”是分量运算符,运算级别最高。a.birthday.yeara.birthday.montha.birthday.day 结构体变量的各个成员可进行何种运算,由该成员的数据类型决定 结构体变量名.成员名第16页,共74页。176.2 结构体变量的定义、引用和初始化6.2.2 结构体变量引用注意

11、: (1)不能将一个结构体变量作为一个整体进行输入和输出,只能对其成员操作。例如,下列引用是非法的: printf(%d,%s,%c,%f, stu1);(2)所引用的成员变量与其所属类型的普通变量使用方法一样,可以进行该类型所允许的任何运算。第17页,共74页。186.2 结构体变量的定义、引用和初始化6.2.2 结构体变量引用(3)只有当两个结构体变量具有完全相同的结构体类型时,相互之间才可以整体赋值。(4)在用scanf语句输入结构体变量的成员时,输入表列同样要用地址。如: scanf(%c,&stu1.sex); (5)如果成员本身是另一个结构体变量,在引用时则要用若干个成员运算符,一

12、级一级地找到最低的成员变量,而且只能对最低的成员变量进行赋值或者运算操作。第18页,共74页。196.2 结构体变量的定义、引用和初始化6.2.3 结构体变量的初始化【例6.3】结构体变量的初始化、赋值、输入和输出 。 #include stdio.hstruct student /*定义结构体*/ int num; char *name; char sex; float score; stu1, stu2,stu3=102,Zhang ping,M,78.5; 如果初值个数少于结构体成员个数,则将无初值对应的成员赋以0值。 如果初值个数多于结构体成员个数,则编译出错。 struct 结构体名

13、 结构体变量=初始化列表;第19页,共74页。206.2 结构体变量的定义、引用和初始化6.2.3 结构体变量的初始化void main()stu1.num=102; =Zhang ping;printf(input sex and scoren);scanf(%c%f,&stu1.sex,&stu1.score); printf(stu1:Number=%dnName=%sn,stu1.num,); printf(Sex=%cnScore=%.2fn,stu1.sex,stu1.score); stu2=stu3; printf(stu2:Number=%

14、dnName=%sn,stu2.num,); printf(Sex=%cnScore=%.2fn,stu2.sex,stu2.score); 第20页,共74页。216.3 结构体数组6.3.1 结构体数组的定义 定义结构体数组的方法也有三种方式: 先定义结构体类型然后再定义结构体数组; 在定义结构体类型的同时定义结构体数组; 在定义无名结构体类型的同时定义结构体数组。 struct student int num; char name20; char sex; float score; stu3; 第21页,共74页。226.3 结构体数组6.3.2 结构体数组的引用for

15、(i=0;i3;i+) scanf(%d,&stui.num); fflush(stdin); gets(); scanf(%c%f,&stui.sex,&stui.score); 结构体数组名下标.成员名第22页,共74页。236.3 结构体数组6.3.3 结构体数组的初始化struct student int num; char *name; char sex; float score; stu3= 101,Zhao lei,M,45,102,Sun hui,M,62.5,103,Li fang,F,92.5stu0stu1stu2101Zhao leiM45102Sun

16、 huiM62.5103Li fangF92.5第23页,共74页。246.3 结构体数组6.3.3 结构体数组的初始化 元素的个数可以省略,根据赋初值时结构体常量的个数确定数组元素的个数 。 内层的大括号只是为了阅读程序的方便,可以省略。 结构体数组名是结构体数组存储的首地址,可以通过数组名利用指针法或下标法访问数组元素。第24页,共74页。256.3 结构体数组6.3.3 结构体数组的初始化【例6.4 】应用结构体数组建立学生信息,实现输入编号,查询学生的基本信息和成绩的功能。#include stdio.hstruct student int num; char name15; int

17、score3; stu=1,David,80,78,92,2,Lily,90,84,89,3,Alice,79,78,96;第25页,共74页。266.3 结构体数组6.3.3 结构体数组的初始化void main( ) int i,j,number; printf(input students number:); scanf(%d,&number); /*输入学生的编号*/ for(i=0;i3;i+) /*查询学生信息*/ if(number=stui.num) break; printf(name=%sn ,); for(j=0;jyear p-month p-day“

18、-”是指向结构体成员运算符,优先级为一级 p=&d.year(*结构体指针变量).成员名 或:结构体指针变量-成员名 第30页,共74页。316.4 结构体与指针6.4 指向结构体变量的指针2. 指针变量的引用 pstu-num:得到pstu指向的结构体变量中的成员变量num的值。pstu-num+:得到pstu指向的结构体变量中的成员变量num的值,先使用,后使num加1。+pstu-num:得到pstu指向的结构体变量中的成员变量num的值,使num先加1,再使用。第31页,共74页。326.4 结构体与指针6.4.1 指向结构体变量的指针 【例6.5】指向结构体变量的指针使用 #incl

19、ude stdio.hstruct student int num; char *name; char sex; float score; stu1=102,Zhang ping,M,78.5,*pstu; 第32页,共74页。336.4 结构体与指针6.4.1 指向结构体变量的指针void main() pstu=&stu1; printf(Number=%dnName=%sn,stu1.num,); printf(Sex=%cnScore=%fnn,stu1.sex,stu1.score); printf(Number=%dnName=%sn,(*pstu).num,(*

20、pstu).name); printf(Sex=%cnScore=%fnn,(*pstu).sex,(*pstu).score); printf(Number=%dnName=%sn,pstu-num,pstu-name); printf(Sex=%cnScore=%fnn,pstu-sex,pstu-score); 第33页,共74页。346.4 结构体与指针6.4.2 指向结构体类型数组的指针1.指向结构体类型数组的指针的定义 一个结构体类型数组的数组名是数组的首地址,结构体指针变量可以指向一个结构体数组,这时结构体指针变量的值是整个结构体数组的首地址。 定义结构体数组的指针和定义其他数组

21、的指针的方法是一样的 第34页,共74页。356. 4 结构体与指针6. 4.2 指向结构体类型数组的指针【例】利用结构体指针输出一组化学 元素名称及其原子量。 struct list int i; char name4; float w; tab4=1,H,1.008,2,He,4.0026, 3,Li,6.941,4,Be,9.01218;tab数组1Htab01.0082Hetab14.00263Litab26.9414Betab39.012182.数组元素的引用 第35页,共74页。2022/8/16366.4 结构体与指针6.4.2 指向结构体类型数组的指针2.数组元素的引用 mai

22、n( ) struct list *p,tab4; printf(NotNametAtomic Weightn); for (p=tab; pi, p-name, p-w); tab数组1Htab01.0082Hetab14.00263Litab26.9414Betab39.01218pppppNo Name Atomic Weight1 H 1.0082 He 4.00263 Li 6.9414 Be 9.01218第36页,共74页。376.4 结构体与指针6.4.2 指向结构体类型数组的指针【例6.6】利用指针变量输出结构体数组 。 #include stdio.h struct stu

23、dent int num; char *name; char sex; float score; stu3= 101,Zhao lei,M,45,102,Sun hui,M,62.5,103,Li fang,F,92.5;第37页,共74页。386.4 结构体与指针6.4.2 指向结构体类型数组的指针void main() struct student *ps; printf(NotNamettSextScore n); for(ps=stu;psnum,ps-name,ps-sex,ps-score); 第38页,共74页。396.4 结构体与指针6.4.2 指向结构体类型数组的指针注意:(

24、1)因为“-”运算符优先级最高,所以ps-num,ps-num+,+ps-num三个表达式都是对成员变量的操作。(2)(+ps)-num,先使ps加1,指向下一个元素,然后得到下一个元素的num成员的值。(3)ps+-num,先得到ps所指的num的值,然后使ps加1,指向下一个元素。第39页,共74页。406.4 结构体与指针6.4.2 指向结构体类型数组的指针 分析自增自减运算对程序结果的影响。 struct code int i; char c; a =100,A,200,B, 300,C,400,D;a数组100a0A200a1B300a2C400a3D第40页,共74页。416.4

25、结构体与指针6.4.2 指向结构体类型数组的指针main( ) struct code *p=a; printf(%dt,+p-i); printf(%ct,(+p)-c); printf(%dt,(p+)-i); printf(%ct,+p-c); printf(%dt,p-i+); printf(%dn,p-i); a数组100a0A200a1B300a2C400a3Dp101D301101B200D300301第41页,共74页。426.5 结构体与函数6.5.1 指向结构体变量的指针作函数参数方法一:在函数之间直接传递结构体数据。 函数的形参定义为结构体变量。函数调用时,可将主调函数的

26、结构体类型实参传递给被调函数的形参。 如果将函数定义为结构体类型函数,可利用return语句将一个结构体数据结果返回到主调函数中。 这一过程无论在空间上还是在时间上都为系统增加了开销,尤其当结构体变量含有很多成员时,系统开销急剧增大,程序效率大幅降低。 第42页,共74页。436.5 结构体与函数6.5.1 指向结构体变量的指针作函数参数方法二:在函数之间传递结构体指针。 形参定义为指向结构体类型的指针变量,可将主调函数的结构体指针传递给被调函数的形参变量,通过指针形参的指向域的扩展,操作主调函数中结构体变量及其成员。 方法三:利用全局结构体变量传递结构体数据。第43页,共74页。446.5

27、结构体与函数6.5.1 指向结构体变量的指针作函数参数 【例6.7】在student结构体类型中增加一个成员rank,如果成绩score大于或等于60,rank的值为“SUCCESS”,否则rank的值为“FAIL”。 struct student int num; char *name; char sex; float score; char *rank; ;第44页,共74页。456.5 结构体与函数6.5.1 指向结构体变量的指针作函数参数void grade(struct student *p) /*根据学生的分数返回不同的值*/ if(p-scorerank=FAIL; else p

28、-rank=SUCCESS;void print(struct student s)printf(num=%dnname=%snsex=%cnscore=%fnrank=%snn,s.num,,s.sex, s.score,s.rank);void main() int i; struct student stu1=102,Zhang ping,M,78.5; grade(&stu1); print(stu1);第45页,共74页。466.5结构体与函数6.5.2结构体变量作为函数的返回值 结构体变量可以作为函数的返回值,具有结构体变量返回值的函数称为结构体函数。在函数定义时,说明

29、返回值的类型为相应的结构体类型,就可以通过return语句使该函数返回结构体类型值。 第46页,共74页。476.5结构体与函数6.5.2结构体变量作为函数的返回值 【例6.8】 求n个学生中成绩最高的学生的信息并输出。#include stdio.hstruct student int num; char *name; char sex; float score; ;第47页,共74页。486.5结构体与函数6.5.2结构体变量作为函数的返回值 struct student fun(struct student *pstud,int n) struct student *p,*p_max,*

30、p_end; int j; float max=0; p=pstud; p_max=p; p_end=p+n; for ( ;pscoremax) max=p-score; p_max=p; return (*p_max);第48页,共74页。496.5结构体与函数6.5.2结构体变量作为函数的返回值 void main () int i,j; struct student pp,stu= 101,Zhao lei,M,45,102,Sun hui,M,62.5, 103,Lifang,F,92.5,104,Wang hua,F,89.5; pp=fun(stu,4); printf (%d

31、%-10s %3c %5.1fn,pp.num, ,pp.sex,pp.score);第49页,共74页。50 共用体可以包括数目固定、类型不同的若干数据。所有成员共享一段公共存储空间。所谓的共享不是指把多个成员同时装入一个共用体变量内,而是指该共用体变量可被赋予任一成员值,但每次只能赋一种值。 共用体类型变量所占内存空间不是各个成员所需存储空间字节数的总和,而是共用体成员中存储空间最大的成员所要求的字节数。6.6 共用体 6.6.1 共用体类型的声明由于共享的特性,只有最新存储的数据是有效的。第50页,共74页。516.6 共用体6.6.1 共用体类型的声明共用体类型声明的一般

32、形式: union为关键字;共用体名是用户定义的类型标识。 中是组成该共用体的成员。成员的数据类型可以是C语言所允许的任何数据类型。 union 共用体名 数据类型1 成员名1; 数据类型2 成员名2; 数据类型n 成员名n; ;第51页,共74页。52例如: union data int stud; char teach 10;6.6 共用体6.6.1 共用体类型的声明 声明了一个union data共用体类型,共用体类型定义不分配内存空间,只是说明此类型数据的组成情况。 第52页,共74页。536.6 共用体6.6.2 共用体变量的定义 1、先定义共用体类型,再定义共用体类型变量例如: u

33、nion data int stud; char teach 10; ; union data un1,un2,un3;union 共用体名 变量名表;第53页,共74页。546.6 共用体6.6.2 共用体变量的定义 2、在定义共用体类型的同时定义变量例如: union data int stud; char teach 10; un1,un2,un3;union 共用体名 成员定义表; 变量名表;第54页,共74页。556.6 共用体6.6.2 共用体变量的定义 3、直接定义共用体类型变量 例如: union int stud; char teach 10; un1,un2,un3;uni

34、on 成员定义表; 变量名表;第55页,共74页。566.6 共用体6.6.3 共用体变量的引用例如: union u char u1; int u2; x,*p=&x; 用共用体变量名的引用形式: x.u1 x.u2 用共用体指针变量的引用形式: (*p).u1 (*p).u2 p-u1 p-u2共用体变量名.成员名指向共用体变量的指针名-成员名第56页,共74页。576.6 共用体6.6.3 共用体变量的引用注意:(1)共用体变量初始化 union u char u1; int u2; ; main( ) union u a=0 x9741; printf(1. %c %xn,a.u1,a

35、.u2); a.u1=a; printf(2. %c %xn,a.u1,a.u2); 共用体类型变量在定义时只能对第一个成员进行赋初值。 由于第一个成员是字符型,用一个字节,所以对于初值0 x9741仅能接受0 x41,初值的高字节被截去。 1. A 412. a 61对u2成员的引用是无意义的第57页,共74页。586.6 共用体6.6.3 共用体变量的引用(2)不允许对共用体变量名作赋值或其他操作,也不能企图引用变量名来得到一个值。 un1=401; /错误 un1=401, jsj08012; /错误(3) 共用体变量的地址和它的各个成员变量的地址相同, &un1.stud、&un1.t

36、each和&un1都是同一个地址。(4) 一个共用体型的变量可以用来存放几种不同类型的成员变量,但无法同时存放几种变量 ,即每一时刻只有一个变量在起作用。 第58页,共74页。596.6 共用体6.6.3 共用体变量的引用(5) 共用体变量不能作函数参数,函数的返回值也不能是共用体类型 。(6) 共用体变量可以出现在结构体类型的定义中,也可以定义共用体数组。另外,结构体变量也可以出现在共用体类型的定义中。第59页,共74页。606.7 枚举类型 1. 什么是枚举类型 枚举类型定义的一般形式: 所谓“枚举”,是指将变量的值一一列举出来。或者说,枚举是若干个具有名称的常量的有序集合。 枚举类型给出

37、一个数目固定的若干有序的名称表,称为枚举表。枚举表中的每个数据项称为枚举符。enum是关键字;枚举名和枚举常量是标识符;枚举常量之间用逗号分隔。enum 枚举名 枚举常量取值表 ;第60页,共74页。61例如: enum weekday Sun, Mon, Tue, Wed, Thu, Fri, Sat ; enum color1 blue, green, red ; enum flag false, true ;6.7 枚举类型 第61页,共74页。62例如: enum flag fg; enum color1 c1; enum color2 blank,brown,yellow,white

38、 c2; enum lightblue,lightgreen,lightred c3;6.7 枚举类型 2. 枚举变量的定义 枚举类型变量定义的三种形式: enum 枚举名 枚举变量名表; enum 枚举名 枚举常量取值表 枚举变量表; enum 枚举常量取值表枚举变量表;第62页,共74页。63例如: enum weekday Sun, Mon, Tue, Wed, Thu, Fri, Sat ;6.7 枚举类型 3. 枚举符的值的确定 隐式定义: 按照类型定义时枚举常量列举的顺序分别代表0、1、2、等整型值。 0123456 在枚举类型中,每个枚举常量都代表一个整型值。在定义枚举类型的同时

39、可隐式或显式地定义枚举常量所代表的值。 第63页,共74页。64例如: enum op plus=43,minus=45,multiply=42,divide=47 ; enum workday Mon=1,Tue,Wed,Thu,Fri ;6.7 枚举类型 3. 枚举符的值的确定 显式定义: 在定义类型的同时指定枚举常量的值,其中如有未指定值的枚举常量,则根据前面的枚举常量的值依次递增1。 2345第64页,共74页。65(1 ) 赋值运算 枚举变量的值只能取枚举类型的枚举表中的枚举符,例如: enum day sun,mon,tue,wed,thu,fri,sat d1,d2; d1=sa

40、t; d2=d1;(2)枚举符可以进行加(减)整型数运算 例如:d1=sun+2; d2=sat-3;(3)枚举元素还可以用来作判断比较 if (todaytue) ;6.7 枚举类型 4. 枚举变量的操作 第65页,共74页。66(4 )枚举变量可以作循环变量 例如: for(today=sun;today=sat;today+) printf(%d,today);(5)枚举变量的输入输出操作 枚举变量只能通过赋值获得值,而不能通过 scanf函数从键盘输入获值。 枚举变量可以通过 printf函数输出其枚举符的值,即整型数值,但不能直接输出其标识符。 (6)枚举变量的作用域与结构体变量以及

41、普通变量定义的作用域类似。 6.7 枚举类型 4. 枚举变量的操作 第66页,共74页。67【例6.10】 顺序输出5种颜色名。#include void main() enum color red,yellow,blue,white,black; enum color c; for(c=red;c=black;c+) switch(c) case red: printf(red);break; case yellow: printf(yellow);break; case blue: printf(blue);break; case white: printf(white);break; case black: printf(black);br

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论