计算机本科c语言第十一章讲.ppt

上传人:za****8 文档编号:6272535 上传时间:2020-02-21 格式:PPT 页数:101 大小:175KB
返回 下载 相关 举报
计算机本科c语言第十一章讲.ppt_第1页
第1页 / 共101页
计算机本科c语言第十一章讲.ppt_第2页
第2页 / 共101页
计算机本科c语言第十一章讲.ppt_第3页
第3页 / 共101页
点击查看更多>>
资源描述
第十一章结构体与共用体 重点 结构体与联合体的概念 结构体定义 结构体变量的定义与引用3 枚举类型的概念 已讲过的数据类型有 简单类型 整型 实型 字符型 变量与变量之间无固定的内在连续 分别表示独立的数据 无从属关系 数组型 同一类型数据的组合 并用下标把数组的各元素有序地联系起来 指针型 主要用于动态存储分配 结构体 用结构体 用户可以根据需要定义一种数据类型 这种数据类型是由C语言中基本数据类型或用户已定义的数据类型组成的 复合类型 将不同类型的数据组合成一个有机的整体 以便于引用 这些组合在一个整体中的数据是互相联系的 例如 一个人的姓名 性别 年龄 家庭地址等项 这些项都与某一个人相联系 应当把它们组织成一个组合项 在一个组合项中包含若干个类型不同 当然也可以相同 的数据项 C语言提供了这样一种数据结构 它称为结构体 structure 它相当于其它高级语言中的 记录 例如 上面讲的 由不同类型的数据项组成的复合类型 可以定为如下结构structperson charname 20 intage charsex longnum charnation 成员名inteducation charaddrees 20 longtel 共占54字节 上面定义了一个结构体类型 structperson struct是关键字 不能省略 表示这是一个 结构体类型 它包括name age address等不同类型的数据项 应当注意 structperson是程序设计者自己定义的类型名 它和系统已定义了的标准类型 如int char float double等 一样可以用来作为定义变量的类型 定义一个结构体类型的一般形式为 struct结构体名 成员表列 花括弧内是该结构体中的各个成员 或称分量 由它们组成一个结构体 例如 上例中的name sex等都是成员 对各成员都应进行类型说明 即类型标识符成员名也可以把 成员表列 称为 域表 结构体的定义明确地描述了该结构的组织形式 在程序执行时 结构体的定义并不引起系统为该结构分配内存空间 结构体的定义仅仅定义了一种特定的数据类型 它制定了这种构造使用内存的模式 这是一种数据类型的定义 并不是变量的定义 11 2定义结构体类型变量的方法要定义一个结构体类型的变量 可以采取以下三种方法 一 先定义结构体类型再定义变量名如上面已定义了一个结构体类型structperson 可以用它来定义变量 如structpersonperson1 person2 定义person1和person2为structperson类型变量 即它们具有structperson类型的结构 如图所示 student1ZhangXinM19 student2WangLIF20 应当注意 将一个变量定义为标准类型 基本数据类型 与定义为结构体类型不同之处在于 后者不仅要求指定变量为结构体类型 而且要求指定为某一特定的结构体类型 例如 structperson 不能只指定为 struct型 而不指定结构体名 而在定义变量为整型时 只需指定为int型即可 换句话说 可以定义许多种具体的结构体类型 为了使用方便 人们通常用一个符号常量代表一个结构体类型 在程序开头 用 definePERSONstructperson这样在程序中 PERSON与structperson完全等效 PERSON charname 20 intage charsex longnum charnation inteducation charaddrees 20 longtel 可以直接用PERSON定义变量 如PERSONperson1 person2 用这种方法定义变量和用int float定义变量的形式相仿 不必再写关键字struct 如果程序规模比较大 往往将对结构体类型的定义集中放到一个文件 以 为后缀的 头文件 中 哪个源文件需用到此结构类型则可用 include命令将该头文件包含到本文件中 这样做便于装配 便于修改 便于使用 二 在定义类型的同时定义变量例如 structstudent intnum charname 2 charsex intage floatscore charaddr student1 student2 它的作用与前面定义的相同 既定义了两个structstudent类型的变量student1 student2 这种形式的定义的一般形式为 struct结构体名 成员表列 变量名表列 三 直接定义结构类型变量其一般形式为 struct 成员表列 变量名表列 即不出现结构体名 关于结构体类型 有几点要说明 类型与变量是不同的概念 不要混同 对结构体变量来说 在定义时一般先定义一个结构体类型 然后定义变量为该类型 只能对变量赋值 存取或运算 而不能对一个类型赋值 存取或运算 在编译时 对类型是不分配空间的 只对变量分配空间 对结构体中的成员 即 域 可以单独使用 它的作用与地位相当于普通变量 关于对成员的引用方法见11 3 成员也可以是一个结构体变量 如 structdate intmonth intday intyear structstudent intnum charname 20 charsex intage Structdatebirthday charaddr 30 student1 student2 然后在定义structstudent类型时 成员birthday的类型定义为structdate类型 structstudent的结构见图 所示 已定义的类型structdate与其它类型 如int char 一样可以用来定义成员的类型birthdaynumnamesexagemonthdayyearaddr 11 结构体类型变量的引用在定义了结构体变量以后 当然可以引用这个变量 但应遵守以下规则 不能将一个结构体变量作为一个整体进行输入和输出 例如 已定义 student1和student2为结构体变量并且它们已有值 不能这样引用 printf d s c d f s n student1 只能对结构体变量中的各个成员分别输出 引用方式为 结构体变量名 成员名例如 student1 num表示student1变量中的num成员 即student1的num 学号 项 可以对变量的成员赋值 例如 student num 10010 是成员 分量 运算符 它在所有的运算符中优先级最高 因此可以把srudent1 num作为一个整体来看待 上面赋值语句的作用是将整数10010赋给student1变量中的成员nu 新的标准 允许将一个结构体变量直接赋值给另一个具有相同结构的结构体变量 如果成员本身又属一个结构体类型 则要用若干个成员运算符 一级一级地找到最低的一级的成员 只能对最低级的成员进行赋值或存取以及运算 例如 对上面定义的结构体变量student1 可以这样访问各成员 student1 numstudent1 namestudent1 birthday monthstudent1 birthday daystudent1 birthday year注意 不能用student1 birthday来访问student1变量中的成员birthday 因为birthday本身是一个结构体变量 对成员变量可以像普通变量一样进行各种运算 根据其类型决定可以进行的运算 例如 student2 score student1 score sum student1 score student2 score student1 age student1 age 由于 运算符的优先级最高 因此student1 age 是对student1 age进行自加运算 而不是先对age进行自加运算 可以引用成员的地址 也可以引用结构体变量的地址 如 scanf d 结构体变量的地址主要用于作函数参数 传递结构体变量的地址 11 结构体变量的初始化过去许多 版本规定 只有当结构体变量为全局变量或静态变量时 才能进行初始化 不能对动态局部变量进行初始化 新版本无此限制 一 对外部存储类型的结构体变量进行初始化 例 1 structstudent longintnum charname 20 charsex charaddr a 89031 Lilin M 123beijingRoad main printf ld nname s nsex c naddress s n a num a name a sex a addr 运行结果如下 in e beij 二 对静态存储类型的结构体变量进行初始化 上面例 1的定义部分可以放到 n函数中 main staticstructstudent longintnum charname 20 charsex charaddr 20 a 89031 LiLin M 123BeijingRoad printf No 1d nname s nsex c naddress s n a num a name a sex a addr 三 过去许多 版本规定 自动变量不能在定义时赋初值 只能在函数执行时用赋值语句对各成员分别赋值 新的 标准无此限制 允许对自动变量初始化 11 结构体数组一个结构体变量中可以存放一组数据 如一个学生的学号 姓名 成绩 等数据 如果有 个学生的数据需要参加运算 显然应该用数组 这就是结构体数组 结构体数组与以前介绍过的数值型数组不同之处在于每个数组元素都是一个结构体类型的数据 它们都分别包括各个成员 分量 项 一 结构体数组的定义和定义结构体变量的方法相仿 只需说明其为数组即可 如 structstudent intnem charname 20 charsex intage floatscore charaddr 30 structstudentstu 3 以上定义了一个数组 其元素为structstudent类型数据 数组有3个元素 也可以直接定义一个结构体数组 如 structstudent intnum stu 3 或struct intnum stu 3 数组各元素在内存中连续存放 见p266图 1 示意 二 结构体数组的初始化结构体数组可以初始化 如 structstudent intnum charname 20 charsex intage floatscore charaddr 30 stu 3 101 LiLiu m 18 87 5 103BeijingRoad 102 Zhang m 19 99 130ShangHaiRoad 104 WangMin F 20 78 5 10GuangzhuRoad 定义数组stu时 元素个数可以不指定 即写成以下形式 stu 编译时 系统会根据给出初值的结构体常量的个数来确定数组元素的个数 当然 数组的初始化也可以用以下形式 structstudent intnum structstudentstu 即先定义结构体类型 然后定义数组为该结构体类型 在定义数组时初始化 从以上可以看到 结构体数组初始化的一般形式是在定义数组的后面加上 初值表列 三 举例下面举一个简单的例子来说明结构体数组的定义和引用 例 1 对候选人得票的统计程序 设有三个侯选人 每次输入一个得票的候选人的名字 要求最后输出各人得票结果 程序如下 structperson charname 20 intcount lead 3 Li 0 Zhang 0 Fun 0 main inti j charleader 20 for i 0 i 10 i scanf s leader for j 0 j 3 j if strcmp leader lead j name 0 lead j count for i 0 i 3 i printf 5s d n lead i name lead i count 运行情况如下 LiLiFunZhangZhangFunLiFunZhangLiLi Z 11 指向结构体类型数据的指针一个结构体变量的指针就是该变量所占据的内存段的起始地址 可以设一个指针变量 用来指向一个结构体变量 此时该指针变量的值是结构体变量的起始地址 指针变量也可以用来指向结构体数组中的元素 11 6 1指向结构体变量的指针下面通过一个简单例子来说明指向结构体变量的指针变量的应用 例 1 include string h main structstudent longnum charname 20 charsex floatscore structstudentstu 1 structstudent p p stu 1 num 89101 strcpy stu 1 name lilin stu 1 sex M stu 1 score 89 5 printf No ld nname s nsex c nscore f n stu 1 num stu 1 name stu 1 sex stu 1 score printf nNo 1d nname s nsex c nscore f n p num p name p sex p score p 在主函数中定structstudent类型 然后定义一个structstudent类型的变量stu 1 同时又定义一个指针变量 它指向一个structstudent类型的数据 在函数的执行部分stu 1的起始地址赋给 也就是使 指向 stu 1 见图 1 然后对 stu 的各成员赋值 第一个printf是输出函数stu 的各个成员的值 用stu 1 表示stu 中的成员 余类推 第二个printf函数也是用来输出stu 1各成员的值 但使用的是 p num这样的形式 p 表示 指向的结构体变量 p num是 指向的结构体变量中的成员 注意 p的括弧不可省 因为成员运算符 优先于 运算符 p num就等价于 num 了 在 语言中 为了使用方便和使之直观 可以把 p num改用 来代替 即 所指向的结构体变量中的 成员 同样 p e等价于 e 也就是说 以下三种形式等价 结构体变量 成员名 成员名 成员名上面程序中最后一个 函数中的输出项表列可以改写为 num p name p sex p score其请分析以下几种运算 n得到 指向的结构体变量中的成员 的值 得到 指向的结构体变量中的成员 的值 用完该值后使它加 得到 指向的结构体变量中的成员 的值使之加 先加 1 6 指向结构体数组的指针以前已经介绍过 可以使用指向数组或数组元素的指针和指针变量 同样 对结构体数组及其元素也可以用指针或指针变量来指向 例11 structstudent intnum charname 20 charsex intage structstudentstu 3 10101 lilin M 18 101 2 zhangFun M 19 10104 wangMin F 20 main structstudent p printf No Namesexage n for stu p stu printf 5d 20s 2c 4d n p num p name p sex p age 在第一次循环中输出stu 0 的各个成员值 然后执行 使 自加1 P 1意味着增加的地址值为结构体类型数组stu的一个元素所占的字节数 在本例中为 1 字节 使 指向stu 1 的起始地址 在第二次循环中输出stu 1 的各成员值 在执行 后 的值等于stu 2 再输出stu 2 的各成员值 在执行 后 的值变为stu 3 已不再小于stu 3了 不再执行循环 注意以下两点 如果 的初值为stu 即指向第一个元素 则p 1后指向下一个元素的起始地址 例如 p num先使 自加1 然后得到它指向的元素中的 成员值 即10102 p num先得到 num的值 即10101 然后使请注意以上二者的不同 指针 已定义为指向structstudent类型的数据 它只能指向一个结构体型数据 也就是 的值是stu数组的一个元素的起始地址 而不能指向一元素中的某一成员 即 的地址不能是成员的地址 例如 下面是不对的 11 用指向结构体的指针作函数参数有时想将一个结构体变量的值传递给另一个函数 但原来的 标准不允许用结构体变量作为函数参数 那么用什么方法来解决这个问题呢 有两个方法 用结构体变量的成员作参数 例如 用stu 1 num或stu 2 name作函数实参 将实参值传给形参 用法和用普通变量作实参是一样的 属 值传递 方式 用指向结构体变量 或数组 的指针作实参 将结构体变量 或数组 的地址传给形参 例 1 有一个结构体变量stu 内含学生学号 姓名和三门课的成绩 要求在main函数中赋以值 在另一函数print中将它们打印输出 include string h defineformat d n s n f n f n f n structstudent intnum charname 20 floatscore 3 main p voidprint structstudentstu stu num 12345 strcpy stu name LiLi stu score 0 5stu score 1 stu score 78 6 print stu voidprint structstudent printf format num name score 0 score 1 p score 2 printf n 运行结果为 LiLi 8 structstudent被定义为外部类型 这样 同一源文件中的各个函数都可以用它来定义变量的类型 main函数中的stu变量定义为structstudent类型 print函数中的形参 被定义为指向structstudent类型数据的指针变量 在main函数中对stu的各成员赋值 注意在调用print函数时 用 stu作实参 stu是结构体变量stu的地址 在调用函数时将该地址传送给形参 是指针变量 这样 就指向了stu 见图11 在print函数中输出 所指向的结构体变量的各个成员值 它们也就是stu的成员值 I 允许用整个结构体作为函数的参数传递 但是必须保证实参与形参的类型相同 例11 5中 函数中最后一行调用print函数 也可改用print stu 即实参改用结构体变量 而不是指针 同时print函数也应相应改为 voidprint stud structstudentstud printf format stud num stud name stud score stud score 1 stud score 2 printf n 把一个完整的结构体变量作为参数传递 虽然合法 但要将全部成员值一个一个传递 费时间又费空间 开销大 如果结构体类型中的成员很多 或有一些成员是数组 则程序运行效率会大大降低 在这种情况下 用指针作函数参数比较好 能提高运行效率 11 6举例 例11 6 有 个学生 每个学生包括学号 姓名 成绩 要求找出成绩最高者的姓名和成绩 程序如下 main structstudent intnum charname 20 floatscore structstudentstu 4 structstudent pinti temp 0 floatmax for i 0 I 4 i scanf s f stu i num stu i name stu i score for max stu 0 score i inum name score 运行情况如下 i g 程序中定义s 为structstudent类型的数组 为指向structstudent类型数据的指针变量 第一个for循环输入 个学生的数据 在第二个for循环中 先使变量 ax的值等于st 0 score 即第 个学生的成绩 然后用 ax与其余 个学生的成绩 即st score 相比 若后者大于 ax 则将大者放人 ax 并记下此时i的值 将 的值存放到 保存起来 接着使 st 十te 也就是将 定位于成绩最高者的那个数组元素处 见图11 10 最后输出 所指的元素中各个成员值 11 7用指针处理链表11 7 1链标概述链表是一种常见的重要的数据结构 它是动态地进行存储分配的一种结构 我们知道 用数组存放数据时 必须事先定义固定的长度 即元素个数 比如 有的班级有 人 而有的班只有 人 如果要用同一个数组先后存放不同班级的学生数据 则必须定义长度为100的数组 如果事先难以确定一个班的最多人数 则必须把数组定得足够大 以能存放任何班级的学生数据 显然这将会浪费内存 链表则没有这种缺点 它根据需要开辟内存单元 图11 10表示最简单的一种链表 单向链表 的结构 链表有一个 头指针 变量 图中以 表示 它存放一个地址 1249 head 1249 1356 1475 1021 该地址指向一个元素 链表中每一个元素称为 结点 每个结点都应包括两个部分 一为用户需要用的实际数据 二为下一个结点的地址 从图看出 head指向第一个元素 第一个元素又指向第二个元素 直到最后一个元素 该元素不再指向其它元素 它称为 表尾 它的地址部分放一个 表示 空地址 链表到此结束 可以看到 链表中各元素在内存中可以不是连续存放的 要找某一元素 必须先找到上一个元素 根据它提供的下一元素地址才能找到下一个元素 如果不提供 头指针 head 则整个链表都无法访问 链表如同一条铁链一样 一环扣一环 中间是不能断开的 打个通俗的比方 幼儿园的老师带领孩子出来散步 老师牵着第一个小孩的手 第一个小孩的另一只手牵着第二个孩子 这就是一个 链 最后一个孩子有一只手空着 他是 链尾 要找这个队伍 必须先找到老师 然后顺序找到每一个孩子 可以看到 这种链表的数据结构 必须利用指针变量才能实现 即 一个结点中应包含一个指针变量 用它存放下一结点的地址 前面介绍了结构体变量 它包含若干成员 这些成员可以是数值类型 字符类型 数组类型 也可以是指针类型 这个指针类型可以是指向其它结构体类型数据 也可以指向它所在的结构体类型 例如 structstudent intnum floatscore structstudent next next是成员名 它是指针类型的 它指向structstudent类型数据 这就是next所在的结构体类型 用这种方法可以建立链表 见图11 11 其中每一个结点都属于structstudent类型 它的成员next存放下一结点的地址 程序设计人员可以不必具体知道地址值 只要保证将下一个结点的地址放到前一结点的成员next中即可 请注意 上面只是定义了一个structstudent类型 并未实际分配存储空间 前面讲过 链表结构是动态地分配存储的 即在需要时才开辟一个结点的存储单元 怎样动态地开辟和释放存储单元呢 语言编译系统的库函数提供了以下有关函数 malloc size 在内存的动态存储区中分配一个长度为size的连续空间 此函数的值 即 返回值 是一个指针 它的值是该分配域的起始地址 如果此函数未能成功地执行 则返回值为 calloc n size 在内存的动态区存储中分配 个长度为 的连续空间 函数返回分配域的起始地址 如果分配不成功 返回 free ptr 释放由 指向的内存区 是最近一次调用calloc或malloc函数时返回的值 上面三个函数中 参数 和 为整型 为字符型指针 请注意 许多 版本提供的mallo 和calloc函数得到的是指向字符型数据的指针 新标准 提供的malloc和calloc函数规定为void 类型 有了本节所介绍的初步知识 下面就可以对链表进行操作了 包括建立链表 插入或删除链表中一个结点等 有些概念需要在后面的应用中逐步建立和掌握 11 7 2建立链表例 要求建立一个含三个结点的链表 存放学生数据 为简单起见 假定学和生数据结构中只有学号和年龄 defineNULL0 defineTYPEstructstudent defineLENsizeof structstudent structstudent intnum intage structstudent next TYPE creat intn structstudent head pf pb intt for t 0 tnum 11 7 3输出链麦将链表中各结点的数据依次输出 这个问题比较容易处理 首先要知道链表头元素的地址 也就是要知道 的值 然后设一个指针变量p 先指向第一个结点 输出 所指的结点 然后使 后移一个结点 再输出 直到链表的尾结点 例11 9 写出输出链表的函数 参照书中p279 voidprint head structstudent head structstudent p printf nNow Thesearerecord n p head if head NULL do printf d d p num p age p p next while p NULL 11 7 4链麦的删除操作已有一个链表 希望删除其中某个结点 怎样考虑此问题的算法呢 先打个比方 一队小孩 B C D E 手拉手 如果某一小孩 想离队有事 而队形仍保持不变 只要将 的手从两边脱开 改为与D拉手即可 与此相仿 从一个链表中删去一个结点 并不是真正从内存中把它抹掉 而是把它从链表中分离开来 即改变链接关系即可 参照书中p281 TYPE delete TYPE head intnum TYPE pf pb if head NULL printf nenptylist n return head pb head while pb num num if pb num num if pb head head pb next 如找到被删结点 且为第一结点则使head指向第二个结点否则使pf所指结点的指针指向下一结点 elsepf next pb next free pb printf Thenodeisdeleted n elseprintf Thenodenotbeenfoud n 11 7 对链表的插入操作将一个结点插入到一个已有的链表中 设已有的链表中各结点中的成员项 学号 是按学号由小到大顺序排列的 由于插入的位置在原链表中不同 因而算法也不同 根据插入位置可以分成下面四种 第一种情况是原来的链表是空表 这时只需使头指针指向被插结点 第二种情况是被插入的结点的值最小 这时应插入第一个结点之前 这种情况下的算法可以设计成 使头指针指向被插结点 而被插结点的指针指向原来的第一个结点 pi next pb head pi 第三种情况是插入结点的位置是链表中间的某一位置 这可使插入位置的前一个结点的指针域指向被插结点 使被插结点的指针域指向插入位置的后一个结点 即 pi next pb pf next pi 第四种情况是插入结点的位置在链表的末尾 这种情况只需使原链表表末结点指针域指向被插结点 而被插结点指针域置为NULL pb next pi Pi next NULL TYPE insert TYPE head TYPE pi TYPE pf pb pb head if head NULL head pi pi next NULL else while pi num pb num 下面主函数的作用将上面的四种操作结合起来组成一个完整的链表程序 main TYPE head pnum intn num printf inputnumberofnode n scanf d scanf d d 11 共用体11 1共用体的概念有时需要使几种不同类型的变量存放到同一内存单元中 例如 可把一个整型变量 一个字符型变量 一个实型变量放在同一个地址开始的内存单元中 见图 1 4 以上三个变量在内存中占的字节数不同 但都从同一地址开始 图中设地址为 存放 1000 也就是使用覆盖技术 几个变量互相覆盖 这种使几个不同的变量共占同一段内存的结构 称为 共用体 类型的结构 共用体 类型变量的定义形式为 union共用体名 成员表列 变量表列 例如 io data i i ar floa b 也可以将类型定义与变量定义分开 io ta i h h floa uniondataa b c 即先定义一个 类型 再将ab 定义为union ata类型 当然也可以直接定义共用体变量 如 union inti charf a b c 可以看到 共用体 与 结构体 的定义形式相似 但它们的含义是不同的 结构体变量所占内存长度是各成员占的内存长度之和 每个成员分别占有其自己的内存单元 共用体变量所占的内存长度等于最长的成员的长度 例如 上面定义的 共用体 变量a b c各占 个字节 因为一个实型变量占 个字节 而不是各占 1 个字节 1 共用体变量的引用方式只有先定义了共用体变量才能引用它 而且不能引用共用体变量 而只能引用共用体变量中的成员 例如 前面定义了a b c为共用体变量 下面的引用方式是正确的 i 引用共用体变量中的整型变量i 引用共用体变量中的字符变量 f 引用共用体变量中的实型变量 不能只引用共用体变量 例如 d a 是错误的 的存储区有好几种类型 分别占不同长度的存储区 仅写共用体变量名a 难以使系统确定究竟输出的是哪一个成员的值 应该写成 d i 或 c 等 1 共用体类型数据的特点在使用共用体类型数据时要注意以下一些特点 同一个内存段可以用来存放几种不同类型的成员 但在每一瞬时只能存放其中一种 而不是同时存放几种 也就是说 每一瞬时只有一个成员起作用 其它的成员不起作用 即不是同时都存在和起作用 共用体变量中起作用的成员是最后一次存放的成员 在存入一个新的成员后原有的成员就失去作用 如有以下赋值语句 i a 在完成以上三个赋值运算以后 只有 f是有效的 和 已经无意义了 此时用printf 是不行的 而用 ri t f a f 是可以的 因为最后一次的赋值是向 f赋值 因此在引用共用体变量时应十分注意当前存放在共用体变量中的究竟是哪个成员 共用体变量的地址和它的各成员的地址都是同一地址 例如 不能初始化 不能对共用体变量赋值 不能引用共用体变量名以得到值 不能把共用体变量作为函数参数 也不能使函数带回共用体变量 但可以使用指向共用体变量的指针 与结构体变量这种用法相仿 共用体类型可以出现在结构体类型定义中 也可以定义共用体数组 反之 结构体也可以出现在共用体类型定义中 数组也可以作为共用体的成员 枚举类型 枚举 就是将某一变量的所有可能取值都罗列出来 比如一周之内有7天 可以用星期一 星期二 星期日这样的数据列举出来 一年之内有12个月 可以用一月 二月 十二月列举出来 在C语言中 专门提供了一种类型来表示这样的数据 这就是枚举类型 它也是一种基本数据类型 枚举类型的一般定义形式 enum枚举名 枚举值表列 如enumweekday sun mon tue wed thu fri sat 定义了枚举类型之后 就可以定义枚举类型变量如 enumweekdayd 或者直接定义 enumweekday sun mon tue wed thu fri sat d 也可以直接定义 enum sun mon tue wed thu fri sat d 在上面的定义中 像sun mon tue等被称为枚举元素或者是枚举常量 它们是由程序员定义的标志符 标志符一旦定义完成后 在这个程序中就始终代表一定的意思 main enumbody a b c d month 31 j intt j a for t 1 td j a for t 1 t 30 t switch month t casea printf 2d c t t a break caseb printf 2d c t t b break casec printf 2d c t t c break cased printf 2d c t t d break default break printf n 本章练习当说明一个结构体变量时系统分配给它的内存是 A 各成员所需内存量的总和B 结构中第一个成员所需内存量C 成员中占内存量最大者所需的容量D 结构中最后一个成员所需内存量 2 根据下面的定义 能打印字母M的语句是 Structperson charname 9 intage Structpersonclass 10 John 17 Paul 19 Mary 18 adam 16 printf c n class 3 name printf c n class 3 name 1 printf c n class 2 name 1 printf c n class 2 name 0 3 下面程序的运行结果是 main structsmplx intx inty cnum 2 1 3 2 7 printf d n cnum 0 y cnum 0 x cnum 1 x 0136 4 若有以下定义和语句structstudent intage intnum structstudentstu 3 1001 20 1002 19 1003 21 main structstudent p p stu 则以下不正确的引用是 p numB p C p numD p stu age 5 当说明一个共用体变量时系统分配给它的内存是 各成员所需内存量的总和结构中第一个成员所需的内存量成员中占内存量最大者所需的容量结构中最后一个成员所需内存量 6 以下程序用以输出结构体变量bt所占内存单元的字节数 请填空 structps doublei chararr 20 main structpsbt printf btsize d n 7 为建立如图所示的存储结构 即每个结点两个域 data是数据域 next是指向结点的指针域 请将定义补充完整 data next structs chardata node 8 以下程序用来按学生姓名查询其排名和平均成绩 查询可连续进行 直到键入0时结束 请在 内填入正确内容 include include defineNUM4Structstudent intrank char name floatscore stu 3 Tom 89 3 4 Mary 78 2 1 Jack 95 1 2 Jin 90 6 main charstr 10 inti do printf Enteraname scanf s str for i 0 i NUM printf notfound n while strcmp str 0 0 9 设有三人的姓名和年龄存在结构数组中 以下程序输出三人中年龄居中者的姓名和年龄 请在 内填入正确内容 staticstructman charname 20 intage person li ming 18 wang hua 19 zhang ping 20 main intI j max min max min person 0 age for I 1 Imax elseif person i age min for I 0 I 3 I if person i age max person i age min printf s d n person i name person i age break 10 若已定义 structnum inta intb floatf n 1 3 5 0 structnum pn 则表达式pn b n a pn b的值是 表达式 pn a pn f的值是 若有下面的说明和定义 structtest intm1 charm2 floatm3 unionuu charu1 5 intu2 2 ua myaa 则sizeof structtest 的值是 A 1216149 12若以下定义 structlink intdata structlink nest a b c p q 且变量a和b之间已有如下图所示的链表结构 abcdatanextdatanextdatanext q p 指针p指向变量a q指向c 则能够把c插入到a和b之间并形成新的链表的语句组是 a next c c next b p next q q next p nextp next 13以下程序的输出结果是 unionmyun struct intx y z u intk a main a u x 4 a u y 5 a u z 6 a k 0 printf d n a u x 4560 13以下程序的输出结果是 structst intx int y p intdt 4 10 20 30 40 structstaa 4 50 102020506021516021607031 二 填空题1结构体又称为 是由具有不同数据类型的多个变量组合而成的数据存储形式 定义一个结构体类型的一般形式为 struct结构体名 成员列表 其中的成员又可以称为 成员表列可以称为 2如果需要将几种不同类型的变量存放到同一段内存单元中 可以使用 类型数据 如果一个变量只有几种可能的值 则可以定义 类型数据结构 字符 0 的ASCII码的十进制数为48 且数组的第0个元素在低位 则以下程序的输出结果是 includemain union inti 2 longk charc 4 r s
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!