第5章 函数.ppt_第1页
第5章 函数.ppt_第2页
第5章 函数.ppt_第3页
第5章 函数.ppt_第4页
第5章 函数.ppt_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

1、July 24, 2020,1,第5章 函数,计算机教学实验中心 西安交通大学,July 24, 2020,2,本单元教学目标,介绍V+函数的 定义 说明 调用方法,July 24, 2020,3,学习要求,+函数的编写和调用方法 内联函数 函数重载 递归函数,July 24, 2020,4,授课内容,函数是构成程序的基本模块,每个函数完成一个计算或执行一个特定的动作, 具有相对独立的功能。 C+提供三种类型的函数: 主函数main() 标准库函数 用户自定义函数,July 24, 2020,5,5.1、定义和调用函数,函数必须先定义,后使用。 定义函数的一般格式为: () ,函数体,July

2、 24, 2020,6,1函数值类型说明,说明调用该函数后所得到的函数值类型,是通过函数体内部的return语句提供。 return语句提供的表达式的值的类型应与函数说明中的函数值类型一致。 如果某一函数确实没有返回值,则使用说明符void。 例如:主函数 void main() 注意这时函数中不能出现有返回值的return语句。,July 24, 2020,7,2参数说明,形参表 从主函数传递数据用到的变量 参数说明格式为: , 例: int array,int count,July 24, 2020,8,注意事项,函数类型说明可以省略,缺省是整型; 若没有返回值和参数,可使用说明符void

3、,例如,void func(void) 形参说明也有两种方式: 古典方式: max(x,y) int x,y; 现代方式: max(int X,int y) 调用函数前,必须给实参赋值,July 24, 2020,9,3函数体,函数体本身是一个分程序,由语句和其他分程序组成。 语句分为说明语句和执行语句两类。 对某具体变量来说,应先说明,后使用。,July 24, 2020,10,4. 函数间的信息交换,主函数和子函数之间的信息交换是通过参数的结合和return语句来实现的。 数据流程是: 在主程序中,先给实参赋值 通过函数调用,将数据从主函数带到子函数 形参带值后,即可进行相应的数据处理 如

4、果有结果值,通过return语句带回到主函数,July 24, 2020,11,5. 函数的调用,函数要先定义,后调用。 调用形式为:() 调用函数时要考虑到函数本身的参数; 调用标准库函数时,要包含相应的头文件 输入/输出函数 iostream.h 字符串函数 string.h 常用数学函数 math.h 调用自定义函数时,要定义相应的实参,并给这些实参赋值。 实参与形参必须一一对应: “类型一致、位置一致、个数一致”,July 24, 2020,12,6.函数声明可省略的情况,函数返回值为int,可省略声明 主函数放在程序最后,可省略声明,July 24, 2020,13,例5-1 求N的

5、阶乘n!(88),算法分析: 计算公式为: n!= n(n-1)321,且0!=1 在子函数中只需一个数据x,故设一个参数n 计算结果要返回主函数,故设一个变量result n的阶乘可在一重循环中实现 因阶乘的结果值很大,故设结果变量为长整数,July 24, 2020,14,例5-1 求N的阶乘n!(续),int fac(int n) int result=1; if(n1) result*=n; n-; return result; ,July 24, 2020,15,例5-1 求N的阶乘n!(续),#include void main() int n; coutn; coutn!=fac

6、(n)endl; ,July 24, 2020,16,5.2、函数原型,函数和变量一样,在使用之前要先说明。 函数原型的一般形式: (); 例5-3 求两数中的大数。(90),July 24, 2020,17,例5-3 求两数中的大数。,#include void main() int max(int x,int y); coutab; couty?x:y; ,July 24, 2020,18,5.3、函数间的参数传递,实参与形参有3种结合方式: 值调用、地址调用和引用调用。 形参:在参数表中声明的参数(变量)叫做函数的形式参数。 实参:在调用函数时,一般须为每一个形参给出其实际数据,即实际参

7、数。 值调用 实参与形参变量之间数据的传递是按照“值传递”的方式进行的,即在调用时仅将实参的值赋给形参,在函数中对形参值的任何修改都不会影响到实参的值。,July 24, 2020,19,值调用的特点,好处:减少了调用函数与被调用函数之间的数据依赖,增强了函数自身的独立性。 缺点:被调用函数向调用函数传递的数据仅有一个返回值,有时显得不够用,July 24, 2020,20,5.4、变 量,根据作用域的不同,可将程序中的变量分为 局部变量和全局变量 根据生存期的不同,可将程序中的变量分为 静态变量和自动变量,July 24, 2020,21,1. 局部变量和全局变量,局部变量是在函数或分程序中

8、说明的变量,只能在本函数或分程序的范围内使用。 全局变量说明于所有函数之外,可以为本源程序文件中位于该全局变量说明之后的所有函数共同使用。 全局变量可以在各个函数之间建立数据传输通道,但滥用会破坏程序的模块化结构。 如出现同名变量,遵循“地方保护主义”原则。,July 24, 2020,22,举例:局部变量和全局变量,int x;/ 说明全局变量 int func1(int x)/ 函数func1()有一个名为x的参数 y = x; . . int func2(int y) / 函数func2()中说明了一个名为x的局部变量 int x; . . void main() / 在主函数中为全局变

