结构体、共用体和枚举类型.ppt_第1页
结构体、共用体和枚举类型.ppt_第2页
结构体、共用体和枚举类型.ppt_第3页
结构体、共用体和枚举类型.ppt_第4页
结构体、共用体和枚举类型.ppt_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

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

文档简介

第10章结构体 共用体和枚举类型 本章要点 了解结构了解关于结构的各种操作理解怎样使用结构操作数据理解结构和函数之间的关系 掌握结构作为参数传递与返回结构的函数方法理解结构中数组的用法理解怎样创建结构数组了解共用体的特点了解枚举类型 问题的提出 学号姓名年龄性别成绩1成绩2平均成绩1aa19m8090902bb18f7870733cc17m8175794dd18f8060755ee19m768383 每行的数据类型不相同 如何表示此二维数据 如何交换两行值 能否将一行看成一个整体 定义一种类型 把不同的数据作为一个整体来处理 结构体 数据类型 数组 有相同类型的数据集合结构体 不同类型的数据集合 构造数据类型 由简单数据类型 int float char 组合而成的 有机整体 数据类型 基本类型 整型 实型 字符型 主要内容 结构体类型的定义结构体类型的变量和结构体类型数组共用体枚举类型 结构体类型的定义 定义了一种新的数据类型struct结构体名或结构体名 struct结构体名 类型标识符成员名1类型标识符成员名2 类型标识符成员名n 可为简单类型也可为构造类型 不能少 例 以学生档案为例 假设包括如下数据项学号 num 整型姓名 name 字符串性别 sex 字符型出生日期 birthday date结构体四门课成绩 sc 一维实型数组 例 依此格式定义上例structdate intyear month day structstudent intnum charname 12 charsex datebirthday floatsc 4 如structdate没事先说明可写成 structstudent intnum charname 12 charsex struct intyear intmonth intday birthday floatsc 4 例 例1 一组相关变量定义结构体类型 新数据类型 结构体成员 intmonth intday intyear structdate intyear intmonth intday 不同数据类型的成员 例2 一组相关变量定义结构体类型 说明 1 结构体类型是一种构造数据类型 它与int char float等系统定义的基本数据类型具有同等地位 是由用户自行定义的 2 结构体类型不分配任何存储空间 相应结构体类型的变量 数组及动态开辟的存储单元占存储空间 构造的数据类型可以用来定义变量 结构体类型的变量和数组的定义方法 先定义结构体类型 再单独进行定义在定义类型的同时定义结构体变量在定义一个无名结构体类型的同时 直接进行定义 方法一 先声明结构体类型再定义结构体变量 struct结构体名 成员列表 struct结构体名变量名列表 或结构体名变量名列表 例 structstudent intnum charname 12 charsex datebirthday floatsc 4 structstudentstd pers 3 或studentstd pers 3 std 结构体变量pers 结构体数组 三个元素均为结构体类型变量 变量std的结构 birthday 注意 各成员按顺序排列 方法二 在声明类型的同时定义结构体变量 structstudent intnum charname 12 charsex structdatebirthday floatsc 4 std pers 3 struct结构体名 成员列表 变量名列表 struct intnum charname 12 charsex datebirthday floatsc 4 std pers 3 方法三 直接定义结构体变量 struct 成员列表 变量名列表 无结构体名 结构体类型的几点说明 结构体中的成员可以象变量一样使用 成员名可以与程序中的变量同名 结构体中的成员也可为结构体变量 类型与变量是完全不同的概念 先定义结构类型 再定义变量为该类型 类型 不可赋值 存贮 运算 系统不分配空间 变量 可赋值 存贮 运算 系统要分配空间 结构体类型变量初值 structstudent intnum charname 12 charsex datebirthday floatsc 4 std 10101 liming m 1962 5 10 88 76 85 5 90 注意 一一对应赋初值 不允许跳跃赋值 可只给前面的成员赋值 给结构体数组赋初值 数组中的每个元素是一个结构体类型的数据 因此将此成员的值依次放在一对花括号中 例 structbookcard charnum 5 floatmoney bk 3 no 1 35 5 no 2 25 0 no 3 66 7 给二维结构体数组赋初值例 struct charch inti floatx arr 2 3 a 1 3e10 a 2 4e10 a 3 5e10 b 1 6e5 b 2 7e5 b 3 8e5 结构体类型变量及其成员的引用 两种方式引用成员结构体变量名 成员名引用整体structt inti j charname 10 tt1 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 stud2 sex 结构体变量不能进行整体输入输出 优先级 1结合性 左例 有定义 structdate对变量today作成员选择运算 intyear today yearint型intmonth today monthint型intday today dayint型 today 成员选择运算的结果是得到了该结构变量的某个成员 其数据类型是定义该结构体类型时成员列表中定义的类型 成员运算符 例 structdata intmonth intday intyear structstudent charname 20 charsex databirthday intsc 4 std arr 5 1 引用sexstd sex 通过结构体变量引用 引用arr 0 中的sex arr 0 sex不能写作arr sex 例 structdata intmonth intday intyear structstudent charname 20 charsex databirthday intsc 4 std arr 5 2 引用sc中的元素 如sc 1 std sc 1 通过结构体变量引用 不能写成std scc 语言不允许对数组整体访问 字符串除外 例 structdata intmonth intday intyear structstudent charname 20 charsex databirthday intsc 4 std arr 5 3 成员为字符串如namestd name 通过结构体变量引用 arr 0 name 例 structdata intmonth intday intyear structstudent charname 20 charsex databirthday intsc 4 std arr 5 4 内嵌结构体成员的引用逐层使用成员名定位引用std中的出生年份std birthday year 只可引用最低一级成员 例std name是字符串 可以对它进行对任何字符串允许的操作 包括输入输出 对结构体变量中的每个成员 可对它进行同类变量所允许的任何操作 对结构体变量中的成员进行操作 例 structdata intmonth intday intyear structstudent charname 20 charsex databirthday intsc 4 std pers 5 1 对name的操作cin std name 或cin getline std name 80 2 对sex的操作 cin std sex for i 0 i pers i sex std sex m 注意 不能写成std name liming structdata intmonth intday intyear structstudent charname 20 charsex databirthday intsc 4 std pers 5 例 3 对birthday中year的操作 cin std birthday year std birthday year 1962 结构体数组 structstudent intnum charname 20 charsex intage floatscore charaddr 30 stud 4 23901 zangli f 19 78 5 35shanghairoad 23902 wangfang f 19 92 101taipingroad 23905 zhaoqiang m 20 87 56ninghairoad 23908 lihai m 19 95 48jiankangroad 内存存储情况 stud 0 stud 1 结构体数组的应用 问题 建立一个学生档案的结构体数组 输入并输出学生的信息 include li0802 2 cpp输入输出学生信息 includestructstudent charnum 16 charname 20 floatscore studentinput studentstud cout stud num stud name stud score returnstud 结构体数组的应用 voidoutput studentstud cout setw 10 stud num setw 10 stud name setw 10 stud score endl voidmain studentstuds 3 for inti 0 i 3 i studs i input studs i cout setw 10 学号 setw 10 姓名 setw 20 程序设计成绩 endl for i 0 i 3 i output studs i cout endl 传值调用 演示 引用调用 include 输入输出学生信息 includestructstudent charnum 16 charname 20 floatscore voidinput student 引用调用 voidoutput student 求若干学生的平均成绩 structstud intnum charname 20 intage charsex intscore includefloataverage studstuds intn floataver 0 for inti 0 i n i aver studs i score aver n returnaver voidmain void studstuds 4 020110101 wu 19 m 80 floataver aver average studs 4 cout 平均成绩为 aver endl 结构体变量所占字节数 结果均为2 sizeof float sizeof x 结果均为4 sizeof structstud sizeof stud sizeof stud1 结果均为33实际运行输出36 4的倍数 structstud intnum 学号 charname 20 姓名 intage 年龄 charsex 性别 intscore 成绩 例shorti floatx structstudstud1 sizeof short sizeof i 用sizeof 类型标识 变量名 10 2结构与指针 结构变量的成员可以通过点操作符进行访问 也可以通过指针进行访问 若定义一个结构指针 并把一个结构变量的地址赋给它 则通过该指针可对结构变量的成员进行访问 结构指针定义格式如下 person p 定义指向结构类型的指针personpr1 定义结构类型变量若p p salary等效于p salary 在使用指针访问成员时 通常使用箭头操作符 例如 下面程序中 定义了结构指针 通过结构指针访问结构成员 include includestrutperson charname 20 unsignedlongid floatsalary voidmain personpr1 person p p 结果为 wangming123456784800 0 如果一个数组的元素是同一种结构类型的变量 那么这种数组称为结构数组 要定义一个结构数组 必须先定义一个结构类型 然后再定义具有这种结构类型的一个数组 例如 定义一个包含100个元素的person结构数组 structperson charname 20 unsignedlongid floatsalary personallone 100 10 3结构与数组 数组中每个元素是一个完整的结构变量 它包含name id salary三个成员分量 allone 0 访问第一个数组元素 allone 99 访问最后一个数组元素 例如 下面程序对一个person结构数组中的元素进行 冒泡法 排序 工资高的排在后面 includestructperson charname 20 unsignedlongid floatsalary personallone 6 jone 12345 3390 0 david 13916 4490 5 marit 27519 3110 0 jasen 42876 6230 5 peter 23987 4000 2 yoke 12335 5110 0 voidmain persontemp for inti 1 iallone j 1 salary 工资高的后移 temp allone j allone j allone j 1 alone j 1 temp for intk 0 k 6 k cout allone k name allone k id allone k salary endl 运行结果为 marit275193110 0jone123453390 0peter239874000 2david139164490 5yoke123355110 0jasen428766230 5 结构变量也可以作为实参数进行函数调用 可以采用传值 传址 传引用的三种方式传递参数 一 传递结构变量值因为传递的是实参结构变量中拷贝的数值 所以实参结构变量的数值不会因为函数的调用而被修改 例如 下面是一个传值调用的例子 includestructperson charname 20 unsigedlongid floatsaslary 10 4传递结构参数 voidprint personpr cout pr name pr id pr salary endl personallone 4 jone 12345 3390 0 david 13916 4490 5 marit 27519 3110 0 yoke 12335 5110 0 voidmain for inti 0 i 4 i print allone i 实参数为结构数组元素 结果为 jone123453390 0david139164490 5marit275193110 0yoke123355110 0 二 传递结构变量的引用结构变量也可以按引用方式传递 此时仅把实参的地址传给形参 由于传递的是地址 可以实现由形参直接修改实参的作用 引用传递没有传递值的拷贝数据过程 节省了传送时间和所需的存储空间 传递效率提高 例如 将前面的程序改为用引用传递结构变量 只需在print 函数定义时 将形参说明为引用 其函数调用方式与传递方式相同 voidprint person 三 传递结构变量的地址传递结构变量地址与传递引用的功能类似 都能实现双向传递 若将前面程序改为传递结构变量的地址 只需定义print 函数时 将形参说明为指向结构变量的指针 函数调用时传递实参结构变量的地址 返回值为结构类型的函数称为结构函数 一 返回结构变量一个函数可以返回一个结构变量 在main 中 调用结构函数的返回值必须赋于具有相同结构类型的变量 例如 includestructperson charname 20 unsignedlongid floatsalary 10 5结构函数 persongetperson 定义返回结构变量的函数 persontemp cout temp name cout temp id temp salary returntemp 返回结构变量temp voidprint person voidmain personemployee 3 for inti 0 i 3 i employee i getperson 返回值赋给同类型的结构变量print employee i 结果 pleaseenteranameforoneperson maritpleaseenterone sidnumberandhissalary 3110 0marit275193110 0 如果将上例中的getperson 函数改为引用传递 则可提高程序运行效率 省去函数返回值赋以同类型结构变量的操作 改写后的程序如下 includestructperson charname 20 unsignedlongid floatsalary voidgetperson person voidprint person 二 返回结构的引用一个函数可以返回一个结构引用 也可以返回一个结构指针 一 结构的嵌套结构可以嵌套 即结构中可以是另一个结构类型的成员变量 例如 structpersonstructdate charname 10 intmonth intage intday floatwage intyear datapayday worker 也可以表示为 10 6链表结构 structperson charname 10 intwage structdate intmonth intday intyear payday worker 结构变量payday是嵌套在结构person内的一个成员分量 在访问嵌套结构的成员时 可以使用多个点操作符 从最外层到最内层逐个列出成员名 worker wage 5000 0 worker payday month 11 二 链表结构结构成员变量不能包含有自身的结构变量 但可以是指向该结构变量的指针 通过包含一个指向自身结构的指针 可以实现不连续分布的结构变量的遍历 如下面的结构 strctlist charname 20 list pn 其中 name成员含有实际的信息 pn是指向另一个list结构变量的指针 显然 通过结构变量中的指针成员链接 能构成任意长度的结构链 这样的结构链称为链表 链表中的每个list结构变量称为一个结点 链首指针 0074 8ac2 0074 8854 0074 28f6 0074 38fa 0074 88f2 链表是由一个个有序的结点组成的 每个结点是同类型的结构变量 通过程序可以建立和显示链表 可以插入 删除及增加结点来维护链表 链表总是包含有链首指针 链表的操作一般都先由链首指针引导 三 链表的创建与遍历例如 下面程序建立一个链表 并输出该链表 includestructstudent longnumber floatscore student next student head 链首指针student greate 创建链表函数 student ps 创建新结点指针student pend 移动的链尾指针 用于在其后插入结点ps newstudent 动态申请新建结点的存储空间cin ps number ps score 结点赋值head null 开始时链表为空pend ps while ps number 0 if head null head ps elsepend next ps pend ps s点ps newstudent cin ps number ps score pend next null deleteps return head voidshowlist student head coutnumberscorenext voidmain showlist greate 输入 结果 85 0theitemsoflistare 73 0401 85 091 0410 73 068 0425 91 082 0413 68 000432 82 0 在main 中 把建立链表函数greate 的返回值head 指向链表指针 作为实参数调用showlist 函数 greate 函数中 链表创建过程如下图所示 进入循环之前 headnull第一次进入循环到达s点 pendpshead第一次循环结束后 headpendps 第二次循环到达s点时 headpendps第二次循环结束时 headpendps 程序结束时 head null 共用体的定义及应用 问题的提出 表格 学生班级 教师职务 structpeople charname 10 intnum charsex charjob union intclass charposition 20 category class和position的使用是互斥的 可分成两列 为节省空间 合并成一列 共用体变量的定义 不同数据类型的一组变量使用同一组内存单元 uniondata charc floatf inti uniondataa b c 或dataa b c uniondata charc floatf inti a b c union

温馨提示

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

评论

0/150

提交评论