《次课函数机制》PPT课件.ppt_第1页
《次课函数机制》PPT课件.ppt_第2页
《次课函数机制》PPT课件.ppt_第3页
《次课函数机制》PPT课件.ppt_第4页
《次课函数机制》PPT课件.ppt_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

1、课程进程,过程化编程之函数机制,C+语言程序设计,任课教师:马彦卓,函数和函数机制,函数 C+的函数是完成既定任务的功能(过程)体,它涵盖了数学函数和一般过程所以基于过程编程本质上就是基于函数编程。 函数机制 一是指程序运行过程中对函数调用的数据管理和处理过程 二是指编程中函数的使用规范它包括 函数参数的属性和传递规则 函数返回类型的匹配与审查 函数名字的识别原则 函数体效率的选择 函数体中数据的访问权限 等,第五章 函数机制 Chapter 5 Function Mechanism,Contents,5.main参数 ( The mains Parameters ),1.函数性质( Func

2、tion Character ),2.指针参数 ( Pointer Parameters ),3.栈机制 ( Stack Mechanism ),4.函数指针 ( Function Pointers ),6.递归函数 ( Recursive Functions ),7.函数重载 ( Function Overload ),函数机制,函数性质 ( Function Character ),函数: 对输入参数负责,埋头做自己的事,最终返回结果 函数组织: 通过在函数中进行函数调用来扩展运行的规模,层层叠叠的函数构成树结构 做法: 将若干个函数组织成文件,又将若干个文件构成程序的办法来进行编程分工,

3、函数性质 ( Function Character ),跨越数学函数的C+函数,有四种形态 P135 返回类型 func ( 参数列表 ) ; 返回类型 func ( ) ; void func ( 参数列表 ) ; void func ( ) ;,函数性质 ( Function Character ),黑盒原则:函数使用者应关注性能,而少去左右实现细节 (P136例5.1),int cost ( int n, int m ) return n*10; / 运输n次m斤 int cost ( int n, int m ) return m*10; / 运输m次n斤 / 选择一个最好的 int

4、cost ( int n, int m ) return (nm? m:n)*10; / 保证运输次数最少 ,void f(Type a); /a为形参 void g() Type x; f(x); /x为实参 ,函数性质 ( Function Character ),传值参数:形参是对实参的克隆,克隆必须遵守类型匹配规则 (P138),a实体,x实体,复制,Type类型,Type类型,. 指针参数 ( Pointer Parameters ),当一个函数对大量数据进行处理时,将所有数据作为实参进行复制内存空间和计算资源的大量浪费! 解决方法:利用指针或引用作为参数来传递数据信息。 该方法优点

5、:高效 该方法风险:破坏黑盒性 综合评定:值得使用,但要谨慎,. 指针参数 ( Pointer Parameters ),传递指针: 指针参数也是值传递的,指针值的真正用途是进行数据间访,以达到操作数据块(大小由之)的目的 传递引用: 引用参数本质上也是值传递的,它表现为名字传递,即以形参的名字来代替实参名字 如果实参不是实体名而是表达式,那么其表达式所对应的临时实体取名为形参,并要求其为常量引用 意义: 指针和引用参数的存在,使函数实际上可以访问非局部的数据区,函数的黑盒性便名存实亡 但这并非一定坏事,指针是一把双刃剑,或灵巧或邪恶 引用是为了防范指针非安全的无意操作,void mySort

6、(int* b, int size); void f() int a = 3, 5, 7, 1, 8, 4, 9; mySort(a, sizeof(a)/sizeof(a0); ,. 指针参数 ( Pointer Parameters ),传递指针须附带传递单位数据的个数,元素个数,传指针,. 指针参数 ( Pointer Parameters ),通过常量性质限制无意操作带来的意外副作用 (P143),vector add( / 向量加法 const vector ,栈机制 ( Stack Mechanism ),运行时内存布局 P145,执行代码 全局数据、静态数据 动态内存 函数数据(

7、局部数据),栈机制 ( Stack Mechanism ),未初始化局部数据的不确定性,#include void f() int b; / 未初始化 std:cout”a“n”; f(); /-,A=8804248 B=2788048,栈机制 ( Stack Mechanism ),指针的无约束性,#include int a=5; int b=6; int main() int* ap=(int*)4202660; *ap=8; std:couta“n”; std:coutint( ,5,6,4202660,4202664,a,b,4202660,ap,8 4202664,函数指针 ( F

8、unction Pointers ),函数类型: 函数类型因参数类型、个数和排列顺序的不同而不同,也因返回类型的不同而不同 函数指针: 指向代码区中函数体代码的指针.不同的函数类型,其函数指针也不同 用法: 函数指针经常用作函数参数,以传递连函数本身都不知道的处理过程(函数),函数指针 ( Function Pointers ),函数指针与指针函数 指向函数的指针简称函数指针 定义: int (*gp)(int) 初始化: int g(int); int (*gp)(int)=g; 指针函数:返回指针类型的函数 int *gp(int a) int* gp(int a),函数指针 ( Func

9、tion Pointers ),不同的函数指针,不能相互赋值 P151,int g(int); int (*gp)(int) = g; / right void f(); void (*fp)(); fp = f; / right gp = fp; / error,不同类型的函数,函数指针 ( Function Pointers ),函数指针作为参数传递 (函数名看作是函数指针),bool lessThanBitSum(int a, int b) int suma=0, sumb=0; for(int x=a; x; x/=10) suma += x%10; for(int x=b; x; x

10、/=10) sumb += x%10; return suma sumb; int main() int a = 33, 61, 12, 19, 14, 71, 78, 59; sort(aa, aa+8, lessThanBitSum); for(int i=0; i8; +i) coutaai ; coutn; ,12 14 33 61 71 19 59 78,函数指针 ( Function Pointers ),指定函数指针类型,定义函数指针数组,typedef void (*MenuFun)(); /p154 f0507 void f1() coutgood!n; void f2()

11、coutbetter!n; void f3() coutbest!n; MenuFun fun=f1,f2,f3;,函数指针类型名,main参数 ( The mains Parameters ),程序运行: 操作系统读入命令以启动程序 重定向命令: 操作系统读入命令后,识别并自我消化的参数 main函数参数: 操作系统读入命令后,不能识别参数,将其直接传递给所启动的程序,main参数 ( The mains Parameters ),命令重定向 (P158),/ f0509.cpp #include using namespace std; int main() for(int a,b; ci

12、nab;) couta+b”n”; ,17 21 357,main参数 ( The mains Parameters ),main函数参数 (P159),#include using anmespace std; int main(int argc, char* argv) for(int i=0; iargc; +i) coutargviendl; ,f0510 a1 a2 a3 a1 a2 a3,递归函数 ( Recursive Functions ),形式上: 一个正在执行的函数调用了自身(直接递归).或者,一个函数调用了另一个函数,而另一个函数却调用了本函数(间接递归) 本质上: 程序

