您好,欢迎访问三七文档
函数1.什么是函数?2.函数的定义和说明3.函数的参数和返回值主要内容4.函数的参数和返回值5.函数的调用方式6.函数的嵌套调用和递归调用2什么是函数编写函数,计算并打印若干给定整数(1、3、4)的阶乘,要求每次打印数据后打印一行星号(10个)。1**********************6**********************24**********************……3什么是函数voidmain(){inta=1,b=3,c=4;intv=1;while(a0){v*=a;a--;}coutv;for(inti=0;i10;i++){cout*;}coutendl;v=1;while(a0){v*=a;a--;}coutv;for(inti=0;i10;i++){cout*;}coutendl;4什么是函数intgetfact(intm){intv=1;while(m0){v*=m;m--;}returnv;}voidcoutstar(){for(inti=0;i10;i++)cout*;coutendl;}voidmain(){inta=19,b=123,c=67;coutgetfact(a);coutstar();coutgetfact(b);coutstar();coutgetfact(c);coutstar();}5参数类型参数名函数名返回类型函数体函数调用(参数传递)什么是函数为什么需要函数提高效率,减少重复编写程序的工作量。一个较大的程序不可能完全由一个人完成,更不可能把所有代码放在一个主函数中。什么是函数函数(function)就是一段实现某个功能的代码。6什么是函数一个程序包含若干个函数(但只有一个主函数),程序从主函数开始执行。执行过程中,主函数调用其它函数,其他函数相互调用。实际应用中,主函数一般比较简单,作用就是调用其它函数,而程序的功能全部都是由函数实现的。mainABCED7函数的定义和说明1、函数的定义格式返回类型函数名(参数列表){若干条语句(函数体)}返回类型包含存储类型和数据类型,存储类型省略为外部函数,数据类型不能省略。参数列表由若个参数组成,参数间用逗号分隔,给出参数名时还要给出参数的数据类型。8函数的定义和说明注意:1、函数的类型即函数返回值的类型,如果函数没有返回值则返回类型为void。voidcoutstar(){…}2、参数定义方式intgetfact(intm){……}9什么是函数voidcoutstar(){for(inti=0;i10;i++){cout*;}coutendl;}intgetfact(intm){intv=1;while(m0){v*=m;m--;}returnv;}10什么是函数voidmain(){inta=1,b=3,c=4;coutgetfact(a);coutstar();coutgetfact(b);coutstar();……}voidcoutstar(){……}intgetfact(intm){……}voidcoutstar(){……}intgetfact(intm){……}voidmain(){inta=1,b=3,c=4;coutgetfact(a);coutstar();coutgetfact(b);coutstar();……}11函数说明intgetfact(int);voidcoutstar();函数的定义和说明2、函数的说明如果函数定义在前,调用在后,调用前可以不说明。如果函数定义在调用之后,则必须在调用前说明函数的类型,名称和参数。说明格式:类型函数名(参数列表)例如,有函数定义如下:intgetfact(intm){…}原型说明:intgetfact(int)要与定义时顺序和类型相一致可省略参数名12函数的定义和说明voidmain(){inta=1,b=3,c=4;voidcoutstar();intgetfact(intm);coutgetfact(a);coutstar();……}voidcoutstar(){……}intgetfact(intm){……}voidcoutstar();intgetfact(intm);voidmain(){inta=1,b=3,c=4;coutgetfact(a);coutstar();……}voidcoutstar(){……}intgetfact(intm){……}13函数的参数和返回值1、函数的参数在定义函数时,函数名后括号中的变量名为形式参数(形参)。定义函数时,必须写出形参的个数、类型和名字。当调用一个有参数的函数时,直接写函数名调用函数,函数名后括号中的参数为实际参数(实参)。实参不加数据类型,可以是常量、变量、表达式。14函数的参数和返回值1、函数的参数在未被调用时,形参没有确定值,只是形式上的参数,只有被调用时才从调用函数中获得实际参数。voidfun(intm){coutm;}voidmain(){inta=100;fun(a);fun(10);fun(10+a);}…………ma100100intm=a;15函数的参数和返回值函数参数的求值顺序参数的求值顺序因编译系统不同而不同,一般来说不会引起参数值不同,但在具有副作用的表达式中可能会造成二义性。inta=5;fun(a++,a);编写程序要避免实参表达式中出现具有副作用的表达式166.1#includeiostream.hintfun(inta,intb){returna+b;}voidmain(){inta(13),b(25);intsum=fun(a-1,a-b);coutsumendl;}17函数的参数和返回值函数参数的默认值在定义或说明函数时通过设置参数的默认值,可以方便函数在调用时只写出部分参数。例如doublefun(doublea=1.5,doubleb=2.6)在函数被调用时,如果对应实参无值,则用形参的默认值,如对应实参有值,则用实参值,默认值无效。fun();//a=1.5,b=2.6fun(1.0)//a=1.0,b=2.618函数的参数和返回值如,doublefun(doublea,doubleb=2.6),则以下调用函数语句有无错误?fun();fun(1.2);fun(1,3);又如doublefun(doublea=1.5,doubleb),则以下调用语句有无错误?fun(1.2);19函数的参数和返回值注意设置形参的默认值要求从参数的右端开始,在指定了默认值的参数右端不允许出现没有指定默认值的参数。如果一个函数需要说明时,设置参数默认值应放在说明函数的语句中,不放在定义函数的语句中。参数默认值可以只用表达式206.2#includeiostream.hvoidmain(){voidfun(inti=1,intj=2,intk=3);fun();fun(4);fun(5,6);fun(7,8,9);}voidfun(inti,intj,intk){couti+j+kendl;}21函数的参数和返回值函数返回值的实现函数可以有返回值也可以没有返回值。没有返回值的函数类型为void,return语句可以省略。在函数中实现返回值的方法是使用带有表达式的return语句:return[表达式];一个函数可以有一个以上return语句,执行到哪一个return语句,哪一个return语句起作用。return后的表达式可以加括号,可以不加22函数的参数和返回值return[表达式];的执行过程;先计算表达式值;当表达式值同函数返回类型不一致时,应将表达式值转换为返回类型;将表达式值返回给调用函数,作为调用函数的值将程序的控制权返回到调用函数语句,执行调用函数下面的语句。236.4#includeiostream.hintfun(doublea,intb){returna-b;}voidmain(){doublex(11.5);inty(10);doublez=fun(x,y);coutzendl;}24函数的调用方式函数根据调用方式分为传值调用和引用调用。传值调用函数调用时,将实参的值传递给形参的调用方式。传值调用中有个分为传值和传地址两种。传值是指传递变量或表达式的值传地址是指传递变量的地址值25函数的调用方式1、传值调用实参为表达式,形参为变量实参复制一个副本给形参,在被调用函数中形参的值被改变时,实参不会受到影响。26传值调用1234567891011voidswap(int,int);voidmain(){intx=100,y=0;swap(x,y);coutx,yendl;}voidswap(inta,intb){intt;t=a;a=b;b=t;couta,bendl;}27回顾注意:当形参是普通变量时,实参可以是变量、常量、表达式,这时形参收到的是实参的值。传参的过程就是初始化形参的过程(开辟空间+赋值)传值方式不能通过改变形参来改变实参28函数的嵌套调用和递归调用函数的嵌套调用嵌套调用是指在一个函数体中调用另一个函数。注意,函数可以嵌套调用,但是不能嵌套定义!mainABCED29函数的嵌套调用和递归调用#includeiostream.hvoidfun1(),fun2(),fun3();voidmain(){coutItisinmain().endl;fun2();coutTiisbackmain().endl;}voidfun1(){coutItisinfun1().endl;fun3();coutItisbackinfun1().endl;}30函数的嵌套调用和递归调用voidfun2(){coutItisinfun2().endl;fun1();coutItisbackinfun2().endl;}voidfun3(){coutItisinfun3().endl;}31函数的嵌套调用和递归调用函数的递归调用递归调用是指在一个函数体中直接或间接调用自己。mainDmainAD32递归调用采用递归调用可以解决的问题是有限的,这些问题具有以下特点:能够将原有问题分解为一个新问题,而这个新问题又要用原有问题的解决方法。按这一特点将问题分解下去,每次出现的新问题都是原有问题的简化的子问题;(规模变小,形式不变)最终分解出来的新问题是具有已知解的问题。(有限)33递归从键盘输入一个正整数,编程求出该函数的阶乘,要求使用递归调用的方法。0!=11!=12!=1*23!=1*2*3n!=1*2*3*……*n=1!*2=2!*3=(n-1)!*n1n=0,1fact(n)=fact(n-1)*nn134递归longfact(intn){intc;if(n=1){return1;elsereturnfact(n-1)*n;}voidmain(){intn;cinn;coutfact(n)endl;}351n=0,1fact(n)=fact(n-1)*nn1主函数voidmain()intfact(intn)fact(n)54主函数voidmain()intfact(inti)fact(n)递归54longfact(intn){intc;if(n=1){return1;elsereturnfact(n-1)*n;}voidmain(){intn;cinn;coutfact(n)endl;}mainfact(n)输出fact(n)returnfact(n-1)*nfact(n-1)returnfact(n-2)*(n-1)fact(1)re
本文标题:c++函数
链接地址:https://www.777doc.com/doc-3357961 .html