资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,计算机基础教研室,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,本章简介,第,3,章 函数,3.1,函数的定义与使用(掌握),3.2,内联函数(掌握),3.3,带默认形参值的函数(掌握),3.4,函数重载(掌握),3.5,使用,c+,系统函数(掌握),3.6,小结,函数是面向对象程序设计中的基本抽象单元;,是对功能的抽象;,函数,2,计算机基础教研室,C+,系统函数,C+,的系统库中提供了几百个函数可供程序员使用。,例如:求平方根函数(,sprt,)、,求绝对值函数(,abs,),等。,使用系统函数时要包含相应的头文件,。,例如:,cmath,使 用,C+,系 统 函 数,3,计算机基础教研室,使用的系统函数,函 数 的 定 义 与 使 用,C+,标准函数库提供一随机数生成器,rand,,返回,0,RAND_MAX,之间均匀分布的伪随机整数。,RAND_MAX,必须至少为,32767,。,rand(),函数不接受参数,默认以,1,为种子(即起始值)。,rand(),产生的随机数在每次运行的时候都是与上一次相同的,若要产生每次不同的随机数,可以使用,srand,( seed ),函数进行随机化,随着,seed,的不同,就能够产生不同的随机数。,4,计算机基础教研室,系统函数应用举例,题目:,从键盘输入一个角度值,求出该角度的正弦值、余弦值和正切值。,分析:,系统函数中提供了求正弦值、余弦值和正切值的函数:,sin(),、,cos,(),、,tan(),,,函数的说明在头文件,cmath,中。,使 用,C+,系 统 函 数,5,计算机基础教研室,#include,#include,using namespace std;,const double pi(3.14159265);,void main(), double a,b;,cin,a;,b=a*pi/180;,cout,sin(a)=sin(b),endl,;,cout,cos,(a)=,cos(b,),endl,;,cout,tan(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+,系 统 函 数,7,计算机基础教研室,函数声明的语法形式,类型标识符 函数名(形式参数表),语句序列,若无参数,写,void,是被初始化的内部变量,寿命和可见性仅限于函数内部,若无返回值,写,void,形式参数表, name1, name2, ., namen,函数的返回值,由,return,语句给出,例如:,return 0,;,无返回值的函数(,void,类型),不必写,return,语句。,函 数 的 定 义 与 使 用,函数的定义,8,计算机基础教研室,调用前先声明函数原型:,在调用函数中,或程序文件中所有函数之外,按如下形式说明:,类型标识符 被调用函数名(含类型说明的形参表),;,调用形式,函数名(实参列表),嵌套调用,函数可以嵌套调用,但不允许嵌套定义。,递归调用,函数直接或间接调用自身。,函 数 的 定 义 与 使 用,函数的调用,9,计算机基础教研室,编写一个求,x,的,n,次方的函数,#,include ,using namespace std;,Double,power (double x, int n);,void main(void),cout 5 to the power 2 is power(5,2) endl;,Double,power (double x, int n),double val = 1.0;,while (n),val = val*x;,n-;,return(val);,函 数 的 定 义 与 使 用,10,计算机基础教研室,数制转换,题目:,输入一个,8,位二进制数,将其转换为十进制数输出。,例如:,(,1101,),2 = 1(2,3,) + 1(2,2,) + 0(2,1,) + 1(2,0,)=,(,13,),10,所以,,如果输入,1101,,则应输出,13,函 数 的 定 义 与 使 用,11,计算机基础教研室,#,include ,using namespace std;,double power (double x, int n);,void main(void),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,函 数 的 定 义 与 使 用,12,计算机基础教研室,其中,arctan,用如下形式的级数计算:,直到级数某项绝对值不大于,10,-15,为止;,和,x,均为,double,型。,函 数 的 定 义 与 使 用,-,=,239,1,arctan,4,5,1,arctan,16,p,编写程序求,的值,13,计算机基础教研室,#include,using namespace std;,void 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,cout,PI=a-b1e-15),f=,e/i,;,r=(i%4=1)?,r+f,:,r-f,;,e=e*,sqr,; i+=2;,return r ;,函 数 的 定 义 与 使 用,14,计算机基础教研室,寻找并输出,11-999,之间的数,m,,,它满足,m,、,m2,和,m3,均为回文数。,回文:各位数字左右对称的整数。例如:,11,满足上述条件,11,2,=121,,,11,3,=1331,。,分析:,10,取余的方法,从最低位开始,依次取出该数的各位数字。按反序重新构成新的数,比较与原数是否相等,若相等,则原数为回文。,函 数 的 定 义 与 使 用,寻找回文数,15,计算机基础教研室,#include ,using namespace std;,void main(),bool,symm(long,n);,long m;,for(m=11; m1000; m+),if (,symm(m)&symm(m,*,m)&symm(m,*m*m),cout,m=mm*m=m*m,m*m*m=m*m*m,endl,;,函 数 的 定 义 与 使 用,16,计算机基础教研室,bool,symm(long,n),long i, m;,i=n ; m=0 ;,while(i),m=m*10+i%10;,i=i/10 ;,return ( m=n );,运行结果:,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,函 数 的 定 义 与 使 用,17,计算机基础教研室,计算如下公式,并输出结果:,其中,r,、,s,的值由键盘输入。,SIN x,的近似值按如下公式计算,计算精度为,10-6,:,函 数 的 定 义 与 使 用,计算,sin(x,),的值,18,计算机基础教研室,#include ,#include,using namespace std;,void main(),double k,r,s;,double,tsin(double,x);,cout,r;,cout,s;,if (r*r=s*s),k=,sqrt(tsin(r,)*,tsin(r)+tsin(s,)*,tsin(s,) ;,else,k=,tsin(r,*s)/2;,cout,k=p);,return g;,运行结果:,r=5,s=8,1.37781,函 数 的 定 义 与 使 用,20,计算机基础教研室,游戏规则是:每个骰子有六面,点数分别为,1,、,2,、,3,、,4,、,5,、,6,。游戏者在程序开始时输入一个无符号整数,作为产生随机数的种子。,每轮投两次骰子,第一轮如果和数为,7,或,11,则为胜,游戏结束;和数为,2,、,3,或,12,则为负,游戏结束;和数为其它值则将此值作为自己的点数,继续第二轮、第三轮,.,直到某轮的和数等于点数则取胜,若在此前出现和数为,7,则为负。,由,rolldice,函数负责模拟投骰子、计算和数并输出和数。,函 数 的 定 义 与 使 用,投骰子的随机游戏,21,计算机基础教研室,int,rolldice(void,), /,投骰子、计算和数、输出和数,int,die1,die2,worksum;,die1=1+rand()%6;,die2=1+rand()%6;,worksum,=die1+die2;,cout,player rolled die1+die2=,worksum,endl,;,return,worksum,;,22,函 数 的 定 义 与 使 用,22,计算机基础教研室,#include ,#include ,using namespace std;,int,rolldice(void,);,void main(),int,gamestatus,sum,mypoint,;,unsigned seed;,cout,seed; /,输入随机数种子,srand(seed,); /,将种子传递给,rand(),sum=,rolldice,(); /,第一轮投骰子、计算和数,函 数 的 定 义 与 使 用,23,计算机基础教研室,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 ;,cout,point is ,mypoint,endl,;,break;,函 数 的 定 义 与 使 用,24,计算机基础教研室,while (,gamestatus,=0),/,只要状态仍为,0,就继续进行下一轮, sum=,rolldice,();,if(sum,=,mypoint,),/,某轮的和数等于点数则取胜,状态置为,1,gamestatus,=1 ;,else,if (sum=7) /,出现和数为,7,则为负,状态置为,2,gamestatus,=2;, /,当状态不为,0,时上面的循环结束,以下程序段输出游戏结果,if(gamestatus,=1),cout,player winsn;,else,cout,player losesn;,运行结果:,Please enter an unsigned integer:23,player rolled 6+3=9,point is 9,player rolled 5+4=9,player wins,函 数 的 定 义 与 使 用,25,计算机基础教研室,函数调用的执行过程,main(),调,fun(),结束,fun(),返回,保存:,返回地址,当前现场,恢复:,主调程序现场,返回地址,函 数 的 定 义 与 使 用,26,计算机基础教研室,嵌套调用,main,调,fun1(),结束,fun1(),调,fun2(),返回,fun2(),返回,函 数 的 定 义 与 使 用,27,计算机基础教研室,输入两个整数,求平方和,#include ,using namespace std;,void main(void),int,a,b;,int,fun1(int,x,int,y);,cin,ab;,cout,a,、,b,的平方和,fun1(a,b),endl,;,函 数 的 定 义 与 使 用,28,计算机基础教研室,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,函 数 的 定 义 与 使 用,29,计算机基础教研室,递归调用,函数直接或间接地调用自身,称为递归调用。,递归过程的两个阶段:,递推:,4!=43! 3!=32! 2!=21! 1!=10! 0!=1,回归:,4!=43!=243!=32!=62!=21!=21!=10!=10!=1,函 数 的 定 义 与 使 用,30,计算机基础教研室,求,n!,分析:计算,n!,的公式如下:,这是一个递归形式的公式,应该用递归函数实现。,函 数 的 定 义 与 使 用,31,计算机基础教研室,/,源程序:,#include ,using namespace std;,long,fac(int,n),long f;,if (n0),cout,n0,data error!,endl,;,else if (n=0) f=1;,else f=fac(n-1)*n;,return(f);,函 数 的 定 义 与 使 用,32,计算机基础教研室,void main(),long,fac(int,n);,int,n;,long y;,cout,n;,y=,fac(n,);,cout,n!=y,endl,;,运行结果:,Enter a positive integer:8,8!=40320,函 数 的 定 义 与 使 用,33,计算机基础教研室,组合数,用递归法计算从,n,个人中选择,k,个人组成一个委员会的不同组合数。,分析:,由,n,个人里选,k,个人的组合数,=,由,n-1,个人里选,k,个人的组合数,+,由,n-1,个人里选,k-1,个人的组合数,当,n=k,或,k=0,时,组合数为,1,函 数 的 定 义 与 使 用,34,计算机基础教研室,#include,using namespace std;,void main(),int,n,k;,int,comm(int,n,int,k);,cin,nk;,cout,comm(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,函 数 的 定 义 与 使 用,35,计算机基础教研室,汉诺塔问题,有三根针,A,、,B,、,C,。,A,针上有,N,个盘子,大的在下,小的在上,要求把这,N,个盘子从,A,针移到,C,针,在移动过程中可以借助,B,针,每次只允许移动一个盘,且在移动过程中在三根针上都保持大盘在下,小盘在上。,A,B,C,函 数 的 定 义 与 使 用,36,计算机基础教研室,分析:,将,n,个盘子从,A,针移到,C,针可以分解为下面三个步骤:,将,A,上,n-1,个盘子移到,B,针上(借助,C,针),;,把,A,针上剩下的一个盘子移到,C,针上,;,将,n-1,个盘子从,B,针移到,C,针上(借助,A,针),;,事实上,上面三个步骤包含两种操作:,将多个盘子从一个针移到另一个针上,这是一个递归的过程。,hanoi,函数实现。,将,1,个盘子从一个针上移到另一针上。用,move,函数实现。,函 数 的 定 义 与 使 用,37,计算机基础教研室,#include ,using namespace std;,void move(char,getone,char,putone,),cout,getone,putone,endl,; ,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,计算机基础教研室,void main(),void,hanoi(int,n,char one,char two,char three);,int,m;,cout,m;,cout,the steps to moving m,diskes,:C,A-B,C-B,A-C,B-A,B-C,A-C,函 数 的 定 义 与 使 用,39,计算机基础教研室,在函数被调用时才分配形参的存储单元。,实参可以是常量、变量或表达式。,实参类型必须与形参相符。,传递时是传递参数值,即单向传递。,函 数 的 定 义 与 使 用,函数的参数传递机制,传递参数值,40,计算机基础教研室,参数值传递举例,X,N,被调函数:,主调函数:,3,2.5,A,D = power(A,3),2.5,3,double power(double X,int,N),函 数 的 定 义 与 使 用,41,计算机基础教研室,函 数 的 定 义 与 使 用,函数调用过程,42,计算机基础教研室,输入两整数交换后输出,#include,using namespace std;,void,Swap(int,a,int,b);,int,main(),int,x(5), y(10);,cout,x=xy=y,endl,;,Swap(x,y);,cout,x=xy=y,endl,;,return 0;,void,Swap(int,a,int,b),int,t;,t=a;,a=b;,b=t;,运行结果,:,x=5 y=10,x=5 y=10,函 数 的 定 义 与 使 用,43,计算机基础教研室,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,函 数 的 定 义 与 使 用,44,计算机基础教研室,函数的参数传递,用引用做形参,引用,(,&,),是标识符的别名,是一种派生数据类型,不占存储空间。,例如,:,int,someInt,;,int,&,rInt,=,someInt,;,/,建立一个,int,型的引用,rInt,并将其,/,初始化为变量,someInt,的一个别名,声明一个引用时,必须,同时对它进行初始化,,使它指向一个已存在的对象。,一旦一个引用被初始化后,,就不能改为指向其它对象。,引用可以作为形参,void,swap(int,& a,int,& b) .(,作用,),函 数 的 定 义 与 使 用,45,计算机基础教研室,输入两个整数交换后输出,#include,using namespace std;,void,Swap(int,& a,int,int,main(),int,x(5), y(10);,cout,x=x y=y,endl,;,Swap(x,y,);,cout,x=x y=y,endl,;,return 0;,void,Swap(int,& a,int,& b),int,t;,t=a;,a=b;,b=t;,运行结果,:,x=5 y=10,x=10 y=5,函 数 的 定 义 与 使 用,46,计算机基础教研室,x,y,10,5,函 数 的 定 义 与 使 用,47,计算机基础教研室,内联函数声明与使用,声明时使用关键字,inline,。,编译时在调用处用函数体进行替换,节省了参数传递、控制转移等开销。,注意:,内联函数体内不能有循环语句和,switch,语句。,内联函数的声明必须出现在内联函数第一次被调用之前。,对内联函数不能进行异常接口声明。,内 联 函 数,48,计算机基础教研室,内联函数应用举例,#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,);,cout,area,endl,;,return 0;,内 联 函 数,49,计算机基础教研室,默认形参值的作用,函数在声明时可以预先给出默认的形参值,调用时如给出实参,则采用实参值,否则采用预先给出的默认形参值。,例如:,int,add(int,x=,5,int y=,6,), return x+y;,void main(void), add(10,20); /10+20,add(10); /10+,6,add(); /,5,+,6,带 默 认 形 参 值 的 函 数,50,计算机基础教研室,默认形参值的说明次序,默认形参值必须,从右向左,顺序声明,并且在默认形参值的右面不能有非默认形参值的参数。因为调用时实参取代形参是从左向右的顺序。,例:,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); /,错误,带 默 认 形 参 值 的 函 数,51,计算机基础教研室,默认形参值与函数的调用位置,调用出现在函数体实现之前时,,默认形参值必须在函数原形中给出,;而当调用出现在函数体实现之后时,默认形参值需在函数实现时给出。,例:,int,add(int,x=5,int y=6);,void main(void), add(); /,调用在实现前,int,add(int,x,int,y), return x+y; ,int,add(int,x=5,int y=6), return x+y; ,void main(void), add(); /,调用在实现后,带 默 认 形 参 值 的 函 数,52,计算机基础教研室,默认形参值的作用域,在相同的作用域内,默认形参值的说明应保持唯一,但如果在不同的作用域内,允许说明不同的默认形参。,例:,int,add(int,x=1,int y=2);,void main(void),int,add(int,x=3,int y=4);,add(); /,使用局部默认形参值(,实现,3+4,),void fun(void), .,add(); /,使用全局默认形参值(,实现,1+2,),带 默 认 形 参 值 的 函 数,53,计算机基础教研室,重载函数的声明,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);,函 数 重 载,54,计算机基础教研室,注意事项,不要将不同功能的函数声明为重载函数,以免出现调用结果的误解、混淆。,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; ,重载函数的形参必须不同,:,个数不同或类型不同,。,编译程序将根据实参和形参的类型及个数的最佳匹配来选择调用哪一个函数。,函 数 重 载,55,计算机基础教研室,重载函数应用举例,编写三个名为,add,的重载函数,分别实现两整数相加、两实数相加和两个复数相加的功能。,#include,using namespace std;,struct,complex,double real;,double imaginary;,;,函 数 重 载,56,计算机基础教研室,void main(void),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);,cout,mn;,cout,integer m+n=add(m,n),endl,;,函 数 重 载,57,计算机基础教研室,cout,xy;,cout,real number x+y= ,add(x,y,),endl,;,cout,c1.realc1.imaginary;,cout,c2.realc2.imaginary;,c3=add(c1,c2);,cout,complex number ( c1.real , c1.imaginary )+(c2.real,c2.imaginary)=(c3.real,c3.imaginary)n;,函 数 重 载,58,计算机基础教研室,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;,运行结果:,Enter two integer: 3 5,integer 3+5=8,Enter two real number: 2.3 5.8,real number 2.3+5.8= 8.1,Enter the first complex number: 12.3 45.6,Enter the second complex number: 56.7 67.8,complex number (12.3,45.6)+(56.7,67.8)= (69,113.4),函 数 重 载,59,计算机基础教研室,
展开阅读全文