版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第五章第五章 函函 数数3教学目标l(1) 了解函数在程序设计中的作用;了解函数在程序设计中的作用;l(2) 掌握函数的定义方法;掌握函数的定义方法;l(3) 掌握函数调用和参数传递的机制和方法;掌握函数调用和参数传递的机制和方法;l(4) 了解变量的作用域和生存期的概念。了解变量的作用域和生存期的概念。4基本内容 l5.1概述概述l5.2 函数的定义和调用函数的定义和调用l5.3 函数间参数传递函数间参数传递55.1 概述l函数是构成程序的基本模块,每个函数完成一个计函数是构成程序的基本模块,每个函数完成一个计算或执行一个特定动作,具有相对独立的功能。算或执行一个特定动作,具有相对独立的功能
2、。l通过函数,可以把一个复杂任务分解成为若干个易通过函数,可以把一个复杂任务分解成为若干个易于解决的小任务。充分体现结构化程序设计由粗到于解决的小任务。充分体现结构化程序设计由粗到精,逐步细化的设计思想。精,逐步细化的设计思想。lC/C+提供三种类型的函数:提供三种类型的函数:l主函数主函数main( )l标准库函数标准库函数l用户自定义函数用户自定义函数6 函数调用层次关系lmain()函数是程序执行的入口,它可以调用其他函数。函数是程序执行的入口,它可以调用其他函数。而其他一般函数既可以调用也可以被调用。而其他一般函数既可以调用也可以被调用。main ( )fun2( )fun1( )fu
3、n3( )fun1_1( )fun2_1( )fun2_2( )75.2 函数的定义和调用l5.2.1 函数的定义函数的定义l5.2.2 函数的调用函数的调用l5.2.3 函数声明函数声明85.2.1 函数的定义l函数必须先定义,后使用。函数必须先定义,后使用。l定义函数的一般格式为:定义函数的一般格式为:函数类型函数类型 函数名函数名(形式参数表形式参数表) 说明语句;说明语句;执行语句;执行语句; return 表达式;表达式;函数体9函数类型l函数类型:即调用该函数后所得到的函数值的类型,函数类型:即调用该函数后所得到的函数值的类型,它由函数体内部的它由函数体内部的return语句提供。
4、语句提供。lreturn 表达式;表达式; lreturn语句提供的表达式的值类型必须与函数类型一致。语句提供的表达式的值类型必须与函数类型一致。l如果某一函数确没有返回值,则使用说明符如果某一函数确没有返回值,则使用说明符void。l例如:主函数的另一种形式例如:主函数的另一种形式void main() 注意:注意:这时函数中不能出现有返回值的这时函数中不能出现有返回值的return语句。语句。10参数说明l形式参数表形式参数表 (形参(形参 )表示将从调用函数中接收哪)表示将从调用函数中接收哪些类型的数据些类型的数据l参数说明格式为:参数说明格式为:变量类型变量类型 形参形参1,变量类型,
5、变量类型 形参形参2,变量类型,变量类型 形参形参nl例:例:int array, int count, doulbe distance11函数体l函数体本身是一个分程序,由语句和其他分程函数体本身是一个分程序,由语句和其他分程序组成。序组成。l语句分为说明语句和执行语句两类。语句分为说明语句和执行语句两类。l对某具体变量来说,应先说明,后使用。对某具体变量来说,应先说明,后使用。125.2.2 函数的调用l函数要先定义,后调用。函数要先定义,后调用。l调用函数时要考虑到函数本身的参数调用函数时要考虑到函数本身的参数:l调用标准库函数时,要包含相应的头文件调用标准库函数时,要包含相应的头文件l
6、输入输入/输出函数输出函数 iostreaml字符串函数字符串函数 cstringl常用数学函数常用数学函数 cmathl调用自定义函数时,要定义相应的实参,并给这些实参调用自定义函数时,要定义相应的实参,并给这些实参赋值。赋值。l 函数名函数名 ( 实参列表实参列表 )l实参与形参必须一一对应实参与形参必须一一对应: “虚实结合虚实结合” “类型一致、位置一致、个数一致类型一致、位置一致、个数一致”13例5-1 求阶乘n!l算法分析:算法分析:l计算公式为:计算公式为: n!= n(n-1)321, 且且0!=1l此函数只需传入一个表示整数运算对象的数据,故设一此函数只需传入一个表示整数运算
7、对象的数据,故设一个形式参数个形式参数nl函数的计算结果要返回主调函数,故设一个变量函数的计算结果要返回主调函数,故设一个变量resultln的阶乘结果可由一重循环来求得的阶乘结果可由一重循环来求得main( )函数函数调用调用fac(3)函数函数fac(3)return 6 主程序后主程序后续语句续语句#include using namespace std;int fac(int n)int result = 1;if(n = 0)return 1;while (n1)result = result * n;n-;return result;int main()int m, r;cout
8、m;r = fac(m) ;cout m ! = r endl;return 0;15函数间的信息交换l调用函数和被调用函数之间的信息交换是通过调用函数和被调用函数之间的信息交换是通过参数的结合和参数的结合和return语句来实现的。语句来实现的。l数据流程是:数据流程是:l在调用函数中,先给实参赋值在调用函数中,先给实参赋值l通过函数调用,将数据从调用函数带到被调用函数通过函数调用,将数据从调用函数带到被调用函数l形参带值后,被调用函数即可进行相应的数据处理形参带值后,被调用函数即可进行相应的数据处理l如果有返回值,通过如果有返回值,通过return语句带回到调用函数语句带回到调用函数165
9、.2.3 函数声明l函数(原型)声明函数(原型)声明l将某函数的定义放在调用它的函数之后时,必须在被将某函数的定义放在调用它的函数之后时,必须在被调用到之前对该函数先做说明调用到之前对该函数先做说明l函数声明的一般格式为:函数声明的一般格式为:函数类型函数类型 函数名函数名 ( 形式参数表形式参数表 );17例 5-2:函数声明的使用绝对值函数 #include using namespace std;int abs(int x);/ 函数声明函数声明int main()/ 主函数主函数int m = -5;cout |m| = abs(m) =0?x:-x;/ 使用问号表达式直接计算并返回结
10、果使用问号表达式直接计算并返回结果运行结果:运行结果:|m| = 5185.3 函数间的参数传递l形参:在参数表中声明的参数(变量)叫做函形参:在参数表中声明的参数(变量)叫做函数的形式参数。数的形式参数。 l实参:在调用函数时,一般须为每一个形参给实参:在调用函数时,一般须为每一个形参给出其实际数据,即实际参数。出其实际数据,即实际参数。 l实参与形参有实参与形参有3 3种结合方式:种结合方式:值调用、引用调用和地址调用。值调用、引用调用和地址调用。19值调用l值调用值调用l在调用时仅将实参的值赋给形参在调用时仅将实参的值赋给形参l在函数中对形参的任何修改不会影响到实参的值。在函数中对形参的
11、任何修改不会影响到实参的值。l优点:优点:l减少了调用函数与被调用函数之间的数据依赖,增减少了调用函数与被调用函数之间的数据依赖,增强了函数自身的独立性。强了函数自身的独立性。l缺点:缺点:l被调用函数向调用函数传递的数据仅有一个返回值,被调用函数向调用函数传递的数据仅有一个返回值,有时显得不够用。有时显得不够用。/例例 5-3:交换两个变量的值:交换两个变量的值(值调用值调用)#include using namespace std; void swap(int x, int y)int tmp;tmp = x;x = y;y = tmp;/ 测试函数测试函数 swap() 用的主函数用的主
12、函数int main( ) int a = 1, b = 2;cout Before exchange:a= a ,b= b endl;swap(a, b);cout After exchange:a= a ,b= b endl;return 0;运行结果:运行结果:(不成功不成功)Before exchange:a=1,b=2After exchange:a=1,b=2215.4 变量的作用域和生存期l5.4.1 变量的作用域变量的作用域l5.4.2 变量的生存期变量的生存期225.4.1 变量的作用域l根据作用域的不同,可将程序中的变量分为根据作用域的不同,可将程序中的变量分为局局部变量部
13、变量和和全局变量全局变量l局部变量是在函数或分程序中说明的变量,只能在局部变量是在函数或分程序中说明的变量,只能在本函数或分程序的范围内使用。本函数或分程序的范围内使用。l全局变量说明于所有函数之外,可以为本源程序文全局变量说明于所有函数之外,可以为本源程序文件中位于该全局变量说明之后的所有函数共同使用。件中位于该全局变量说明之后的所有函数共同使用。l全局变量可以在各个函数之间建立数据传输通道,全局变量可以在各个函数之间建立数据传输通道,但滥用会破坏程序的模块化结构。但滥用会破坏程序的模块化结构。l如出现同名变量,遵循如出现同名变量,遵循“地方保护主义地方保护主义”原则。原则。#include
14、 using namespace std;int x;/ 声明全局变量声明全局变量int f1() / 在函数在函数f1()使用全局变量使用全局变量xreturn (x+5)*(x+5);int f2(int y)int x =y+5;/ 函数函数f2()中声明了一个名为中声明了一个名为x的局部变量的局部变量return x*x;int main()x = 3;/ 在主函数中为全局变量在主函数中为全局变量x赋值赋值cout调用函数调用函数f1()的结果:的结果:f1()endl;cout调用函数调用函数f2()的结果:的结果:f2(2)endl;coutx = xendl;return 0;运
15、行结果:运行结果:调用函数调用函数f1()的结果:的结果:64调用函数调用函数f2()的结果:的结果:49x = 3 245.4.2 变量的生存期l根据生存期的不同,可将程序中的变量分为根据生存期的不同,可将程序中的变量分为自动自动变量变量和和静态变量静态变量l自动变量自动变量(auto)的生存期是说明了自动变量的函数或分的生存期是说明了自动变量的函数或分程序。它对存储空间的利用是动态的。其初值在每次程序。它对存储空间的利用是动态的。其初值在每次为自动变量分配存储后都要重新设置。为自动变量分配存储后都要重新设置。l静态变量静态变量(static)的生存期就是整个程序的运行期。在的生存期就是整个
16、程序的运行期。在程序开始运行前就为其分配相应的存储空间,在程序程序开始运行前就为其分配相应的存储空间,在程序的整个运行期间一直占用,直到结束。的整个运行期间一直占用,直到结束。25例5-5:自动变量的使用#include using namespace std;int func()int count = 0;/ 定义自动局部变量并初始化定义自动局部变量并初始化count+;return count;int main()/ 分别调用分别调用10次次func( ) 函数函数for(int i=0; i10; i+)coutfunc()t;coutendl;return 0;运行结果:运行结果:1
17、1 1 1 1 1 1 1 1 1 26例5-6:静态局部变量的使用#include using namespace std;int func()static int count = 0;/ 声明静态局部变量并初始化声明静态局部变量并初始化count+;return count;/ 本函数每执行一次,变量值加本函数每执行一次,变量值加1int main()/ 分别调用分别调用10次次func( ) 函数函数for(int i=0;i10;i+)coutfunc()t;coutendl;return 0;运行结果:运行结果:1 2 3 4 5 6 7 8 9 10 27扩展阅读l5.5 函数的嵌
18、套和递归调用函数的嵌套和递归调用l5.6带默认形参值的函数带默认形参值的函数l5.7函数重载函数重载l5.8函数模板函数模板285.5 函数的嵌套和递归调用l5.5.1 函数的嵌套函数的嵌套l5.5.2 递归调用递归调用295.5.1 函数的嵌套30例5-7 求两个整数的最小公倍数 l算法分析算法分析l两个正整数的最小公倍数可以由下面公式计算出来:两个正整数的最小公倍数可以由下面公式计算出来:两个正整数的最小公倍数两个正整数的最小公倍数=两数乘积两数乘积两数的最大公约数两数的最大公约数l求最大公约数的辗转相除法:求最大公约数的辗转相除法:l步骤步骤1: 如果如果p q,交换,交换p 和和q;l
19、步骤步骤2: 求求p/q的余数的余数r;l步骤步骤3: 如果如果r =0,则,则 q 就是所求的结果就是所求的结果; 否则,反否则,反复做如下工作:令复做如下工作:令p = q,q = r,重新计算,重新计算 p 和和q 的的余数余数r,直到,直到r =0为止,则为止,则 q 就是原来的两正整数就是原来的两正整数的最大公约数。的最大公约数。#include using namespace std;int gcd(int p, int q)/求最大公约数求最大公约数int r;if(pq) r = p; p = q;q = r;r = p%q; while(r != 0) p = q; q =
20、r; r = p%q;return q;int lcm(int p, int q) /求最小公倍数求最小公倍数return p*q/gcd(p, q);int main()int p, q;cout p q;cout 两个整数的最小公倍数是:两个整数的最小公倍数是: lcm(p, q) endl;return 0;325.5.2 递归调用l当定义一个函数时,如果其函数体内有调当定义一个函数时,如果其函数体内有调用其自身的语句,则该函数称为递归函数。用其自身的语句,则该函数称为递归函数。l一个直接或间接地调用了自身的算法就是一个直接或间接地调用了自身的算法就是递归算法。递归算法。33例例5-8
21、5-8 采用递归算法求采用递归算法求n!n!l算法:算法:由阶乘的概念可以写出其递归定义:由阶乘的概念可以写出其递归定义: 0! = 1 n! = n*(n-1)!#include using namespace std;int fac(int n) / 函数函数fac():求阶乘的递归函数:求阶乘的递归函数if(n=0)/ 0!=1return 1;elsereturn n*fac(n-1);/ n!=n*(n-1)!int main()int n;cout n;cout n ! = fac(n) endl;return 0;35递归函数的调用顺序递归函数的调用顺序当当n取取5时,产生下列调
22、用序列:时,产生下列调用序列: 回代结果:回代结果:fac(5)= 5 *fac(4) fac(5)=5*4*3*2*1fac(4)= 4 *fac(3) fac(4)=4*3*2*1fac(3)= 3 *fac(2) fac(3)=3*2*1fac(2)= 2 *fac(1) fac(2)=2*1fac(1)= 136递归基本定理递归基本定理l一个问题是否可以转换为递归来处理一个问题是否可以转换为递归来处理必须满足以下条件:必须满足以下条件:l(1) 必须包含一种或多种非递归的基必须包含一种或多种非递归的基本形式;本形式;l(2) 一般形式必须能最终转换到基本一般形式必须能最终转换到基本形式
23、;形式;l(3) 由基本形式来结束递归。由基本形式来结束递归。375.6 带默认形参值的函数l在函数定义时,可在形参列表中预先给一些默在函数定义时,可在形参列表中预先给一些默认值。认值。l当调用这种函数时,若为相应参数给出实参,当调用这种函数时,若为相应参数给出实参,则用实参初始化对应形参;如果没给出,则自则用实参初始化对应形参;如果没给出,则自动采用预先给定的默认形参值。动采用预先给定的默认形参值。l注意:注意:l要保证所有的缺省参数均放在参数表的最后,即默要保证所有的缺省参数均放在参数表的最后,即默认参数值必须按从右向左的顺序声明。如:认参数值必须按从右向左的顺序声明。如:void fun
24、c(int x, int n1 = 1, int n2 = 2);38例 5-9:带默认形参值的函数#include using namespace std;void func(int x = 1, int y = 2, int z = 3)/ 带默认形参值的函数带默认形参值的函数cout 参数参数x:xendl;cout 参数参数y:yendl;cout 参数参数z:zendl;int main()cout 未给出实参值的情况:未给出实参值的情况:endl;func();cout 给出给出1个实参值的情况:个实参值的情况:endl;func(10);cout 给出给出2个实参值的情况:个实参
25、值的情况:endl;func(20, 30);cout 给出给出3个实参值的情况:个实参值的情况:endl;func(20, 30, 40);return 0;395.7函数重载l函数重载函数重载:l一组参数和返回值不同的函数共用一个函数名。一组参数和返回值不同的函数共用一个函数名。l注意:注意:l重载函数之间必须在重载函数之间必须在参数的类型参数的类型或或个数个数方面有所不方面有所不同。只有返回值类型不同的几个函数不能重载。同。只有返回值类型不同的几个函数不能重载。#include using namespace std;int max(int x, int y)/求两个整型数的最大值求两个
26、整型数的最大值return (xy)?x:y;double max(double x, double y)/求两个双精度数的最大值求两个双精度数的最大值return (xy)?x:y;char max(char x, char y)/求两个字符的最大值求两个字符的最大值return (xy)?x:y;int main()int m1=5, m2=3;double d1=12.5, d2=6.4;char c1=a, c2=b;coutm1和和m2中的最大值是中的最大值是: max(m1, m2) endl;coutd1和和d2中的最大值是中的最大值是: max(d1, d2) endl;cou
27、tc1和和c2中的最大值是中的最大值是: max(c1, c2) endl;return 0;415.8 函数模板l函数模板用于定义一个抽象通用的函数,从而函数模板用于定义一个抽象通用的函数,从而能够对不同类型的数据进行相同的处理。能够对不同类型的数据进行相同的处理。l定义一个函数模板的格式为:定义一个函数模板的格式为:template 函数类型函数类型 函数名函数名 ( 形式参数表形式参数表 ) 函数体函数体42例 5-11:求最大值的函数模板#include using namespace std;template T tmax(T a, T b)/求两个数据最大值的函数模板求两个数据最大
28、值的函数模板return ab?a:b;int main()int m1=5, m2=3;double d1=12.5, d2=6.4;char c1=a, c2=b;coutm1和和m2中的最大值是中的最大值是: tmax(m1, m2) endl;coutd1和和d2中的最大值是中的最大值是: tmax(d1, d2) endl;coutc1和和c2中的最大值是中的最大值是: tmax(c1, c2) endl;return 0;43上机指导l5. 9 Visual C+的跟踪调试功能的跟踪调试功能44(1)Restart(快捷键:(快捷键:Ctrl+Shift+F5)(2)Stop De
29、bugging(快捷键:(快捷键:Shift+F5)(3)Break Execution:(4)Apply Code Changes(快捷键:(快捷键:Alt+F10)(5)Show Next Statement(快捷键:(快捷键:Alt+Num *)(6)Step Into(快捷键:(快捷键:F11)(7)Step Over(快捷键(快捷键F10)(8)Step Out(快捷键:(快捷键:Shift+F11)(9)Run To Cursor(快捷键:(快捷键:Ctrl+F10)Debug工具栏45应用举例l例例5-12显示出杨辉三角形的前显示出杨辉三角形的前10行行l算法讨论:算法讨论:l杨
30、辉三角形的每一项也可以用二项式杨辉三角形的每一项也可以用二项式 的展开式的系数来表示。的展开式的系数来表示。l杨辉三角形的通项公式杨辉三角形的通项公式 l求解杨辉三角形的步骤为:求解杨辉三角形的步骤为:l编写出阶乘函数编写出阶乘函数l在主函数中调用阶乘函数来构造杨辉三角形的通在主函数中调用阶乘函数来构造杨辉三角形的通项公式,循环显示输出项公式,循环显示输出 )!( !mnmnnba)(#include #include using namespace std;int fac(int n)/求求n!的函数的函数int result=1;while(n1)result =result*n;n=n-
31、1;return result;int main()for(int n=0; n10; n=n+1)for(int m=0; m=n; m=m+1)coutfac(n)/(fac(m)*fac(n-m)t;coutendl;return 0;47例 5-13:找出100-200之间的所有素数#include using namespace std;bool isprime(int a)for(int i=2; i=a/2; i+)if(a%i = 0)return false; return true;int main()for(int m=100; m=200; m+)if(isprime(
32、m) coutmt;return 0;48例 5-14 根据用户输入的宽和高的数目,显示一个由“*”号组成的矩形#include using namespace std;void rectangle(int w,int h)int i, j;for(j=0; jw; j+) cout*;/ 显示矩形上面的边显示矩形上面的边coutendl;for(i=1; ih-1; i+)/ 显示矩形侧边显示矩形侧边cout*;for(j=1; jw-1; j+) cout ;cout*endl;for(j=0; jw; j+) cout*;/ 显示矩形下面的边显示矩形下面的边coutendl;int main()int w, h;coutwh;rectangle(w, h);return 0;49例 5-15:当用户输入一个整数和数字后,能够统计出
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年洞庭文旅职业学院单招综合素质考试模拟试卷(原创题)附答案详解
- 2025年安徽省滁州市高职单招职业技能考试模拟试卷及参考答案详解【培优A卷】
- 2024年滨州现代物流学院高职单招职业技能考试模拟试卷带答案详解(考试直接用)
- 2026年宁夏石嘴山星海职业学院高职单招职业技能考试题库含完整答案详解【夺冠系列】
- 2026年嘉峪关产业职业学院高职单招职业适应性测试考试模拟试卷附参考答案详解(研优卷)
- 2025年鹤壁淇河职业学院单招综合素质考试题库含完整答案详解【夺冠】
- 2025年河南机电职业学院高职单招职业适应性测试考试模拟试卷(B卷)附答案详解
- 2025年陕西铁路工程职业技术学院高职单招职业技能考试模拟试卷及答案详解参考
- 2027年辽宁省鞍山市单招职业技能考试题库含完整答案详解【夺冠】
- 2027年湖南娄底娄星职业学院高职单招职业适应性测试考试题库及完整答案详解【全优】
- GB/T 47559-2026风能发电系统风力发电机组塔架结构安全监测方法
- 2025年海南省中考道德与法治试题(试卷+解析)
- 2026中国工商银行河南省分行纪检人才专项社会招聘考试备考题库及答案解析
- 机关支部2026年上半年意识形态工作总结
- 西陵区网格员考试真题试卷
- 露天矿山无人驾驶车辆运行安全技术规范
- 施工阶段成本控制目标方案
- 铜仁市2025-2026学年高考冲刺押题(最后一卷)数学试卷(含答案解析)
- 农业执法队考勤制度
- 抖音电商培训全套
- 2026年及未来5年中国天津市酒店行业发展趋势预测及投资战略研究报告
评论
0/150
提交评论