收藏 分销(赏)

L03函数省名师优质课赛课获奖课件市赛课一等奖课件.ppt

上传人:丰**** 文档编号:8462590 上传时间:2025-02-14 格式:PPT 页数:67 大小:309.04KB 下载积分:14 金币
下载 相关 举报
L03函数省名师优质课赛课获奖课件市赛课一等奖课件.ppt_第1页
第1页 / 共67页
L03函数省名师优质课赛课获奖课件市赛课一等奖课件.ppt_第2页
第2页 / 共67页


点击查看更多>>
资源描述
单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,面向对象程序设计(C+),福州大学 吴小竹,本资料仅供参考,不能作为科学依据。谢谢。本资料仅供参考,不能作为科学依据。谢谢您,第三章 函数,福州大学 吴小竹,面向对象程序设计,第1页,1,本章主要内容,函数申明和调用,函数间参数传递,内联函数,带默认形参值函数,函数重载,C+系统函数,第2页,2,函数申明,函数是面向对象程序设计中,对功效抽象,函数申明语法形式,类型标识符 函数名(形式参数表),语句序列,函数申明与使用,是被初始化内部变量,寿命和可见性仅限于函数内部,若无返回值,写void,第3页,3,函数申明,形式参数表,name,1,name,2,.,name,n,函数返回值,由 return 语句给出,比如:,return 0,无返回值函数(void类型),无须写return语句。,函数申明与使用,第4页,4,函数调用,调用前先申明函数原型:,在调用函数中,或程序文件中全部函数之外,按以下形式说明:,类型标识符 被调用函数名(含类型说明形参表);,调用形式,函数名(实参列表),嵌套调用,函数能够嵌套调用。,递归调用,函数直接或间接调用本身。,函数申明与使用,第5页,5,例3-1编写一个求xn次方函数,#,include,using namespace std;,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页,6,运行结果:,5 to the power 2 is 25,例3-1编写一个求xn次方函数,函数申明与使用,第7页,7,例3-2 数制转换,题目:,输入一个8位二进制数,将其转换为十进制数输出。,比如:,1101,2,=1(2,3,)+1(2,2,)+0(2,1,)+1(2,0,)=13,10,所以,假如输入,1101,,则应输出,13,函数申明与使用,第8页,8,#,include,using namespace std;,double,power,(double x,int n);,int main(),int i;,int value=0;,char ch;,cout=0;i-),cin ch;,if(ch=1),value+=int(,power,(2,i);,cout Decimal value is valueendl;,double,power,(double x,int n),double val=1.0;,while(n-)val*=x;,return(val);,运行结果:,Enter an 8 bit binary number 01101001,Decimal value is 105,9,第9页,9,例3-3编写程序求值,其中arctan用以下形式级数计算:,直到级数某项绝对值小于10,-15,为止;和x均为double型。,函数申明与使用,第10页,10,#include,using namespace std;,int main(),double a,b;,double,arctan,(double x);/函数原型申明,a=16.0*,arctan,(1/5.0);,b=4.0*,arctan,(1/239.0);,/注意:因为整数相除结果取整,,/假如参数写1/5,1/239,结果就都是0,coutPI=a-b1e-15),f=e/i;,r=(i%4=1)?r+f:r-f;,e=e*sqr;i+=2;,return r;,运行结果:,PI=3.14159,12,第12页,12,例3-4,寻找并输出11999之间数m,它满足m、m,2,和m,3,均为回文数。,回文:各位数字左右对称整数。比如:11满足上述条件 11,2,=121,11,3,=1331。,分析:,10取余方法,从最低位开始,依次取出该数各位数字。按反序重新组成新数,比较与原数是否相等,若相等,则原数为回文。,函数申明与使用,第13页,13,#include,using namespace std;,int main(),bool,symm,(long n);,long m;,for(m=11;m1000;m+),if(,symm,(m)&,symm,(m*m)&,symm,(m*m*m),coutm=m m*m=m*m,m*m*m=m*m*mendl;,14,第14页,14,bool symm(long n),long i,m;,i=n;m=0;,while(,i,),m=,m*10+i%10,;,i=i/10 ;,return(m=n);,15,第15页,15,运行结果:,m=11 m*m=121 m*m*m=1331,m=101 m*m=10201 m*m*m=1030301,m=111 m*m=12321 m*m*m=1367631,16,第16页,16,例3-5,计算以下公式,并输出结果:,其中r、s值由键盘输入。sin x近似值按以下公式计算,计算精度为10,-6,:,函数申明与使用,第17页,17,#include,#include,using namespace std;,int 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,k=,tsin,(r*s)/2;,coutk=p);,return g;,运行结果:,r=5,s=8,1.37781,19,第19页,19,例3-6投骰子随机游戏,每个骰子有六面,点数分别为1、2、3、4、5、6。游戏者在程序开始时输入一个无符号整数,作为产生随机数种子。,每轮投两次骰子,第一轮假如和数为7或11则为胜,游戏结束;和数为2、3或12则为负,游戏结束;和数为其它值则将此值作为自己点数,继续第二轮、第三轮.直到某轮和数等于点数则取胜,若在以前出现和数为7则为负。,由rolldice函数负责模拟投骰子、计算和数并输出和数。,函数申明与使用,第20页,20,#include,#include,using namespace std;,int,rolldice,(void);,int main(),int gamestatus,sum,mypoint;,unsigned seed;,coutseed;/输入随机数种子,srand(seed);/将种子传递给rand(),sum=,rolldice,();/第一轮投骰子、计算和数,21,第21页,21,switch(sum),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;,22,第22页,22,while(gamestatus=0),/只要状态仍为 0,就继续进行下一轮,sum=,rolldice,();,if(sum=mypoint),/某轮和数等于点数则取胜,状态置为1,gamestatus=1,else,if(sum=7 )/出现和数为7则为负,状态置为2,gamestatus=2;,/当状态不为0时上面循环结束,以下程序段输出游戏结果,if(gamestatus=1 ),coutplayer winsn;,else,coutplayer losesn;,23,第23页,23,rand,函数原型:int rand(void);,所需头文件:,功效和返回值:求出并返回一个伪随机数,srand,函数原型:void srand(unsigned int seed);,参数:seed产生随机数种子。,所需头文件:,功效:为使rand()产生一序列伪随机整数而设置起始点。使用1作为seed参数,能够重新初始化rand()。,24,第24页,24,int rolldice(void),/投骰子、计算和数、输出和数,int die1,die2,worksum;,die1=1+rand()%6;,die2=1+rand()%6;,worksum=die1+die2;,coutplayer rolled die1+die2=worksumab;,couta、b平方和:,fun1,(a,b)endl;,函数申明与使用,第29页,29,int,fun1,(int x,int y),int,fun2,(int m);,return(fun2(x)+fun2(y);,int,fun2,(int m),return(m*m);,运行结果:,3 4,a、b平方和:25,30,第30页,30,递归调用,函数直接或间接地调用本身,称为递归调用。,递归过程两个阶段:,递推:,4!=43!,3!=32!,2!=21!,1!=10!,0!=1,未知 已知,回归:,4!=43!=24,3!=32!=6,2!=21!=2,1!=10!=1,0!=1,未知 已知,函数申明与使用,第31页,31,例3-8 求n!,分析:计算,n,!公式以下:,这是一个递归形式公式,应该用递归函数实现。,函数申明与使用,第32页,32,源程序:,#include,using namespace std;,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);,33,第33页,33,int main(),long fac(int n);,int n;,long y;,coutn;,y=,fac,(n);,coutn!=ynk;,coutcomm(n,k)n)return 0;,else if(n=k|k=0),return 1;,else,return comm(n-1,k)+comm(n-1,k-1);,运行结果:,18 5,8568,36,第36页,36,例3-10汉诺塔问题,有三根针A、B、C。A针上有N个盘子,大在下,小在上,要求把这N个盘子从A针移到C针,在移动过程中能够借助B针,每次只允许移动一个盘,且在移动过程中在三根针上都保持大盘在下,小盘在上。,函数申明与使用,A,B,C,第37页,37,分析:,将n 个盘子从A针移到C针能够分解为下面三个步骤:,将A 上n-1个盘子移到 B针上(借助C针);,把A针上剩下一个盘子移到C针上;,将n-1个盘子从B针移到C针上(借助A针);,实际上,上面三个步骤包含两种操作:,将多个盘子从一个针移到另一个针上,这是一个递归过程。hanoi函数实现。,将1个盘子从一个针上移到另一针上。用move函数实现。,38,第38页,38,#include,using namespace std;,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);,39,第39页,39,int main(),void hanoi(int n,char one,char two,char three);,int m;,coutm;,coutthe steps to moving m,diskes:C,A-B,C-B,A-C,B-A,B-C,A-C,41,第41页,41,函数参数传递机制,传递参数值,在函数被调用时才分配形参存放单元。,实参能够是常量、变量或表示式。,实参类型必须与形参相符。,传递时是传递参数值,即单向传递。,函数申明与使用,第42页,42,函数参数传递机制,参数值传递举例,X,N,被调函数:,主调函数:,3,2.5,A,D=power(A,3),2.5,3,double power(double X,int N),函数申明与使用,第43页,43,例3-11 输入两个整数交换后输出,#include,using namespace std;,void,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;,函数申明与使用,第44页,44,void,Swap,(int a,int b),int t;,t=a;,a=b;,b=t;,运行结果:,x=5 y=10,x=5 y=10,45,第45页,45,a=b;,5,x,10,y,5,a,10,b,执行主函数中函数调用,Swap(x,y);,t=a;,5,x,10,y,5,a,10,b,5,t,b=t;,5,x,10,y,10,a,5,b,5,t,5,x,10,y,10,a,10,b,5,t,在Swap子函数中,返回主函数以后,5,x,10,y,46,46,第46页,46,函数参数传递,用引用做形参,引用(&)是标识符别名,比如:,int i,j;int /建立一个int型引用ri,并将其 /初始化为变量i一个别名,j=10;ri=j;/相当于 i=j;,申明一个引用时,必须同时对它进行初始化,使它指向一个已存在对象。,一旦一个引用被初始化后,就不能改为指向其它对象。,引用能够作为形参void swap(int&a,int&b).,函数申明与使用,第47页,47,例3-12,输入两个整数交换后输出,#include,using namespace std;,void 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=10 y=,5,第48页,48,t=a;,x,5,t,5,x,别名,a,x,y,5,10,y 别名,x,别名,a,b,y 别名,x,别名,a,b,x,10,y,10,a=b,b=t;,y,5,t,5,y,地址,b,x,y,10,5,Swap(x,y);,49,第49页,49,内联函数申明与使用,申明时使用关键字 inline。,编译时在调用处用函数体进行替换,节约了参数传递、控制转移等开销。,注意:,内联函数体内不能有,循环语句,和,switch,语句。,内联函数定义必须出现在内联函数第一次被调用之前。,对内联函数不能进行异常接口申明。,内联函数,第50页,50,例3-14 内联函数应用举例,#include,using namespace std;,inline,double,CalArea,(double radius),return 3.14*radius*radius;,int main(),double r(3.0);,double area;,area=,CalArea,(r);,coutareaendl;,return 0;,内联函数,第51页,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页,52,默认形参值说明次序,默认形参值必须,从右向左,次序申明,而且在默认形参值右面不能有非默认形参值参数。因为调用时实参取代形参是从左向右次序。,例:,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页,53,默认形参值与函数调用位置,调用出现在函数体实现之前时,默认形参值必须在函数原形中给出;而当调用出现在函数体实现之后时,默认形参值需在函数实现时给出。,例:,int add(int x=5,int y=6);,int main(),add();,/调用在实现前,int add(int x,int y),return x+y;,int add(int x=5,int y=6),return x+y;,int main(),add();,/调用在实现后,带默认形参值函数,第54页,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,),带默认形参值函数,第55页,55,重载函数申明,C+允许功效相近函数在相同作用域内以相同函数名申明,从而形成重载。方便使用,便于记忆。,例:,形参类型不一样,int add(,int,x,int,y);,float add(,float,x,float,y);,形参个数不一样,int add(int x,int y);,int add(int x,int y,int z,);,函 数 重 载,第56页,56,注意事项,不要将不一样功效函数申明为重载函数,以免出现调用结果误解、混同。这么不好:,int add(int,x,int,y,);,int add(int,a,int,b,);,编译器不以,形参名,来区分,int,add(int x,int y);,void,add(int x,int y);,编译器不以,返回值,来区分,int,add,(int x,int y),return x,+,y;,float,add,(float x,float y),return x,-,y;,函 数 重 载,重载函数形参必须不一样:,个数,不一样或,类型,不一样。,编译程序将依据实参和形参类型及个数最正确匹配来选择调用哪一个函数。,第57页,57,例3-16重载函数应用举例,编写三个名为add重载函数,分别实现两整数相加、两实数相加和两个复数相加功效。,#include,using namespace std;,struct complex,double real;,double imaginary;,;,函 数 重 载,第58页,58,int 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;,59,第59页,59,coutxy;,coutreal number x+y=add(x,y),endl;,coutc1.realc1.imaginary;,coutc2.realc2.imaginary;,c3=add(c1,c2);,coutcomplex number(c1.real,c1.imaginary)+(c2.real,c2.imaginary)=(c3.real,c3.imaginarya;,b=a*pi/180;,coutsin(a)=sin(b)endl;,coutcos(a)=cos(b)endl;,couttan(a)=tan(b)(“,活动子集”栏)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页,66,小结与复习提议,主要内容,函数申明和调用、函数间参数传递、内联函数、带默认形参值函数、函数重载、C+系统函数,到达目标,学会将一段功效相对独立程序写成一个函数,为下一阶段学习类和对象打好必要基础。,第67页,67,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服