程序设计基础 ——C语言第8章 结构体与共用体_第1页
程序设计基础 ——C语言第8章 结构体与共用体_第2页
程序设计基础 ——C语言第8章 结构体与共用体_第3页
程序设计基础 ——C语言第8章 结构体与共用体_第4页
程序设计基础 ——C语言第8章 结构体与共用体_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

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

文档简介

程序设计基础 第 8章 结构体与共用体 1 结构体类型变量的引用和初始化 结构体数组 结构体类型和结构体类型变量 问题的引出 结构体指针 结构体与函数 枚举类型 共用体 结构体综合应用实例 链表 第 8章 结构体与共用体 2 问题的引出 表 8学生信息表 编号 姓名 性别 年龄 语文成绩 数学成绩 英语成绩 1 张三 M 20 李四 F 18 王五 M 19 赵六 F 21 假设有 30名学生,为了能够表达上述表格的所有内容,可以进行如下数组的定义: 0; /*存放 30名学生的编号 */ 010; /*学生的姓名 */ 0; /*学生的性别 */ 0; /*学生的年龄 */ 0; /*学生的语文成绩 */ 0; /*学生的数学成绩 */ 0; /*学生的英语成绩 */ 3 重新进行 数组 的 定义并赋值 。 0=1,2,3,4; 010=“张三” ,“李四” ,“王五” ,“赵六” ; 0=M,F, M, F; 0 =20,18,19,21; 0= 0 = 0 = 问题的引出 1234n a m s e 378 . 590 . 276 . 5c h i n e s 576 . 385 . 690 . 5m a t 568 . 584 . 685 . 5e n g l i s 学生信息数据结构的内存分配图 结构 零散 不易管理 效率不 高 4 问题的引出 【 思考 】 是否 有一种数据类型,可将不同数据类型的数据集中在一起 ,从而 很方便地实现一个学生的信息集中在一张纸上,另一个学生的信息集中在另一张纸上 呢 ? 1张三 32李四 5 90 . 2 76 . 576 . 3 85 . 6 90 . 568 . 5 84 . 6 85 . 588 . 578 . 5图 8理想的学生信息数据结构的内存分配图 结构 紧凑 容易管理 相关性强 查找方便 入了结构体 来实现上述目标。 5 6 结构体类型和结构体类型变量 图 8创建 结构体 类型: /*学生的编号 */ 10; /*学生的姓名 */ /*学生的性别 */ /*学生的年龄 */ *学生的语文成绩 */ /*学生的数学成绩 */ *学生的英语成绩 */ ; 声明 结构体类型 们设计了一个用户自定义的数据类型,编译系统系统将 并不为 间。 结构体类型和结构体类型变量 7 结构体类型变量的定义 结构体的嵌套 结构体类型的声明 8 结构体类型的声明 声明 一个结构体类型的一般形式为: 结构体 名 类型名 成员名 1; 类型名 成员名 2; ; 声明结构体类型以关键字 结构体名 、成员名均 应 符合标识符命名的规则 。 “ ;”是结构体类型声明的结束 标志。 9 结构体类型变量的定义 只有 定义结构体类型的变量,编译系统才会分配相应的内存单元,存储具体的数据。 种定义结构体类型变量的方法 。 ( 1)先声明结构体类型,再定义结构体类型变量 前面声明了结构体类型 以用它来定义变量。例如: 类型 变量 名 与 a,b; 类型 变量名 1张三 32李四 576 . 368 . 588 . 578 . 5a m es e h i n e s em a t he n g l i s hs t u 1 s t u 2假设已经对 况 如右图。 10 结构体类型变量的定义 ( 2)在声明结构体类型的同时定义变量 例如: /*学生的编号 */ 10; /*学生的姓名 */ /*学生的性别 */ /*学生的年龄 */ /*学生的语文成绩 */ /*学生的数学成绩 */ /*学生的英语成绩 */ 一般形式为: 结构体 名 类型名 成员名 1; 类型名 成员名 2; 变量名表列 ; 11 ( 3)不写结构体名,直接定义结构体类型 变量 。 例如: /*学生的编号 */ 10; /*学生的姓名 */ /*学生的性别 */ /*学生的年龄 */ /*学生的语文成绩 */ /*学生的数学成绩 */ /*学生的英语成绩 */ 结构体类型变量的定义 一般形式为: 类型名 成员名 1; 类型名 成员名 2; 变量名表列 ; 12 结构体的嵌套 结构体 类型在声明时,其成员还可以允许是其它的结构体类型的 变量。 例如: /*声明结构体类型 /*年 */ /*月 */ /*日 */ ; 10; /*; ; a m es e xc h i n e s em a t he n g l i s hb i r t h d a y y e a r m o n t h d a 13 结构体类型变量的引用和初始化 ( 1)定义了结构体类型变量后,就可以引用此变量 。 /*学生的编号 */ 10; /*学生的姓名 */ /*学生的性别 */ /*学生的年龄 */ *学生的语文成绩 */ /*学生的数学成绩 */ *学生的英语成绩 */ 不能 这样输出: % d,%s,%c,%d,%f,%f,%fn”, 引用结构体变量中成员的方式为: 结构体类型变量 “ .”是成员运算符,也称圆点 运算符 , 它 在所有的运算符中优先级最高 。 %d,%s,%c,%d,%f,%f,%fn , 14 结构体类型变量的引用和初始化 ( 2)当出现结构体的嵌套时,必须以级联方式访问结构体变量成员 。 *声明结构体类型 *年 */ *月 */ *日 */ ; 10; /*; *结构体类型变量 5; 15 结构体类型变量的引用和初始化 ( 3)对结构体变量的成员可以像普通变量一样进行各种运算。 *将 ; /*等价于 (+*/ + /*等价于 +(; /*将 ( 4)结构体类型变量的初始化 前面我们学习了如何初始化变量和数组,例如: ; =1,2,3,4; 结构体类型变量的初始化也可以使用与数组初始化相似的方法。例如: /*学生的编号 */ 10; /*学生的姓名 */ /*学生的性别 */ /*学生的年龄 */ *学生的语文成绩 */ /*学生的数学成绩 */ *学生的英语成绩 */ ; 1,”张三” ,M,20, 17 结构体类型变量的引用和初始化 也可以在声明结构体类型的同时,完成结构体变量的定义和初始化操作,即: /*学生的编号 */ 10; /*学生的姓名 */ /*学生的性别 */ /*学生的年龄 */ *学生的语文成绩 */ /*学生的数学成绩 */ *学生的英语成绩 */ 1,”张三” ,M,20, 18 结构体类型变量的引用和初始化 当出现结构体嵌套时,结构体类型变量的初始化方式为: 10; /*; 1,”张三” ,M, 1998,5,21, 19 结构体数组 前面 我们学习一维数组的定义和初始化,例如: =1,2,3,4; ( 1)声明结构体类型 /*学生的编号 */ 10; /*学生的姓名 */ /*学生的性别 */ /*学生的年龄 */ *学生的语文成绩 */ /*学生的数学成绩 */ *学生的英语成绩 */ ; 20 ( 2)定义结构体 数组 ; 数组 所占的内存空间为 4*字节 。 结构体数组 。 结构体数组 s t u A r r 0 s t u A r r 1 s t u A r r 2 s t u A r r 3 s t u A r r 0 . s t u A r r 0 . n a m e s t u A r r 0 . s e x s t u A r r 0 . s t u A r r 0 . c h i n e s es t u A r r 1 . s t u A r r 1 . n a m e s t u A r r 1 . s e x s t u A r r 1 . t u A r r 2 . s t u A r r 2 . n a m e s t u A r r 2 . s e x s t u A r r 2 . t u A r r 3 . s t u A r r 3 . n a m e s t u A r r 3 . s e x s t u A r r 3 . t u A r r 1 . c h i n e s es t u A r r 2 . c h i n e s es t u A r r 3 . c h i n e s es t u A r r 1 . m a t hs t u A r r 2 . m a t hs t u A r r 3 . m a t hs t u A r r 1 . e n g l i s hs t u A r r 2 . e n g l i s hs t u A r r 3 . e n g l i s hs t u A r r 0 . m a t h s t u A r r 0 . e n g l i s n a m e s e x c h i n e s e m a t h e n g l i s 3)初始化结构体数组 可以在定义结构体数组的同时进行初始化,例如: =1,”张三” ,M,20, 2,”李四” ,F,18, 3,”王五” ,M,19, 4,”赵六” ,F,21,; 数组 况。 结构体数组 s t u A r r 0 s t u A r r 1 s t u A r r 2 s t u A r r 3 1 张三 M 20 86 . 32 李四 F 183 王五 M 194 赵六 F 2178 . 590 . 276 . 576 . 385 . 690 . 568 . 584 . 685 . 588 . 5 78 . 5n a m e s e x c h i n e s e m a t h e n g l i s 程序 8有 括编号、姓名、性别、年龄、语文成绩、数学成绩和英语成绩),要求按照语文成绩由高到低的顺序输出各学生的信息。 【 问题分析 】 用 结构体数组 存放 后采用冒泡排序法对各学生的语文成绩按照由高到低的顺序进行排序,最后输出排序后的各学生的信息。 【 算法设计 】 定义包含有 采用冒泡排序法对各学生的语文成绩按照由高到低的顺序进行排序。 输出排序后的各学生的信息。 结构体数组 23 【 程序 8 # 4 /*学生的编号 */ 10; /*学生的姓名 */ /*学生的性别 */ /*学生的年龄 */ *学生的语文成绩 */ /*学生的数学成绩 */ *学生的英语成绩 */ ; /*定义并初始化结构体数组 */ =1,张三 ,M,20, 2,李四 ,F,18, 3,王五 ,M,19, 4,赵六 ,F,21,; 24 /*定义结构体变量 作交换时的临时变量 */ i,j; /*采用冒泡排序法对各学生的语文成绩按照由高到低的顺序排序 */ i=0;i)和成员 名 。 结构体指针 -成员名 例如 : %s n”, p- ( 3)引用结构体中的成员的第三 种方式: (*结构体指针 )例如: %s n”, (*p) *为成员运算符“ .”的优先级高于间接寻址运算符“ *”。 28 指向结构体数组的指针 前面 我们学习了指向一维数组的指针,例如: =1,2,3,4; p; /*定义整型指针 p*/ p= /*,例如: =1,”张三” ,M,20, 2,”李四” ,F,18, 3,”王五” ,M,19, 4,”赵六” ,F,21,; p; /*定义 ; /*+ 1p + 2p + 329 指向结构体数组的指针 【程序 8利用指向结构体数组的指针计算学生各科的平均成绩 。 # 4 /*学生的编号 */ 10; /*学生的姓名 */ /*学生的性别 */ /*学生的年龄 */ *学生的语文成绩 */ /*学生的数学成绩 */ *学生的英语成绩 */ ; 30 /*数组 3= /*数组 3= i; =语文成绩 ,数学成绩 ,英语成绩 ; /*定义并初始化结构体数组 */ =1,张三 ,M,20, 2,李四 ,F,18, 3,王五 ,M,19, 4,赵六 ,F,21,; 31 /*p= /*计算 1+=p- /*计算 2+=p- /*计算 /*输出各科的平均成绩 */ i=0;i # 4 /*学生的编号 */ 10; /*学生的姓名 */ /*学生的性别 */ /*学生的年龄 */ *学生的语文成绩 */ /*学生的数学成绩 */ *学生的英语成绩 */ /*学生 3门课的平均成绩 */ ; 35 /*函数功能 : 求 各个学生 3门课的平均成绩,返回平均成绩最高的学生 函数 参数 : 结构体 数组 生人数 n 函数 返回值:平均成绩最高的 学生 */ ,n) /*,; /*求各个学生 3门课的平均成绩,存放到结构体的 (i=0;i; /*返回平均成绩最高的学生 */ 36 /*定义并初始化结构体数组 */ =1,张三 ,M,20, 2,李四 ,F,18, 3,王五 ,M,19, 4,赵六 ,F,21,; i; *调用 (); /*输出平均成绩最高的学生信息 */ 编号 姓名 性别 年龄 语文 数学 英语 平均 n); %2d%7s%4c%5d%n, ; 37 ( 2)方法二: p,n); /*程序 8法二 */ # 4 /*学生的编号 */ 10; /*学生的姓名 */ /*学生的性别 */ /*学生的年龄 */ *学生的语文成绩 */ /*学生的数学成绩 */ *学生的英语成绩 */ /*学生 3门课的平均成绩 */ ; 38 /*函数功能 : 求 各个学生 3门课的平均成绩,返回平均成绩最高的学生 函数 参数 : 指向 结构体数组的指针 p,学生人数 n 函数 返回值:平均成绩最高的学生的 地址 */ p,n) /*,; /*求各个学生 3门课的平均成绩,存放到结构体的 (i=0;(p+i)-p+i)-p+i)-3; /*寻找平均成绩最高的那个学生在结构体数组中的序号 */ i=1; (p+i; /*返回平均成绩最高的学生的地址 */ p+ 39 /*定义并初始化结构体数组 */ =1,张三 ,M,20, 2,李四 ,F,18, 3,王五 ,M,19, 4,赵六 ,F,21,; i; *调用 (); /*输出平均成绩最高的学生信息 */ 编号 姓名 性别 年龄 语文 数学 英语 平均 n); %2d%7s%4c%5d%n, ; 40 结构体综合应用实例 【 程序 8编程实现一个简单的 学生成绩查询系统 ,功能描述: ( 1)用户添入用户名和密码进行登录, ( 2)登录成功进入学籍管理系统主界面, ( 3)选择查询类型,根据学号查询或是根据班级查询或根据专业查询,若根据班级查询或根据专业查询,除查询外,还可以统计各门考试最高分,最低分,平均分并排序。 要求:写 8个函数分别完成登录身份验证( 学籍管理系统主界面控制( 学号查询( 班级查询( 专业查询( 最高分统计( 最低分统计( 平均分统计( 排序( 按照结构化程序设计“ 自顶向下、逐步细化 ”分析问题的方法,系统各函数间调用的层次结构如图 8 41 主 函 数登 录主 界 面按 学 号 查 询 按 班 级 查 询按 专 业 查 询最 高 分 统 计最 低 分 统 计 平 均 分 统 计排 结构体综合应用实例 图 8生成绩查询系统层次结构图 问题的引出 42 共用体 声明共用体类型和定义共用体类型的变量 共用体成员的引用 43 问题的引出 结构体 是允许存放不同数据类型的集合体 。 假如 现在要定义一种类型可以放学生的学号、姓名和英语成绩 ,其中 英语成绩 有的老师按照 “ A” 、“ B” 、“ C” 、“ D” 、“ E” 五个等级 给的,有的老师则是按照 百分制 给的,那应该如何设计这样的类型呢 ? 此时 我们就可以声明 共用体 类型来解决上面的问题。 共用体 是一个能在同一内存空间内存储不同类型数据的数据类型 。 共用体的关键字是 44 声明共用体类型 和 定义 共用体类型的变量 老师 就可以根据需要给出 等级制 成绩或是 百分制 成绩。 /*声明英语成绩的共用体 */ /*按等级给出成绩 */ /*按百分制给出成绩 */ ; 声明 共用体类型的一般形式为: 用体名 类型名 成员名 1; 类型名 成员名 2; ; 45 定义共用体类型 变量有 三种实现方式: ( 1)先声明共用体类型,然后定义共用体类型变量 s; /*定义 s*/ ( 2)声明共用体类型的同时定义共用体类型变量 /*声明英语成绩的共用体 */ *按等级给出成绩 */ /*按百分制给出成绩 */ s; /*定义 s */ ( 3)直接定义共用体类型变量,共用体名缺省 *声明共用体 */ *按等级给出成绩 */ /*按百分制给出成绩 */ s; /*定义共用体类型变量 s*/ u n i o n s c o r e sp o i n tg r a d 共用体成员的引用 共 用体变量成员引用的 形式为 : 共用体变量名 注意 :由于共用体类型采用的是覆盖技术 ,不能 同时对共用体成员进行赋值操作。共用体在同一时刻只有一个成员是有意义的。 /*声明英语成绩的共用体 */ /*按等级给出成绩 */ /*按百分制给出成绩 */ s; /*定义 s */ A ; %c n”, A 47 如果接着对共用体变量 98; %f n”, %c n”, 如果对共用体变量的每个成员都进行赋值操作,共用体变量中起作用的总是最后一次存放的成员变量的值 。 *声明学生结构体 */ /*学生的编号 */ 10; /*学生的姓名 */ /*声明英语成绩的共用体 */ *按等级给出成绩 */ /*按百分制给出成绩 */ s; /*定义 s */ 采用级联的访问方式如下: 8 枚举类型 如果 一个变量只能几种可能的值,则可定义为枚举 类型 。 枚举 类型可用关键字 ( 1)声明枚举类型和定义枚举类型的变量 举名 枚举元素 1,枚举元素 2, ; 例如: s; 也 可以在声明枚举类型的同时定义枚举类型的变量,例如: s; 也 可以缺省枚举名,例如: s; 49 枚举类型 ( 2)枚举类型变量的赋值和初始化 包含 在大括号内的标识符均为整型常量,也称为枚举常量 。 除非 特别规定,否则这组常量中的第 1个标识符的值为 0,第 2个标识符的值为 1,以此类推, ,后 1个标识符在前 1个标识符值的基础上加 1。 s = /*用标识符对枚举类型变量 : s = ( 0; /*将整型常量值强制类型转换成枚举类型 */ 也等价于: s = 0; /*用整型常量值对枚举类型变量 ,例如: , s; 50 枚举类型 ( 3)枚举类型变量的输出 枚举常量标识符代表的是一个整数值 ,它们 可以用于使用整数值的任何场合,但不能将其作为字符串直接输出。例如: s = %dn”,s ); 但是如果用如下形式输出则是错误的。 %sn”,s ); ( 4)枚举类型变量在控制结构中的应用 枚举类型变量可以出现在条件语句 如: , s ; s = 51 /*程序 8 # , s ; s= s , s ; % d”,&s ); /*输入枚举类型变量 (s) n); n); n); n); ; 枚举类型 2 3 键字 名” 。 型名 标识符 例如: 再 例如: /*学生的编号 */ 10; /*学生的姓名 */ /*学生的性别 */ /*学生的年龄 */ *学生的语文成绩 */ /*学生的数学成绩 */ *学生的英语成绩 */ ; p,; 等价于: p,; 54 用 处 是: ( 1)可以减少关键字 以通过非常有意义的名字来命名新类型,从而增强程序的可读性。 ( 2)用 如,需要让整数占 4个字节的程序在一种系统上可能要用 在另一种系统上可能要用 可移植性而设计的程序经常用 个字节的整数的别名。如: 一次性修改程序中的别名 而提高编码的效率。 问题的 引出 链表的删除操作 链表的创建 链表的定义和特点 链表的插入操作 55 链表 56 问题的引出 现 要 设计一个学生信息管理 系统, 如何设计数据结构? 00; 0000; 一 个实际的问题是,如何确定一个学校的学生总人数 ? 一旦 数组的大小确定,会带来两个问题: 学生人数远远低于所设定的元素最大值,将造成系统资源的浪费。 当需要向结构体数组中增加或删除一个学生信息时,可能需要移动大量的数组元素,这会造成时间上的浪费。 链表 可以 解决 上述问题。链表是一种动态的进行内存分配的数据结构,它既不需要事先确定最大值,规模大小可以根据需要进行动态变化,在插入或者删除一个元素时也不会引起数据的大量移动,从而达到合理地使用存储空间的目的。 57 链表的定义和特点 链表 是由一系列节点组成的,每个节点有两部分构成 : 第 一部分是 数据域 用来 保存用户需要保存的数据,它可以由多个数据项构成 ; 另 一部分是 指针域 用来 存放下一个节点的地址 。 一个节点中应包含一个指针变量,用来存放下一个节点的地址。例如: /*数据域 /*指针域 ; d a t an e x th e a d a t an e x d a t L n58 链表的创建 链表 的创建采用向链表中添加新节点的方式来实现。向链表中添加新节点要考虑两种情况: 若当前链表为空,则将新建节点置为第 1个节点,如图 8 若当前链表为非空,则将新建节点 2添加到表尾,如图 8新建节点 3添加到表尾,如图 8 2N U L Lh e a pt a i L 2N U L Lh e a d 节点 1 pt a i L 2h e a t a i L 2h e a t a i 第 2个节点添加到链表尾 步骤一 步骤二 步骤三 图 8第 1个节点的创建 59 链表的创建 4N U L 2h e a t a i L 4节点 22h e a t a i L 4节点 22h e a t a i L 图 8第 3个 节点添加到链表尾 步骤一 步骤二 步骤三 2h e a d 节点 14节点 26N U L 图 8创建好的链表结构图 60 【 程序 8链表 的创建、输出和 释放 # /*数据域 *指针域 ; /*函数功能 : 创建 一个链表,当输入的数为 0时,建立链表结束。 函数 的参数 : 无 函数 的返回值:创建链表的头 指针 */ /*p; x; 61 请输入一个整数: ); %d,&x);

温馨提示

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

评论

0/150

提交评论