13、在运行中调用了相同代码实体的函数,却在函数栈中重新复制了该函数的整套数据,由于每套数据中的参数也许不同,导致了计算条件发生变化,使得函数得以逐步逼近终极目标而运行 递归的条件 P163,递归函数 ( Recursive Functions ),递归函数可以转换为非递归函数例如,求最大公约数,long gcd1(int a, int b) / 递归版 if(a%b=0) return b; return gcd(b, a%b); /- long gcd2(int a, int b) / 非递归版 for(int temp; b; a=b, b=temp) temp = a%b; return a

14、; /-,函数重载 ( Function Overload ),函数重载: 一组概念相同,处理对象(参数)不同的过程,出于方便编程的目的,用同一个函数名字来命名的技术称为函数重载 参数默认: 一个函数,既可以严谨和地道的调用,也可以省略参数,轻灵地调用,达到此种方便编程目的的技术称为参数默认 重载与参数默认: 它们都是通过参数的变化来分辨处理任务的不同如果参数决定了不同的处理过程,则应重载,否则参数默认更简捷一些,函数重载 ( Function Overload ),重载是不同的函数,以参数的类型,个数和顺序来分辨P167,void print(double); void print(int)

15、; void func() print(1); / void print(int); print(1.0); / void print(double); print(a); / void print(int); print(3.1415f); / void pirnt(double); ,函数重载 ( Function Overload ),参数默认是通过不同参数来分辨一个函数调用中的行为差异,void delay(int a = 2); / 函数声明时 int main() delay(); / 默认延迟秒 delay(2); / 延迟秒 delay(5); / 延迟秒 void delay

16、(int a) / 函数定义时 int sum=0; for(int i=1; i=a; +i) for(int j=1; j3500; +j) for(int k=1; k100000; +k) sum+; ,函数重载 ( Function Overload ),默认参数的规则 P169 默认参数值总是在函数声明时描述的,声明定义同时存在时,默认参数只能置身于声明中 函数参数默认值只能从后往前设置 调用时的实参按位置解析,默认实参只能从后往前逐个替换尾部的缺漏,函数重载 ( Function Overload ),无名参数 函数声明和定义中,都可以省略形参名称。P170,void point

17、(int a, int); /声明时省略了第二个形参名 void point(int a, int ) countaendl; /定义时省略,第二个参数形同虚设,函数重载 ( Function Overload ),重载VS参数默认 定义方法不同,效果类似,本章小结,函数是程序的基本组成 本质上基于过程程序设计就是以函数为基本过程化单位的 函数的灵活多样性会导致副作用,反映在参数的指针和引用传递上。 函数的黑盒化程序设计规范化 函数机制靠栈结构来支撑 函数指针开拓了程序运行所覆盖的计算机系统空间 对于包含多个函数的文件的组织问题 main函数是操作系统调用的函数,返回类型都是int型,否则是不

18、标准的,但其返回语句允许省略。 main函数所带的参数规定了操作系统对它数据传递的形式重定向是操作系统启动命令的功能之一。 函数可以重载,即重名,但必须有不同的参数类型、个数或顺序。函数参数可以默认,效果类似于重载,但使用时有一些差别。,作业,第1、2、5题 其中第5题将(e)放在(c)前 第五题中可以结合使用命令行重定向、main()参数、函数重载、函数指针等新学知识。 10月17日晚24点之前,学号为单号的同学交作业 其他同学可选交,Thank You !,Any question?,上次作业点评,1.注意1/2这样的表达式值为0,想要得到正确结果需要进行格式转换,隐式、显式均可。 2.函数调用时,无须

温馨提示

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

评论

0/150

提交评论