第7章_函数.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《第7章_函数.ppt》由会员分享,可在线阅读,更多相关《第7章_函数.ppt(72页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1第一节第一节 C C函数概述函数概述第二节第二节 C C函数的定义函数的定义第三节第三节 函数参数和函数值函数参数和函数值第四节第四节 函数的调用函数的调用第五节第五节 函数的嵌套调用函数的嵌套调用第六节第六节 函数的递归调用函数的递归调用第七节第七节 数组作为函数的参数数组作为函数的参数第八节第八节 全局变量和局部变量全局变量和局部变量第九节第九节 变量的存储类别变量的存储类别第十节第十节 内部函数和外部函数内部函数和外部函数2第一节第一节 C C函数概述函数概述void print_mess()void print_mess()printf printf(How do you do!n)
2、;(How do you do!n);void printstar()void printstar()printf printf(*n);(*n);main()main()printstar();printstar();print_mess();print_mess();printstar();printstar();3源文件1函数n函数2函数1源文件m源文件2一个C程序 一个C程序的源文件.4函数的调用:函数的调用:主函数只能是主调函数,也是主控函数;其它函数之间可以互相调用,即其它函数既可以是主调函数也可以是被调函数。函数的分类:函数的分类:从用户使用的角度来分:标准函数,即系统函数标准函
3、数,即系统函数用户自定义函数用户自定义函数从函数的形式来分:有参函数有参函数无参函数无参函数5第二节第二节 C C函数的定义函数的定义无参函数的定义无参函数的定义类型标识符类型标识符 函数名()函数名()声明部分声明部分语句语句说明:这种函数在调用时不需要从主调函数中获得数据。这种函数一般用来实现一定的功能,如打印一行星号等。一般也没有返回值。有参函数的定义有参函数的定义类型标识符类型标识符 函数名(形式参数说明表列)函数名(形式参数说明表列)声明部分声明部分语句语句说明:这种函数在调用时需要从主调函数中获得数据,从而对相应数据进行处理。一般有返回值。6例如:intmax(intx,inty)
4、intz;z=xy?x:y;returnz;对形参声明的传统方式对形参声明的传统方式int max(x,y)int x,y;int z;z=xy?x:y;return z;空函数空函数的定义的定义数据类型函数名数据类型函数名()作用:作用:相当于预留一个位置,相当于预留一个位置,以便于对整个程序的扩充。以便于对整个程序的扩充。7第三节第三节 函数参数和函数参数和函数的值函数的值3.1 3.1 形参和实参形参和实参3.2 3.2 函数返回值函数返回值83.1 3.1 形参和实参形参和实参形式参数形式参数:在定义函数时函数名后面:在定义函数时函数名后面的括号中的变量称为形式参数,简称的括号中的变量
5、称为形式参数,简称形参。形参。实际参数实际参数:在调用函数时,函数名后:在调用函数时,函数名后面括号中的表达式称为实际参数,简面括号中的表达式称为实际参数,简称实参。称实参。9例:例:#include#include intint max(max(int x,int yint x,int y)int z;int z;if(x=y)z=x;if(x=y)z=x;else z=y;else z=y;return(z);return(z);intint main()main()int a,b,c;int a,b,c;scanf(scanf(%d%d%d%d,&a,&b);,&a,&b);c=max(
6、c=max(a,ba,b););printf(printf(”%dn%dn,c,c););return 0;return 0;10关于形参和实参的说明:关于形参和实参的说明:1 1、形参的有效作用范围是:在其定义所在的函数、形参的有效作用范围是:在其定义所在的函数内。内。2 2、实参对形参的数据传递是值传递,即单向传递。、实参对形参的数据传递是值传递,即单向传递。只由实参传给形参。只由实参传给形参。2525abxy2525abxy113 3、形参仅在其定义所在的函数被执行时,系统才为其分配、形参仅在其定义所在的函数被执行时,系统才为其分配存储空间,退出该函数时该存储空间被系统收回。存储空间,退
7、出该函数时该存储空间被系统收回。4 4、当形参是变量,对应的实参可以是常量、变量、表达式、当形参是变量,对应的实参可以是常量、变量、表达式或数组元素,但必须有确定的值,如或数组元素,但必须有确定的值,如:max(2,b):max(2,b)。调用。调用时会将实参的值赋给形参变量。当形参是数组名,对应时会将实参的值赋给形参变量。当形参是数组名,对应的实参可以是数组名或指针变量。的实参可以是数组名或指针变量。5 5、实参传递给形参的实际值必须与函数定义中的参数类型、实参传递给形参的实际值必须与函数定义中的参数类型一致。一致。123.2 3.2 函数返回值函数返回值函数返回值的实现是通过控制语句:函数
8、返回值的实现是通过控制语句:return(表达式表达式);实现的,在使用时应注意以下几点:实现的,在使用时应注意以下几点:1.一个函数中可以有一个以上的一个函数中可以有一个以上的return语句语句2.return后面可以是一个表达式,后面可以是一个表达式,括号可以省略括号可以省略。3.如果如果return语句中表达式的类型与函数值的类型语句中表达式的类型与函数值的类型不一致,以函数类型为准。不一致,以函数类型为准。4.如果被调函数中如果被调函数中没有没有return语句,则带回的是一语句,则带回的是一个不确定的值。为了明确表示不带返回值,个不确定的值。为了明确表示不带返回值,可可以用以用vo
9、id定义无类型定义无类型。13#include int main()int max(float x,float y);float a,b;int c;scanf(%f,%f,&a,&b);c=max(a,b);printf(max is%dn,c);return 0;int max(float x,float y)float z;z=xy?x:y;return(z);1.52.62.62变为变为214第四节函数的调用第四节函数的调用4.1函数调用的一般形式函数调用的一般形式4.2函数调用的方式函数调用的方式4.3对被调函数的声明和函数原型对被调函数的声明和函数原型154.1 4.1 函数调用的
10、一般形式函数调用的一般形式 函数名(函数名(实参表实参表);例如例如:exch(exch(a,ba,b););exch(int exch(int x x,int,int y y)实参的实参的逐个逐个传递与形参。传递与形参。16 4.24.2 函数的几种调用方式函数的几种调用方式 printstar();printstar();print_mess();print_mess();c=max(a,b);c=max(a,b);1.1.函数调用作为语句函数调用作为语句2.2.表达式中的函数调用表达式中的函数调用3.3.函数调用作为实在参数。函数调用作为实在参数。printf(%dn,max(a,b);
11、printf(%dn,max(a,b);174.3 4.3 被调用函数的声明被调用函数的声明1.1.被调函数必须是已经被调函数必须是已经存在存在的函数。的函数。2.2.如果使用库函数,必须在本文件开头加上用如果使用库函数,必须在本文件开头加上用#include命令将调用有关库函数时所用的信息包命令将调用有关库函数时所用的信息包含到本文件中。例如:含到本文件中。例如:#include”stdio.h”3 3、如果是、如果是调用自己定义的函数调用自己定义的函数,函数调用语句之,函数调用语句之前使用前使用函数声明语句函数声明语句对该被调用函数作声明对该被调用函数作声明。声明形式为:声明形式为:类型标
12、识符类型标识符 被调函数名(形参类型标识符)被调函数名(形参类型标识符);4 4、函数原型、函数原型“函数定义”与“函数声明”的区别?18#includeintmain()floatadd(floatx,floaty);floata,b,c;printf(Pleaseenteraandb:);scanf(%f,%f,&a,&b);c=add(a,b);printf(sumis%fn,c);return0;float add(float x,float y)float z;z=x+y;return(z);求两个实数之和,求两个实数之和,函数值也是实型函数值也是实型对对add函数声明函数声明19#
13、includeintmain()floatadd(floatx,floaty);floata,b,c;printf(Pleaseenteraandb:);scanf(%f,%f,&a,&b);c=add(a,b);printf(sumis%fn,c);return0;float add(float x,float y)float z;z=x+y;return(z);只差一个分号只差一个分号20#includeintmain()floatadd(floatx,floaty);floata,b,c;printf(Pleaseenteraandb:);scanf(%f,%f,&a,&b);c=add
14、(a,b);printf(sumis%fn,c);return0;float add(float x,float y)float z;z=x+y;return(z);定义定义add函数函数调用调用add函数函数21函数原型的一般形式有两种:函数原型的一般形式有两种:如 float add(float x,float y);float add(float,float);原型说明可以放在文件的开头,这时所有原型说明可以放在文件的开头,这时所有函数都可以使用此函数函数都可以使用此函数22第五节第五节函数的嵌套调用函数的嵌套调用在程序的执行过成中,当调用一个函数时,在该函数中又在调用另一个函数。mai
15、n函数函数调用调用a函数函数结束结束a函数函数调用调用b函数函数b函数函数即即可以嵌套调用函数可以嵌套调用函数,但函数不能嵌套定义但函数不能嵌套定义23例例7.5输入输入4个整数,找出其中最大的数。用个整数,找出其中最大的数。用函数的嵌套调用来处理。函数的嵌套调用来处理。解题思路:解题思路:main中调用max4函数,找4个数中最大者max4中再调用max2,找两个数中的大者max4中多次调用max2,可找4个数中的大者,然后把它作为函数值返回main函数main函数中输出结果24#includeintmain()intmax4(inta,intb,intc,intd);inta,b,c,d,
16、max;printf(Pleaseenter4integernumbers:);scanf(%d%d%d%d,&a,&b,&c,&d);max=max4(a,b,c,d);printf(Max=%dn,max);return0;intmax4(inta,intb,intc,intd)intmax2(inta,intb),m;m=max2(a,b);m=max2(m,c);m=max2(m,d);returnm;intmax2(inta,intb)if(ab)returna;elsereturnb;25intmax4(inta,intb,intc,intd)intmax2(inta,intb);
17、intm;m=max2(a,b);m=max2(m,c);m=max2(m,d);return(m);max4函数函数ruturn max2(max2(max2(a,b),c),d);int max2(int a,int b)return(ab?a:b);26intmax4(inta,intb,intc,intd)intmax2(inta,intb);ruturnmax2(max2(max2(a,b),c),d);int max2(int a,int b)return(ab?a:b);#include int main()max=max4(a,b,c,d);27第六节第六节函数的递归调用函数的
18、递归调用当函数被调用时,又同时调用自身,被称为函数当函数被调用时,又同时调用自身,被称为函数递归调用递归调用。递归实现:递归实现:递归公式;递归结束的条件。使用递归解决某些问题时很容易实现,但应注意:使用递归解决某些问题时很容易实现,但应注意:递归次数太多会使内存减少;不要出现无穷递归,也就是说应有结束递归的条件。28例例7.6age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10age(2)=12age(3)=14age(4)=16age(5)=18回推阶段递推阶段已知intage(intn)intc;if(
19、n=1)c=10;elsec=age(n-1)+2;return(c);age(n)=10n=1;age(n)=age(n-1)+2n1;29#include int age(int n)int c;if(n=1)c=10;else c=age(n-1)+2;return(c);int main()printf(No.5,age:%dn,age(5);return 0;age(5)输出age(5)c=age(4)+2c=age(3)+2c=age(2)+2c=age(1)+2c=10age函数n=5age函数n=4age函数n=3age函数n=2age函数n=1mainage(5)=18age
20、(4)=16age(3)=14age(2)=12 age(1)=1030例例7.7用递归方法求!。用递归方法求!。解题思路:解题思路:求!也可以用递归方法,即!等于!,而!,!可用下面的递归公式表示:31#includeintfac(intn)intf;if(n=0|n=1)f=1;elsef=fac(n-1)*n;return(f);intmain()intfac(intn);intn;inty;scanf(%d,&n);y=fac(n);printf(%d!=%dn,n,y);return0;递归结束条件递归结束条件n=0递归公式递归公式调用递归函数调用递归函数32fac(5)输出输出fa
21、c(5)mainf=fac(4)5fac函数函数n=5f=fac(3)4fac函数函数n=4f=fac(1)2fac函数函数n=2f=fac(2)3fac函数函数n=3f=1fac函数函数n=1fac(1)=1fac(2)=2fac(3)=6fac(4)=24fac(5)=12012033第七节第七节 数组作为函数的参数数组作为函数的参数7.1 7.1 数组元素作为函数的实际参数数组元素作为函数的实际参数数组元素的引用与一般变量的引用是一样的,传递的是数组元素的值,属于“值传递”方式。34#includeintmain()intmax(intx,inty);inta10,m,n,i;print
22、f(“10integernumbers:n);for(i=0;i10;i+)scanf(%d,&ai);printf(n);例例 7.9输入输入1010个数,要求输出其中值最大的元素和该数个数,要求输出其中值最大的元素和该数是第几个数。是第几个数。35for(i=1,m=a0,n=0;im)m=max(m,ai);n=i;printf(“largestnumberis%dn,m);printf(“%dthnumber.n“,n+1);int max(int x,int y)return(xy?x:y);367.2 7.2 数组名作为函数的实际参数数组名作为函数的实际参数C C语语言言中中的的数
23、数组组名名代代表表了了数数组组在在内内存存中中存存放放的的起起始始地地址址,所所以以数数组组名名作作为为函函数数的的参参数数传传递递的的是是数数组组的的起起始始地地址址,属属于于“传地址传地址”,是一种双向传递的方式。,是一种双向传递的方式。说明:说明:(1 1)用用数数组组名名作作为为函函数数的的参参数数,必必须须对对实实参参数数组组先先定定义义,形参必须说明成与实参数组类型一致的数组。形参必须说明成与实参数组类型一致的数组。(2 2)形形参参数数组组和和实实参参数数组组的的数数组组名名可可以以不不一一样样,数数组组的的大大小小也也可可以以不不一一致致。由由于于传传递递的的是是地地址址,所所
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内