C语言程序设计PPt第三章函数.ppt

上传人:sccc 文档编号:5371179 上传时间:2023-06-30 格式:PPT 页数:66 大小:225.01KB
返回 下载 相关 举报
C语言程序设计PPt第三章函数.ppt_第1页
第1页 / 共66页
C语言程序设计PPt第三章函数.ppt_第2页
第2页 / 共66页
C语言程序设计PPt第三章函数.ppt_第3页
第3页 / 共66页
C语言程序设计PPt第三章函数.ppt_第4页
第4页 / 共66页
C语言程序设计PPt第三章函数.ppt_第5页
第5页 / 共66页
点击查看更多>>
资源描述

《C语言程序设计PPt第三章函数.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计PPt第三章函数.ppt(66页珍藏版)》请在三一办公上搜索。

1、第三章 函数,C+语言程序设计,2,本章主要内容,函数的定义、声明和调用函数间的参数传递内联函数带默认形参值的函数函数重载C+系统函数,3,函数的定义,函数是面向对象程序设计中,对功能的抽象函数定义的语法形式类型标识符 函数名(形式参数表)语句序列,函数的声明与使用,是被初始化的内部变量,寿命和可见性仅限于函数内部,若无返回值,写void,double power(double x,int n)double val=1.0;while(n-)val=val*x;return(val);,4,函数的调用,调用前先声明函数原型:在调用函数中,或程序文件中所有函数之外,按如下形式说明:类型标识符 被

2、调用函数名(含类型说明的形参表);调用形式 函数名(实参列表)嵌套调用函数可以嵌套调用,但不允许嵌套定义。递归调用函数直接或间接调用自身。,函数的声明与使用,5,例3-1编写一个求x的n次方的函数,#include double power(double x,int n);int main()cout5 to the power 2 is power(5,2)endl;double power(double x,int n)double val=1.0;while(n-)val=val*x;return(val);,函数的声明与使用,6,运行结果:5 to the power 2 is 25,

3、例3-1编写一个求x的n次方的函数,函数的声明与使用,7,例3-2 数制转换,题目:输入一个8位二进制数,将其转换为十进制数输出。例如:011010012=0(27)+1(26)+1(25)+0(24)+1(23)+0(22)+0(21)+1(20)=10510 所以,如果输入01101001,则应输出105,函数的声明与使用,#include double power(double x,int n);/声明函数原型powerint main()int i;int value=0;char ch;cout=0;i-)cin ch;if(ch=1)value+=int(power(2,i);/调

4、用函数powercout Decimal value is valueendl;double power(double x,int n)/声明函数powerdouble val=1.0;while(n-)val*=x;return(val);,运行结果:Enter an 8 bit binary number 01101001Decimal value is 105,8,9,例3-3编写程序求的值,其中arctan用如下形式的级数计算:直到级数某项绝对值不大于10-15为止;和x均为double型。,函数的声明与使用,#includeint main()double a,b;double ar

5、ctan(double x);/函数原型声明 a=16.0*arctan(1/5.0);b=4.0*arctan(1/239.0);/注意:因为整数相除结果取整,/如果参数写1/5,1/239,结果就都是0 coutPI=a-bendl;,10,double arctan(double x)int i;double r,e,f,sqr;sqr=x*x;r=0;e=x;i=1;while(e/i1e-15)f=e/i;r=(i%4=1)?r+f:r-f;e=e*sqr;i+=2;return r;,运行结果:PI=3.14159,11,12,例3-4,寻找并输出11999之间的数m,它满足m、m

6、2和m3均为回文数。回文:各位数字左右对称的整数。例如:11满足上述条件 112=121,113=1331。分析:10取余的方法,从最低位开始,依次取出该数的各位数字。按反序重新构成新的数,比较与原数是否相等,若相等,则原数为回文。-参见例2-6,函数的声明与使用,#include int main()bool symm(long n);long m;for(m=11;m1000;m+)if(symm(m),13,bool symm(long n)long i,m;i=n;m=0;while(i)/等价于while(i!=0)m=m*10+i%10;/对求出的每一位累加 i=i/10;retu

