已阅读5页,还剩61页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十章 结构、联合和枚举 1 10.1 引言 *10.2 结构的定义 *10.3 结构变量的定义 *10.4 结构变量的初始化 *10.5 访问结构变量成员 *10.6 结构和函数 *10.7 类型定义typedef 10.8 联合 *10.9 枚举常量 提纲 2 10.1 引言 在日常生活中,我们经常会用到一些表格。例如,下图 是一张某个学校的学生成绩管理表: 为了用计算机程序实现对上述表格的管理,需要先将上 述表格进行存储。如何存储? 学号姓名性别别入学时时 间间 英 语语 高数 音乐乐 1张三 男2008809066 2李四 男2008786777 3王五 男2008908780 4 5 3 10.1 引言 根据以前的知识,可以定义若干数组来存储上述信息 : int studentID10; /存储学生学号 char studentName3010; /存储学生姓名 char studentGender303; /存储学生性别 int timeOfEnter30; /存储入学年份 int scoreEnglish30; /存储英语成绩 int scoreMath30; /存储数学成绩 int scoreMusic30; /存储音乐成绩 4 10.1 引言 存在的问题: 1.任何一个学生的信息分散在内存各处,要了解一个学 生的信息,必须到各个数组的相应元素中去查找,很 不方便。而且因为内存不集中,所以查找效率不高。 2.存储结构显得比较零散,不易管理。 而30个学生的信息可以抽象为线性表(线性表是具有相 同数据类型的n(n=0)个数据元素的有限序列),每一 个学生的信息是表中的一个元素。有没有可能用一个 长度为30的一维数组来存储学生成绩表,每个数组元 素存储一个学生的信息(包括基本信息和成绩)? 如果可以,那一个数组元素存储了多个不同类型的数据 ,那数组元素的类型又该如何定义? 5 10.1 引言 如果可以,那对于前面介绍的洗牌发牌模拟程序,也可 以用一个长度为52的一维数组来存储一幅牌,每个数组 元素存储两个指针,分别指向表示该张牌花色和面值的 字符串。 suit suit0 suit1 suit2 suit3 face face0 face11 face12 第6张牌是红心Queen 6 10.1 引言 C语言在产生的时候,设计者就针对此类问题,设 计了一系列用户自定义数据类型。用户可以根据 具体问题的需要,设计符合自己要求的新的数据 类型。结构和联合就是两种用户自定义的数据类 型,结构可以用来满足我们上述问题的需要。 7 10.1 引言 10.2 结构的定义 10.3 结构变量的定义 10.4 结构变量的初始化 10.5 访问结构变量成员 10.6 结构和函数 10.7 类型定义typedef 10.8 联合 10.9 枚举常量 提纲 8 10.2 结构的定义 一、结构的定义 结构是用其它类型的对象构造出来的派生数据 类型(注意:结构是一种数据类型,先定义结构 类型,再定义结构类型的变量)。 struct 结构名 数据类型 数据项1; 数据类型 数据项2; 数据类型 数据项; ; 9 10.2 结构的定义 上述成绩管理的例子可以定义如下形式的结构: struct STUDENT char studentID10;/存储一个学生的ID char studentName10;/存储一个学生的姓名 char studentGender3; int timeOfEnter; int scoreEnglish; int scoreMath; int scoreMusic; 定义了一个名为STUDENT的结构 (类型)。该结构有7个数据项。 用该结构定义的结构变量可以用 来存放一个学生的信息,包括学 号、姓名、性别、入学年份、英 语成绩、数学成绩和音乐成绩。 10 10.2 结构的定义 struct card char * face; char * suit; ; 定义了一个名为card的结构(类型),由face和 suit两个数据项组成。用该结构定义的结构变 量可以用来存放一张牌的信息。 11 10.2 结构的定义 1.“结构名”和“数据项”的命名规则,与变量名相同。 2. 数据类型相同的数据项,既可逐个、逐行分别定义 ,也可合并成一行定义。 struct card char * face,* suit; ; 3. 结构中的数据项,可以是不同类型(和数组不同) 。既可以是整形、字符型、浮点型、指针,也允许 是数组或者另一个已经定义的结构。【链接】 4.个数据项称为结构的个成员(或分量)。同一 结构中的成员不能同名,不同结构中的成员可以同 名。 12 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; ; 13 10.2 结构的定义 7. 用户自己定义的结构是一种数据类型,与系统定 义的标准类型(int、char等)一样,可用来定义 结构变量。结构变量是用一个名字引用的相关变 量的集合。 14 10.1 引言 10.2 结构的定义 10.3 结构变量的定义 10.4 结构变量的初始化 10.5 访问结构变量成员 10.6 结构和函数 10.7 类型定义typedef 10.8 联合 10.9 枚举常量 提纲 15 10.3 结构变量定义 (1)间接定义法先定义结构,再定义结构变量 struct card char * face,* suit; ; main() struct card a,* cPtr= printf(“%dn“,sizeof(struct card); printf(“%pn“,cPtr); printf(“%pn“, printf(“%pn“, system(“pause“); 8 0022FF70 0022FF70 0022FF74 cPtr 0022FF70 0022FF70 0022FF74 结构变量a face suita是结构变量 a.face:访问结构变量 成员face。.运算优先 级高于 ; main() int i; struct card deck3;/结构数组定义 printf(“%dn“,sizeof(deck); for(i=0;i” 通过指向结构变量的指针访问结构成员: 指针名-结构成员名 或 (*指针名).结构成员名 运算符. 优先级 高于运算符*, 故必须加括号 000102 张三 男 1980 9 20 stuptr 29 10.5 访问结构变量成员使用指针运算符 main() struct student stu=“000102“,“张三“,“男 “,1980,9,20; struct student * ptr = printf(“No:%sn“, ptr-no); printf(“Name:%sn“, ptr-name); printf(“Gender:%sn“, ptr-gender); printf(“Birthday:%d-“, ptr-birthday.year); printf(“%d-“, ptr-birthday.month); printf(“%dn“, ptr-birthday.day); system(“pause“); return 0; 注意:year前面 是.而不是- 运算符. 和-优先级 相同,自左向右结 合,相当于 (ptr-birthday).year 方法1 30 10.5 访问结构变量成员使用指针运算符 main() struct student stu=“000102“,“张三“,“男“,1980,9,20; struct student * ptr= printf(“No:%sn“, (*ptr).no); printf(“Name:%sn“, (*ptr). name); printf(“Sex:%sn“, (*ptr). gender); printf(“Birthday:%d-“, (*ptr). birthday.year); printf(“%d-“, (*ptr). birthday.month); printf(“%dn“, (*ptr). birthday.day); system(“pause“); return 0; 此时birthday前 面是.而不是- 方法2 31 10.5 访问结构成员赋值 main() struct student stu,* ptr= scanf(“%s“, ptr-no); scanf(“%s“, ptr-name); scanf(“%s“, ptr-gender); scanf(“%d“, scanf(“%d“, scanf(“%d“, system(“pause”); return 0; 相当于 000102 张三 男 1980 9 20 0022FF30 0022FF37 0022FF40 0022FF44 stu a 0022FF37 func main i 1980 36 10.6 函数和结构 2.传递整个结构(形参是实参的副本,两者互不影响) void func(struct student stu)/*函数定义*/ func(theStu);/* main函数中的函数调用*/ 000102 张三 男 1980 9 20 0011AA10 0011AA17 0011AA20 0011AA24 stu func 000102 张三 男 1980 9 20 0022FF30 0022FF37 0022FF40 0022FF44 theStu main 37 10.6 函数和结构 3.传递指向结构的指针(被调用函数可以操作 调用函数中的结构变量) void func(struct student * stuPtr)/*函数定义*/ func(/*函数调用*/ no name gender year month day 0022FF30 0022FF37 0022FF40 0022FF44 stu 0022FF30 stuPtr main func 38 10.1 引言 10.2 结构的定义 10.3 结构变量的定义 10.4 结构变量的初始化 10.5 访问结构变量成员 10.6 结构和函数 10.7 类型定义typedef 10.8 联合 10.9 枚举常量 提纲 39 10.7 类型定义 typedef 可以用typedef建立已定义好的数据类型的别名 。 定义新的类型Card,它是类型struct card 的别 名 typedef struct card Card; 定义一个结构数组: Card deck3; 结构数组deck deck0 deck1 deck2 数据类型名别名 40 10.7 类型定义 typedef 用typedef只是给已有类型增加个别名,并不 能创造个新的类型。就如同人一样,除学名 外,可以再取一个小名(或雅号),但并不能 创造出另一个人来。 41 洗牌和发牌游戏模拟 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); 42 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 43 初始化一副牌 void fillDeck(Card * wDeck,char * wFace,char * wSuit) /初始化发牌 int i; for(i=0;i” main() union number value,* ptr= value.x=10; printf(“int:%d,float:%fn“, value.x, value.y); ptr-y=100.0; printf(“int:%d, float:%fn“, ptr-x, (*ptr).y); system(“pause“); return 0; int:10, float:0.000000 int:0, float:100.000000 请按任意键继续. . . 55 10.8 联合 五.联合的用途 学生基本信息包括:姓名、出生日期、学号和班级 教师基本信息包括:姓名、出生日期、工号、职称和开始 工作年 56 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:分 别针对学生 和老师定义 结构 57 方法2:采用联合。 10.8 联合 用于区分是学 生还是老师 58 /*将学生和老师的特殊信息分别定义成结构*/ struct student /*学生特殊信息结构类型*/ char no7; /*学号*/ char class5; /*班级*/ ; struct teacher /*教师特殊信息结构类型*/ char no4; /*工号*/ char class5; /*职称*/ int startYear; /*开始工作年*/ ; 10.8 联合 59 union roletype/*描述不同类人员信息的联合*/ struct student studentField; struct teacher teacherField; struct person char name10; /*姓名*/ struct date birthday; /*生日*/ int roletype;/*角色*/ union roletype roleinfo; /*不同角色的信息*/ 10.8 联合 60 10.8 联合 #define STUDENT 0 #define TEACHER 1 main() struct person p; /读入学生或者教师的信息到结构变量p中。 switch (p.roletype) case STUDENT: 处理学生信息语句; break; case TEACHER: 处理教师信息语句; break; default: printf(“invalid roletype!n”); 61 10.1 引言 10.2 结构的定义 10.3 结构变量的定义 10.4 结构变量的初始化 10.5 访问结构变量成员 10.6 结构和函数 10.7 类型定义typedef 10.8 联合 10.9 枚举常量 提纲 62 10.9 枚举常量 目前为止,我们
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 演出长期合作合同范本
- 2025年专升本药学专业综合测试试卷(含答案)
- 潮汕生基购买合同协议
- 2026年婴儿食品加热器行业发展现状及未来趋势研究分析报告
- 2025年高中二年级生物上学期期中测试
- 盲管厂家供货合同范本
- 烟花厂收购的合同范本
- 酒代理协议书代理合同
- 药品厂家代理合同范本
- 连锁超市联营合同范本
- 2024郑州工业安全职业学院教师招聘考试真题及答案
- DB65T 3321-2011 沙冬青栽培技术规程
- 长津湖电影课件
- 江苏建设网校安全员题库及答案解析
- 粮食熏蒸作业培训
- 腾讯视频视频上传平台内容合作审核及收益分成合同
- 人员密集场所安全培训课件
- 研发项目立项评审表模板
- GB/T 45953-2025供应链安全管理体系规范
- 孕期生理变化
- 急性支气管炎儿科课件
评论
0/150
提交评论