您好,欢迎访问三七文档
Chap5函数5.1计算圆柱体积5.2数字金字塔5.3复数运算本章要点函数的作用?如何确定函数功能?怎样定义函数?如何调用函数?定义函数与声明函数有何区别?什么是函数的参数?怎样确定函数的参数?在函数调用时,参数是如何传递数据的?变量与函数有什么关系?如何使用局部变量和全局变量?什么是静态变量?4.4求1!+2!+….+100!#includestdio.hintmain(void){inti,j;doubleitem,sum;/*item存放阶乘*/sum=0;for(i=1;i=100;i++){item=1;/*每次求阶乘都从1开始*/for(j=1;j=i;j++)/*内层循环算出item=i!*/item=item*j;sum=sum+item;}printf(1!+2!+3!+…+100!=%e\n,sum);}例4-7源程序方法一:嵌套循环#includestdio.hdoublefact(intn);intmain(void){inti;doublesum;sum=0;for(i=1;i=100;i++)sum=sum+fact(i);printf(1!+2!+3!+…+100!=%e\n,sum);return0;}doublefact(intn){inti;doubleresult=1;for(i=1;i=n;i++)result=result*i;returnresult;}4.4.1程序解析求1!+2!+….+100!1!+2!+…+100!=9.426900e+157方法二:调用函数fact(i)计算i的阶乘程序中包括两种函数:一种是系统提供的标准库函数,如scanf()和printf();另一类是用户自定义的函数fact(intn)函数的定义•C语言要求函数使用之前必须先定义•函数定义中指定函数名字、函数返回值类型、函数实现的功能以及参数的个数与类型,将这些信息通知编译系统。函数的定义类型函数名(类型参数1,类型参数2,……){声明语句序列可执行语句序列return表达式;}返回值类型函数名参数表相当于运算的操作数返回运算的结果函数出口函数定义的一般形式:类型函数名(类型参数1,类型参数2,……){声明语句序列可执行语句序列return表达式;}函数体的定界符参数表里的变量(称为形式参数)也是内部变量,及只能在函数内部使用函数体函数定义的一般形式:函数首部说明(1)函数名函数名是一个用户定义的标识符,命名规则同变量一样。在同一程序中,不能有同名的函数。(2)函数体用左、右花括号括起来的部分称函数体,它由声明(变量或者函数)部分和语句部分组成。(3)函数类型定义函数时应说明函数类型,函数类型应与return语句中返回值的类型一致。判断是否素数的函数返回类型为?•计算正整数x!的函数返回类型为?•计算班里某一门考试的平均分返回类型为?•如果函数返回值的类型与指定的函数类型不一致,则以函数定义类型为准(按照赋值规则处理)。•如果缺省函数类型,则系统一律按整型处理。Ract(inta){return3.0;}sizeof(Ract(2))=?(4)参数(形参)列表为了与调用函数提供的实际参数区别开,将函数定义中的参数表称为形式参数表,简称形参表。形参列表列出了参数类型,名字。多个参数用逗号间隔。但是多个参数时,对应参数类型不能缺省。(5)函数定义不允许嵌套•函数的定义,可以放在程序中的任意位置,主函数main()之前或之后。•一个函数并不从属于另一个函数,各函数之间是相互独立的。在一个函数的函数体内,不能再定义另一个函数,即不能嵌套定义。(函数嵌套定义会导致localfunction语法错误)函数定义的特殊形式:•如果不需要指定参数,可以省略参数,或者将参数部分设置为void•如果不需要通过函数将计算结果返回给使用者,可以将返回类型设置为void例如:打印200个空格返回类型为?例5-5输出5之内的数字金字塔。void函数名(void){声明语句序列可执行语句序列return;}函数无返回值,用void定义返回值类型用void定义参数,表示没有参数return语句后无需任何表达式函数的定义计算整数n的阶乘n!/*函数功能:用迭代法计算n!函数入口参数:整型变量n表示阶乘的阶数函数返回值:返回n!的值*/doubleFact(intn)/*函数定义*/{inti;doubleresult=1;for(i=2;i=n;i++){result*=i;}returnresult;}返回值类型函数名把函数运算的结果回送给主函数形参表,函数入口函数内部可以定义只能自己使用的变量,称内部变量没有分号只能返回一个值函数结果返回完成确定的运算,将运算结果返回给主调函数。函数结果返回的形式:return表达式;return(表达式);5.1.1计算圆柱体积例5-1输入圆柱体的高和半径,求圆柱体积,volume=π*r2*h。要求定义和调用函数cylinder(r,h)计算圆柱体的体积。例5-1源程序/*计算圆柱体积*/#includestdio.hdoublecylinder(doubler,doubleh);/*函数声明*/intmain(void){doubleheight,radius,volume;printf(Enterradiusandheight:);scanf(%lf%lf,&radius,&height);volume=cylinder(radius,height);/*调用函数,返回值赋给volume*/printf(Volume=%.3f\n,volume);return0;}doublecylinder(doubler,doubleh)/*定义求圆柱体积的函数*/{doubleresult;result=3.1415926*r*r*h;/*计算体积*/returnresult;/*返回结果*/}5.1.2函数定义函数类型函数名(形参表)/*函数首部*/{/*函数体*/函数实现过程return表达式;}把函数运算的结果回送给主函数只能返回一个值函数返回值的类型没有分号doublecylinder(doubler,doubleh){doubleresult;result=3.1415926*r*r*h;returnresult;}doublecylinder(doubler,doubleh)/*函数首部*/{/*函数体,写在一对大括号内*/doubleresult;result=3.1415926*r*r*h;/*计算圆柱体积*/returnresult;/*返回运算结果*/}分析函数的定义函数类型函数名形参表与函数类型一致形参类型1参数1,类型2参数2,……,类型n参数n参数之间用逗号分隔,每个参数前面的类型都必须分别写明函数类型函数名(形参表){函数实现过程return表达式;}不能写成doubler,hdoublecylinder(doubler,doubleh){doubleresult;result=3.1415926*r*r*h;returnresult;}5.1.3函数的调用定义一个函数后,就可以通过程序来调用这个函数。调用标准库函数时,在程序的最前面用#include命令包含相应的头文件。调用自定义函数时,程序中必须有与调用函数相对应的函数定义。1.函数调用的形式函数调用的一般形式为:函数名(实际参数表)对于实现计算功能的函数,函数调用通常出现在两种情况:赋值语句volume=cylinder(radius,height);输出函数的实参printf(“%f”,cylinder(radius,height));•如果实参表列包含多个实参,则各参数间用逗号隔开。•实参应与形参一一对应,类型匹配•如果是调用无参函数,则“实参表列”可以为空,但括号不能省略3.函数参数•函数调用作为另一函数调用时的实参如m=max(a,max(b,c));其中max(b,c)是一次函数调用,它的值作为max另一次调用的实参•调用函数时,必须提供实际参数(实参:函数调用时提供的参数值)。如果实参表列包含多个实参,则各参数间用逗号隔开•实参应与形参一一对应,类型匹配•主调函数把实参值复制给被调函数的形参的过程,称为参数传递•函数调用的一般形式为:函数名(实参表列);•如果是调用无参函数,则“实参表列”可以为空,但括号不能省略2.函数调用的过程计算机在执行程序时,从主函数main开始执行,如果遇到某个函数调用,主函数被暂停执行,转而执行相应的函数,该函数执行完后,将返回主函数,然后再从原先暂停的位置继续执行。函数遇return返回主函数分析函数调用的过程#includestdio.hintmain(void){doubleheight,radius,volume;doublecylinder(doubler,doubleh);printf(Enterradiusandheight:);scanf(%lf%lf,&radius,&height);volume=cylinder(radius,height);printf(Volume=%.3f\n,volume);return0;}doublecylinder(doubler,doubleh){doubleresult;result=3.1415926*r*r*h;returnresult;}调用函数实参形参执行函数中的语句返回调用它的地方函数的返回值1.函数返回值与return语句函数的返回值是通过函数中的return语句来获得的。(1)return语句的一般格式:return(返回值表达式);return语句后面的括号可以不要(2)return语句的功能:返回到调用函数,并将“返回值表达式”的值带给调用函数。返回值表达式可以是常量、变量、表达式和函数调用•一个函数中可以有一个以上的return语句,执行到某个return语句立刻结束函数返回主调函数注意:为了明确表示不返回值,用void定义成函数类型。同时在函数定义中,可以有返回语句return;,也可以不带返回语句,那么当函数执行到最后一个花括号时,自动返回。3.参数传递函数定义时的参数被称为形式参数(简称形参)doublecylinder(doubler,doubleh);函数调用时的参数被称为实际参数(简称实参)volume=cylinder(radius,height);参数传递:实参形参主调函数把实参值复制给被调函数的形参的过程,称为参数传递。在参数传递过程中,实参把值复制给形参。形参和实参一一对应:数量一致,类型一致,顺序一致形参:变量,用于接受实参传递过来的值实参:常量、变量或表达式单向传递•函数被调用才能执行。除了main(),其他函数如果不被调用的话,即使定义了也不能执行。•其他函数不能调用main函数,main函数可以看作是由系统调用的。main函数的返回值返回给操作系统,其余被调函数的返回值返回给主调函数•调用函数的函数称为主调函数,被调用函数称为被调函数。•如果函数本身调用自己:称为递归函数函数的调用函数调用时的数据传递1.对于有参函数,主调函数和被调函数间有数据传递关系。•定义函数时的参数称为形式参数,简称形参。形参在该函数未被调用时是没有确定的值,只是形式上的参数•调用函数时的参数称为实参,实参可以是变量、常量或表达式,有确定的值,是实实在在的参数。主调函数把实参值复制给被调函数的形参的过程,称为参数传递2.实参和形参间的数据传递–在调用函数过程中,系统会把实参的值传递给被调用函数的形参。或者说,形参从实参得到一个值–该值在函数调用期间有效,可以参加被调函数中的运算–切记:实参的个数、类型和顺序,应该与被调用函数所要求的形参个数、类型和顺序一致,才能正确地进行数据传递。•注意:函数定义时的形参不占内存,只有发生调用时,形参才被分配临时内存空间,接受从实参传过来的值。函数的参数传递实参和形参
本文标题:chap05_函数
链接地址:https://www.777doc.com/doc-2905067 .html