C++程序设计 4章 函数.ppt

大学C++程序设计教程-杨国兴及例题-课件PPT

收藏

资源目录
跳过导航链接。
大学C程序设计教程-杨国兴及例题-课件PPT.zip
C++程序设计教程-杨国兴及例题-PPT演示文稿
C++程序设计教程-杨国兴及例题-PPT课件文件
C++程序设计教程-杨国兴及例题-大学教学资料
(课件资料)《C++程序设计教程》-杨国兴-电子教案及例题
压缩包内文档预览:(预览前20页/共43页)
预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图
编号:21836152    类型:共享资源    大小:1.57MB    格式:ZIP    上传时间:2019-09-06 上传人:QQ24****1780 IP属地:浙江
25
积分
关 键 词:
大学 C++ 程序设计 教程 杨国兴 例题 课件 ppt
资源描述:
大学C++程序设计教程-杨国兴及例题-课件PPT,大学,C++,程序设计,教程,杨国兴,例题,课件,ppt
内容简介:
第4章 函数,4.1 函数的定义和使用 4.2 函数的参数传递 4.3 函数的嵌套调用 4.4 函数的递归调用 4.5 内联函数 4.6 函数重载 4.7 带默认形参值的函数 4.8 函数的存储类别,4.1 函数的定义与使用,系统库函数:需要包含相应的头文件,如 #include 系统所提供的库函数都是完成一些通用功能的函数,在实际的程序设计中,自己还需要编写大量完成特殊功能的函数,我们称之为用户自定义函数。 4.1.1 函数的定义 函数定义的一般格式为: 函数类型 函数名( 形式参数表) 语句组 ,第4章 函数,例4.1 求两个整数中较大的值的函数,#include int max(int x, int y); void main() int a,b,c; cout a b; c = max(a,b); cout y) m=x; else m=y; return m; ,程序运行结果为: 请输入两个整数,用空格分隔:20 30 a,b中较大的数是:30,第4章 函数,函数调用语句,主调函数,被调函数,4.1 函数的定义与使用,4.1.1 函数的定义(续一) 1. 函数类型与返回值 函数的类型就是函数返回值的类型,可以是C+中的任何数据类型。 函数的返回值由函数体中的return语句给出。 return语句的一般格式为: return (表达式); 或 return 表达式; 或 return ; 函数的类型要与return语句的返回值类型相同。若不一致则以函数类型为准,将返回值类型转换为函数类型,若不能转换,则编译过程会出错! 若函数不需要返回值,则应将类型指定为void。,第4章 函数,执行该语句时,不带回返回值,只是返回主调函数,4.1 函数的定义与使用,4.1.1 函数的定义(续二) 2. 函数的参数 函数通过参数接收数据。 函数头中的参数为形式参数(或形参),在函数调用时给出的参数称为实际参数(或实参)。 实参必须是一个实际的值,而形参只有在发生实际调用时才有具体的值。 如果不需要为函数提供数据,则可以没有参数,称之为无参函数。,第4章 函数,4.1 函数的定义与使用,4.1.2 函数的声明与调用 函数调用的一般格式: 函数名(实际参数表) 注意:若无形参,也不必给出实参,但括号不能省略。 实参与形参个数应一致,类型要一一对应。 函数原型声明:在调用函数前,对函数进行说明。通常用于函数定义出现在函数调用之后的情况。 函数原型声明的一般格式: 函数类型 函数名(形式参数表); 注意:函数原型中可以不写出参数名。 如:double power(double, int);,第4章 函数,例4.2 编写一个求x的n次方的函数,#include double power(double x, int n); void main() double x; int n; cout x n; cout x “的“ n “次方是:“ power(x,n) endl; double power(double x, int n) double a = 1.0; int i; for(i=1; i=n; i+) a *= x; return a; ,程序运行结果为: 请输入X和N的值,用空格分隔:3.0 4 3的4次方是:81,第4章 函数,4.2 函数的参数传递,根据函数的功能,函数的形参可以选择为数值、引用或指针三种形式。 4.2.1 值传递 C+中参数的传递是单向的,即只能将实参的值传递给形参,而形参值的改变对实参没有影响。 例4.3 写一个函数交换主函数中两个变量的值 考虑:使用值传递,将需要交换的变量作为实参传递给函数的形参,在函数体中完成交换值的过程,这种做法能否实现程序要求?,第4章 函数,例4.3 源程序,#include void swap(int x, int y); void main() int a, b; a = 10; b = 20; swap(a, b); cout a “, “ b endl; ,程序运行结果为: 10,20,void swap(int x, int y) int temp; temp = x; x = y; y = temp; ,第4章 函数,注意:值传递时,函数的实参与形参在内存中占用不同的存储空间,值只能由实参传递给形参,而形参的变化并不会影响实参。因此不能完成程序功能。,4.2 函数的参数传递,4.2.2 使用引用 1. 引用的概念 引用是一种特殊的变量,可以认为是一个变量的别名。 定义引用的一般格式: 类型说明符 首先定义变量a,并初始化为1,然后定义引用b,并初始化为a,即b是a的别名,因此a和b是同一个单元。 注意:定义引用时一定要初始化,指明该引用变量是谁的别名。,第4章 函数,例4.4 引用的使用,#include void main() int a=1; int c=10; int ,程序运行结果: 1,1,10 10,10,10 20,20,10,定义引用b,并将其作为a的别名,第4章 函数,将c的值赋给b,不是将b作为c的别名,4.2 函数的参数传递,4.2.2 使用引用(续一) 2. 引用作为函数的参数 例4.5 写一个函数,用引用作为参数,交换函数中两个变量的值。,第4章 函数,#include void swap(int x, int y); void main() int a, b; a = 10; b = 20; swap(a, b); cout a “, “ b endl; ,void swap(int ,程序运行结果为: 20,10,4.2 函数的参数传递,4.2.2 使用引用(续二) 例4.5程序运行过程中参数值的变化图示,第4章 函数,注意:引用作参数时,函数的实参与形参在内存中共用存储单元,因此形参的变化会使实参同时变化。,4.3 函数的嵌套调用,函数的嵌套调用是指,在执行被调用函数时,被调用函数又调用了其它函数。 嵌套调用的执行过程:,第4章 函数,例4.6 求1! + 2! + n!,#include long f1(int n); long f2(int m); void main() int n; long s; cout n; s = f1(n); cout s endl; ,第4章 函数,long f1(int n) / 求1!+2!+n! int i; long sum = 0; for(i=1; i=n; i+) sum += f2(i); return sum; long f2(int m) / 求m! int i; long s = 1; for(i=1; i=m; i+) s *= i; return s; ,程序运行结果: 请输入n的值:5 153,例4.7 输入两个整数,求平方和,#include int fun2(int m); int fun1(int x,int y); void main(void) int a,b; cout a b; cout “a、b的平方和:“ fun1(a,b) endl; int fun1(int x, int y) return ( fun2(x) + fun2(y) ); int fun2(int m) return ( m*m ); ,第4章 函数,程序运行结果: 请输入两个整数:4 5 a、b的平方和:41,4.4 函数的递归调用,一个函数在它的函数体内,直接或间接地调用它自身,称为递归调用。这种函数称为递归函数。 直接或间接调用函数自身的情况如图:,第4章 函数,直接调用,间接调用,这两种递归调用都是无中止地调用自身,显然是不正确的。为了 防止递归调用无终止地进行,必须在函数内有终止递归调用的手段。,例4.8 用递归的方法求 n!,分析:计算n!的公式为: 1 n =1或 0 y = n*(n-1)! n 0 可以将求n!转化为求(n-1)!,再继续转化为求(n-2)!,到1时应停止递归 #include long power(int n); void main() int n; long y; cout n; y=power(n); cout n “!=“ y endl; ,第4章 函数,long power(int n) long f; if(n1) f=n*power(n-1); else f=1; return f; ,例4.8的递归过程分析,第4章 函数,例4.9 Hanoi塔问题,有三根针A、B、C,A针上有n个盘子,盘子大小不等,大的在下,小的在上,如图所示。要求将这n个盘子从A针移到C针,在移动过程中可以借助B针,每次只能移动一个盘子,并且在移动过程中三根针上的盘子都保持大盘在下,小盘在上。 分析:将n个盘子从A针移到C针可以分解为以下三个步骤: (1)将A针上的n-1个盘子借助C针移到B针上; (2)将A针上剩下的一个盘子移到C针上; (3)将B针上的n-1个盘子借助A针移到C针上。,第4章 函数,A,B,C,例4.9 Hanoi塔问题源程序,#include void Move(char x, char y); void Hanoi(int n, char one, char two, char three); void main() int n; cout n; cout “ y endl; ,第4章 函数,例4.9 Hanoi塔问题源程序(续),/函数Hanoi()将n-1个盘子从one针借助two针移到three针 void Hanoi(int n, char one, char two, char three) if(n=1) Move(one, three); else Hanoi(n-1, one, three, two); Move(one, three); Hanoi(n-1, two, one, three); ,第4章 函数,程序运行结果: AC AB CB AC BA BC AC,运行演示,4.5 内联函数,内联函数与一般函数的区别在于它不是在调用时发生控制转移,而是在编译时将被调函数体嵌入到每一个函数调用处,节省了参数传递、控制转移等开销。对于一些规模较小、频繁调用的函数可声明为内联函数,能提高程序运行效率。 内联函数的定义: inline 类型说明符 函数名(参数及类型表) 函数体 注意:只有简单的函数才能成为内联函数,如函数体中不能有循环语句和switch语句等。 内联函数的定义必须出现在内联函数第一次被调用之前。,第4章 函数,例4.10 使用内联函数,#include inline int Add(int a, int b) int x; x = a+b; return x; ,第4章 函数,程序运行结果:10+20=30 10+50=60 50+50=100,void main() int a, b, c; a = 10; b = 20; c = Add(a,b); cout a “ + “ b “ = “ c endl; c = Add(a,50); cout a “ + 50 “ “ = “ c endl; c = Add(50,50); cout “50 + 50 “ “ = “ c endl; ,4.6 函数重载,在C+中可以定义多个相同名字的函数,只要它们形参的个数或类型不完全一致即可,编译程序根据实参与形参的类型及个数自动确定调用哪一个同名函数,这就是函数重载,这些同名函数称为重载函数。 例4.12 定义两个函数,分别求两个整数及两个实数的最大值。 分析:在C语言中,要定义题中的函数,只能使用两个不同名函数实现,即定义 int max1(int x, int y) double max2(double x, double y) 在C+中,可通过定义两个重载函数实现,二者同名,如下: int max(int x, int y) double max(double x, double y),第4章 函数,例4.12 源程序,#include int max(int x, int y); double max(double x, double y); void main() int a=10, b=20 ,c; double x=200.3, y=400.6, z; c = max(a,b); z = max(x,y); cout c “ “ z endl; ,第4章 函数,程序运行结果:int function float function 20,400.6,int max(int x, int y) cout y) return x; else return y; double max(double x, double y) cout y) return x; else return y; ,4.7 带默认参数值的函数,4.7.1 带默认参数值的函数 在函数的声明或定义中可以预先给出默认的形参值,函数调用时,按从左到右的次序将实参和形参结合,如给出对应的实参,则采用实参值,否则采用预先给出的默认形参值 。 例4.13 使用带默认参数值的函数求x的n次方(n是正整数)。,第4章 函数,#include double power(double x=10.0, int n=2); void main() cout power(3, 5) endl; cout power(3) endl; cout power() endl; ,double power(double x, int n) int i; double s=1.0; for(i=1; i=n; i+) s *= x; return s; ,4.7 带默认参数值的函数,4.7.1 带默认参数值的函数(续) 注意:默认形参值必须由右向左的顺序定义。如果某个参数有默认值,则其右面的参数必须都有默认值;如果某个参数没有默认值,则其左面的参数都不能有默认值。例如: int max(int a, int b=10, int c=20); /正确 int max(int a, int b=10, int c); /错误 int max(int a=5, int b, int c=30); /错误 在后两种情况下,调用语句 x = max(20, 30); 会出错! 注意:在使用带默认参数值的函数时,只能在函数定义或函数声明中的一个位置给出默认值,不能在两个位置同时给出。还要保证在函数调用之前给出默认值。,第4章 函数,4.7 带默认参数值的函数,4.7.2 带默认参数值函数产生的二义性 例4.14程序,第4章 函数,#include int add(int x=5, int y=6); float add(int x=5, float y=10.0); void main() int a; float b; a= add(10,20); b= add(10); cout “a= “ a endl; cout “b= “ b endl; ,int add(int x, int y) return x+y; float add(int x, float y) return x+y; ,b=add(10)语句产生二义性,可以认为该语句是调用第一个函数,也可以是第二个,因此编译器不能确定调用的是哪一个函数。,4.8 变量的存储类别,4.8.1 内部变量与外部变量 1. 内部变量 在一个函数内部定义的变量是内部变量(也称为局部变量),它只在该函数范围内有效。 例如:,第4章 函数,void f1(int a) int b,c; void main() int m,n; ,int i,a; for(i=0; i10; i+) int b; ,注意:在不同的作用范围内允许声明同名的变量,4.8 变量的存储类别,4.8.1 内部变量与外部变量(续) 2. 外部变量 在函数外部定义的变量是外部变量(也称为全局变量),它不属于任何一个函数。它的作用范围是:从外部变量的定义位置开始,到本文件的结尾。 例如:,第4章 函数,int a,b; void f1( ) int x,y; void main() ,例4.15 使用全局变量和局部变量,#include int i=1; /全局变量,文件作用域 void main() cout“全局变量 i=“iendl; /输出1 int i=5; /函数局部变量,块作用域 int i; /块局部变量,块作用域 i=7; cout“块局部变量 i=“iendl; /输出7 cout“全局变量 i=“:iendl; /输出1,:使用全局变量 cout“函数局部变量 i=“iendl; /输出5 cout“全局变量 i=“:iendl; /输出1,:使用全局变量 ,第4章 函数,程序运行结果:全局变量 i=1 块局部变量 i=7 全局变量 i=1 函数局部变量 i=5 全局变量 i=1,4.8 变量的存储类别,4.8.2 变量的存储类别 变量在内存中的存储方式可以分为两大类,即静态存储方式与动态存储方式。 静态存储方式是指在程序运行期间,分配固定的存储空间。全局变量和静态局部变量是静态存储方式。 动态存储方式是在程序执行过程中,根据需要动态地分配存储空间。局部变量是动态存储方式。 1. 静态变量 定义形式: static 数据类型 变量名 特点:程序运行过程中变量始终存在,每次调用函数结束的值都被保留下来。 仅初始化一次,每次调用它所在的函数时,不再重新初始化。若不指定初值,自动指定初值为0。,第4章 函数,例4.16 输出14的阶乘,#include int fact( int n); void main() int i; for(i=1; i=4; i+) cout i “! = “ fact(i) endl; int fact(int n) static int f=1; /仅在第一次调用函数时执行一次 f *= n; return f; ,第4章 函数,程序运行结果: 1!=1 2!=2 3!=6 4!=24,4.8 变量的存储类别,4.8.2 变量的存储类别(续) 2. 自动变量 定义形式: auto 数据类型 变量名 特点:定义变量时,若不指定static或auto,则默认为自动变量。自动变量是动态存储方式。 每次调用它所在的函数时,都要重新分配存储空间,并初始化。函数调用结束,存储空间就释放。 若不初始化,则初值是不确定的。,第4章 函数,例4.17 静态变量与动态变量的使用,#include void other(void); int i=1; / i 为全局变量,具有静态生存期。 void main(void) static int a; / a为静态局部变量,具有全局寿命,局部可见。 int b=-10; / b, c为动态局部变量,具有局部生存期。 int c=0; cout“-MAIN-n“; cout“ i: “i“ a: “a“ b: “b“ c: “cendl; c=c+8; other(); cout“-MAIN-n“; cout“ i: “i“ a: “a“ b: “b“ c: “cendl; i=i+10; other(); ,第4章 函数,例4.17 静态变量与动态变量的使用(续),void other(void) / a,b为静态局部变量,具有全局寿命,局部可见, / 只第一次进入函数时被初始化。 static int a=2; static int b; int c=10; / C为动态局部变量,每次进入函数时都初始化。 a=a+2; i=i+32; c=c+5; cout“-OTHER-n“; cout“ i: “i“ a: “a“ b: “b“ c: “cendl; b=a; ,第4章 函数,程序运行结果: -MAIN- i: 1 a: 0 b: -10 c: 0 -OT
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
提示  人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:大学C++程序设计教程-杨国兴及例题-课件PPT
链接地址:https://www.renrendoc.com/p-21836152.html

官方联系方式

2:不支持迅雷下载,请使用浏览器下载   
3:不支持QQ浏览器下载,请用其他浏览器   
4:下载后的文档和图纸-无水印   
5:文档经过压缩,下载后原文更清晰   
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

网站客服QQ:2881952447     

copyright@ 2020-2025  renrendoc.com 人人文库版权所有   联系电话:400-852-1180

备案号:蜀ICP备2022000484号-2       经营许可证: 川B2-20220663       公网安备川公网安备: 51019002004831号

本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知人人文库网,我们立即给予删除!