- 1、本文档共34页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
(一)和-西安交通大学计算机程序设计
大学C++程序设计教程 西安交通大学 计算机教学实验中心 第8章 函数和指针 C++语言的模块设计离不开函数,函数设计更离不开参数。 掌握函数设计和调用的正确方法,是程序设计的基本功。 正确设计函数原型和参数类型,不仅能保证函数的正确性,而且能提高程序设计的效率。 介绍函数调用、递归调用以及函数调用中的参数替换和返回值等问题之外,还将结合软件编程技术的发展,讨论函数指针、内联函数、函数重载等。 理解指针和函数的几种关系 授课内容 8.1 递归函数 8.2 函数重载 8.3 指针和函数 8.4 带参数的main()函数 8.5 内联函数 8.6 不使用参数的函数 8.7 void和const类型的指针 一、递归函数 函数调用,一般是一个函数调用另外一个函数。此外,函数还可以自己调用自己,这种调用叫做函数的递归调用。 递归调用有两种方式,一种是直接调用其本身,另一种是通过其他函数间接地调用。 一个问题是否可以转换为递归来处理必须满足以下条件: (1)必须包含一种或多种非递归的基本形式; (2)一般形式必须能最终转换到基本形式; (3)由基本形式来结束递归。 递归调用在堆栈中临时占据的存储区域是较多的,在实际运行时,递归调用的时间效率较差。 [例8-1] 采用递归算法求n! 算 法: 由阶乘的概念可以写出其递归定义: 0! = 1 n! = n*(n-1)! Example 8-1:用递归方法求n! // 函数fac():求阶乘的递归函数 int fac(int n) { if(n0) // 不能求负数的阶乘 return ?1; else if(n==0) // 0的阶乘为1 return 1; else return n*fac(n-1); // n!为(n-1)!乘以n } [例8-2] 梵塔(hanoi塔)问题 算 法: 如果只有1片金片时,只要直接将金片从A针移到C针上即可; 当n1时,就需要借助另外一个针来移动。将n片金片由A移到C上可以分解为以下几个步骤: (1) 将A上的n?1片金片借助C针移到B针上; (2) 把A针上剩下的一片金片由A针移到C针上; (3) 最后将剩下的n?1个金片借助A针由B针移到C针上。 步骤(1)和(3)与整个任务类似,但涉及的金片只有n?1个了。这是一个典型递归算法。 [例8-2] 梵塔(hanoi塔)问题 #include iostream.h const int N=3; //考察当金片数为3个时的情况 void move(char from, char to) // 函数move():将金片由一根针移到另一根针上 { cout From from to to endl; } void hanoi(int n, int p1, int p2, int p3) { if(n==1) move(p1, p3); else { hanoi(n-1, p1, p3, p2); move(p1, p3); hanoi(n-1, p2, p1, p3); } } int main() { hanoi(N, A, B, C); return 0; } 二、函数重载 函数重载使一个函数名具有多种功能,即具有“多种形态”,称这种形态为多态性。 函数重载: 一组参数和返回值不同的函数共用一个函数名。 例如求绝对值函数,对应不同的参数类型,可以定义如下几个重载函数: int abs(int); double fabs(double); long labs(1ong); 当某个函数中调用到重载函数时,编译器会根据实参的类型去对应地调用相应的函数。匹配过程按如下步骤进行: (1)如果有严格匹配的函数,就调用该函数; (2)参数内部转换后如果匹配,调用该函数; (3)通过用户定义的转换寻求匹配。 [例8-3] 重载绝对值函数 #include iostream.h int abs(int x) {return x=0?x:-x; } double abs(double x) {return x=0?x:-x; } long abs(long x) {return x=0?x:-x; } 8.3 指针和函数 8.3.1 指针作为函数的参数 8.3.2 返回指针的函数 8.3.3 指向函数的指针 8.3.1 指针作为函数的参数 函数的参数不仅可以是基本数据类型的变量、对象名、数组名或函数名,而且可以是指针。 例7.1~例7.3都使用了这一方法。 通过使实参与形参指针指向共同的内存空间,达到了参数双向传递的目的。 8.3.2 返回指针
文档评论(0)