7、rn(m=n);,14,运行结果:m=11 m*m=121 m*m*m=1331m=101 m*m=10201 m*m*m=1030301m=111 m*m=12321 m*m*m=1367631,15,16,例3-5,计算如下公式,并输出结果:其中r、s的值由键盘输入。sin x的近似值按如下公式计算,计算精度为10-6:,函数的声明与使用,#include#includeint main()double k,r,s;double tsin(double x);coutr;couts;if(r*r=s*s)k=sqrt(tsin(r)*tsin(r)+tsin(s)*tsin(s);else

8、 k=tsin(r*s)/2;coutkendl;,17,double tsin(double x)double p=0.000001,g=0,t=x;int n=1;do g=g+t;n+;t=-t*x*x/(2*n-1)/(2*n-2);while(fabs(t)=p);return g;,运行结果:r=5s=81.37781,18,g:存放累加和t:存放任一项当前项=(-1)*前一项*X*X/(2*n-1)/(2*n-2),19,例3-6投骰子的随机游戏,每个骰子有六面,点数分别为1、2、3、4、5、6。游戏者在程序开始时输入一个无符号整数,作为产生随机数的种子。每轮投两次骰子,第一轮如

9、果和数为7或11则为胜,游戏结束;和数为2、3或12则为负,游戏结束;和数为其它值则将此值作为自己的点数,继续第二轮、第三轮.直到某轮的和数等于点数则取胜,若在此前出现和数为7则为负。由rolldice函数负责模拟投骰子、计算和数并输出和数。,函数的声明与使用,#include#include int rolldice(void);int main()int gamestatus,sum,mypoint;unsigned seed;coutseed;/输入随机数种子 srand(seed);/将种子传递给rand()sum=rolldice();/第一轮投骰子、计算和数,20,switch(s

10、um)case 7:/如果和数为7或11则为胜,状态为1 case 11:gamestatus=1;break;case 2:/和数为2、3或12则为负,状态为2 case 3:case 12:gamestatus=2;break;default:/其他情况,游戏尚无结果,状态为0,记下点数,为下一轮做准备 gamestatus=0;mypoint=sum;coutpoint is mypointendl;break;,21,while(gamestatus=0)/只要状态仍为 0,就继续进行下一轮 sum=rolldice();if(sum=mypoint)/某轮的和数等于点数则取胜,状态置

11、为1 gamestatus=1 else if(sum=7)/出现和数为7则为负,状态置为2 gamestatus=2;/当状态不为0时上面的循环结束,以下程序段输出游戏结果 if(gamestatus=1)coutplayer winsn;else coutplayer losesn;,22,rand函数原型:int rand(void);所需头文件:功能和返回值:求出并返回一个伪随机数srand函数原型:void srand(unsigned int seed);参数:seed产生随机数的种子。所需头文件:功能:为使rand()产生一序列伪随机整数而设置起始点。使用1作为seed参数,可以

12、重新初化rand()。,23,int rolldice(void)/投骰子、计算和数、输出和数 int die1,die2,worksum;die1=1+rand()%6;die2=1+rand()%6;worksum=die1+die2;coutplayer rolled die1+die2=worksumendl;return worksum;,24,运行结果2:Please enter an unsigned integer:23player rolled 6+3=9point is 9player rolled 5+4=9player wins,25,26,函数调用的执行过程,函数的声

13、明与使用,27,嵌套调用,函数的声明与使用,main调fun1()结束,fun1()调fun2()返回,fun2()返回,28,例3-6 输入两个整数,求平方和。,#include int main()int a,b;int fun1(int x,int y);cinab;couta、b的平方和:fun1(a,b)endl;,函数的声明与使用,int fun1(int x,int y)int fun2(int m);return(fun2(x)+fun2(y);int fun2(int m)return(m*m);运行结果:3 4a、b的平方和:25,29,30,递归调用,函数直接或间接地调用

14、自身,称为递归调用。递归过程的两个阶段:递推:4!=43!3!=32!2!=21!1!=10!0!=1未知 已知回归:4!=43!=243!=32!=62!=21!=21!=10!=10!=1未知 已知,函数的声明与使用,31,例3-8 求n!,分析:计算n!的公式如下:这是一个递归形式的公式,应该用递归函数实现。,函数的声明与使用,源程序:#include long fac(int n)long f;if(n0)coutn0,data error!endl;else if(n=0)f=1;else f=fac(n-1)*n;return(f);,32,int main()long fac(i

