收藏 分享(赏)

第4章 函数2.ppt

上传人:gnk289057 文档编号:6944427 上传时间:2019-04-28 格式:PPT 页数:47 大小:690KB
下载 相关 举报
第4章 函数2.ppt_第1页
第1页 / 共47页
第4章 函数2.ppt_第2页
第2页 / 共47页
第4章 函数2.ppt_第3页
第3页 / 共47页
第4章 函数2.ppt_第4页
第4页 / 共47页
第4章 函数2.ppt_第5页
第5页 / 共47页
点击查看更多>>
资源描述

1、,若一头母牛,从出生起第四个年头开始每年开始生一头母牛,按此规律,第n年时有多少头母牛?,课程导入,#include using namespace std; void main() int n;long a=1, b=1, c=1, temp; /c保存总的母牛数cout n; /输入年数for(int i=4; i=n; i+)temp=a+c; a=b; b=c; c=temp;cout c endl; ,如果母牛每三个年头生母牛或每五个年头生母牛,程序应该如何修改?,思考:,编写函数fun(),它的功能是求n以内(不包括n)同时能被3与7整除的所有自然数之和的平方根s,并做为函数值返回

2、。,例如:n为1000时,函数值应为s=153.909064,# include # include main() int n;float s;s=fun(1000);coutsendl; ,double fun(int n) double s=0.0;int i; /在0n中找到既能被3整除同时又能被7整除的数,并将这些数求和for(i=0; in;i+) if(i%3=0 ,第4章 函数,2,4,头文件与多文件结构,1,2,3,编译预处理,函数的递归调用,习题,课程内容,一、头文件与多文件结构,标准库头文件 自定义头文件,系统定义的头文件中定义了一些常用的公用标识符和函数,用户只要将头文件

3、包含进自己的文件,就可使头文件中定义的标识符在用户文件中变得可见,也就可以直接使用头文件中定义的标识符和函数。,对于具有外部存储类型的标识符,可以在其他任何一个源程序文件中经声明后引用,因此用户完全可以将一些具有外部存储类型的标识符的声明放在一个头文件中。具体地说,头文件中可以包括:用户构造的数据类型(如枚举类型), 外部变量,外部函数、常量和内联函数等具有一定通用性或常用的量,而一般性的变量和函数定义不宜放在头文件中。,在开发较大程序时,通常将其分解为多个模块,每个模块用一个源程序文件实现。,编译,预编译,编译,预编译,预编译,编译,二、编译预处理,宏定义指令,文件包含指令,条件编译指令,宏

4、定义指令,用来产生与一个字符串对应的常量字符串,格式为:#define 宏名 常量串 预处理后文件中凡出现该字符串处均用其对应的常量串代替。,不带参宏定义,程序中使用标识符PI,编译预处理后产生一个中间文件,文件中所有PI被替换为3.1415926。,例,带参宏定义的形式很象定义一个函数,格式为:#define 宏名 ( 形参表 ) 表达式串,例:#define S(a,b) (a)*(b)/2程序中可使用S(a,b),预处理后产生中间文件 , 其中S(a,b)被替换成(a)*(b)/2。,例 :#define S(a,b) a*b/2,注意,宏定义时形参通常要用 ( ) 括起来,否则容易导致

5、逻辑错误。,文件包含指令,预处理后将指令中指明的源程序文件嵌入到当前源程序文件的指令位置处。,指令 #include,一个被包含的头文件中还可以有#include指令,即include指令可以嵌套,但如果同一个头文件在同一个源程序文件中被重复包含,就会出现标识符重复定义的错误。,注意,避免重复包含可以用条件编译指令。,条件编译指令,在不同条件下编译程序的不同部分,这种情况就要使用条件编译指令。,条件编译指令包括:#if、#else、#ifdef、#ifndef、#endif、#undef#ifndef与#ifdef作用一样,但选择的条件相反 #undef 指令用来取消#define指令所定义的

6、符号,这样可以根据需要打开和关闭符号,例:在调试程序时常常要输出调试信息,而调试完后不需要输出这些信息,则可以把输出调试信息的语句用条件编译指令括起来。 # ifdef DEBUGcouta=atx=xendl; # endif在程序调试期间,在该条件编译指令前增加宏定义:#define DEBUG调试好后,删除DEBUG宏定义,将源程序重新编译一次。,例:,从键盘输入数据完成复数运算(加、减、乘、除、模、辐角)。,/myFile.cpp #include using namespace std; #include “complex.h“void main() char ch;dodispla

7、yMessage();cinch;,switch(ch)case 1: Add();break;case 2: Minus();break;case 3: Multiply();break;case 4: Divide();break;case 5: Modul();break;case 6: amplitude();break;default:break;cout“continue?(y/n)”;cinch;while(ch=y); ,inline void displayOperation() coutendl;coutendl;coutendl;coutendl;coutendl;cou

