《函数的高级应用精.ppt》由会员分享,可在线阅读,更多相关《函数的高级应用精.ppt(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、函数的高级应用第1 页,本讲稿共17 页课程内容安排 数组作为函数参数。查找算法的函数实现。排序算法的函数实现。函数模板的定义和应用。函数重载的应用。第2 页,本讲稿共17 页数组作为函数参数 数组作为函数参数,是指以数组名作为实际参数传递给函数,其要求形参和相对应的实参都必须是类型相同的数组,都必须有明确的数组说明。当形参和实参二者不一致时,即会发生错误。此外,用数组名作函数参数时,不是进行值的传送,即不是把实参数组的每一个元素的值都赋予形参数组的各个元素,而是是地址的传送,也就是说把实参数组的首地址赋予形参数组名。第3 页,本讲稿共17 页查找的函数实现 所谓查找是根据用户指定的查找目标,
2、在以某一数据结构存储的数据中进行检索查询,一直到找到该目标或查找失败。查找时实际应用中使用非常频繁的,因此经常将查找封装成函数,以便在其他函数中直接调用。本节要介绍的是针对所有数据结构而言两种通用的查找方法:顺序查找和折半查找的函数实现。第4 页,本讲稿共17 页顺序查找 顺 序 查 找 就 是 在 一 个 已 知 无 序 队 列 中 找 出 与 给 定 关 键 字 相 同的 数 的 具 体 位 置。顺 序 查 找 的 原 理 是 让 关 键 字 与 队 列 中 的 数从 第 一 个 开 始 逐 个 比 较,直 到 找 出 与 给 定 关 键 字 相 同 的 数 为止,如 果 到 查 找 到
3、队 列 的 最 后 一 个 元 素 还 未 找 到,则 查 找 失败。顺序查找的实现流程如图9.4 所示。第5 页,本讲稿共17 页折半查找的函数实现 所 谓 折 半 查 找 是 指 在 数 组 基 本 有 序 下,从 初 始 的 查 找 数组 开 始,每 次 与 当 前 查 找 区 间 的 中 间 点 位 置 上 的 元 素 值进 行 比 较,相 同 则 查 找 成 功,不 成 功 则 当 前 的 查 找 区 间就 缩 小 一 半。这 一 过 程 不 断 重 复 直 至 找 到 目 标 值 在 数 组中 的 位 置,或 者 直 至 当 前 的 查 找 区 间 为 空(即 查 找 失 败)时为
4、止,流程图如图9.6 所示。第6 页,本讲稿共17 页除了查找外,排序也是实际程序中的一项基本应用。由于实际工作中处理的数量巨大,所以排序对算法本身的速度要求很高。本节将介绍C+中使用函数实现两种常见的排序算法:冒泡排序算法和快速排序算法。排序的函数实现 第7 页,本讲稿共17 页冒泡排序是一种最为常见也最原始的排序方法,其实现思想是依次两两比较待排序的数组元素;若为逆序(递增或递减)则进行交换,将待排序元素从左至右比较一遍称为一趟“冒泡”。每趟冒泡都将待排序列中的最大关键字交换到最后(或最前)位置,直到全部元素有序为止。冒泡排序的函数实现 第8 页,本讲稿共17 页 由于冒泡排序使用了一个双
5、重循环,因此不管数组是否基本有序,都必须完成n2 次比较,这对于排序来说是非常影响效率的。而快速排序是对冒泡排序的一种改进,快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序的函数实现 第9 页,本讲稿共17 页函数模板 函数模板是C+的新特性,这个概念在C 语言中是没有的。与函数不同的是,函数模板不是一个实实在在的函数,而是对逻辑功能相同,但数据类型不同的一族函数的统一描述。利用函数模板,可以对函数的类型(返回类型
6、,以及参数类型)进行参数化处理,也就是函数的类型也可以象变量一样改变。利用函数模板可以用一种逻辑过程,处理不同类型的数据,从而极大地提高了编程的效率。第10 页,本讲稿共17 页函数重载 读者知道,在C+程序中不允许有相同的函数出现,否则调用时无法区分到底使用哪一个。区分两个函数靠的不仅是函数名,还有函数的参数列表。如果多个函数拥有相同的函数名,但参数列表不同,这是C+所允许的,这种方式称为函数重载。第11 页,本讲稿共17 页小结 本章作为第8 章函数的一个延伸,主要就函数的相关高级应用作了具体讲解。针对数组作为函数的参数进行传递,本章通过具体的示例进行了介绍。此外,在现实生活中,查找和排序
7、的使用较为频繁,本章分别介绍了几种常用的查找函数和排序函数的实现。对于函数的高级应用,本章还具体讲解了函数模板的定义及其实例化,并简要介绍了函数的重载。有关函数模板和函数重载的相关内容,在后续章节还将继续介绍。第12 页,本讲稿共17 页习题【题目121】编写一个C+函数,利用数组名作为函数参数对数组中的所有元素进行升序排列,并输出排序前和排序后的数组元素。【分析】该试题主要考查数组作为函数参数的传递过程。读者需要注意,在用数组名作为函数参数进行传递时,函数传递的不是数组中数组元素的真实值而是数组在内存中的实际地址。因此,在进行排序时可考虑冒泡排序算法,即两两比较数组元素,将其中较大的元素依次
8、排到数组的后面,通过数组元素的交换来实现。第13 页,本讲稿共17 页【题目122】有n 个数,已按由小到大顺序排列好,要求输入一个数,把它插入到原有数列中,而且仍然保持有序,同时输出新的数列。【题目123】编写函数利用数组名作参数计算数组arr34所有元素的和。【题目124】使用函数重载的方法定义两个重名函数,分别求出整型数的两点间距离和浮点型数的两点间距离。【题目125】利用重载编写求整数绝对值和求实数绝对值两个函数。第14 页,本讲稿共17 页【题目126】编写一个函数,返回二维数组amn 中所有元素的平均值,假定采用变量v 存放平均值。【题目127】编写一个递归函数计算出数组a 中n
9、个元素的平方和并返回结果。【题目128】编写一个递归函数void p(int n);,当n 的值为5时显示出如下图形。【题目129】定义一个函数模板,使其能够完成两个整型、字符型和浮点型变量的值的交换,并在主函数中将其实例化。第15 页,本讲稿共17 页【题目130】编写一个函数,从一个二维整型数组中查找具有最大值的元素,由引用参数row 和col 带回该元素的行号和列号。【题目131】编写一个函数,对于二维字符数组a 中保存的M个字符串,分别统计并输出其长度小于5、大于等于5 且小于15、大于等于15 的字符串个数。【题目132】编写一个递归函数,求出两个自然数m 和n 的最小公倍数。第16 页,本讲稿共17 页【题目133】编写一个函数,实现strcat 函数的功能,把s2所指字符串连接到s1 所指字符串的后面,并返回s1 指针。【题目134】编写一个函数,实现strcmp 函数的功能,比较两个字符串str1 和str2 的大小,若str1 较大则返回1,若str2 较大则返回-1,若两者相等则返回0。【题目135】编写一个函数模板,从一维数组an 中查找值为key 的元素,若查找成功则返回真否则返回假。第17 页,本讲稿共17 页