




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第7章 函数与指针7.1 递归函数7.2 函数重载7.3 指针和函数7.4 带参数main()函数7.5 内联函数7.6 无参函数7.7 void和const类型指针第1页第1页7.1 递归函数1、递归调用一个函数自己调用自己,这种调用称为递归调用。2、递归调用方式(1)直接调用其本身,称为直接递归调用(2)通过其它函数间接地调用,称为间接递归调用3、一个问题是否能够转换为递归来处理必须满足下列条件:(1)必须包括一个或各种非递归基本形式;(2)普通形式必须能最后转换到基本形式;(3)由基本形式来结束递归。(不会造成死循环)注意: 递归程序结构清楚、简朴、容易阅读和理解。 但是递归调用在堆栈中
2、暂时占据存储区域是较多,在实际运营时递归调用时间效率较差。 许多问题能够用递归办法求解,也能够用普通循环结构求解。第2页第2页例7-1 采用递归算法求阶乘n!int fac(int n) if(n1时,就需要借助另外一个针来移动。将n片金片由A移到C上能够分解为下列几种环节: (1) 将A上n1片金片借助C针移到B针上; (2) 把A针上剩余一片金片由A针移到C针上; (3) 最后将剩余n1个金片借助A针由B针移到C针上。环节(1)和(3)与整个任务类似,但涉及金片只有n1个了。这是一个典型递归算法。 用字符A,B,C表示3根针第4页第4页第5页第5页例8-2 梵塔(hanoi塔)问题#inc
3、lude using namespace std;const int N=3;/考察当金片数为3个时情况/ 函数move():将金片由一根针移到另一根针上void move(char from, char to) cout From from to to endl;/ 函数 hanoi():将n片金片由p1借助p2移到p3上void hanoi(int n, char p1, char p2, char p3) if(n=1) move(p1, p3); else hanoi(n-1, p1, p3, p2); move(p1, p3); hanoi(n-1, p2, p1, p3); 第6页
4、第6页/测试主函数int main() hanoi(N, A, B, C); return 0; 第7页第7页7.2 函数重载函数重载一组参数和返回值不同函数共用同一个函数名。函数重载:a)使一个函数名含有各种功效,即含有“各种形态”,称这种形态为多态性(面向对象主要特性)。b)面向对象理论中类结构函数需要重载机制当某个函数中调用到重载函数时,编译器会依据参数不同(包含类型、个数和次序)去对应地调用对应函数。只有返回值类型不同几个函数不能重载!匹配过程以下:1)假如有严格匹配函数,就调用该函数;2)参数内部转换后假如匹配,调用该函数;3)经过用户定义转换寻求匹配。第8页第8页例7-3 重载绝对
5、值函数#include using namespace std;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; 第9页第9页int main() int x1 = 1;double x2 = -2.5;long x3 = 3L;cout |x1| = abs(x1) endl;cout |x2| = abs(x2) endl;cout |x3| = abs(x3) endl;return 0; 第10页第10页7.3 指针和函数一. 指针作为
6、函数参数二. 返回指针函数三. 指向函数指针第11页第11页一. 指针作为函数参数函数参数不但能够是基本数据类型变量、对象名、数组名或函数名,并且能够是指针。当以指针作为形参时,在函数调用过程中实参将地址值传递给形参,通过使实参与形参指针指向共同内存空间,对形参指针所指变量值改变也同样影响着实参指针所指向变量值,达到了参数双向传递目的第12页第12页二. 返回指针函数函数返回值也能够是一个地址 (如变量、数组和函数地址,指针变量值等)。在阐明返回值为地址函数时,要使用指针类型阐明符。比如:/ 查找字符c,返回字符c地址 char *strchr(char *string, int c); /在
7、string1中查找子字符串string2,返回string2地址 char *strstr(char *string1, char *string2);第13页第13页例7-4 将月份数值转换为相应英文名称#include char *month_name(int n) static char *month= /字符型指针数组 Illegal month, January, February, March, April, May, June, July, August, September,October, November, December ; /monthi指向第i个字符串 retur
8、n (n=1 & n=12)?monthn:month0; void main( ) coutendl; coutmonth_name(3); coutendl;第14页第14页三. 指向函数指针函数代码在内存中占有一片存储区域,第一个代码所在内存地址称为首地址。首地址是函数入口地址。主函数在调用子函数时,就是让程序转移到函数入口地址开始执行。指向函数指针:就是指针值为该函数入口地址。阐明格式为: (*)();比如:int(*p)();/ p为指向返回值为整型函数指针float(*q)(float,int);/ q为指向返回值为浮点型函数指针第15页第15页假如将函数地址赋给一个指向函数指针变
9、量,就能够通过该指针变量调用函数。/函数名即为函数入口地址,func为函数指针double (*func)(double) = cos; double y,x;x = 3.14159;y = (*func)(x);第16页第16页例7-5 通用数值积分函数(梯形积分公式)double integral(double a, double b, double (*fun)(double), int n)double h = (b-a)/n;double sum = (*fun)(a)+(*fun)(b)/2;int i;for(i=1; in; i+)sum += (*fun)(a+i*h); s
10、um *= h;return sum; /将被积函数调用地址传递给积分函数第17页第17页7.4 带参数main()函数函数原型为:int main(int argc, char *argv) 第一个整型参数指明在以命令行方式执行本程序时所带参数个数(包括程序名本身,故argc值至少为1)第二个参数为一个字符型指针数组(其中第1个下标变量argv0指向本程序名,接下来下标变量argv1,argv2.等分别指向命令行传递给程序各个参数),用来存储命令行中命令字及各个参数字符串。第18页第18页例7-6 带参数main函数#includeint main(int a, char *ar) if(a
11、!=2) coutError!endl;coutUsage: ProgramName endl;return 1;coutHello, ar1. Welcome to the world of C+ !endl;return 0;第19页第19页7.5 内联函数函数调用是以减少效率为代价。调用函数时,需要断点现场保护、数据进栈、执行函数体、保留返回值、恢复现场和断点,开销很大。有函数体比较简朴,假如频繁被调用,则附加时间开销将很大。内联函数机制通过将函数体代码直接插入到函数调用处来节约调用函数时间开销(编译器直接处理)内联函数事实上是一个用空间换时间方案,其目的是为了提升函数执行效率。要定义一
12、个内联函数,只需在定义函数时将该函数用关键字inline修饰即可第20页第20页7-7将例5-8函数max( )改写成内联函数/ Example 求两数中大数#include using namespace std;inline int max(int x, int y) return xy?x:y;int main() cout a b;cout The maximum is max(a,b) endl;return 0;第21页第21页使用内联函数要注意:除了含有循环、switch分支和复杂嵌套if语句函数外,所有函数均能够被阐明为内联函数。内联函数大多是小函数。内联函数定义必须出现在调用
13、之前。内联函数节约了程序运营时间开销,却增大了代码占用内存空间开销第22页第22页7.6 无参函数 void用于函数参数表明确阐明该函数不使用参数void阐明函数返回值阐明该函数不提供任何返回值比如: 申明函数:void func(void) /既不需要参数,也不提供返回 调用方式: func( )第23页第23页7.7 void和const类型指针 1、指向void类型指针通用型指针, 能够指向任何类型变量。能够对其赋值,不过指针参加运算之前必须强制类型转换。int x,y;void * ptr;ptr = &x; /任何类型变量地址均可存入void类型指针y = *(int*)ptr);
14、/强制类型转换2、用关键字const修饰一个指针修饰符const多用于修饰函数指针或引用参数,以预防在编程中无意识地改变其值依据其位置不同有不同含义。比如:(1)const char *ptr = “Point to constant string”; /定义了一个指向常量字符串指针 *ptr = Q; /非法 ptr+; /合法 ,指针是变量(2)char *const qtr = “A constant pointer”; /定义了一个常量指针。指针是常量,指向对象是变量 第24页第24页程序设计举例例7-8 改进模拟梵塔问题递归程序,打印更多信息。例7-9 采用递归算法寻找一个整型数组中
15、最大元素。例7-10 重载上例求最大元素函数。例7-11 编写一个用于在字符串中查找某字符函数。例7-12 编写一个用于三个整型变量排序程序。第25页第25页例7-8:改进梵塔问题模拟程序#include using namespace std;const intN=3;/ 函数move():将金片由一根针移到另一根针上void move(char from, char to)static long no = 0; / 局部静态变量,用于统计调用本函多次数static int pillar3 = N, 0, 0; /局部静态数组,用于统计每根针上金片数目no+; / 移动金片次数加1(pill
16、arfrom-A)-; / from针上金片数目减1(pillarto-A)+; / to 针上金片数目加1cout Step no :From from to to;cout , (A:pillar0 B:pillar1 C: pillar2 )endl; / 函数 hanoi():将n片金片由p1借助p2移到p3上void hanoi(int n, char p1, char p2, char p3)if(n=1)move(p1, p3);elsehanoi(n-1, p1, p3, p2);move(p1, p3);hanoi(n-1, p2, p1, p3);第26页第26页/ 测试用
17、主函数int main()cout Simulation of hanoi tower. endl;cout Step 0: (A: N B: 0 C: 0) endl;hanoi(N, A, B, C);return 0;第27页第27页程序运营结果:第28页第28页例 7-9:采用递归算法寻找一个整型数组中最大元素#include using namespace std;int max_element(const int array , int lower, int upper) int maximum;if(lower=upper) return arraylower;else maxi
18、mum=max_element(array, lower+1, upper);if(arraylower=maximum) return arraylower;else return maximum;第29页第29页/ 测试递归函数主函数int main()int A=19,33,69,55,77,12,52;coutThe maximum element of the array is: max_element(A,0,6)endl; return 0;第30页第30页程序运营结果:第31页第31页例 7-10:重载采用递归算法寻找数组最大元素函数#include using namespa
19、ce std;/采用递归算法寻找整型数组中最大元素函数int max_element(const int array , int lower, int upper)int maximum;if(lower=upper) return arraylower;else maximum=max_element(array, lower+1, upper);if(arraylower=maximum)return arraylower;elsereturn maximum;第32页第32页/采用递归算法寻找双精度型数组中最大元素函数double max_element(const double arr
20、ay , int lower, int upper) double maximum;if(lower=upper) return arraylower;elsemaximum=max_element(array, lower+1, upper);if(arraylower=maximum)return arraylower;elsereturn maximum;第33页第33页/ 测试递归函数主函数int main()int A=19,33,69,55,77,12,52;double B=10.1, 21.3, 12.4, 321.42, 5.2, 7.1, 8.3, 12.31, 70.0;
21、coutThe maximum element of the array A is: max_element(A,0,6)endl;coutThe maximum element of the array B is: max_element(B,0,8)endl;return 0;第34页第34页程序运营结果:第35页第35页例 7-11:函数strchr(): 在字符串中查找指定字符 char *strchr(char *string, char c) while(*string!=c & *string!=0) string+; if(*string=c) / 查找成功 return string; /返回第一个待查字符地址 else /string=0(字符串结束符), 字符串中没有c return NULL; 第36页第36页例7-12:三个整型变量排序#include using name
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论