8、tendl;coutendl; ,/complex.h #ifndef COMPLEX_H /防止此文件被多次嵌入 #define COMPLEX_H #define DEBUG_COMPLEX /调试时为显示某些中间结果;/在最终版本,如果不需要,可将此句注释掉。 #define PI 3.14 /定义符号常量PI #define ANGLE180 180 /定义符号常量 void Add(); void Minus(); void Multiply(); void Divide(); void Modul(); void amplitude(); #endif,三、函数的递归调用,1. 什

9、么是递归,阶乘定义式:,#include using namespace std; void main() coutn;n_fact=factorial(n);cout“the factorial of “n“is: “n_factendl; ,例:求n! 的结果 。,int fact( int n) if(n=0)return 1;elsereturn n*fact(n-1); ,递归问题的求解实际分成两个阶段:化简问题的递推阶段;达到递归终止条件得到基本情况的结果,并逐步回推结果阶段。递归函数的主要两部分 具有更简单参数的递归调用 停止递归的终止条件(递归终止条件),四、习题,斐波那契数列

10、(Fibonacci)如下: 0, 1, 1, 2, 3, 5, 8, 13 编写程序求该数列的第n项!,f(0)= 0 f(1)= 1 f(n)= f(n-1)+f(n-2),归纳:,#include using namespace std; double f(int); int main() int n; coutn; coutf(n); return 0; ,double f(int n) if(n=0)return 0;else if(n=1)return 1;elsereturn (f(n-1)+f(n-2); ,例: 汉诺塔问题,汉诺塔问题是著名的递归问题之一。传说远东地区有一座庙

11、,僧人要把盘子(64个)从第一个柱(A)移到第三个柱(C),这64个盘子从上至下逐渐增大。 僧人移动盘子的规则是:每次只能移动一个盘子;柱子上任何时候都要保持大盘在下,小盘在上的放置方式;移动过程中,可以借助于第二个柱(B),暂时放置盘子。,十九世纪法国数学家鲁卡斯指出,完成这个任务,僧人们移动盘子的总次数为: 。,问题分析: 这个问题适合用递归法解决,递归函数为hanoi()。 设A柱上需要移动的盘子的个数为n,移动n个盘子可以利用递归法降阶为移动n-1个盘子,具体步骤为: 步骤1.如果n=1,则盘子直接从A柱到C柱:AC;执行步骤3;否则执行步骤2。 步骤2.如果n1,则将盘子分成最大的1

12、个和其它(n-1)个,先把(n-1)移到B柱上,再把最大的盘直接移到C柱上,然后把B柱上的n-1个盘移到C柱上。,即: 将A柱上(n-1)个盘子:借助C柱,由A柱移到B柱:hanoi(n-1,A,C,B); 将最大的一个盘子由A柱移到C柱:move(A,C); 再将B柱上(n-1)个盘子借助A柱移到C柱上:hanoi(n-1,B,A,C)。 步骤3.结束。 其中,函数move()为直接移动盘子函数。,/汉诺塔问题程序 #include using namespace std; void move(char x,char z); void hanoi(int n,char x,char y,ch

13、ar z);,void main() int num;coutnum;cout“按“汉诺塔“的规则,把“num“个盘子从a针搬到c针的步骤是:“endl;hanoi(num,A,B,C); ,void move(char x, char z) static int i; i+;couti“:“x“zendl; ,void hanoi(int n,char x,char y,char z) if(n = 1) move(x,z);else hanoi(n-1,x,z,y);move(x,z);hanoi(n-1,y,x,z); ,习题二,输入一个整数,用递归算法将整数倒序输出。分析:在递归过程的

14、递推步骤中用求余运算将整数的各个位分离,并打印出来。,void main() int n;coutn;cout“原整数:“nendl“反向数:“;backward(n);coutendl;return 0; ,void backward(int n) coutn%10;if(n10) return; else backward(n/10); ,n=247,cout7; backward(24);,n=2,cout2; return;,n=24,cout4; backward(2);,backward(247),return;,return;,coutendl;,求余总是取当前整数的最右一位,所

15、以先输出余数后递归可实现倒序输出。如果先递归后输出余数,则是在回归的过程中输出,实现的就是正序输出。,习题三,请编写一个函数 comm(int n,int k),该函数将用递归算法计算从n个人中选择k个人组成一个委员会的不同组合数,由n个人里选k个人的组合数由(n-1)个人里选k个人的组合数由(n-1)个人里选(k-1)个人的组合数。,void main() int n=7,k=3;cout“n=7,k=3“endl;coutcomm(n,k)endl; ,int comm(int n,int k) if(kn) return 0;else if(n=k|k=0)return 1;elsereturn comm(n-1,k)+comm(n-1,k-1); ,习题四,入站:4、3、2、1,出站:?,分析: (有三种情况) 当left中没有数时,此时数都已在down和right, 这种情况下,顺序已经确定,无法再更改顺序. 将right的数依次出栈输出, 然后再将down的数依次出栈输出; 当down中没有数时,此时只能将left中的数出栈, 压到down中; 当不属于上述两种情况时,即left和down中都有数时,此时有两种选择 :,(1)将left中的一个数出栈, 压down中 (2)left中的数不变, 将down中的一个数出栈,压到right中,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 社会民生

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报