15、nt n);int n;long y;coutn;y=fac(n);coutn!=yendl;运行结果:Enter a positive integer:88!=40320,33,34,例3-9,用递归法计算从n个人中选择k个人组成一个委员会的不同组合数。分析:由n个人里选k个人的组合数=由n-1个人里选k个人的组合数+由n-1个人里选k-1个人的组合数当n=k或k=0时,组合数为1,函数的声明与使用,#includeint main()int n,k;int comm(int n,int k);cinnk;coutn)return 0;else if(n=k|k=0)return 1;els

16、e return comm(n-1,k)+comm(n-1,k-1);,运行结果:18 58568,35,36,例3-10汉诺塔问题,有三根针A、B、C。A针上有N个盘子,大的在下,小的在上,要求把这N个盘子从A针移到C针,在移动过程中可以借助B针,每次只允许移动一个盘,且在移动过程中在三根针上都保持大盘在下,小盘在上。,函数的声明与使用,分析:将n 个盘子从A针移到C针可以分解为下面三个步骤:将A 上n-1个盘子移到 B针上(借助C针);把A针上剩下的一个盘子移到C针上;将n-1个盘子从B针移到C针上(借助A针);事实上,上面三个步骤包含两种操作:将多个盘子从一个针移到另一个针上,这是一个递

17、归的过程。hanoi函数实现。将1个盘子从一个针上移到另一针上。用move函数实现。,37,#include void move(char getone,char putone)coutputoneendl;void hanoi(int n,char one,char two,char three)void move(char getone,char putone);if(n=1)move(one,three);else hanoi(n-1,one,three,two);move(one,three);hanoi(n-1,two,one,three);,38,int main()void ha

18、noi(int n,char one,char two,char three);int m;coutm;coutthe steps to moving m diskes:endl;hanoi(m,A,B,C);,39,运行结果:Enter the number of diskes:3the steps to moving 3 diskes:A-CA-BC-BA-CB-AB-CA-C,40,41,函数的参数传递机制 传递参数值,在函数被调用时才分配形参的存储单元。实参可以是常量、变量或表达式。实参类型必须与形参相符。传递时是传递参数值,即单向传递。,函数的声明与使用,42,函数的参数传递机制 参

19、数值传递举例,函数的声明与使用,43,例3-11 输入两个整数交换后输出,#includevoid Swap(int a,int b);int main()int x(5),y(10);coutx=x y=yendl;Swap(x,y);coutx=x y=yendl;return 0;,函数的声明与使用,void Swap(int a,int b)int t;t=a;a=b;b=t;运行结果:x=5 y=10 x=5 y=10,44,46,函数的参数传递 用引用做形参,引用(声明一个引用时,必须同时对它进行初始化,使它指向一个已存在的对象。一旦一个引用被初始化后,就不能改为指向其它对象。引用

20、可以作为形参void swap(int&a,int&b).,函数的声明与使用,47,例3-12 输入两个整数交换后输出,#includevoid Swap(int,函数的声明与使用,运行结果:x=5 y=10 x=10 y=5,Swap(x,y);,48,49,内联函数声明与使用,声明时使用关键字 inline。编译时在调用处用函数体进行替换,节省了参数传递、控制转移等开销。注意:内联函数体内不能有循环语句和switch语句。内联函数的声明必须出现在内联函数第一次被调用之前。对内联函数不能进行异常接口声明。,内联函数,50,例3-14 内联函数应用举例,#includeinline doubl

21、e CalArea(double radius)return 3.14*radius*radius;int main()double r(3.0);double area;area=CalArea(r);coutareaendl;return 0;,内联函数,51,默认形参值的作用,函数在声明时可以预先给出默认的形参值,调用时如给出实参,则采用实参值,否则采用预先给出的默认形参值。例如:int add(int x=5,int y=6)return x+y;int main()add(10,20);/10+20 add(10);/10+6 add();/5+6,带默认形参值的函数,52,默认形参

