[IT计算机]吴文虎《程序设计基础第2版》PPT12.ppt_第1页
[IT计算机]吴文虎《程序设计基础第2版》PPT12.ppt_第2页
[IT计算机]吴文虎《程序设计基础第2版》PPT12.ppt_第3页
[IT计算机]吴文虎《程序设计基础第2版》PPT12.ppt_第4页
[IT计算机]吴文虎《程序设计基础第2版》PPT12.ppt_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

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

文档简介

声明 本课件版权归清华大学计算机系语音技术中心所有未经许可不得扩散 结构数组 结构也可以构成数组 即数组元素是结构 当然要求这一类数组的全部元素都应该是同一类结构 先看下例 例中有同宿舍的四名同学的数据 构成一个有四个元素的结构数组 程序名 7 14 cpp 作者 wuwh 编制时间 2002年11月21日 主要功能 结构数组 include include structstudent 定义结构student charname 20 charsex unsignedlongbirthday floatheight floatweight studentroom 4 定义student结构数组 并初始化 lixin m 19840318 1 82f 65 0f zhangmen m 19840918 1 75f 58 0f helei m 19841209 1 83f 67 1f geyujian m 19840101 1 70f 59 0f voidmain 主函数 studentq 定义q为student结构 以下是按年龄大小对四位同学进行排序inti 0 intj 0 for j 0 jroom i 1 birthday ifq room i room i room i 1 room i 1 q if fori forjfor i 0 i 4 i foricout room i name n room i sex n room i birthday n room i height n room i weight n fori 主函数 说明上述程序可完成冒泡排序 在排序过程中数组中的元素是结构 按生日大小排序时 学生的5个数据作为一个整体 结构 来调整在数组中的位置 作业 希望你能按身高排序改写上述程序 程序名 7 15 cpp 作者 wuwh 编制时间 2002年11月21日 主要功能 结构指针数组 include includestructstudent 定义结构student charname 20 charsex unsignedlongbirthday floatheight floatweight 下面我们用结构指针数组来完成排序任务 studentroom 4 定义student结构数组 并初始化 lixin m 19840318 1 82f 65 0f zhangmen m 19840918 1 75f 58 0f helei m 19841209 1 83f 67 1f geyujian m 19840101 1 70f 59 0f voidmain 定义指向student结构的指针数组 指向room数组元素student p 4 定义一个指向student结构的指针 用作中间变量 下面仍用冒泡排序将屋中4人依身高从大到小排序inti 0 intj 0 for j 0 jheightheight q p i p i p i 1 p i 1 q for i 0 inamesexbirthdayheightweight endl 说明 1 p 是指向student结构的指针数组 经初始化赋入的是room数组中元素所在的地址 指向关系见图1 2 p i height是名为p i 的指针通过箭头操作符来访问my结构成员height 3 语句if p i heightheight 是说如果room i 中的height成员比room i 1 中的height成员小 就去做下面的语句组 变换指针的指向 让p i 改去指向room i 1 让p i 1 指向room i 这样做就比前一个程序好 当着结构成员很多时 直接让结构变量相互交换并不是好办法 而现在的做法只需将指针的指向交换一下 极为省力 1 87p 0 p 1 1 85p 2 p 3 1 621 76 引用的概念及应用 古代有的人有名有字还有号 在c 中 为了方便除了给变量起一个名之外 有时还要给它起一个 别名 这里我们介绍 引用 的概念和用引用传递参数的方法 比如 我们先定义一个整型变量i并初始化为3 再声明j是对整型数的引用 并初始化为引用i 两个语句为inti 3 是定义int是声明和初始化 而不是定义和初始化 比较inti 和int j 前者是定义 需要分配内存单元给变量i 后者是声明 不是定义 不需要分配内存单元给j 仅仅声明了一个引用 或者说仅仅起了一个 别名 而已 下面 我们用图示来细说定义和声明的关系 inti 3 定义之后 系统为i分配了内存地址单元 i为符号地址 int声明j是i的 别名 即j是i的引用 系统并不去为j分配内存单元 而是说j是i的 别名 别名和正名所代表的符号地址是同一个地址 为了验证上述说法 请作如下实验 i 别名j i 0 x0012ff7c j 0 x0012ff7c 程序名 7 16 cpp 引用测试 作者 wuwh 编制时间 2002年11月25日 主要功能 对 引用 的测试 include 预编译命令intmain void 主函数 inti 3 定义和初始化int 输出结果为i的地址 0 x0012ff7cj的地址 0 x0012ff7c名与别名两者所表示的地址相同 注意 你的运算结果的地址可能和本书所给的不同 但i和j的地址会是一样的 利用引用来传递参数 我们先来看下面的程序 这个程序是用来输出两个数中之大者的 这个程序在7 17 cpp中 是用指针来编写的 现在我们利用引用来编写 之后再比较两者之异同 看引用的好处 程序名 7 17 cpp 引用测试 作者 wuwh 编制时间 2002年11月26日 主要功能 利用引用来传递参数 include 预编译命令 交换两浮点数voidswap float 主函数结束 voidswap float voidmain floatx y cout x cout y 交换x y并输出swap x y cout n调用swap x y n cout x x endl cout y y endl 说明 1 子函数中两个形式参数被声明为引用 都是对浮点类型的数的引用 2 主函数在键盘输入x y值之后 执行swap x y 这时实参为x y的值 形参为xx yy 将实参传递给形参的过程相当于在做float使xx成为x的引用 yy成为y的引用 或者说xx成为变量x的地址 x 的符号名的别名 yy成为变量y的地址 y 的符号名的别名 本来子函数是不能直接对变量x y进行操作的 经过引用之后 两个 别名 xx与yy替代了x y 表面上看 主函数在调用子函数时 传递的是变量x y 而实际上传递给子函数的是x y变量的地址 形式上看是对xx yy进行操作 实质上在对x y进行操作 3 从这个例子看出 引用具有指针的强大功能 但在传递参数 调用函数时却有良好的可读性 比较swap floatxx floatyy 与swap float xx float yy xy3 05 0 xxyy3 025 05 03 01temp33 0 x 别名xx y 别名yy 3 05 05 023 01temp33 0 本来子函数是不能直接对变量x y进行操作的 经过引用之后 两个 别名 xx与yy替代了x y 表面上看 主函数在调用子函数时 传递的是变量x y 而实际上传递给子函数的是x y变量的地址 形式上看是对xx yy进行操作 实质上在对x y进行操作 思考几种参数传递方式的比较 程序名 7 18 cpp 作者 wuwh 编制时间 2002年11月27日 主要功能 参数传递比较 include 传引用voidswap1 int 传引用voidswap1 int 传地址 指针 修改指针所指地址的内容voidswap2 int xx int yy inttemp temp xx xx yy yy temp cout 子函数 xx xx yy yy endl 传值voidswap3 intxx intyy inttemp temp xx xx yy yy temp cout 子函数 xx xx yy yy endl 传地址 指针 修改指针本身voidswap4 int xx int yy int p p xx xx yy yy p cout 子函数 xx xx yy yy endl voidmain 主函数 intx y x 100 y 200 cout 初始值 x x y y endl cout endl 传引用cout 传引用 swap1 x y endl swap1 x y cout 主函数 x x y y endl cout endl 传地址 传址 x 100 y 200 cout 传地址 修改指针所指的内容 swap2 传值x 100 y 200 cout 传值 swap3 x y endl swap3 x y cout 主函数 x x y y endl cout endl 传地址x 100 y 200 cout 传地址 修改指针 swap4 链表 例 某电视台希望王小二同学为他们编一个程序 该程序可以将节目串在一起 形成一份有序的节目预告 节目列表有如下三项 1 节目名称包括新闻联播 cctvnews 祖国各地 motherland 体育之窗 sports 学校见闻 college 电影展播 movie 2 节目主持人 director 3 播放时间长度 time 我们可以将每一个节目单独放在一个结构里 用一个指针把两个结构连在一起 一天的节目形成一条链表 用一个所谓的头指针head指向链表的第一个结点 如下图所示 head 头指针 下面的程序是建立链表的过程 程序名 7 19 cpp 作者 wuwh 编制时间 2002年11月26日 主要功能 链表 includestructactlist 定义一个名为actlist结构 charactname 20 节目名为字符数组chardirector 20 主持人为字符数组intmtime 节目长度为分钟actlist next 指向actlist结构的指针 actlist head 链头指针 actlistcharactname 20 chardirector 20 数据域intmtime actlist next 指针域 acitlist结构的指针函数actlist create actlist p null 指向待插入的结点actlist q null 指针 用于在其后插入结点head null 一开始链表为空inttime 节目时长 如为0则退出 以下是给新结点输入节目信息cout time while time 0 当该节目的时长不为0时 将其 纳入链表中p newactlist 分配内存空间给p结点 让time赋给p结点的结构成员mtimep mtime time cout p actname 输入节目名称cout p director 输入主持人 voiddisplaylist actlist head coutmtimeactnamedirectornext voidmain 主函数开始 调用子函数displalist 调用时的实参为create 函数的返回值displaylist create 主函数结束 说明1 先从主函数说起主函数只有一条语句displaylist create 这是调用子函数displaylist 该子函数的形参为actlist head是一个指向actlist结构的名为head的指针变量 在主函数调用displaylist时所用的实际参数来自运行create 函数的返回值 从create 的定义actlist create 看出create 函数的返回值应该是一个指向actlist的指针 主函数在调用子函数时 又遇到该函数的实参又是调用另一个函数之后的返回值 看起来的确显得复杂 但是我们耐心分析之后 感到并不难 2 程序开头为结构定义 在这里我们称这样的一个结构为一个结点 这个结点包含两个域 数据域和指针域 结点 数据域中装有节目的信息 而指针域装的是指向另一个结点的地址 显然这是为形成链表而专门设置的 3 在定义create函数之前 先定义了一个指向结构的头指针head 即actlist head 4 定义create函数 该函数可返回指向actlist结构的指针 即actlist create 分析这个函数的功能可分如下4块 定义actlist p null actlist q null head null inttime 定义了两个指向结构actlist的指针p和q 并初始化为空 即未指向任何地址 同时让头指针head也为空 再定义一个临时变量time 是一个整型数 提示 输入节目时长 之后用键盘输入 用了下面两句 cout time 这部分程序语句是为下面的while循环做准备的 如果time不为0 才做下面的内容 while time 0 循环在当循环的循环体内完成建立链表的过程 首先给p结点分配内存空间 这个内存空间的大小要根据p结点的定义 p结点是actlist结构 来确定 p结点有了内存空间 就可以给它的各个成员赋值了 接着下面就是几个赋值语句p mtime time cout p actname 用键盘输入节目名称cout p director 用键盘输入主持人 接着是一个分支语句if head null head p 这是说如果头指针为空 表示链表还是空的 这时p结点就是第一个结点 让head赋值为p 即让head指向p结点 之后让q p 这是让q指向刚进入链表的结点 让p再去指向待加入的结点 如果p结点已不是第一个结点了 head必不为null 因此要走else分支 即elseq next p 将此时的p结点放到q所指向的结点后面 之后让q p 即让q指向刚进入链表的结点 腾出p去指向下一个待加入的结点 接下来输入下一个节目时长 cout time 至此 while语句的循环体结束 当time值不为0 就会有结点加入链表 继续执行循环体 一旦time为0 则会跳出while循环 执行两条语句if head null q next null return head 第一条是说 如果head不空说明链表已建成 这时q一定是最后一个结点 将该结点的指针域置成空 以表明它是链尾 第二条return head 将这条链表的头指针head返回 这件事意味着执行完create函数后得到head指针所指向的地址 这个地址就是链表中的第一个结点的地址 这时对主函数而言displaylist create 就是dispalylist head 调用dsplaylist head 就会将整个链表从头至尾输出 1 定义actlist结构 结构中包含数据域和指针域 将一个结构看作一个结点 2 定义一个指向结构的指针head 准备用来指向链表的第一个结点 3 定义一个指向actlist结构的指针函数 起名为create函数 该函数返回的是创建好的链的头指针head 下面是create函数所要做的事情 定义指向actlist结构的两个指针p和q 定义后立即初始化为null 即不指向任何地址 再让头指针head为null 也是不指向任何地址 表示该链表尚未建立 一个结点也没有 然后定义一个中间变量 节目时长time 当time为0时 建立链表的过程应该结束 建立链表的过程可归纳为如下三个步骤 下面程序的构思是 只要time不为0 就要构建链表 构建的思路是将一个一个的结点加至链表里来 首先给p找一个能够指向的内存空间 我们说这是给p结点分配一片内存空间 如下图 建立链表的过程可

温馨提示

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

评论

0/150

提交评论