资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,1,第七章,函 数,第1页,2,前 言,怎样调试程序最方便?尤其对于语句较多程序。,第2页,3,7.1,、概述,7.8,、局部变量和全局变量,7.2,、,函数定义普通形式,7.3,、,函数参数和函数值,7,.4,、,函数调用,7.5,、函数嵌套调用,7.6,、函数递归调用,7.7,、数组作为函数参数,主要内容,第3页,4,7.1,、概述,一、,C,程序结构,见教材,170,页图,7-1,一个,C,程序可由一个主函数和若干个函数组成。,每个程序有且只能有一个主函数(,main),,其它函数都是“子函数”。,子函数能够相互调用,但主函数不能被调用。,第4页,5,C,程序执行从,main,函数开始,调用其它函数后,仍回到,main,函数,程序在,main,函数结束时结束;,全部子函数都说平行,任何子函数都不属于其它函数;,说 明,分类,从用户使用角度看:,标准函数和用户自定义函数,从函数形式看:,无参函数和有参函数,例,7.1,函数调用简单例子,教材,170,页例,7.1,第5页,6,7.2,函数定义普通形式,无参函数定义普通形式,有参函数定义普通形式,空函数,能够总结为,类型说明 函数名(,【,形式参数说明,】,),函数体,第6页,7,普通情况下,函数体由两部分组成:,【,局部变量说明,】,语句,第7页,8,输入两个数,输出最大值。(判断两个数最大值用函数),void main(),int a,b,c;,c=,max(a,b),;,printf(“The max is%d”,c);,int max(int x,int y),int z;,if(xy)z=x;,else z=y;,return(z),;,第八章 函数,函数调用,函数定义,第8页,9,7.3,函数参数和函数值,一个,C,程序由若干个函数组成,各函数调用时经常需要传递一些数据。即调用函数把数据传递给被调用函数,经被调用函数处理后,得到一个确定结果,在返回调用函数时,把结果带回调用函数。例,7.2,调用函数时数据传递(教材,176,页),各函数间信息往来是由,函数传递,和,返回语句,实现。,第9页,10,一、形式参数和实际参数,函数参数:用于函数间数据传递,形式参数:,定义,函数时使用参数,实际参数:,引用,函数时使用参数,说明:,定义函数时必须说明形参类型,形参只能是变量或数组;,函数被调用前,形参不占用内存,函数调用结束后,形参所占用内存将被回收;,实参能够是常量、变量或表示式;,实参加形参类型必须一致,;,C,语言中实参对形参数据传递是“值传递”,即单向传递。它仅由参数对应位置确定,与名字无关。,第10页,11,例,7.3,读程序,写出运行结果,#include,int sum(int a,int b),a=a+b;,return(a);,void main(),int a=1,b=3,c;,c=sum(a,b);,printf(“%d+%d=%dn,a,b,c);,值传递,单向传递,第11页,12,二、函数返回值,1,、返回函数值方法,假如一个函数有返回值,就必须使用,return,语句,一个函数中能够有一个以上,return,语句,但不论执行到哪个,return,语句都将结束函数调用返回主调函数,return,语句中括号能够省略,,return,后面值能够是一个表示式,2,、函数值类型,函数类型即函数值类型,省略类型说明函数是,int,型,return,语句中表示式值普通应与函数类型一致,假如不一致,则需要进行类型转换。只有数值型数据能够自动转换,第12页,13,二、函数返回值,3,、不需要返回值函数,假如函数中没有使用,return,语句,函数返回是一个不确定数值,假如一个函数不需要返回值(表示一个过程),能够用,void,做类型说明,假如一个函数被申明为,void,类型,就不允许再引用它返回值(即只能用函数语句形式调用),第13页,14,例 无返回值函数,void,swap(int x,int y),int temp;,temp=x;,x=y;,y=temp;,printstar(),printf(*);,main(),int a;,a=printstar();,printf(%d,a);,void,printstar(),printf(*);,main(),int a;,a=printstar();,printf(%d,a);,正确。函数,printstar(),没有说明类型表示整型,在,main(),中,语句,a=printstar(),;执行函数调用,因为在函数定义时没有定义返回值,所以返回一个随机整数。运行结果:*,10,10,就是返回随机整数。,错误!在编译时将提,示以下信息:,cannot convert from,void to int,即不能将,void,转换为,int,举例,第14页,15,7.4,函数调用,一、函数调用普通形式,函数名(实参列表),说明,假如调用无参函数,实参能够忽略,但括号不能省,实参个数和形参普通相等,实参加形参类型应一一对应,必要时使用类型转换,注意,不一样系统中,实参计算次序不一样。微机上普通是从右到左。为防止由此引发混乱,普通应在调用函数前计算出实参值,例,7.4,教材,180,页,第15页,16,二、函数调用方式,1,、函数语句,函数名(实参表列);,如:,printmessage(),printf(“%d”,p),2,、函数表示式,函数返回值参加运算,如:,m=max(a,b),m=3*max(a,b),3,、函数参数,如:,printf(“Max is%d”,max(a,b);,第16页,17,三、函数调用执行过程,按从右向左次序,计算实参中各表示式值,按照位置,将实参值一一对应传给形参,执行被调用函数,当碰到,return(,表示式,),语句时,计算表示式值,并返回主调函数,第17页,例,7.5,读程序,写出结果,#include,int iabs(float x),return(x0?x:-x);,void main(),float x=-1.2,y;,y=iabs(2*x);,printf(x=%f,iabs(x)=%fn,x,y);,18,第18页,19,四、函数原型说明,在程序中调用函数需满足一下条件:,被调用函数必须存在,且遵照“,先定义后使用,”标准,假如被调用函数定义在主调函数之后,(,位置,),,能够先给出原型说明,说明,库函数原型说明存放在头文件中,经过使用,include,预处理命令将这些原型说明插入程序中,第19页,20,例,7.6,编写求 程序,void main(),float c;,int m,n;,float fac(int x);,printf(“input m,n:”);,scanf(“%d%d”,c=,fac(n),/(,fac(m),*,fac(n-m),);,printf(“The result is%8.1f”,c);,第20页,float fac(int x),int i;,float t=1;,for(i=1;iy?x:y;,return(rz?r:z);,int min(int x,int y,int z),int r;,r=xy?x:y;,return(rz?r:z);,main(),调用函数,dif,输出,结束,dif,函数,max,函数,调用函数,max,调用函数,min,min,函数,第23页,24,7.6,函数递归调用,在调用一个函数过程中又出现直接或间接地调用该函数本身,成为函数,递归调用。,举例:用递归方法求,n!,。,float fac(int n),float f;,if(n0),printf(n0,dataerror!);,f=-1;,else if(n=0|n=1)f=1;,else f=fac(n-1)*n;,return(f);,void main(),int n;,float y;,printf(input a inter numer:);,scanf(%d,y=fac(n);,printf(%d!=%15.0fn,n,y);,第24页,25,7.7,数组作为函数参数,数组元素作函数实参,值传递,数组名作函数参数,地址传递,在主调函数与被调函数分别定义数组,且类型应一致,形参数组大小,(,二维数组第一维,),可不指定,形参数组名是,地址变量,第25页,26,例 数组元素与数组名,作函数参数比较,(数组元素作为参数),void,swap(int x,int y),int z;,z=x;x=y;y=z;,main(),int a2=1,2;,swap(a0,a1);,printf(a0=%dna1=%dn,a0,a1);,值传递,1,2,a,调用前,a0,a1,1,2,a,调用,a0,a1,1,2,x,y,2,1,x,y,交换,1,2,a,返回,第26页,27,例 数组元素与数组名,作函数参数比较,(数组名作为参数),void,swap,(int x,),int z;,z=x0;x0=x1;x1=z;,main(),int a2=1,2;,swap(,a,);,printf(a0=%dna1=%dn,a0,a1);,地址传递,1,2,a,调用前,1,2,a,x,调用,2,1,a,x,交换,2,1,a,返回,第27页,28,例(数组名作函数参数)求学生平均成绩,#include,float average(int stu10,int n);,void main(),int score10,i;,float av;,printf(Input 10 scores,:,n);,for(i=0;i10;i+),scanf(%d,av=,average(score,10);,printf(Average is,:,%.2f,av);,float average(,int,stu10,int n),int i;,float av,total=0;,for(i=0;in;i+),total+=stui;,av=total/n;,return av;,int stu,.,.,2,1,0,9,score,56,23,12,.,.,88,stu,第28页,29,7.8,局部变量和全局变量,局部变量,定义:在,函数内定义,,,只在本函数内有效,说明:,main,中定义变量只在,main,中有效,不一样函数中同名变量,占不一样内存单元,形参属于局部变量,局部变量可用存放类型,:,auto register static,(,默认为,auto,),第29页,30,全局变量,-,外部变量,定义:在函数外定义变量,有效范围:从定义变量位置开始到根源文件结束,应尽可能少使用全局变量,第30页,31,float f1(int a),int b,c;,.,char f2(int x,int y),int i,j;,main(),int m,n;,.,a,b,c,有效,x,y,i,j,有效,m,n,有效,int p=1,q=5;,float f1(int a),int b,c;,.,int f3(),.,char c1,c2,;,char f2(int x,int y),int i,j;,main(),int m,n;,.,c1,c2,作用范围,p,q,作用范围,第31页,32,例 不一样函数中同名变量,(,局部变量),main(),int a,b;,a=3;,b=4;,printf(main:a=%d,b=%dn,a,b);,sub();,printf(main:a=%d,b=%dn,a,b);,sub(),int a,b;,a=6;,b=7;,printf(sub:a=%d,b=%dn,a,b);,运行结果:,main:a=3,b=4,sub:a=6,b=7,main:a=3,b=4,第32页,33,float max,min;,float average(float array,int n),int i;float sum=array0;,max=min=array0;,for(i=1;imax),max,=arrayi;,else if(arrayimin),min,=arrayi;,sum+=arrayi;,return(sum/n);,main(),int i;float ave,score10;,/*Input */,ave=,average(score,10);,printf(max=%6.2fnmin=%6.2fn,average=%6.2fn,max,min,ave);,作用域,max,min,例 全局变量,第33页,
展开阅读全文