专题8函数的基本概念及调用.ppt_第1页
专题8函数的基本概念及调用.ppt_第2页
专题8函数的基本概念及调用.ppt_第3页
专题8函数的基本概念及调用.ppt_第4页
专题8函数的基本概念及调用.ppt_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

专题八:函数的基本概念及调用,一、自定义函数:(把程序写成函数的形式,方便以后调用),1. 有参函数的定义的一形式,存储类型 返回类型 函数名(参数表) 函数体语句 return (表达式) ,float add( int a, int b, char x) int c; return; c=a+b; return c; 自定义函数名为add, 储类型为extern,返回类型为int,a,b为参数表,例:extern double pow(doulbe x,double y) int n; for(n=1;n=y;n+) x*=x; return x;,例 fact (int n) int s=1,k; for(k=1;k=n;k+) s=s*k; return s; 定义的fact函数省略了存储类型和返回类型,默认存储类型为extern,返回类型为int。,说明: 1)函数名和形式参数都是由用户命名的标示符,在同一程序中,函数名必须唯一;形式参数名只要在同一函数中唯一即可,可以与其他函数中的变量同名 2)c语言规定,不能在一个函数的内部再定义函数 3)返回类型是函数值的类型,如整数、实数等, 省略为int型 )若在函数的首部省略了函数返回值的类型名,把函数首部写成: 函数名(类型名 形式参数1,类型名 形式参数2 ,。) 则默认函数返回值的类型为int类型,2. 无参函数的定义的一形式 存储类型 返回类型 函数名( ) 函数体语句 说明: (1)存储类型是,有extern和static两种,省略为extern。 (2)函数的返回类型省略为int型。 (3)无参函数一般不要返回值,可用void定义,使函数没有返回值。 (4)sum() 为空函数,表示什么也不做。,01年4月 (29) 以下所列的各函数首部中,正确的是 A) void play(var :Integer,var b:Integer) B) void play(int a,b) C) void play(int a,int b) D) Sub play(a as integer,b as integer),例1以下正确的函数定义形式是: A)double fun(int x,int y) B)double fun(int x;int y) C)double fun(int x, int y); D)double fun(int x,y); 例2以下正确的函数的形式是: A) double fun(int x,int y) B)fun(int x,int y) z=x+y;return z; int z; return z; C) fun(int x, int y); D)double fun(int x,y) int x,y ; double z; double z; z=x+y; return z; z=x+y; return z;,3.函数的返回值,有的时候希望通过函数调用使主调函数能得到一个确定的值,这就是函数的返回值。 例如:max(2,3)的值是3。,1、函数的返回值是通过函数中的return语句获得的。 return 表达式; return (表达式); return;/作用只是是流程返回到调用函数,并没有确定的函数值 另:函数体内也可以没有return语句。 注意: ()return的值为返回值,它的类型与函数的返回类型要一致。若不一致,函数值的类型为准 ()函数可以没有return语句,程序执行到末尾,返回主调用函数,带回不确定值。 ()为使被调用函数不带回值,须用void定义称”空类型“,不带回值,例.下列叙述中错误的是08年9月:函数中return语句 A)用户定义的函数中可以没有return语句 B)用户定义的函数中可以有多个return语句,以便可以调用一次返回多个函数值 C)用户定义的函数中若没有return语句,则应当定义函数为void类型 D)函数的return语句中可以没有表达式,4、函数值的类型 C语言规定凡不加类型说明的函数,一律自动按整型处理;返回值类型应与return语句中的表达式类型一致,若不一致则按返回值类型为准,由系统自动进行转换;若无返回值,可用“void”定义“无类型”,02年9月 (27) C语言中,函数值类型的定义可以缺省,此时函数值的隐含类型是 A) void B) int C) float D) double,1、以下函数的类型是: fff(float x) printf(“%dn”,x*x); 与参数x的类型相同 b)void类型 c)int类型 d)无法确定,、 以下函数值的类型是01年9月 fun ( float x ) float y; y= 3*x-4; return y; int 不确定 C) void D) float,5.函数参数(每年必考),形式参数:在定义函数时函数名后面括弧中的变量名称为“形参”。 实际参数:在主调函数中调用一个函数时,函数名后面括弧中的参数(可以是一个表达式)称为“实际参数”(即“实参”)。,调用函数时的数据传递。 main() int a,b,c; scanf(“%d %d ”,int max(int x,int y) int z; z=xy?x:y; return z;,关于形参与实参的说明: 1、在定义函数中指定的形参,在未出现函数调用时,他们并不占内存中的存储单元。只有在发生函数调用时,函数max中的形参才被分配内存单元。在调用结束后,形参所占的内存单元被释放。 2、实参可以是常量、变量或表达式、函数。但要求有确定的值。 3、在被定义的函数中,必须指定形参的类型 4、实参与形参的类型应相同或赋值兼容。,22. 下面函数调用语句中func函数的实参个数是08年9月:函数的实参 func(f2(v1,v2),(v3,v4,v5),(v6,max(v7,v8); A)3 B) 4 C) 5 D) 8,答案:A,6.函数的调用形式 1、作为一条单独的语句(函数语句) add(3.3,5.4);/函数只是完成一定的操作 2、函数表达式 函数在一个表达式中出现,这个表达式叫做函数表达式,这是要求带回一个确定的值以参加表达式的运算 double c=2*add(a,b); 3、函数参数 函数调用作为另一个函数的实参 m=add(5,add(6,10);,说明: 函数调用时,函数名必须与所调用的函数名字完全一致 实参的个数与形参的个数要一致 被调函数的定义出现在主调函数后面,则主调函数要进行函数说明才能正确调用,但是被调函数的返回值为int或char类型,可以不需要进行说明,否则要在调用函数中进行相关的函数原型说明,03年9(26)若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是 A)函数调用可以作为独立的语句存在 B)函数调用可以作为一个函数的实参 C)函数调用可以出现在表达式中 D)函数调用可以作为一个函数的形参,例:请在以下程序第一行的下划线处填写适当内容,使程序能正确运行。 double max ( double,double); main() double x,y; scanf(“%lf%lf“,13.以下程序的功能是:通过函数func输入字符并统计输入字符的个数。输入时用字符作为输入结束标志。请填空。08年9月:函数说明语句 long _ /* 函数说明语句 */ main() long n; n=func(); printf(“n=%ldn“,n); long func() long m; for(m=0;getchar()!=; _); return m; ,练习, 有以下函数定义: 03年9 void fun(int n, double x) 若以下选项中的变量都已正确定义并赋值,则对函数fun的正确调用语句是 A)fun(int y,double m); B)k=fun(10,12.5); C)fun(x,n); D)void fun(n,x);, 下列函数定义中,会出现编译错误的是03年9 A)max(int x,int y,int *z) B)int max(int x,y) *z=xy ? x:y; int z; z=xy ? x:y; return z; C)max(int x,int y) D)int max(int x,int y) int z; return(xy?x:y); z=xy?x:y; return(z); , 有以下程序 float fun(int x,int y) return (x+y); main() int a=2,b=5,c=8; printf(“%3.0fn”,fun(int)fun(a+c,b),a-c); 程序运行后的输出结果是 编译出错 B)9 C) 21 D)9.0,. 以下列程序的结果为(2002年考题) #include int f(int a); main() int i; for(i=0;i3;i+) printf(“%d ”,f(2); f(int a) int b=3,c=6; return(a+b+c); 9 10 11,.以下列程序的结果为(01年) int fact( int n) int k,s=1; for(k=1;k=n;k+) s=s*k; return s; main() int s1,s2,s3; s1=fact(2); s2=fact(4); s3=fact(5); printf(“%d%d%d”,s1,s2,s3);,6.有以下程序09年3月:函数的基本调用 int f( int x,int y ) return (y-x)*x); main() int a=3,b=4,c=5,d; d=f(f(a,b),f(a,c); printf(“%dn“,d); 程序运行后的输出结果是( ) A)10 B)9 C)8 D)7,答案:B,7.有以下程序09年3月:函数的基本调用 int fun(int x,int y) if(x=y) return(x); else return(x+y)/2); main() int a=4,b=5,c=6; printf(“%dn“,fun(2*a,fun(b,c); 程序运行后的输出结果是( ) A) 3 B) 6 C) 8 D) 12,答案:B,8.有以下程序08年9月:函数的基本调用 #include #include int fun(int n) int *p; p=(int *)malloc(sizeof(int); /记得在函数部分增加malloc函数的讲解 *p=n; return *p; main() int a; a=fun(10); printf(“%dn“,a+fun(10); 程序的运行结果是 A) 0 B) 10 C) 20 D)出错,答案:C,二、函数的递归调用: 在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。前者为简单递归(考试重点),后者成为间接递归,一个问题要采用递归方法来解决时,必须符合以下三个条件 1、可以把要解的问题转化为一个新的问题,而这个新的问题的解法任于原来的解法相同,只是所处理的对象有规律的递增或递减 2、可以应用这个转化过程使问题得到解决 3、必定要有一个明确的结束递归条件,f(a,b,c) . . f(x,y,z); ,f(a,b,c) . . g(x,y); ,g(t,b) . . f(x,y,z); ,用递归方法求n! n!=1 (n=0,1) n!=n*(n-1)! (n1) #include int fact(int n) int t; if(n=0|n=1) return 1; else t=fact(n-1)*n; n=(n-1) return t;,main() int y,m; y=fact(5); printf(“%d”,y); ,练习,.有如下程序00年9月 long fib(int n) if(n2) return(fib(n-1)+fib(n-2); else return(2); main0 printf(“%dn”,fib(3); 该程序的输出结果是 2 B)4 C)6 D)8,2. 有以下程序02年9月 int f(int n) if (n=1) return 1; else return f(n-1)+1; main() int i,j=0; for(i=1;i3;i+) j+=f(i); printf(“%dn”,j); 程序运行后的输出结果是 A) 4 B) 3 C) 2 D) 1,3.有以下程序08年9月:函数的递归 #include int fun(int a, int b) if(b=0) return a; else return (fun(-a,-b); main() printf(“%dn“,fun(4,2); 程序的运行结果是 A)1 B)2 C)3 D)4,答案:B,4.有以下程序 08年4月:函数的递归 #include int f(int x) int y; if(x=0|x=1) return (3); y=x*x-f(x-2); return y; main() int z; z=f(3); printf(“%dn“,z); 程序的运行结果是 A)0 B)9 C)6 D)8,答案:C,5.以下程序的输出结果是【13】。 08年4月:函数的递归 #include void fun(int x) if(x/20) fun(x/2); printf(“%d “,x); main() fun(3); printf(“n“);,答案:13,x,k为局部变量,在主函数main()中有效,三、 函数中变量的分类,1局部变量与全局变量 在c语言中,把在函数内部或复合语句内部定义的变量,称为局部变量,也称内部变量,局部变量的作用范围只适用于所在函数或复合语句内部。注意,函数的形参属于局部变量,在函数外部定义的变量,称为全局变量,也称外部变量,全局变量一般在整个程序中起作用。,例1: int fun(int x); main() int x=5,k=2; x=fun(x); printf(“%d,%dn”,x,k); ,例2 int fun(int m) int x,k; float x,y,z; z=x+y; z=x*k; x=m; if(x0) k=2*x; printf(“%d,%dn”,x,k); return k; else return x; ,x1,y,z在复合语句中有效,x,k为局部变量,在自定义函数fun中有效,把这种定义函数内部的或复合语句内部的变量叫叫局部变量。 注意:形参是局部变量,其有效范围只能在自定义函数中有效。,float add(float x,float y); int z; main() int z=3; printf(“调用函数结果=n”,add(z,3); float add(float x,float y); float h; h=x+y+z; return h;,z为全局变量,在整个程序中起作用,把这种把定义在函数外部的变量叫全局变量,说明: (1)如把int z 放存程序文件末尾 则用 extern声明全局变量。 (2)当全局变量与局部变同名时,执行到局部变量时,局部变量起作用。,例3,1.以下叙述中不正确的是 A)在不同的函数中可以使用相同名字的变量 B)函数中的形式参数是局部变量 C)在一个函数内定义的变量只在本函数范围内有效 D)在一个函数内的复合语句中定义的变量在本函数范围内有效,练习,2.在一个C源程序文件中所定义的全局变量,其作用域为07年9月:全局变量 A)所在文件的全部范围 B)所在程序的全部范围 C)所在函数的全部范围 D)由具体定义位置和extern说明来决定范围,答案:D,答案:D,3.以下程序的运行结果是 _ 。07年4月:函数的基本调用和全局变量 int k=0; void fun(int m) m+=k; k+=m; printf(“m=%dn k=%d “,m,k+); main() int i=4; fun(i+); printf(“i=%d k=%dn“,i,k); ,练习,答案:m=4 k=4 i=5 k=5,2.用static声明局部变量(掌握),有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量已有值,就是上一次函数调用结束时的值。,f(int x) static int c=3; int b=

温馨提示

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

评论

0/150

提交评论