C语言及应用第6章.ppt_第1页
C语言及应用第6章.ppt_第2页
C语言及应用第6章.ppt_第3页
C语言及应用第6章.ppt_第4页
C语言及应用第6章.ppt_第5页
已阅读5页,还剩94页未读 继续免费阅读

下载本文档

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

文档简介

第6章结构与联合 6 1结构6 2联合6 3位字段6 4枚举6 5自定义类型习题6 6 1结构 6 1 1结构类型的定义 例如 某公司职工的基本情况包括如下内容 姓名 性别 年龄 家庭住址 联系电话 邮政编码 习惯上用字符串形式保存姓名 性别 家庭住址 联系电话 用数值形式保存年龄和邮政编码 如果对上述数据进行存储和操作 应首先定义一个结构类型作为存储这些数据的数据类型 1 结构类型定义的一般形式 struct结构类型名 成员类型1成员名1 成员类型2成员名2 成员类型 成员名 2 结构类型定义的说明 1 struct是结构类型定义的保留字 必须原样照写 2 结构类型名的构成应符合标识符的规定 它与struct一起构成特定的结构类型 在以后的结构变量说明中可以被引用 3 大括号内是由结构成员组成的结构体 每个成员由数据类型和成员名组成 每个成员的数据类型可以是基本数据类型 也可以是构造类型 例6 1将上例中的职工基本情况 定义成如下形式 structemployee charname 8 姓名定义 charsex 4 性别定义 intage 年龄定义 charhome 30 家庭住址定义 chartel 20 联系电话定义 longintpostcode 邮编定义 例6 1定义了一个结构类型 类型名为structemployee 它与int char等类型名是同等的 该结构类型由6种数据类型的成员组成 其中 name sex age home tel postcode称为结构成员 6 1 2结构变量1 结构变量的说明 要说明一个结构类型的变量 可以采用如下三种形式 1 用变量说明语句来说明结构变量 一般形式如下 struct结构类型名变量表 例如 说明变量s1 s2 s3为structemployee类型 structemployees1 s2 s3 2 在定义结构类型的同时说明结构变量 一般形式如下 struct结构类型名 结构成员表 变量表 例如 定义结构类型structemployee并说明变量s1 s2 s3为structemployee类型 structemployee charname 8 charsex 4 intage charhome 30 chartel 20 longintpostcode s1 s2 s3 3 在定义结构类型的同时说明结构变量 但不设结构类型名 一般形式如下 struct 结构成员表 变量表 2 结构变量的初始化 如同其它类型的变量一样 结构变量也可以在说明的同时进行初始化 其初始化的条件与数组相似 即只有静态存储或外部存储的结构变量才能进行初始化 例如 对上例中的变量s1进行初始化 staticstructemployees1 ZK 何燕 女 20 劲松小区100号楼702室 010 88985566 100058 在进行结构变量的初始化时 数据与其对应的结构成员的类型应一一对应 6 1 3结构成员1 结构成员的引用 结构变量一旦说明 即可以对其进行操作 需要说明的是 引用结构变量时 只能对其成员进行引用 而不能对整个结构进行引用 结构成员的一般引用形式如下 结构变量名 成员名 例如 对上例中的变量s2进行赋值操作 s2 name 李力 s2 sex 男 s2 age 21 s2 home 花乡李村57号 s2 tel 66788765 s2 postcode 100451 2 结构变量的使用说明 1 结构变量具有存储性质 它可以被说明为外部 自动 静态等存储类型 但不能是寄存器类型 2 结构成员名可与程序中的变量名相同 结构变量名可与结构类型名相同 例如 structemployeeemployee 结构变量名和结构类型名都是employee 这是允许的 例6 2编程序 输出一个职工的姓名 性别 年龄 住址 电话和邮编 include voidmain structemployee charname 8 charsex 4 intage charhome 30 chartel 20 longpostcode staticstructemployees1 何燕 女 20 劲松小区100号楼702室 010 88985566 100058 printf 姓名 s n s1 name printf 性别 s n s1 sex printf 年龄 d n s1 age printf 住址 s n s1 home printf 电话 s n s1 tel printf 邮编 ld n s1 postcode 程序的运行结果如下 姓名 何燕 性别 女 年龄 20 住址 劲松小区100号楼702室 电话 010 88985566 邮编 100058 6 1 4结构数组1 结构数组的定义 结构类型与其它类型一样 当需要存储一组数据时可以定义成一个数组 即结构数组 例如 当需要对全公司职工的基本情况进行存储与操作时 可以进行如下定义 structemployeess1 50 以上定义了一个数组ss1 ss1数组含有50个数组元素 其数组元素为structemployee类型 2 结构数组的初始化 结构数组的初始化 只能对全局的或静态存储类型的数组进行 3 结构数组的引用 与其它数组一样 结构数组的引用只能引用数组元素而不能引用整个数组 例6 3编写程序 输出某商店的电器库存情况 structjglx charname 10 intNo main staticstructjglxjg 电视机 36 电冰箱 28 洗衣机 110 VCD机 40 照相机 21 微波炉 60 电风扇 130 空调机 38 录像机 15 586计算机 60 inti printf 库存情况 n printf 商品名称数量 n 程序的运行结果如下 库存情况 商品名称数量 电视机36 电冰箱28 洗衣机110 VCD机40 照相机21 微波炉60 电风扇130 空调机38 录像机15 586计算机60 例6 4编写程序 输入5名学生的姓名 语文成绩 数学成绩 C语言成绩 计算平均成绩并输出平均成绩最高学生的成绩 程序的执行过程如图6 1所示 图6 1例6 4程序的执行过程 程序如下 main structjieg charname 10 intyuwen intshuxue intc floataver j1 5 inti j for i 0 i 5 i printf 输入学生的姓名 语文 数学 C语言成绩 scanf s d d d printf 姓名 6s n j1 j name printf 语文成绩 6d n j1 j yuwen printf 数学成绩 6d n j1 j shuxue printf C语言成绩 6d n j1 j c printf 平均成绩 6 2f n j1 j aver 程序的运行结果如下 输入学生的姓名 语文 数学 C语言成绩 王海877690 输入学生的姓名 语文 数学 C语言成绩 李明899890 输入学生的姓名 语文 数学 C语言成绩 刘松涛768591 输入学生的姓名 语文 数学 C语言成绩 闻澜946788 输入学生的姓名 语文 数学 C语言成绩 赵茜878990 平均分最高的学生是 姓名 李明 语文成绩 89 数学成绩 98 C语言成绩 90 平均成绩 92 33 6 1 5结构与函数C语言中 结构变量与普通变量一样 可以参与函数处理 结构变量既可以作为实参向函数传递数值 也可以接收函数的返回值 例6 5结构变量作为函数的参数 structjiegou intx inty structjiegouf jg structjiegoujg printf jg的原值 d d n jg x jg y jg x jg x 10 jg y jg y 10 printf jg的新值 d d n jg x jg y return jg main structjiegouj j x 10 j y 20 printf j的原值 d d n j x j y j f j printf j的返回值 d d n j x j y 程序的运行结果如下 j的原值 10 20 jg的原值 10 20 jg的新值 100 200 j的返回值 100 200 例6 5程序中 main 函数定义了一个结构变量j 并作为实际参数调用函数f f 函数用具有相同结构的结构变量jg作为形式参数接收j传递的数据 6 2联合 6 2 1联合类型的定义和联合变量的说明联合类型的定义和引用方式与结构类型非常相似 1 联合类型的定义 联合类型定义的一般形式如下 union联合类型名 成员类型1成员名1 成员类型2成员名2 成员类型n成员名n 1 union为联合类型定义的保留字必须原样照写 2 联合类型名的构成应符合标识符的规定 它与union一起构成特定的联合类型 在以后的联合变量说明中可以被引用 3 大括号内是由联合成员组成的联合体 每个成员由成员类型和成员名组成 每个成员的数据类型可以是基本数据类型 也可以是已定义过的结构类型和联合类型 例如 定义一个既能存储整型数据 又能存储实型数据的联合类型 定义形式如下 unionlianhe inti floatf 2 联合变量的说明 与其它类型相同 联合类型定义后也可以说明属于该类型的变量 其一般形式如下 union类型名变量表 例如 说明x y为lianhe型变量 unionlianhex y 同样 也可以将类型定义与变量说明合二为一 其一般形式如下 unionlianhe inti flaotf x y 6 2 2联合变量的引用联合变量的引用与结构变量类似 联合变量一旦被说明 即可对它们进行操作 同样 引用联合变量时 只能对其成员进行引用 而不能对整个联合进行引用 引用联合成员的一般形式如下 联合变量名 成员名 6 2 3联合变量的使用说明 1 同一个联合变量可以存储几种不同类型的成员 但在每一时刻只能存储其中的一种 即 每一时刻只能有一个成员起作用 其它成员不起作用 2 联合变量中起作用的成员是最后一次赋值的成员 在存储一个新的成员后 原有成员的值将丢失 例如 引用联合变量x 并给它赋值如下 x i 10 x f 7 2 由于x中的两个成员共用同一块内存 所以当第二次赋值时 自动将第一次所赋的值覆盖 因此 在完成以上两个操作后 只有x f的值是有效的 3 联合变量与其它类型的变量不同 它不能进行初始化 4 使用联合类型可以节省内存空间 5 一个联合变量占用的内存空间 取决于联合成员中占用内存空间最大的成员 例如 上例说明的变量x 其所占内存的形式 如图6 2所示 其中 int类型与float类型共用一段内存 一个int类型的变量占用2个字节而一个float类型的变量占用4个字节 所以x共占用4个字节内存 当x用来存储整型数据时 即x i有效时 使用前2个字节 当x用来存储实型数据时 x f有效时 使用4个字节 由于联合的特点是共用内存 所以联合类型变量的所有成员的地址是相同的 图6 2联合变量的存储方式 例6 6联合变量的应用示例 include main unionlianhe inti charch x x i 111 printf d c n x i x ch x ch a printf d c n x i x ch 程序的运行结果如下 111 o 97 a 例6 6程序中 定义并说明了一个联合类型变量x 它的两个成员i和ch分别为int类型和char类型 共用2个字节的内存 因为C语言中整型与字符型是互相通用的 所以当x i被赋值为111时 x ch的值为字符 o 而当x ch被赋值为 a 时 x i的值为97 从例6 6程序可以看出 一旦联合变量的某个成员被赋值 那么在其之前已赋值的成员的内容将被破坏 6 3位字段 6 3 1位运算位运算是对操作数以二进制位 bit 为单位进行的数据处理 C语言中 位运算包括逻辑位运算和移位位运算 参加位运算的操作数必须是整型常量或变量 1 逻辑位运算 逻辑位运算分为4种 位反 位与 位或和位异或 其运算功能如表6 1和表6 2 所示 表6 1逻辑位运算符 表6 2逻辑位运算的功能 例6 7逻辑位运算示例 已知a 0 xf0 11110000 2b 0 xff 11111111 2 a 0 x0f 00001111 2a b 0 xf0 11110000 2 a b 0 xff 11111111 2a b 0 x0f 00001111 2 例6 8编写程序 描述例6 7的运算 main inta b a 0 xf0 b 0 xff printf a x n a printf a 程序的运行结果如下 a ff0f a b f0 a b ff a b 0f 例6 8程序的运行结果中 a的值为什么是ff0f而不是f呢 这是因为整型变量a占用2个字节 当a赋值0 xf0时 相当于赋值0 x00f0 因此 a的值为ff0f 在逻辑位运算符中 的优先级高于算术运算符 关系运算符 逻辑运算符和其它运算符 其它位运算符的优先级则低于关系运算符 高于逻辑运算符 例如 a b HT5SS 首先进行 a运算 然后进行 运算 有关运算符的优先级及结合性如表2 3所示 2 移位运算 移位运算分为两种 左移和右移 其运算功能如表6 3所示 表6 3移位运算符 1 左移运算当进行左移运算时 右端出现的空位补0 而左端移出的数据舍去 例如 已知c 44 00101100 2 进行操作 c c 2 HT5SS 后 c的值变为176或 10110000 2 操作过程如图6 3所示 2 右移运算当进行右移运算时 操作结果与操作数是否带符号有关 无符号操作数右移时 左端出现的空位补0 带符号操作数右移时 左端出现的空位按原最高位复制 无论什么操作数 右端移出的数据舍去 图6 3左移运算示意图 例如 带符号数a 16和无符号数b 240 它们的二进制表示同为11110000 进行下列操作 a a 2 b b 2 a的值变为 4或 11111100 2 b的值变为60或 00111100 2 操作过程如图6 4所示 图6 4右移运算示意图 图6 4右移运算示意图 例6 9编写程序 描述左 右移运算 main inta b c a 16 b 240 c 44 printf a d右移二位a d n a a 2 printf b d右移二位b d n b b 2 printf c d左移二位c d n c c 2 程序的运行结果如下 a 16右移二位a 4 b 240右移二位b 60 c 44左移二位c 176 移位运算的使用说明 1 左移一位相当于原数乘以2 左移n位则相当于原数乘以2n 例如 例6 9程序中c左移2位相当于原数44乘以22 得176 但此结论只适用于舍去的高位中不包含1的情况 2 右移一位相当于原数除以2 右移n位则相当于原数除以2n 例如 例6 9程序中a右移2位相当于原数 16除以22 得 4 b右移2位相当于原数240除以22 得60 3 移位运算比乘 除法的运算速度快 4 移位运算的优先级低于算术运算 但高于关系运算 如表2 3所示 3 位运算符与赋值运算符可以组成复合赋值运算符 表6 4列出了位运算与赋值运算组成的复合赋值运算 其优先级等价于赋值运算 如表2 3所示 表6 4复合赋值运 6 3 2位字段的定义和位字段变量的说明计算机应用中 有些命令字 状态字 方式字是以二进制位 bit 为单位表示的信息 这种类型的数据通常称为位字段数据 例如 真 或 假 一般用1或0表示 只需一位二进制位表示即可 对于位字段数据 如果用一个整型或字符型变量来存储 将会大量浪费内存 而如果用一个整型或字符型变量来存储多个位字段数据 又不利于存取和操作 为了解决这个问题 C语言提供了借助于结构来实现位字段数据的方法 它既可以有效地解决问题 又可以最大限度地节省内存 1 位字段的定义 位字段类型定义的一般形式如下 struct位字段类型名 数据类型名位字段名1 常量表达式1 数据类型名位字段名2 常量表达式2 数据类型名位字段名n 常量表达式n 其中 常量表达式用来指定每个位字段的宽度 数据类型名指定每个位字段的数据类型 一般选用unsignedint 位字段类型名 位字段名的构成应符合标识符的构成规则 例如 定义一个位字段类型如下 structweiziduan unsignedintw1 1 unsignedintw2 1 unsignedintw3 1 unsignedintw4 4 unsignedintw5 9 以上定义了一个名为weiziduan的位字段结构类型 它包含5个位字段成员 其数据类型均为无符号整数 它们的宽度分别为1 1 1 4 9位 如图6 5所示 图6 5位字段存储示意图 在进行位字段类型定义时应注意以下几点 1 当位字段结构中的各成员项的位数总和小于int类型的位长时 它仍将占用一个int类型的位长 2 当位字段结构中的各成员项的位数总和超过int类型的位长时 将占用下一个连续的int位长 但是 一个位字段不能跨越两个int位长 3 省略位字段名时 该段称为无名位字段 表示分配内存时将 跳过 该位字段所指定的位数 当无名位字段的宽度为0时 将强制下一个位字段从一个新的字节开始存放 例如 structzi unsignedintz1 4 unsignedint 2 unsignedintz2 1 unsignedint 0 unsignedintz3 1 其中 第一个无名位字段表示z1与z2之间空2位 第二个无名位字段表示无论前一个字节是否还有剩余空间 z3都将从下一个新字节开始存放 如图6 6所示 4 一个位字段的长度不能大于一个int位长 也不能定义位字段数组 图6 6位字段存储示意图 2 位字段变量的说明 位字段变量的说明与结构变量的说明相同 例如 structweiziduanwz1 wz2 structzizd 3 位字段变量的引用 位字段变量的引用方式与结构相同 即只能引用位字段的成员 例如 wz1 w1 zd z3等等 位字段变量可以和普通整型变量一样 进行算术运算和逻辑运算 例如 wz1 w1 0 if wz1 w11 printf d n wz1 w1 此外 位字段变量还可以进行位运算 例6 10位字段的应用示例 weizi intm structjg inti intb 2 n n i m if n i 0 n b 1 elseif n i 0 n b 1 else n b 0 switch n b case 1 printf 数据 d的符号是 n n i break case1 printf 数据 d的符号是 n n i break case0 printf 数据 d的符号是0 n n i main weizi 57 weizi 57 weizi 0 程序的运行结果如下 数据57的符号是 数据 57的符号是 数据0的符号是0 例6 10程序中 函数weizi 中的位字段n i用来存放接收的数据 并判断该数据是正数 负数还是零 n b根据n i的判断结果存放相应的符号标志 6 4枚举 6 4 1枚举类型的定义和枚举变量的说明1 枚举类型的定义 枚举类型定义的一般形式 enum枚举类型名 枚举元素1 枚举元素2 枚举元素n 或enum枚举类型名 枚举元素1 整型常量 枚举元素2 整型常量 枚举元素n 整型常量 其中 枚举元素是赋给枚举变量的允许值 enum是枚举类型的保留字 枚举类型名的构成应符合标识符的构成规则 整型常量 为枚举元素的序号初值 可以省略 例如 enummeiju false true 定义了一个名为meiju的枚举类型 它的取值只能是false或true 不能是其它值 2 枚举变量的说明 枚举变量的说明和其它构造类型一样 例如 enummeijum1 m2 也可以将类型定义与变量说明合二为一 例如 定义并说明一个关于方位的枚举类型enumlocation和属于它的变量loc enumlocation east west south north loc 3 枚举元素和它的序号 枚举类型中的枚举元素是以整数形式存放的 这个整数称为元素的序号 当定义一个枚举类型时 C语言编译程序将自动给这个枚举类型的元素赋以序号 如果没有强制定义 则第一个元素的序号为0 后续的每一个元素的序号都以比前一个元素的序号多1的值来表示 例如 enummeiju false true 元素false的序号为0 true的序号为1 也可以强制定义元素的序号 例如 enummonth january 1 february 2 march 3 april 4 may 5 june 6 july 7 august 8 september 9 october 10 november 11 december 12 上例采用了强制定义 编译时枚举元素的序号按用户指定的序号定义 6 4 2枚举类型的引用 1 在C语言中 枚举元素是按常量处理的 因此 不能对枚举元素赋值 2 枚举变量可以被赋值 例如 enumlocation east west south north loc loc south 相当于将序号2的枚举元素赋给loc 也可写成 loc enumlocation 2 或loc 2 甚至还可以使用表达式 loc enumlocation 6 4 以上各种写法的作用完全相同 3 枚举变量可以参与关系运算 例如 if loc east while loc west if loc 0 枚举变量进行比较的规则是 以序号的大小相互比较 序号大 则变量的值就大 4 枚举变量可以作为函数的参数或函数的返回值 5 枚举变量的值不能由输入输出函数直接进行输入输出 例如 printf s n loc 编译时不会出错 但是不输出内容 例6 11已知98年1月1日是星期四 当输入今年任意一天的日期时 计算是星期几并输出 main enumweekday sunday monday tuesday wednesday thursday friday saturday today firstday 定义枚举类型并说明枚举变量 inti j m day t HJ staticintdays 13 0 31 28 31 30 31 30 31 31 30 31 30 31 firstday enumweekday 4 98年1月1日是星期四 do j 0 printf 输入日期 月 日 scanf d d while j 1 t 0 for i 1 i m i 计算前m 1个月的总天数 t t days i t t day 计算1月1日距指定日期共有多少天 t t int firstday 1 7 计算指定日期是星期几 today enumweekday t printf 98年 d月 d日是 m day switch today casesunday printf 星期日 n break casemonday printf 星期一 n break casetuesday printf 星期二 n break casewednesday printf 星期三 n break casethursday printf 星期四 n break casefriday printf 星期五 n break casesaturday printf 星期六 n break 程序的运行结果如下 输入日期 月 日 81 98年8月1日是星期六 输入日期 月 日 23

温馨提示

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

评论

0/150

提交评论