您好,欢迎访问三七文档
当前位置:首页 > 高等教育 > 其它文档 > 第8章 函数1 (第13次课)
•教学目的与要求(1)掌握函数的申明、定义、调用(2)掌握函数的参数和返回值(3)掌握传值和传地址(3)理解数组与函数参数•课时2第8章函数1内容提要:•8.1问题的提出和程序示例•8.2函数定义•8.3函数调用8.1问题的提出和程序示例我们来看一段程序:x=1;for(i=1;i=n;i++){x=x*i;}这段程序的功能是求n!编程序求组合函数n!*(m-n)!.!mCnm=8.1问题的提出和程序示例main(){intm,n,x=1,y=1,z=1,i,cmn;scanf(%d%d,&m,&n);for(i=1;i=m;i++)/*求m!*/x=x*i;for(i=1;i=n;i++)/*求n!*/y=y*i;for(i=1;i=m-n;i++)/*求(m-n)!*/z=z*i;cmn=x/(y*z);printf(Cmn=%d,cmn);}8.1问题的提出和程序示例intfac(intn)/*求某个数n的阶乘*/{inti,x=1;for(i=1;i=n;i++)x=x*i;return(x);}main()/*求组合函数的解*/{intm,n,cmn;scanf(%d%d,&m,&n);cmn=fac(m)/(fac(n)*fac(m-n));printf(cmn=%d,cmn);}问题提出:是否可以减少相似类型的操作而使程序变得简洁一些?8.2函数定义8.2.1函数基础函数定义:即定义函数的功能。未经定义的函数不能使用。函数调用:即执行一个函数,调用函数时,程序跳转到被调用函数的第一句开始执行,执行至被调用函数的最后一句,然后程序返回调用该函数处。函数声明:即通知编译系统该函数已经定义过了。函数类型函数名([参数表]){函数体}函数头函数体函数名:一个有效的标识符。函数类型:返回值的类型说明符。如果不指定,即缺省,就是int。void:表示函数不返回任何值。参数表:声明参数,多个参数用逗号分隔开。接收传递进来的数据。必须为每个参数指定数据类型。8.2.2函数定义1.形参函数定义时,函数名后面小括号内的参数就是形式参数,简称形参.2.实参调用函数时,函数名后面小括号内的参数就是实际参数,简称实参.3.形参与实参的关系当发生函数调用时,实参向形参传值,要实现数值传递的正确性,应该保证实参与形参的三个一致性—类型一致、个数一致、顺序一致请看图8.18.2.3形参与实参的关系8.2.4有参函数与无参函数1.有参函数函数类型函数名(形式参数表){函数体}有参函数比无参函数多了两个内容,其一是形式参数表,其二是形式参数类型说明。在形参表中给出的参数称为形式参数,它们可以是各种类型的变量,各参数之间用逗号间隔。在进行函数调用时,主调函数将赋予这些形式参数实际的值。形参既然是变量,当然必须给以类型说明。【例8-2】定义一个函数fun,其功能是用”*”打印直角三角形voidfun(intn){inti,j;for(i=1;i=n;i++){for(j=1;j=2*i-1;j++)printf(*);printf(\n);}}voidmain(){intx=5;fun(x);fun(x+2);}8.2.4有参函数与无参函数2.无参函数函数类型函数名(){函数体}无参函数定义时,函数名后有一个空括号,其中无没有参数,但括号不可少。表示此函数被调用时,没有数据传递进来。括号不可省略函数定义时,根据函数名后的圆括号内是否有形参,分为有参函数和无参函数两类。如果一个函数无返回值,此类函数任务完成后不需向调用者返回结果,一般可以不写return语句。用户在定义此类函数时需指定它的返回值为“空类型”(即void类型)。1.返回值不空,int,float等类型2.函数的返回值类型为空(即void类型)8.2.4函数的返回类型(1)return语句的一般格式:return(返回值表达式);(2)return语句的功能:返回调用函数,并将“返回值表达式”的值带给调用函数。函数定义时的类型就是函数返回值的类型。从理论上,C语言要求函数定义的类型应当与返回语句中表达式的类型保持一致。8.2.4函数的返回类型8.3函数调用函数调用的一般形式为:函数名([实参表])请看图8.2函数调用过程retrun的作用:结束函数,可返回一个值。return的用法:(1)return(表达式);(2)return表达式;(3)return;//专用于void类型的函数例8.4定义一个函数max,求两个数中的较大数。intmax(inta,intb){intm;m=(ab)?a:b;return(m);}voidmain(){intx=5,y=9,z;z=max(x,y);printf(z=%d\n,z);}例8.5定义一个函数max(),求两个数是的较大数,并在函数max()中输出结果voidmax(inta,intb){intm;m=(ab)?a:b;printf(“m=%d\n,m);return;//可省略}voidmain(){intx=5,y=9;max(x,y);}1.值传递方式以上例题中主调函数与被调函数之间的数值传递是通过参数(实参和形参)传递、以及返回值实现的。实参是主调函数中的变量或表达式,形参是被调函数中的变量,调用函数时实参的值传递给形参,这种方式称为传值。传值过程如下:(1)函数被调用时,形参变量被创建;(2)实参将其数值复制一份赋值给形参变量;(3)当被调函数运行结束返回主调函数时,形参被释放。8.3.4函数参数的传递方式#includestdio.hvoidswap(int,int);voidmain(void){intx=2,y=3;printf((1)x=%d,y=%d\n,x,y);swap(x,y);printf((4)x=%d,y=%d\n,x,y);}voidswap(inta,intb){intt;printf((2)a=%d,b=%d\n,a,b);t=a;a=b;b=t;printf((3)a=%d,b=%d\n,a,b);}程序运行结果:(1)x=2,y=3(2)a=2,b=3(3)a=3,b=2(4)x=2,y=3例8.6编写一个函数,试图交换主函数中的x,y【例8.7】通过调用swap()函数,把主函数中变量x和y中的数据进行交换。#includestdio.hvoidswap(int*,int*);voidmain(){intx=2,y=3;printf((1)x=%d,y=%d\n,x,y);//输出调用swap()函数前x、y的值swap(&x,&y);//将变量x和y的地址传递给形参printf((4)x=%d,y=%d\n,x,y);//输出调用swap()函数后x、y的值}2.地址传递方式8.3.3函数的传地址方式voidswap(int*a,int*b){intt;printf((2)*a=%d,*b=%d\n,*a,*b);//输出swap()函数开始运行时a、b的值t=*a;*a=*b;*b=t;//*a代表主调函数中的变量x//*b代表主调函数中的变量yprintf((3)*a=%d,*b=%d\n,*a,*b);//输出swap()函数运行结束时a、b的值}程序运行结果:(1)x=2,y=3(2)*a=2,*b=3(3)*a=3,*b=2(4)x=3,y=28.3.3函数的传地址方式系统还没有给形参a和b分配存储空间系统释放形参的存储空间,形参a和b也随之消失23xy23xy32xyswap()函数调用前swap()函数调用过程返回main()函数后实参形参图8-3例8-9中的实参和形参示意图ab2x3y指向指向32xyswap()函数调用前swap()函数调用后ab3x2y指向指向交换后第13次上机作业8.18.2自学static变量8.3(1),(2),(3)写函数练习:1.求1+2+…+n,返回结果2.求一维数组的最大值,返回其下标.提示:intf1(inta[],intn)或intf2(int*p,intn)调用f1(数组名,m);3.求二维数组的最大值,在函数中输出其下标.在子函数中给主函数中的i1,j1赋值.提示:voidf3(inta[][5],intn,intm,int*a,int*b)调用:f3(数组名,n,m,&i1,&j1)
本文标题:第8章 函数1 (第13次课)
链接地址:https://www.777doc.com/doc-4073810 .html