22、值的说明次序,默认形参值必须从右向左顺序声明,并且在默认形参值的右面不能有非默认形参值的参数。因为调用时实参取代形参是从左向右的顺序。例:int add(int x,int y=5,int z=6);/正确int add(int x=1,int y=5,int z);/错误int add(int x=1,int y,int z=6);/错误,带默认形参值的函数,53,默认形参值与函数的调用位置,调用出现在函数体实现之前时,默认形参值必须在函数原形中给出;而当调用出现在函数体实现之后时,默认形参值需在函数实现时给出。例:,int add(int x=5,int y=6);int main()ad

23、d();/调用在实现前int add(int x,int y)return x+y;,int add(int x=5,int y=6)return x+y;int main()add();/调用在实现后,带默认形参值的函数,54,默认形参值的作用域,在相同的作用域内,默认形参值的说明应保持惟一,但如果在不同的作用域内,允许说明不同的默认形参。例:int add(int x=1,int y=2);int main()int add(int x=3,int y=4);add();/使用局部默认形参值(实现3+4)void fun().add();/使用全局默认形参值(实现1+2),带默认形参值的函

24、数,55,重载函数的声明,C+允许功能相近的函数在相同的作用域内以相同函数名声明,从而形成重载。方便使用,便于记忆。例:,函 数 重 载,56,注意事项,不要将不同功能的函数声明为重载函数,以免出现调用结果的误解、混淆。这样不好:,函 数 重 载,重载函数的形参必须不同:个数不同或类型不同。编译程序将根据实参和形参的类型及个数的最佳匹配来选择调用哪一个函数。,57,例3-16重载函数应用举例,编写三个名为add的重载函数,分别实现两整数相加、两实数相加和两个复数相加的功能。#includestruct complexdouble real;double imaginary;,函 数 重 载,i

25、nt main()int m,n;double x,y;complex c1,c2,c3;int add(int m,int n);double add(double x,double y);complex add(complex c1,complex c2);coutmn;coutinteger m+n=add(m,n)endl;,58,coutxy;coutc1.realc1.imaginary;coutc2.realc2.imaginary;c3=add(c1,c2);coutcomplex number(c1.real,c1.imaginary)+(c2.real,c2.imagina

26、ry)=(c3.real,c3.imaginary)n;,59,int add(int m,int n)return m+n;double add(double x,double y)return x+y;complex add(complex c1,complex c2)complex c;c.real=c1.real+c2.real;c.imaginary=c1.imaginary+c2.imaginary;return c;,60,运行结果:Enter two integer:3 5integer 3+5=8Enter two real number:2.3 5.8real number

27、 2.3+5.8=8.1Enter the first complex number:12.3 45.6Enter the second complex number:56.7 67.8complex number(12.3,45.6)+(56.7,67.8)=(69,113.4),61,62,C+系统函数,C+的系统库中提供了几百个函数可供程序员使用。例如:求平方根函数(sprt)、求绝对值函数(abs)等。使用系统函数时要包含相应的头文件。例如:math.h 或 cmath,使用C+系统函数,63,例3-17系统函数应用举例,题目:从键盘输入一个角度值,求出该角度的正弦值、余弦值和正切值。

28、分析:系统函数中提供了求正弦值、余弦值和正切值的函数:sin()、cos()、tan(),函数的说明在头文件math.h和cmath中。,使用C+系统函数,#include#includeconst double pi(3.14159265);int main()double a,b;cina;b=a*pi/180;coutsin(a)=sin(b)endl;coutcos(a)=cos(b)endl;couttan(a)=tan(b)endl;,运行结果:30sin(30)=0.5cos(30)=0.866025tan(30)=0.57735,64,65,查找系统函数的使用说明,查编译系统的

29、库函数手册查联机帮助VC+6.0联机帮助的使用方法:help/Contents-(“活动子集”栏)Visual C+Documentation-Visual C+Documentation-Using Visual C+-Visual C+Programmers Guide-Run-Time Library Reference-Run Time Routines by Category-Run Time Routines by Category,使用C+系统函数,66,小结与复习建议,主要内容函数的声明和调用、函数间的参数传递、内联函数、带默认形参值的函数、函数重载、C+系统函数达到的目标学会将一段功能相对独立的程序写成一个函数,为下一章学习类和对象打好必要的基础。,

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

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号