资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第7章函数,学习目旳和规定:,掌握函数申明与定义。,理解并掌握函数调用时参数传递中形式参数与实际参数结合方式。,强调对main函数学习与理解。,推荐课时:,56,课时,第1页,第7章函数,在C语言中,函数实际上就是一段代码总称,例如,我们已经熟知main()函数和printf()、scanf()等函数,其中,main()函数是我们顾客自己编写一段代码,printf()和scanf()函数所对应代码是C系统已经写好,只要按照格式调用它们即可。,函数是C语言程序基本构成单元,第2页,在C语言中,可以从不一样样角度对函数进行分类。,(1)从函数角度分,可分为库函数和顾客自定义函数。,库函数:由C系统提供函数。此类函数顾客无需定义,也不必在程序中作类型阐明,只需在程序前包具有该函数原型头文献,即可在程序中直接调用。如前面反复用到过printf()、scanf()等函数。,(2)从函数有无返回值分,可分为有返回值函数和无返回值函数。,(3)从主调函数和被调函数之间数据传送角度分,可分为无参函数和有参函数。,无参函数:函数定义、函数阐明及函数调用中均不带参数,主调函数和被调函数之间不进行参数传送。,7.1,函数分类,第3页,库函数示例,第4页,顾客自定义函数示例,第5页,无参函数示例,不带参数,第6页,有参函数:也称带参函数。函数定义与函数阐明时都带参数,称为形式参数(简称形参)。函数调用时也必须给出参数,称为实际参数(简称实参)。在进行函数调用时,主调函数将实参传递给形参,供被调用函数使用。,7.1,函数分类,第7页,有参函数示例,带参数a,a为形式参数,999为实际参数,第8页,7.2,函数定义,顾客自定义函数必须定义后才能使用,函数定义即编写实现函数功能程序模块。,第9页,例7.1,使用函数:编写程序求n!(n!=12(n-1)n),第10页,分析阐明,语句第211行是main()函数即主调函数,语句第1321行是自定义函数fact(),功能是求n!。对照输出成果可以看出,程序运行时,在main函数中,输入n=10,然后调用fact函数,程序转去执行fact函数,计算出10!值,所求成果返回main()函数,输出10!值。在这个程序中包括到了函数定义、函数调用等知识点。,第11页,函数定义语法,定义函数语法形式为:,类型标识符函数名(形式参数列表),函数体;,第12页,强调阐明,类型标识符:指明本函数类型,即调用该函数后所得到函数值类型,函数值通过return语句提供。,函数名:要定义函数名字,命名要符合C对标识符规定,函数名后跟一对圆括号。,形式参数(形参):必须是变量,放在函数名后一对圆括号中,形参给出所有形参类型和名称,其语法形式为:,类型1 形参1,类型2 形参2,类型n 形参n,各参数间用逗号间隔。,假如函数没有形参,函数为无参函数,否则函数为有参函数。,第13页,强调阐明,假如函数没有形参,函数体也没有任何语句,则函数为空函数。空函数表达什么也不做,没有任何实际作用,但该函数功能可以在需要时补充上,空函数在程序设计中是常常用。空函数语法形式为:,类型标识符函数名(),第14页,函数不能嵌套定义,即在一种函数定义中不能再定义另一种函数。,由于所有函数都是平行,在定义函数时是分别进行,是互相独立,一种函数不从属于另一函数。,强调阐明,第15页,7.3,函数调用,定义一种函数后,就可以在程序中使用这个函数,称函数调用。,其中自定义函数称为“被调函数”,调用它函数称为“主调函数”。,第16页,此处为函数调用,fact为被调函数,main为主调函数,第17页,函数原型申明,C语言中调用原则库函数时,只需在程序前用#include命令包括对应头文献。,调用自定义函数时,程序要有与调用函数相对应函数定义,即在主调函数调用某函数之前应对被调用函数进行申明,这与使用变量之前要先申明变量是同样。,第18页,函数申明目旳是阐明函数类型和参数状况。函数申明一般语法形式为:,类型标识符函数名(形式参数列表);,第19页,(1)函数申明语法形式可写成两种形式:,类型标识符函数名(参数类型1,参数类型2,,参数类型n);,类型标识符函数名(参数类型1,参数名1,参数类型n,参数名n);,(2)函数原型与函数首部写法要一致,即函数类型、函数名、参数个数、参数类型和参多次序必须相似。但函数申明是C语言一条语句,必须以分号结束。,(3)在调用函数前,既不定义函数,也不申明函数,程序编译时会出错。,强调阐明,第20页,假如自定义函数放在主调函数之前,可以不申明函数原型,反之则必须在调用前申明函数原型;假如已在文献开头(所有函数前),对文献中使用函数进行了申明,则在各函数中不必对其所调用函数再作申明。例如:,int f1(int a,int b);,float f2(float m,float n);,void main()/*main函数要调用函数f1和f2*/,f1(2,3);/*调用函数f1前,不必函数f1进行申明*/,int f1(int a,int b)/*定义函数f1*/,float f2(1.2,2.8);/*调用函数f2前,不必函数f2进行申明*/,float f2(float m,float n)/*定义函数f2*/,强调阐明,第21页,函数调用语法形式,函数调用语法形式为:,函数名(实际参数列表);,【强调阐明】,(1)实际参数(实参)可以是常量、变量和表达示,各参数之间用逗号分隔。,(2)对无参函数调用时,无实际参数。,(3)函数调用方式有三种:,函数语句:把函数调用作为一种语句。函数能完毕一定操作。例如printf(“%d”,a);。,函数表达式:函数出目前一种表达式中,这种表达式称为函数表达式。这时规定函数带回一种确定值以参与表达式运算。,例如:*(,);。,函数参数:将函数调用作为一种函数实参。,例如:m=max(a,max(b,c);,其中max(b,c)是一次函数调用,它值作为max另一次调用实参。m值是a、b、c三者中最大者。,第22页,参数传递,函数调用时通过参数传递来传递数据,即将实参值传递给形参。,(1)函数定义中形参和函数调用中实参在个数、类型上应当一致,实参与形参按次序对应,一一传递数据。,(2)形参只有当调用时才临时分派寄存单元,实参一定要有确定值,可以是表达式。,(3)在参数传递过程中,将实参值复制给形参,这种传递是单向,称为“值传递”,即实参将值复制给形参,虽然形参值在函数中发生了变化,也不会影响到实参。,(4)参数传递尚有一种方式是“按址传递”,此方式要运用数组或指针实现。,第23页,(1)函数定义中形参和函数调用中实参在个数、类型上应当一致,实参与形参按次序对应,一一传递数据。,例如:,int jiaquanpingjun(float,float,float,n);/函数原型申明,void main(),;,avg=jiaquanpingjun(99.7,55.0,87.8,3);/函数调用,(2)形参只有当调用时才临时分派寄存单元,实参一定要有确定值,可以是表达式。,强调阐明,形参和实参个数、类型,一致,次序对应。,第24页,强调阐明,(3)在参数传递过程中,将实参值复制给形参,这种传递是单向,称为“值传递”,即实参将值复制给形参,虽然形参值在函数中发生了变化,也不会影响到实参。,(4)参数传递尚有一种方式是“按址传递”,此方式要运用数组或指针实现。,第25页,例7.2:值传递示例,第26页,成果为:,第27页,分析阐明:,程序中a,b是实参,x,y是形参,函数swap实现两数互换。从键盘输入a=4、b=9,执行swap(a,b)函数时,系统自动给形参x、y分派内存单元。如图7.1所示,并将实参a、b值对应传递给形参x、y,即x=4,y=9,然后执行swap函数体,互换x、y值。从程序运行成果看,数据互换前后,a值都是4,b值都是9,互换前后数据不变;而形参x、y进行了数据互换,互换前后值不一样样。这阐明参数传递是值传递,形参值不能传回给实参,形参值变化不会影响实参。,第28页,y,x,4,4,9,9,a,b,x,y,a,4,4,9,9,b,图7.1实参对形参数据传递图,第29页,函数值(函数返回值)是指函数被调用后,执行函数体中程序段所得并返回给主调函数值。,【强调阐明】,(1)函数值只能通过return语句返回主调函数,其语法形式为:,return 表达式;,或者为,return(表达式);,先求表达式值,再返回其值。,return功能一是使流程返回主调函数,宣布函数一次执行终止,二是将函数值返回主调函数。,函数中容许有多种Return语句,但每次调用只执行一种return语句,因此return语句只能返回一种值。,(2)return提供函数值类型应与函数定义中函数类型一致。假如不一致,以函数类型为准,自动进行类型转换。,(3)假如函数值为整型(int),在函数定义中可以省略类型阐明。,(4)不返回函数值函数,可以明确定义为空类型,类型标识为“void”,函数体中不得出现return语句。,函数返回值,第30页,使用函数编写程序,【例7.4】计算表达式值。,xx+1 (x=0),y=,第31页,代码1116行为自定义函数。代码29行为主调函数。代码8行在printf()函数中直接调用函数y。代码14、16行依据x取值将结果返回return到主调函数main,第32页,例7.5:,求三个正整数最大公约数。,代码8行和代码9行两次调用gcd用于求3个数最大条约数,第一次调用求a,b最大条约数,保留求得结果在g中,第二次调用求g,c最大条约数。,代码13行23行定义了求两个正整数最大公约数函数。采用算法是辗转相除法。,第33页,m,n,r,5,7,r为2,不为0,执行while循环,7%5,m=5,n=2,r=5%2,r为1,不为0,执行while循环,m=2,n=1,r=2%1,5,2,5%2,2,1,2%1,r为0,循环结束,成果保留在n中,辗转相除求最大公约数,int gcd(int m,int n),int r;,r=m%n;,while(r!=0),m=n;,n=r;,r=m%n;,return n;,请大家一定要注意和教材比较,成果为何保留在n中,第34页,例7.6:,求100以内所有素数。,第35页,第36页,成果为:,第37页,7.5函数嵌套与递归调用,C语言中不容许函数嵌套定义,但容许在一种函数中出现对另一种函数调用,这就是函数嵌套调用,即在函数中又调用其他函数。,第38页,嵌套调用,main 函数,a函数,结束,b函数,调用a函数,调用b函数,函数嵌套调用图,第39页,例7.7:,求 1!+2!+3!+n!,第40页,循环嵌套常见形式:,(3)for(;),for(;),(4)while(),do,while();,第41页,循环嵌套常见形式:,(5)for(;),while(),(6)do,for(;),第42页,break,语句,break语句通常用在循环语句和多分支语句中。,当break用于多分支语句switch中时,可使程序跳出switch而执行switch后来语句。,第43页,例6.10:,代码1924行将低于60分成绩都转换成E等级。代码25行default后break能够省略,也能够写上。读者自行测试。,百分制转换成A,B,C,D,E等级制。,第44页,当break语句用于do-while、for、while循环语句中时,可使程序终止循环而执行循环背面语句,一般break语句总是与if语句联在一起。即满足条件时便跳出循环。在多层循环中,一种break语句只向外跳一层。,第45页,例6.11:,从结果能够看出,从55开始,后面全部跳过不输出。共执行了54次循环。这正是代码7行10行if语句中执行了break语句。,第46页,6.7 continue,语句,continue语句作用是跳过循环体中剩余语句而强行执行下一次循环。,第47页,例6.12:,从结果能够看出,只跳过i=55这一次循环,共执行了99次。这正是代码7行10行if语句中执行了continue语句。,第48页,第49页,break语句和continue语句对比,第50页,例6.13:,分析阐明程序中使用泰勒级数展开式来求自然对数底e近似值,泰勒级数展开式如下:,e1+1/1!+1/2!+1/3!+1/n!,n从键盘输入。,第51页,第52页,例6.14:,分析阐明运用/41-1/3+1/5-1/7+公式求近似值,直到最终一项绝对值不不小于10-6。,第53页,代码7行用到求绝对值函数fabs,所以在代码2行要包含”math.h”。,代码14行需要将/4乘以4才能得到。,读者一定要体会代码11行中累加求值多项式中正负交替项用C代码实现。,第54页,例6.15:,分析阐明显然应当用二重循环嵌套,否则,所有*就输出在一行了。关键在于找出每行打印*个数和行号、空格个数和行号函数关系。可以提成上下部分用不一样样循环写,也可以写在一种外循环内。,第55页,第56页,第57页,代码8行和22行语句中如过加上35,钻石形状将显示在屏幕中间。,第58页,可以通过if-else语句控制行号。,第59页,分析阐明 每月第一天都在银行存入100元,按单利计息,月利率为3,求一年后本利之和。,例6.16:,第60页,第61页,例6.17:,编程计算1!+2!+3!+4!+n!,代码4行将sum,p申明为double是预防溢出。因为阶乘增加很快,况且是求阶乘和。有兴趣读者能够换成int或者long试下当从键盘输入n=20看看。,第62页,第63页,求Fibonacci数列:1,1,2,3,5,8,前40个数,即,F1=1(n=1),F2=1(n=2),Fn=Fn-1+Fn-2(n3),例6.18:,第64页,f1=1,f2=1,for i=1 to20,输出f1,f2,f1=f1+f2,f2=f2+f1,第65页,代码7行只循环了20次,是因为每次能够输出2个数。,第66页,第67页,例6.19:,读入m,k=,i=2,当ik,m被i整除,真,假,用break结束循环,i=i+1,ik+1,真,假,输出是素数,输出不是素数,第68页,第69页,求100200间所有素数。,分析阐明在上题基础上,用一种嵌套for循环即可抵达目旳。,例6.20:,第70页,第71页,第72页,作业,习题六,6.1(成果写在书本),上机习题:6.2、6.3、6.4、6.5、6.6、6.7、6.8、6.9、6.10、6.11、6.12,第73页,
展开阅读全文