9、量x赋值 . . x = 0; . . ,July 24, 2020,23,2. 自动变量和静态变量,静态变量的生存期就是整个程序的运行期。在程序开始运行前就为其分配相应的存储空间,在程序的整个运行期间一直占用,直到结束。 自动变量的生存期是说明了自动变量的函数或分程序。它对存储空间的利用是动态的。其初值在每次为自动变量分配存储后都要重新设置。,July 24, 2020,24,统计调用函数func()的次数,#include int func() static int count=0; return +count; void main() for(int i=0;i10;i+) coutfu

10、nc()endl; ,July 24, 2020,25,变量在存储区内分配示意图,对用户来说,在程序中定义的变量是按符号名去应用的。呈现 在用户面前的是符 号名空间。为管理 方便,不同存储类 别的变量存于不同 的区域。 静态变量区 存放全 局变量;程序开始时分配单元,结束时释放。 动态变量区 存放局部变量;只有在函数调用时才分配单元,函数结束后,自动释放。,静态存储区,程序区,动态存储区,July 24, 2020,26,3 、寄存器变量register,寄存器变量 分配的存储单元不是存储单元,而是寄存器。在函数体内有效。 说明语句格式: register 类型说明符 变量名表; 生存周期:与

11、函数共存亡。 作用域: 在函数体内。 特性 : 数量少、速度快 不能进行取地址操作“ 静态变量 static int x; static int x,July 24, 2020,29,变量使用小结,(1) 最常用的变量形式是局部变量。一般的局部变量都是自动变量,其作用域为定义局部变量的函数或分程序,生存期为程序执行到变量定义域中的期间。 (2) 可以通过在说明语句前面加上保留字“static”将局部变量说明为静态局部变量。其作用域仍为定义局部变量的函数或分程序,但其生存期扩大到整个程序的运行期,其主要用途是保存函数的执行信息。 (3) 定义于所有函数之外的变量称为全局变量,全局变量都是静态的,

12、即具有和程序执行期相同的生存期。全局变量的作用域也可以扩充到其他源程序中。 (4) 使用寄存器变量的运算速度很高,但通常可以使用的寄存器变量很少,且仅限于整型和指针。 (5) 上面所说的变量包括数组。但不能为局部自动数组设置初值,只有全局数组或静态数组可以设置初值。,July 24, 2020,30,5.5内联函数,调用函数:断点现场保护、数据进栈、执行函数体、保存返回值、恢复现场和断点等,开销很大。 内联函数适用于: 函数体比较简单 被频繁调用,July 24, 2020,31,例5-4 将例5-3中的函数max()改写成内联函数。,#include inline int max(int x

13、,int y) return xy?x:y; void main() cout a b; cout The maximum is max(a,b) endl; ,July 24, 2020,32,例5-4 结果,void main() cout a b; cout b?a:b endl; ,July 24, 2020,33,5.6 带有缺省参数的函数,double func(double x,double y,int n = 1000); 则其参数n带有缺省参数值 调用方式: a = func(b,c); a = func(b,c,2000);,July 24, 2020,34,5.7 函数重

14、载,在VC+的函数库中,有4个功能相似的函数: int abs(int); double fabs(double); long labs(1ong); 函数重载:若干参数和返回值不同的函数共用一个函数名。 oop技术:封装性、继承性、多态性。 多态性 :一个名字,多个人口”,或称“同一接口,多种方法 。,July 24, 2020,35,例5-5 重载绝对值函数,int abs(int x) return x0?x:-x; double abs(double x) return x0?x:-x; 1ong abs(1ong x) return x0?x:-x; void main() int

15、x1 = 1;double x2 = 2.5;1ong x3 = 3L; cout |x1| = abs(x1) endl; cout |x2| = abs(x2) endl; cout |x3| = abs(x3) endl;,July 24, 2020,36,5.8 C+的库函数,#include #include #include #include #include #include #include ,July 24, 2020,37,5.11调试技术:跟踪调试功能,Step Into(快捷键:F11):跟踪 Step Over(快捷键F10):单步执行 Step Out(快捷键:Sh

16、ift+F11):从函数体内运行到外 Run To Cursor(快捷键:Ctrl+F10):从当前位置运行到编辑光标 观察窗口(Watch)用于观察指定变量或表达式的值 变量窗口(Variables)用于观察断点处或其附近的变量的当前值。 调用栈窗口(Call Stack)用于观察调用栈中还未返回的被调用函数列表。,July 24, 2020,38,11.程序举例,12.编写一个求阶乘n!的函数。 3.使用函数原型max。 4.将例5-3中的函数max()改写成内联函数。 5.重载绝对值函数。 6.交换两个变量的值 7.编写一个用于字符串比较的函数mystrcmp,July 24, 2020,39,例5-6 交换两个变量的值,算 法:交换两个变量x和y的值一定要用到第三个变量t作为周转: t = x; x = y; y = t;,July 24, 2020,40,例5-6 交换两个变量的值(续),#include void swap(int x,int y) int t;t = x;x = y;y = t; main() int a = 1,b = 2; cout Before exchange:a= a “,b= b endl; swap(a,b); cout After excha

温馨提示

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

评论

0/150

提交评论