《C语言程序设计实用教程》课件第5章 函数.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《C语言程序设计实用教程》课件第5章 函数.ppt》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言程序设计实用教程 C语言程序设计实用教程课件第5章 函数 语言程序设计 实用教程 课件
- 资源描述:
-
1、5.1 函数的定义与调用函数的定义与调用5.2 函数的参数传递函数的参数传递5.3 函数的重载函数的重载5.4 函数嵌套与递归函数嵌套与递归5.5 返回指针类型的函数返回指针类型的函数5.6 指向函数的指针指向函数的指针5.7 变量的作用域与可见性变量的作用域与可见性5.8 变量的存储类型和生存期变量的存储类型和生存期5.9 C 程序的多文件结构程序的多文件结构5.10 编译预处理编译预处理第第5章章 函数函数n模块化程序设计思路:模块化程序设计思路:n在设计一个较大的程序时,往往把它分为若干在设计一个较大的程序时,往往把它分为若干个模块,每一个模块用一个函数(模块单位)个模块,每一个模块用一
2、个函数(模块单位)实现实现.n一个函数一个函数(过程过程):完成一个具体的、独立的完成一个具体的、独立的功能。功能。n函数是处理问题过程的一种抽象,函数编函数是处理问题过程的一种抽象,函数编写好后,有利于代码的重用写好后,有利于代码的重用.第第5章章 函数函数n程序结构:由一个主函数和若干个其他程序结构:由一个主函数和若干个其他函数构成函数构成.n主函数调用其他函数,其他函数也可以互相调主函数调用其他函数,其他函数也可以互相调用用5.1 函数的定义与调用函数的定义与调用n5.1.1函数的定义函数的定义n5.1.2函数的调用函数的调用5.1.1 函数的定义函数的定义n程序中用到的所有函数,程序中
3、用到的所有函数,一般要一般要“先定先定义义函数函数,然然后后调用调用”n定义定义函数时指明:函数时指明:n函数函数名字名字、n函数函数返回值类型返回值类型、n参数的个数与类型参数的个数与类型n函数实现的函数实现的功能功能。5.1.1 函数的定义函数的定义n函数的声明格式函数的声明格式:返回值类型 函数名(形式参数表)/函数头 语句序列 /函数体函数声明例子:求函数声明例子:求阶乘阶乘n!n!long Factor(int n)long Factor(int n)long s=1;long s=1;for(i=1;i=n;i+)for(i=1;ib?a:b;return ab?a:b;函数的调用
4、:c=max(2,3);5.1.1 函数的定义函数的定义 2.返回类型返回类型(2)如果返回类型不写,则默认的返回类型为如果返回类型不写,则默认的返回类型为int。例如:main()return 0;该函数的返回类型是int。函数体中应有:return expression;5.1.1 函数的定义函数的定义 2.返回类型返回类型 (3)返回类型为返回类型为void,表示函数调用后无返回值,表示函数调用后无返回值n在函数体中可不写在函数体中可不写return语句,函数调用执行到函数语句,函数调用执行到函数体的最后一个右括号体的最后一个右括号“”,将自动返回到调用者。,将自动返回到调用者。n如果写
5、如果写return语句,在语句,在return之后必须不带返回值。之后必须不带返回值。例如:5.1.1 函数的定义函数的定义void printHello()printf(“Hello,every one!n”);return;/可缺省可缺省函数的调用:printHello();printHello()3.return 语句的一般格式:语句的一般格式:return 表达式;nreturn语句语句:使程序流程从函数调用中返回,表达使程序流程从函数调用中返回,表达式的值就是函数调用的返回值。式的值就是函数调用的返回值。n如果函数没有返回值(返回类型为如果函数没有返回值(返回类型为void时),则时
6、),则return语句中的表达式省略。语句中的表达式省略。5.1.1 函数的定义函数的定义main()()Y=f(2);int f(int x)return x*x;4.形式参数表形式参数表 指明该函数所需要的若干参数和这些参数的类指明该函数所需要的若干参数和这些参数的类型,各参数之间用逗号分开。型,各参数之间用逗号分开。形式参数表的格式:形式参数表的格式:类型类型1 形参形参1,类型类型2 形参形参2,类型类型n 形参形参n5.1.1 函数的定义函数的定义int max(int x1,int x2).int max(int x1,x2).error 4.形式参数表形式参数表 函数无参数时函数
7、无参数时:形式参数表为空形式参数表为空(void)。例如:例如:5.1.1 函数的定义函数的定义 f()等同于:等同于:f(void)5.1.1 函数的定义函数的定义函数的声明格式函数的声明格式:返回值类型返回值类型 函数名(函数名(形式参数表形式参数表)语句序列语句序列 5.函数头与函数体函数头与函数体函数头:定义了函数的功能是什么,怎样调用它。函数头:定义了函数的功能是什么,怎样调用它。函数体:定义功能的具体实现过程代码。调用时,函数体:定义功能的具体实现过程代码。调用时,只需关心函数头,而无需关心函数体。只需关心函数头,而无需关心函数体。函数头函数头函数体函数体5.1.2 函数的调用函数
8、的调用n函数定义好后,就可以被其它函数调用函数定义好后,就可以被其它函数调用被调用的函数叫做被调用的函数叫做Called,调用者叫做,调用者叫做Calling。1.函数调用的一般格式:函数调用的一般格式:函数名(实参表)函数名(实参表)实参表是用逗号分开的实参。实参表是用逗号分开的实参。(1)实参表与形参表匹配:实参表与函数定义中实参表与形参表匹配:实参表与函数定义中形参表的形参类型和形参个数要一一匹配。形参表的形参类型和形参个数要一一匹配。5.1.2 函数的调用函数的调用long Factor(int n)long Factor(int n).函数调用形式函数调用形式:k=Factor(5)
9、;K=Factor(5.0)float max(float x1,float x2)函数调用形式函数调用形式:float x=10.0f;y=89.7f,z=-78.7f;m=max(x,y);m=max(x,y,z);m=max(max(x,y),z);m=max(2,3);m=max(2.0,3);m=max(2.0f,3);例如例如:2.0 类型类型doublex5.1.2 函数的调用函数的调用(1)函数的调用无返回值(返回类型函数的调用无返回值(返回类型void),函数调用可函数调用可作为一条语句单独出现。作为一条语句单独出现。void printHello()void printHe
10、llo()函数调用形式函数调用形式:printHello();例如例如:5.1 函数的定义与调用函数的定义与调用n书写函数时注意:书写函数时注意:(1)程序中如果定义了多个函数,这些函数定)程序中如果定义了多个函数,这些函数定义在书写上应该是并列的关系,而不是嵌套义在书写上应该是并列的关系,而不是嵌套的关系。的关系。例如例如,一个源程序有三个函数组成一个源程序有三个函数组成:void f1(float x)void f2(int x)int main()int main()void f1(float x)void f2(int x)5.1 函数的定义与调用函数的定义与调用n书写函数注意点:书写
11、函数注意点:(2)遵循)遵循“函数定义在前、调用在后函数定义在前、调用在后”原则。原则。n如果如果“函数调用在前、定义在后函数调用在前、定义在后”,则函数调,则函数调用之前必须书写用之前必须书写函数原型函数原型。n函数原型函数原型的格式的格式:函数头函数头;例如:例如:void f1(float x);或或 void f1(float);n在函数原型中形式参数的名字可以不写。在函数原型中形式参数的名字可以不写。5.1 函数的定义与调用函数的定义与调用n书写函数时要注意点:书写函数时要注意点:例如,函数定义在前,函数调用在后的情形:例如,函数定义在前,函数调用在后的情形:void f1(floa
12、t x)void f2(int x)int main()float a=3.0;f1(2.0);f2(a);5.1 函数的定义与调用函数的定义与调用n书写函数时要注意点:书写函数时要注意点:例如,函数定义在后,函数调用在前的情形:例如,函数定义在后,函数调用在前的情形:void f1(float);/函数原型函数原型,省略了形参名,省略了形参名void f2(int x);/函数原型函数原型int main()f1(2.0f);f2(10);void f1(float x)/函数定义函数定义void f2(int x)/函数定义函数定义函数定义,函数原型,函数调用有啥区别?函数定义,函数原型,
13、函数调用有啥区别?5.1 函数的定义与调用函数的定义与调用n函数调用的执行过程函数调用的执行过程:例例5-1 编写求编写求xn的函数。的函数。n解题思路:求解题思路:求xn的函数定义为函数:的函数定义为函数:double power(double x,int n)int i;double xn=1;for(i=1;i=n;i+)xn*=x;return xn;void main()int n;double x;printf(x,n=?);scanf(%lf,%d,&x,&n);printf(%.4fn,power(x,n);x,n=?12.5,2156.2500double power(dou
14、ble x,int n)int i;double xn=1;for(i=1;i=n;i+)xn*=x;return xn;例例5-2 输出输出10000之内的所有完全数。之内的所有完全数。n解题思路解题思路:完全数是指等于其所有因子和(包括完全数是指等于其所有因子和(包括1但不包但不包括这个数本身)的数。括这个数本身)的数。例如,例如,6123,6123,则,则6是完全数是完全数1.定义两个函数:定义两个函数:int isPerfect(int x),用于判断,用于判断x是否完全数;是否完全数;void displayPerfect(int x),用于输出,用于输出x的因子之和的的因子之和的式
15、子。式子。2.在在main()函数中使用一个函数中使用一个for循环,检查循环,检查1到到10000之之间的所有整数是否为完全数。间的所有整数是否为完全数。#include int isPerfect(int x);/函数原型,判断函数原型,判断x是否完全数是否完全数void displayPerfect(int x);/函数原型,输出函数原型,输出x的因子之和的公式的因子之和的公式void main()int x;for(x=1;x10000;x+)if(isPerfect(x)displayPerfect(x);int isPerfect(int x)int y=0,i;/y存放因子之和存
16、放因子之和for(i=1;ix;i+)if(x%i=0)/i是是x的因子时,加到的因子时,加到yy+=i;if(y=x)return 1;elsereturn 0;void displayPerfect(int x)/输出输出x的因子之和的公式的因子之和的公式 int i;printf(%d=,x);for(i=1;ix;i+)if(x%i=0)if(i!=1)printf(+);printf(%d,i);printf(n);printf(i=1?%d:+%d,i);5.2 函数的参数传递函数的参数传递n函数的调用者如何将实际参数值传递给函数的调用者如何将实际参数值传递给被调用者?被调用者?n
17、C语言的参数传递方式:语言的参数传递方式:n按值传递按值传递n按地址传递。按地址传递。nC+语言增加:语言增加:n按引用传递按引用传递5.2.1 按值传递按值传递n按值传递:按值传递:n当函数的形参为非指针类型时,则此形参是当函数的形参为非指针类型时,则此形参是值参数。值参数。n函数调用时,将实参的值传递给对应的形参。函数调用时,将实参的值传递给对应的形参。n单方向传递。不会因为被调用函数中对形参单方向传递。不会因为被调用函数中对形参值的改变而影响实参的值。值的改变而影响实参的值。5.2.1 按值传递按值传递例例5-3 按值传递的例子。按值传递的例子。void swap(int x,int y
18、)int hold;hold=x;x=y;y=hold;printf(x=%d,y=%dn,x,y);void main()int a=1,b=2;swap(a,b);printf(a=%d,b=%dn,a,b);x=2,y=1a=1,b=2xab1212y实参形参传值5.2.2 按地址传递按地址传递 n按地址传递:按地址传递:n当函数的形参为指针类型时,则当函数的形参为指针类型时,则形参是地址变量。形参是地址变量。n函数调用时,是将实参的地址传递给对应的形参指函数调用时,是将实参的地址传递给对应的形参指针变量。针变量。void swap(int*x,int*y)swap(&a,&b)给形参传
19、是变量的地址值给形参传是变量的地址值5.2.2 按地址传递按地址传递例例5-4利用地址参数将两变量的值进行交换。利用地址参数将两变量的值进行交换。void swap(int*x,int*y)int hold;hold=*x;*x=*y;*y=hold;printf(x=%d,y=%dn,*x,*y);void main()int a=1,b=2;swap(&a,&b);printf(a=%d,b=%dn,a,b);x=2,y=1a=2,b=1实参:实参:12a(1000)b(1004)&b形参:形参:&axy*x *y给形参传的值是变量的地址给形参传的值是变量的地址5.2.2 按地址传递按地址
20、传递n地址形参对应的实际参数是变量地址。地址形参对应的实际参数是变量地址。n在子函数的函数体中,使用指针取内容在子函数的函数体中,使用指针取内容运算。运算。如:如:*xn给形参指向的实参对象赋新值,从而改变实给形参指向的实参对象赋新值,从而改变实参的值。参的值。例例5-5 定义一函数求一元二次方程的实根。定义一函数求一元二次方程的实根。n解题思路:定义求实根的函数解题思路:定义求实根的函数:int computRoots(double a,double b,double c,double*x1,double*x2)n参数参数a,b,c是值参是值参nx1,x2是地址参数,用以返回两实根是地址参数
21、,用以返回两实根n返回类型返回类型int,标志一元二次方程是否有实根,标志一元二次方程是否有实根n当返回结果为当返回结果为0时,无实根时,无实根n当返回结果为当返回结果为1时,有相同的两个实根时,有相同的两个实根n当返回结果为当返回结果为2时,有不同的两个实根时,有不同的两个实根int computRoots(double,double,double,double*,double*);/函数原型函数原型int main()double a,b,c;double x1,x2;int flag;printf(Input a,b,c?);scanf(%lf,%lf,%lf,&a,&b,&c);fla
22、g=computRoots(a,b,c,&x1,&x2);if(flag=0)printf(此方程没有实根,或此方程不是一元二次方程此方程没有实根,或此方程不是一元二次方程.n);else printf(此方程实根为:此方程实根为:x1=%8.4f,x2=%8.4fn,x1,x2);int computRoots(double a,double b,double c,double*x1,double*x2)int result;double t;if(fabs(a)1e-6)/判断判断a=0,result=0;/方程不是一元二次方程方程不是一元二次方程 else t=b*b-4*a*c;if(
23、fabs(t)1e-6)/当当t0 有两个不同的实根有两个不同的实根 *x1=(-b+sqrt(t)/(2.0*a);*x2=(-b-sqrt(t)/(2.0*a);result=2;else /无实根无实根 result=0;return result;Input a,b,c?1,-4,3此方程实根为:此方程实根为:x1=3.0000,x2=1.000005.2.3 按引用传递按引用传递(c+中提供中提供)1.引用型变量的概念引用型变量的概念 引用变量是另一个变量的别名。引用变量是另一个变量的别名。声明语句声明语句:类型类型&变量名变量名 例如例如:int n;int&m=nn当声明一个引用
24、型变量时,需要用一个已存在的变当声明一个引用型变量时,需要用一个已存在的变量对它进行初始化。量对它进行初始化。105.2.3 按引用传递按引用传递1.引用型变量的概念引用型变量的概念例如例如:int n;int&m=n;m是变量是变量n的别名的别名 对变量对变量m的访问相当于对变量的访问相当于对变量n的访问的访问 给给n分配存储单元分配存储单元,m使用使用n的存储单元的存储单元 m=10;相当于:相当于:n=10;mn5.2.3 按引用传递按引用传递2.函数的引用形参函数的引用形参n当函数的参数为引用类型时,则对形参的任何访当函数的参数为引用类型时,则对形参的任何访问等同于对实参的访问问等同于
25、对实参的访问n按引用传递是按引用传递是C+增加的参数类型,增加的参数类型,n源文件的后缀名一定要为源文件的后缀名一定要为.cpp,而不能为,而不能为.c。void swap(int&x,int&y)例例5-6利用引用参数将两变量的值进行交换利用引用参数将两变量的值进行交换n定义一函数实现两个变量值的交换,并带有两定义一函数实现两个变量值的交换,并带有两个引用参数的:个引用参数的:void swap(int&x,int&y)n调用语句调用语句 swap(a,b);注意:注意:引用形参对应的实参引用形参对应的实参,是一般的变量是一般的变量,而,而不是变量的地址。不是变量的地址。/ch5_6.cpp
展开阅读全文