c-chap10结构、联合和枚举.ppt_第1页
c-chap10结构、联合和枚举.ppt_第2页
c-chap10结构、联合和枚举.ppt_第3页
c-chap10结构、联合和枚举.ppt_第4页
c-chap10结构、联合和枚举.ppt_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

1,2,10.1 引言 10.2 结构的定义 10.3 结构变量的定义 10.4 结构变量的初始化 10.5 访问结构变量成员 10.6 结构和函数 10.7 类型定义typedef 10.8 联合 10.9 枚举常量,提纲,3,10.1 引言,在日常生活中,我们经常会用到一些表格。例如,下图是某个学校的学生成绩管理表: 为了用计算机程序实现对上述表格的管理,需要先将上述表格进行存储。如何存储?,4,10.1 引言,根据以前的知识,可以定义若干数组来存储上述信息: int studentID30; /存储学生学号 char studentName3010; /存储学生姓名 char studentSex303; /存储学生性别 int timeOfEnter30; /存储入学年份 int scoreEnglish30; /存储英语成绩 int scoreMath30; /存储数学成绩 int scoreMusic30; /存储音乐成绩,5,10.1 引言,存在的问题: 1.每个学生的信息分散在内存各处,要了解一个学生的信息,必须到各个数组的相应元素中去查找,很不方便,且查找效率不高。 2.存储结构显得比较零散,不易管理。 而30个学生的信息可以抽象为线性表(线性表是具有相同数据类型的n(n=0)个数据元素的有限序列),每一个学生的信息是表中的一个元素。有没有可能用一个长度为30的一维数组来存储学生成绩表,每个数组元素存储一个学生的信息(包括基本信息和成绩)? 如果可以,即一个数组元素存储了多个不同类型的数据,那数组元素的类型又该如何定义?,6,10.1 引言,如果可以,那对于前面介绍的洗牌发牌模拟程序,也可以用一个长度为52的一维数组来存储一幅牌,每个数组元素存储两个指针,分别指向表示该张牌花色和面值的字符串。,suit,suit0,suit1,suit2,suit3,face,face0,face11,face12,第6张牌是红心Queen,7,10.1 引言,C语言在产生的时候,设计者就针对此类问题,设计了一系列用户自定义数据类型。用户可以根据具体问题的需要,设计符合自己要求的新的数据类型。结构和联合就是两种用户自定义的数据类型,结构可以用来满足我们上述问题的需要。,8,10.1 引言 10.2 结构的定义 10.3 结构变量的定义 10.4 结构变量的初始化 10.5 访问结构变量成员 10.6 结构和函数 10.7 类型定义typedef 10.8 联合 10.9 枚举常量,提纲,9,10.2 结构的定义,一、结构的定义 结构是用其他类型的对象构造出来的派生数据类型(注意:结构是一种数据类型)。,struct 结构名 数据类型 数据项1; 数据类型 数据项2; 数据类型 数据项; ;,10,10.2 结构的定义,上述成绩管理的例子可以定义如下形式的结构: struct STUDENT char studentID10;/存储一个学生的ID char studentName10;/存储一个学生的姓名 char studentSex3; int timeOfEnter; int scoreEnglish; int scoreMath; int scoreMusic; ,定义了一个名为STUDENT的结构(类型)。该结构有7个数据项。 用该结构定义的结构变量可以用来存放一个学生的信息,包括学号、姓名、性别、入学年份、英语成绩、数学成绩和音乐成绩。,11,10.2 结构的定义,struct card char * face; char * suit; ; 定义了一个名为card的结构(类型),由face和suit两个数据项组成。用该结构定义的结构变量可以用来存放一张牌的信息。,12,10.2 结构的定义,1.“结构名”和“数据项”的命名规则,与变量名相同。 2. 数据类型相同的数据项,既可逐个、逐行分别定义,也可合并成一行定义。 struct card char * face,* suit; ; 3. 结构中的数据项,可以是不同类型(和数组不同)。既可以是整形、字符型、浮点型、指针,也允许是数组或者另一个已经定义的结构。【链接】 4.个数据项称为结构的个成员(或分量)。同一结构中的成员不能同名,不同结构中的成员可以同名。,13,10.2 结构的定义,5. 结构既可以在函数外定义,也可以在函数内定义。但函数内定义的结构只能在本函数中使用。 6. 不能在struct card结构中定义struct card类型的变量。但可以定义指向struct card类型的指针(称为自引用结构)。,struct card char * face; char * suit; struct card card; ;,struct card char * face; char * suit; struct card * card; ;,14,10.2 结构的定义,7. 用户自己定义的结构是一种数据类型,与系统定义的标准类型(int、char等)一样,可用来定义结构变量。结构变量是用一个名字引用的相关变量的集合。,15,10.1 引言 10.2 结构的定义 10.3 结构变量的定义 10.4 结构变量的初始化 10.5 访问结构变量成员 10.6 结构和函数 10.7 类型定义typedef 10.8 联合 10.9 枚举常量,提纲,16,10.3 结构变量定义,(1)间接定义法先定义结构,再定义结构变量,struct card char * face,* suit; ; main() struct card a,* cPtr= ,8 0022FF70 0022FF74 0022FF70,cPtr,0022FF70,0022FF70,0022FF74,结构变量a,face,suit,a是结构变量,a.face:访问结构变量成员face。.运算优先级高于&运算,17,10.3 结构变量定义,24 0022FF20 0022FF28 0022FF30,struct card char * face;char * suit; ; main() int i; struct card deck3;/结构数组定义 printf(“%dn“,sizeof(deck); for(i=0;i=2;i+) printf(“%pn“, ,0022FF20,0022FF28,结构数组deck,0022FF30,deck0,deck1,deck2,18,10.3 结构变量定义,(2)直接定义法在定义结构类型的同时, 定义结构变量 main() struct card char * face; char * suit; a , deck52 , * cPtr;, ,19,10.3 结构变量定义,说明: 1. 结构与结构变量是两个不同的概念,其区别如同int类型与int型变量的区别一样。 2. 结构中的成员名,可以与程序中的变量同名,它们代表不同的对象,互不干扰。 3. 对结构变量的操作有: 1) 获取结构变量的地址: /将deck0中各成员的值赋给a中各成员 4) 用sizeof运算符确定结构变量的大小 sizeof(deck6)、sizeof(struct card),注意不能比较结构变量(原因见书上314页),见后面例子,20,struct date /*日期结构类型*/ int year; /*年*/ int month; /*月*/ int day; /*日*/ ; struct student /*学生信息结构类型*/ char no7; /*学号*/ char name9; /*姓名*/ char sex3; /*性别*/ struct date birthday; /*生日*/ ;,反映学生基本情况的结构结构成员为结构,【返回】,21,main() struct student stu; printf(“%dn“,sizeof(struct student); printf(“%pn“,stu.no); printf(“%pn“,); printf(“%pn“,stu.sex); printf(“%pn“, ,32 0022FF30 0022FF37 0022FF40 0022FF44,根据定义成员sex只需要3个字节,但实际分配了4字节的内存,剩下的1个字节没用。因此不能比较结构变量!,22,10.1 引言 10.2 结构的定义 10.3 结构变量的定义 10.4 结构变量的初始化 10.5 访问结构变量成员 10.6 结构和函数 10.7 类型定义typedef 10.8 联合 10.9 枚举常量,提纲,23,10.4 结构变量的初始化,在定义结构变量的同时可以进行初始化 struct card a=“Three”, “Hearts”; 如果初始化的个数少于结构中的成员数目,剩余成员被自动化初始为0(整型、浮点型)、0(字符或者字符串型)、NULL(指针),结构变量a,face,suit,24,10.4 结构变量的初始化,struct student stu=“000102”,“张三”,“男”, 1980,9,20;/注意生日的初始化 或者 struct student stu=“000102”,“张三”,“男”, 1980, 9, 20;,25,10.1 引言 10.2 结构的定义 10.3 结构变量的定义 10.4 结构变量的初始化 10.5 访问结构变量成员 10.6 结构和函数 10.7 类型定义typedef 10.8 联合 10.9 枚举常量,提纲,26,10.5 访问结构变量成员,使用结构成员运算符“.” 通过结构变量名访问结构成员:结构变量名.结构成员名 main() struct student stu=“000102”,“张三”,“男”, 1980,9,20;/注意生日的初始化 printf(“No:%sn“, stu.no); printf(“Name:%sn“, ); printf(“Sex:%sn”, stu.sex); printf(“Birthday:%d-“, stu.birthday.year); printf(“%d-“, stu.birthday.month); printf(“%dn“, stu.birthday.day); system(“pause“); return 0; ,注意这种结构成员本身又是结构的情况,struct student char no7; char name9; char sex3; struct date birthday; ;,No:000102 Name:张三 Sex:男 Birthday:1980-9-20 请按任意键继续. . .,.运算符是自左向右结合的,相当于(stu.birthday).year,27,10.5 访问结构变量成员赋值,main() struct student stu; scanf(“%s“, stu.no); scanf(“%s“, ); scanf(“%s“, stu.sex); scanf(“%d”, ,. 运算优先级高于&,相当于&(stu.birthday.year),28,10.5 访问结构变量成员,(1) 如果某成员本身又是一个结构类型,则只能通过多级的分量运算,对最低一级的成员进行引用。 此时的引用格式扩展为: 结构变量.成员.子成员.最低一级子成员 例如,stu.birthday.year (2) 对最低一级成员,可像同类型的普通变量一样,进行相应的各种运算。 (3) 既可引用结构变量成员的地址,也可引用结构变量的地址。例如, ,&stu,29,10.5 访问结构变量成员,二. 使用指针运算符“-” 通过指向结构变量的指针访问结构成员: 指针名-结构成员名 或 (*指针名).结构成员名,运算符. 优先级高于运算符*,故必须加括号,ptr,30,10.5 访问结构变量成员使用指针运算符,main() struct student stu=“000102“,“张三“,“男“,1980,9,20; struct student * ptr = ,注意:year前面是.而不是-,运算符. 和-优先级相同,自左向右结合,相当于 (ptr-birthday).year,方法1,31,10.5 访问结构变量成员使用指针运算符,main() struct student stu=“000102“,“张三“,“男“,1980,9,20; struct student * ptr= ,此时birthday前面是.而不是-,方法2,32,10.5 访问结构成员赋值,main() struct student stu,* ptr= ,相当于 &(ptr-birthday.year),33,10.5 访问结构成员,总结:访问结构变量的成员(以访问结构变量成员year为例) 三种方式:,no,name,sex,year,month,day,ptr,stu.birthday.year ptr-birthday.year (*ptr). birthday.year,34,10.1 引言 10.2 结构的定义 10.3 结构变量的定义 10.4 结构变量的初始化 10.5 访问结构变量成员 10.6 结构和函数 10.7 类型定义typedef 10.8 联合 10.9 枚举常量,提纲,35,10.6 函数和结构,把结构传递给函数的三种方式: 传递单个成员 传递整个结构 传递指向结构的指针,36,10.6 函数和结构,1.传递单个成员(此时和传递普通变量一样) void func(char a,int i )/*函数定义*/ /*main函数中的函数调用*/ func(, stu.birthday.year);,a,0022FF37,func,main,i,1980,37,10.6 函数和结构,2.传递整个结构(形参是实参的副本,两者互不影响) void func(struct student stu)/*函数定义*/ func(theStu);/* main函数中的函数调用*/,func,main,38,10.6 函数和结构,3.传递指向结构的指针(被调用函数可以操作 调用函数中的结构变量) void func(struct student * stuPtr)/*函数定义*/ func(/*函数调用*/,0022FF30,stuPtr,main,func,39,10.1 引言 10.2 结构的定义 10.3 结构变量的定义 10.4 结构变量的初始化 10.5 访问结构变量成员 10.6 结构和函数 10.7 类型定义typedef 10.8 联合 10.9 枚举常量,提纲,40,10.7 类型定义 typedef,可以用typedef建立已定义好的数据类型的别名。 定义新的类型Card,它是类型struct card 的别名 typedef struct card Card; 定义一个结构数组: Card deck3;,数据类型名,别名,41,10.7 类型定义 typedef,用typedef只是给已有类型增加个别名,并不能创造个新的类型。就如同人一样,除学名外,可以再取一个小名(或雅号),但并不能创造出另一个人来。,42,洗牌和发牌游戏模拟,317页10.7 洗牌和发牌游戏模拟,#include #include #include struct card char * face; char * suit; ; typedef struct card Card; void fillDeck(Card * wDeck,char * wFace,char * wSuit); void shuffle(Card * wDeck); void deal(Card * wDeck);,43,main() Card deck52; char * face=“Ace“,“Deuce“,“Three“,“Four“,“Five“, “Six“,“Seven“,“Eight“,“Nine“,“Ten“, “Jeck“,“Queen“,“King“; char * suit=“Hearts“,“Diamonds“,“Clubs“,“Spades“; srand(time(NULL); fillDeck(deck,face,suit); /初始化一副牌 shuffle(deck); /洗牌 deal(deck); /发牌 system(“pause“); return 0; ,suit,suit0,suit1,suit2,suit3,face,face0,face11,face12,44,初始化一副牌,void fillDeck(Card * wDeck,char * wFace,char * wSuit) /初始化发牌 int i; for(i=0;i52;i+) wDecki.face=wFacei%13; wDecki.suit=wSuiti/13; ,分析:当i取值为012时,i/13值为0,因此前13张牌的花色为红心,面值分别是Ace到King。以此类推。,45,洗牌,void shuffle(Card * wDeck) /洗牌 int i, j; Card temp; for(i=0;i52;i+) j=rand()%52; temp=wDecki; wDecki=wDeckj; wDeckj=temp; ,洗牌思路:每张牌都和随机抽取的另外一张牌交换一次。,46,发牌,void deal(Card * wDeck)/发牌 int i; for(i=0;i52;i+) printf(“%5s of %- 8s%c“,wDecki.face,wDecki.suit,(i+1)%2?t:n); ,47,10.1 引言 10.2 结构的定义 10.3 结构变量的定义 10.4 结构变量的初始化 10.5 访问结构变量成员 10.6 结构和函数 10.7 类型定义typedef 10.8 联合 10.9 枚举常量,提纲,48,一、联合的定义(有些书称联合为共用体) 和结构一样,联合是用其他类型的对象构造出来的派生数据类型。,union 联合名 数据类型 数据项1; 数据类型 数据项2; 数据类型 数据项; ;,union number short x; float y; ;,定义了一个名为number的联合(类型),由x和y两个数据项组成。,10.8 联合,49,10.8 联合,二. 联合变量的定义 (1)间接定义法先定义联合类型,再定义联合变量 union number short x; float y; ; main() union number value; ,50,10.8 联合,(2)直接定义法在定义联合类型的同时, 定义联合变量 main() union number short x; float y; value; ,51,10.8 联合,联合和结构的区别: 结构的成员各自有自己的存储空间,但联合的成员共享了同一个存储空间;,结构变量a,face,suit,联合变量value,x,y,union number short x; float y; ;,用来存储联合的字节数至少要能存储占用字节最大的成员。 同一时刻只能引用一个成员。,52,10.8 联合,union number short x; float y; ; main() union number value; printf(“sizeof(short)=%d,sizeof(float)=%dn“,sizeof(short),sizeof(float); printf(“sizeof(union number)=%dn“,sizeof(union number); printf(“ ,sizeof(short)=2,sizeof(float)=4 sizeof(union number)=4 &value.x=0022FF74, sizeof(value.x)=2 &value.y=0022FF74, sizeof(value.y)=4 请按任意键继续. . .,53,10.8 联合,和结构一样,联合也是派生数据类型,但是其成员共享了同一个存储空间。 联合的成员可以是任何数据类型。 程序员必须要用正确的数据类型引用联合中的数据。,54,10.8 联合,三.联合变量的初始化 联合只能用与第1个成员具有相同类型的值初始化。 union number value=10; /正确 union number value=13.2; /非法,55,10.8 联合,四.访问联合变量成员 1.使用运算符“.” 2.使用运算符“” main() union number value,* ptr= ,int:10, float:0.000000 int:0, float:100.000000 请按任意键继续. . .,56,10.8 联合,五.联合的用途,学生基本信息包括:姓名、出生日期、学号和班级 教师基本信息包括:姓名、出生日期、工号、职称和开始 工作年,57,10.8 联合,struct student /*学生信息结构类型*/ char name10; /*姓名*/ struct date birthday; /*生日*/ char no7; /*学号*/ char class5; /*班级*/ ; struct teacher /*教师信息结构类型*/ char name10; /*姓名*/ struct date birthday; /*生日*/ char no4; /*工号*/ char class5; /*职称*/ int startYear; /*开始工作年*/ ;,方法1:分别针对学生和老师定义结构,58,方法2:采用联合。,10.8 联合,用于区分是学生还是老师,59,/*将学生和老师的特殊信息分别定义成结构*/ struct student /*学生特殊信息结构类型*/ char no7; /*学号*/ char class5; /*班级*/ ; struct teacher /*教师特殊信息结构类型*/ char no4; /*工号*/ char class5; /*职称*/ int startYear; /*开始工作年*/ ;,10.8 联合,60,union roletype/*描述不同类人员信息的联合*/ struct student studentField; struct teacher teacherField; struct person char name10; /*姓名*/ struct date birthday; /*生日*/ int roletype;/*角色*/ union roletype roleinfo; /*不同角色的信息*/ ,10.8 联合,61,10.8 联合,#def

温馨提示

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

评论

0/150

提交评论