C++函数详解ppt课件_第1页
C++函数详解ppt课件_第2页
C++函数详解ppt课件_第3页
C++函数详解ppt课件_第4页
C++函数详解ppt课件_第5页
已阅读5页,还剩97页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,函数:程序的最基本单位,2,1Creturn0;函数main调用了函数printfprintf是一个库函数,例1,为了完成一个特定的任务,在程序开发中一般要定义若干函数。,用户定义函数,1Creturn(pow(x,y);/*调用pow库函数*/intmain()floata,b,c,d;c=func(a,b);/*第一次调用用户函数*/d=func(c,b);/*第二次调用用户函数*/printf(“%f,%fn”,c,d);/*调用格式输出库函数*/return0;,例2,/*用户定义函数*/,1Clongy;for(y=1;x0;-x)y*=x;return(y);,函数名,形式参数列表,函数类型,形式参数说明,函数体,函数返回,2函数定义(续),求阶乘函数facto的定义,13,intmain()inta,b,c;printf(”Entera,bn”);scanf(”%d,%d”,形式参数列表:是用,分开的一组变量,用来接收调用时传入的数据,形式参数说明:在外面对形式参数的类型进行说明,函数调用,2函数定义(续),求两个变量的最大值,14,2函数定义(续),六、函数定义注意事项,1.形式参数表中给出的形式参数名和数量要与形式参数说明中的参数名和数量相同。要求形式参数表中的形参与形式参数说明中的参数应一一对应。但对于两者的排列顺序没有要求。,2.形式参数表中说明的形式参数只要在形式参数说明中说明一次即可,在函数体中不需再说明,可直接使用。,15,2函数定义(完),六、函数定义注意事项,3.函数体内部的变量说明与形参说明的含义不一样。前者说明一个局部于函数体的一般变量,后者说明一个用于函数间传送数据的形式变量。在概念上截然不同,在函数中的作用完全不同。在函数体内部一般变量与形参的使用方法完全一样。,16,3函数的调用与返回,一、函数的调用形式,函数名(实际参数表);,实参的数量、类型和排列顺序必须与函数定义时形式参数表中形参的数量、类型和排列顺序一致,不允许任意改变。,17,3函数的调用与返回,在一个函数中调用另一个函数时,程序将控制从调用函数处转移到被调用函数,并且执行被调用函数。在执行完被调用函数的所有语句或者遇到return语句时,程序的控制要返回到调用函数中原来调用函数的地方继续执行。,二、函数调用的过程,18,三、函数声明,3函数的调用与返回(续),在调用函数之前,要先进行函数声明,“声明”与“定义”的区别:“声明”就是声明函数返回值的类型。“定义”是给出函数的程序体。,19,函数声明与函数定义的首部唯一区别:函数声明语句的()之后必须有分号,而函数定义头部的()之后没有分号。,3函数的调用与返回(续),函数声明的一般形式,函数类型函数名(形参类型1形参名1,形参类型2形参名2);,函数类型必须与函数定义时的函数类型一致,20,3函数的调用与返回(续),例:调用max函数的程序#include”stdio.h”intmain()inta,b,c;intmax(inta,intb);scanf(%d,%d,函数声明,21,四、函数原型,3函数的调用与返回(续),函数声明的简化形式:函数原型,函数类型函数名(形参类型1,形参类型2);,通常将一个文件中需调用的所有函数原型写在文件的开始。,22,五、函数的返回,3函数的调用与返回(续),从函数返回的两种方法,用return语句从被调函数中退出,返回调用它的程序中(也称为主调函数);被调函数如果没有return语句,被调函数执行结束遇到最外面的,返回主调函数。,23,控制程序从当前函数(被调用函数)中退出,返回到调用函数中继续执行;从被调用函数向主调函数返回一个值(称为返回值)。,五、函数的返回,3函数的调用与返回(续),return的两重作用:,24,返回值规定,函数除void类型之外,均有一个返回值,返回值的类型就是在定义函数时的函数类型。,例:当返回值类型为整型int时intmax(x,y)intx,y;intz;z=xy?x:y;return(z);,3函数的调用与返回(续),25,在程序中调用函数的时候,必须先明确地说明被调用函数的数据类型,然后再使用(调用)。,返回语句,格式1:return;功能:将控制从被调函数返回到主调函数。,格式2:return(表达式);或:return表达式;,功能:在被调函数中计算表达式的值,将计算结果按照函数说明的函数类型返回到主调函数,并将控制返回主调函数。,3函数的调用与返回(续),26,3函数的调用与返回(续),void类型概念又称为无值类型(或空类型)。void类型的函数在调用之后没有返回值。(void类型的函数不是调用函数之后不返回),void类型的用途表示一个函数没有返回值;用来指明一个通用型的指针。,27,void类型的说明void类型的函数与有返回值类型的函数在定义过程中没有区别;有返回值的函数可将函数调用放在表达式的中间,将返回值用于计算;void类型的函数不能将函数调用放在表达式之中,只能以单独语句形式调用。,3函数的调用与返回(续),28,例:调用max函数的程序intmain()inta,b,c;intmax(int,int);scanf(%d,%d,函数调用,intmax(x,y)intx,y;intz;if(xy)z=x;elsez=y;return(z);,实际参数,形式参数,返回函数值,接收返回值,程序执行顺序?,/*1*/*2*/*3*/*4*/*5*/,/*11*/*12*/*13*/*14*/*15*/*16*/,函数调用与返回实例,3函数的调用与返回(续),29,/*1*/*2*/*3*/*4*/*5*/*11*/*12*/*13*/*14*/*15*/*16*/,voidmain()inta,b,c;scanf(%d,%d,断点,保护断点和现场,转向11,入口,虚实结合a-x,b-y,返回断点恢复现场带回函数值,3函数的调用与返回(续),30,intmax(x,y)intx,y;intz;if(xy)z=x;elsez=y;return(z);,返回整型函数值,intmax(x,y)intx,y;intz;if(xy)z=x;elsez=y;return;,返回不确定的函数值,intmax(x,y)intx,y;intz;if(xy)z=x;elsez=y;,无返回语句在此返回,3函数的调用与返回(续),31,例:用函数facto计算m阶乘。intmain()intm;longmm;longfacto(int);scanf(%d,/*函数定义*/*形式参数说明*/*以下为函数体*/*返回并带回返回值*/,/*函数声明*/*m是实参数,调用函数facto,返回值送入变量mm中*/,函数执行过程,main()mm=facto(m);,facto(x)return(y);,调用,返回,3函数的调用与返回函数调用的执行过程,32,9-6函数的嵌套调用,3函数的调用与返回函数的嵌套调用,函数的嵌套调用,main函数调用函数A;,函数A调用函数B;,函数B,调用,调用,返回,返回,33,4在函数间的传递数据,在不同的函数之间传递数据,可以使用的方法:参数:通过形式参数和实际参数返回值:用return语句返回计算结果全局变量:外部变量,一、函数间数据传递方式,34,4在函数间的传递数据,值传递:在调用函数时,将实参变量的值取出来,复制给形参变量,使形参变量在数值上与实参相等。在函数内部使用从实参中复制来的值进行处理。中的实参可以是一个表达式,调用时先计算表达式的值,再将结果(值)复制到形参变量中。,二、函数参数的值传递,35,例4用函数实现交换两个变量的值。intmain()inta=5,b=10;/*说明两个变量并赋初值*/voidswap(int,int);printf(beforeswapa=%d,b=%dn,a,b);swap(a,b);/*用变量a和b作为实际参数调用函数*/printf(afterswapa=%d,b=%dn,a,b);return0;voidswap(x,y)intx,y;inttemp;/*借助临时变量交换两个形参变量的值*/temp=x;x=y;y=temp;printf(inswapx=%d,y=%dn,x,y);,36,main函数a=5;b=10;swap(a,b);,swap(x,y)函数temp=x;语句x=y;语句y=temp;语句,5,10,实参变量a,实参变量b,5,10,形参变量x,形参变量y,变量temp,复制,复制,temp=x,x=y,y=temp,10,5,5,swap函数的执行过程和各个变量的变化过程,调用swap函数,调用swap函数,调用swap函数,执行swap函数,执行swap函数,执行swap函数,4在函数间的传递数据(续),37,main函数a=5;b=10;swap(a,b);,swap(x,y)函数temp=x;语句x=y;语句y=temp;语句,swap函数的执行过程和各个变量的变化过程,main函数,swap函数,5,10,变量a,变量b,形参x,形参y,10,5,变量temp,5,10,5,swap(a,b);,main函数,变量a,5,变量b,10,temp=x;,x=y;,y=temp;,函数执行结束返回,4在函数间的传递数据(续),38,值传递方式的特点值传递方式也称数据复制方式。函数间形参变量与实参变量的值的传递过程类似于日常生活中的“复印”操作。,值传递的优点被调用的函数不可能改变调用函数中变量的值,而只能改变它的局部的临时副本。这样就可以避免被调用函数的操作对调用函数中的变量可能产生的副作用。,值传递的缺点在值传递方式下,每个形式参数仅能传递一个数据,当需要在函数之间传递大量数据时,值传递方式显然不适用。,4在函数间的传递数据(续),39,变量的三个属性变量的名称:编写程序时使用变量名。变量的值:程序运行时使用变量的值参加运算。变量的地址:程序运行时,要将变量的值保存在计算机的存储单元中,每个存储单元都有唯一的内存地址。变量在内存中占据的存储单元的地址就是变量的地址。通过变量名存取变量的值,称为直接访问。通过变量地址存取变量的值,称为间接访问。,三、在函数间传递变量的地址,40,在函数之间传递变量的地址在函数间通过一般的变量可以传递变量的值要在函数间传递变量地址必须通过指针变量即要在函数之间传递指向变量的指针。在函数间传递变量地址时,变量的地址在调用函数时要作为实际参数,被调用函数使用指针变量作为形式参数接收传递的地址。注意:实参的数据类型要与作为形参的指针所指的对象的数据类型一致。,41,指针及其引用,C变量pk中存放k在内存中的地址,变量pk就是一个指针变量,指向变量k,存放k的地址。,因此:指针就是地址。,42,1指针及其引用(续),一、指针变量的说明,格式:,其中:类型说明符,是指针所指的变量的类型*为指针说明符,说明后面的变量为指针变量(也叫间接访问符),例如:inta,*pa;,pa=将变量a的地址赋给指针pa,printf(“%d”,*pa);通过间接访问符可以访问变量a,类型说明符*变量名;,43,指针及其引用(续),一、指针变量的说明,说明:,(1)一个指针指向类型说明符所说明的变量类型,(2)*和pk=,可以为指针赋空值(NULL),此时指针不指向任何变量pk=NULL;,45,指针及其引用(续),三、指针变量的引用,定义指针后,对变量的访问就可以有两种方法:,间接访问:通过指针,*pk=0;与k=0;*pk+=1;与k+=1;(*pk)+与k+;,区别:定义指针时的*pk和引用指针时的*pk,直接访问:通过变量名,例:intk,*pk;pk=,printf(“%d”,k);与printf(“%d”,*pk);,完全等价,46,例:使用函数plus求两个数的和。#includeintmain()inta,b,c;printf(EnterAandB);scanf(%d%d,/*返回两个整数的和*/,4在函数间的传递数据(续),47,例:用函数交换两个变量的值。#includeintmain()inta,b;a=5;b=10;printf(brfortswapa=%d,b=%dn,a,b);swap(,4在函数间的传递数据(续),48,main函数a=5;b=10;swap(,swap(*px,*py)函数temp=*px;语句*px=*py;语句*py=temp;语句,swap函数的执行过程和各个变量的变化过程,5,10,变量a,变量b,/*在主调函数内定义数组*/for(i=0;i=1时n!=n*(n-1)!,6函数的递归调用,89,facto(intn)intr;if(n=0)r=1;elser=facto(n-1);r=n*r;return(r);,facto(intn),intr;,if(n=0),facto(intn)intr;if(n=0)r=1;elser=facto(n-1);r=n*r;return(r);,r=facto(n-1),facto(intn),intr;,if(n=0),facto(intn)intr;if(n=0)r=1;elser=facto(n-1);r=n*r;return(r);,r=facto(n-1),facto(intn)intr;if(n=0)r=1;elser=facto(n-1);r=n*r;return(r);,facto(intn),facto(intn),intr;,intr;,if(n=0),if(n=0),r=facto(n-1),r=1,return(1),r=n*r=1*1,return(1),return(2),r=n*r=2*1,r=n*r=3*2,return(6),1,调用,2,3,4,调用,调用,3,2,1,返回,返回,返回,N=3,N=2,N=1,N=0,6函数的递归调用,90,例:求自然数1到n之和。建立问题的递归定义:f(n)=1当n=1时f(n)=n+f(n-1)当n1时程序:intadd(n)intn;if(n=1)return(1);/*递归结束条件*/if(n1)return(n+add(n-1);,递归结束条件,递归算法,三、数值型问题的递归求解一般方法,从数学公式入手:推导出问题的递归定义;确定问题的边界条件;再得到问题的递归算法和递归结束条件。,6函数的递归调用,91,七、非数值型问题的递归求解一般方法,将问题化简:分析在最简单情况下问题的求解方法。此时,求解的方法一定是非递归的算法,而且十分简单。,分解:将一般的问题分解为两个(或多个)小问题,且每个分解后的小问题与原来的问题仍然是相似的,具有相同的性质,只是在问题的规模上有所缩小。,6函数的递归调用,92,由第1步可以产生递归结束条件,由第3步可以推出递归算法。,七、非数值型问题的递归求解一般方法,建立模型:假设分解后的小问题已经全部可以解决,将每个小问题看作一个整体,不再对小问题进行分解,建立用小问题解决一般问题的算法。,6函数的递归调用,93,1.若n为1位整数(0n9):则可直接输出。2.将任一个整数n(*+)(n=10)分为两部分:个位(+)除个位以外的其余部分(*)3.将分解后的两部分分别看成整体,则解决原来问题的算法可以描述为:输出n的个位(+)反序输出n的除个位以外的其余部分(*)由1推出递归终止条件。由3得到递归算法。,例14反序输出整数n(n=0)。例如:n=12345,输出54321。,问题分析:,94,12345,5,1234,4,123,3,12,2,1,1,递归算法描述:若:整数n只有1位数字则:输出该整数n;否则:输出n的个位;反序输出n的除个位以外的其余部分。,进行递归,n/10,printn(n),6函数的递归调用,95,程序:voidprintn(intn)if(01)个圆盘的汉诺塔,将N个圆盘分为两部分:上面的N-1个圆盘和最下面的N号圆盘。将“上面的N-1个圆盘”看成一个整体。第3步,为解决N个圆盘的汉诺塔,可按如下方式进行操作:,将A杆上面的N-1个盘子,借助B杆,移到C杆上;,将A杆上剩下的N号盘子移到B杆上;,将C杆上的N-1个盘子,借助A杆,移到B杆上。,6函数的递归调

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论