C++程序设计教程(第二版)ppt课件

上传人:文**** 文档编号:240772801 上传时间:2024-05-06 格式:PPT 页数:25 大小:121.02KB
返回 下载 相关 举报
C++程序设计教程(第二版)ppt课件_第1页
第1页 / 共25页
C++程序设计教程(第二版)ppt课件_第2页
第2页 / 共25页
C++程序设计教程(第二版)ppt课件_第3页
第3页 / 共25页
点击查看更多>>
资源描述
C+程序设计教程(第二版)第五章 函数机制 Chapter 5 Function Mechanism 清华大学出版社 钱 能5/6/20241C+程序设计教程(第二版)第五章 函数机制 清华大学出版社n函数 C+的函数是完成既定任务的功能(过程)体,它涵盖了数学函数和一般过程所以基于过程编程本质上就是基于函数编程n函数机制 一是指程序运行过程中对函数调用的数据管理和处理过程 二是指编程中函数的使用规范它包括函数参数的属性和传递规则,函数返回类型的匹配与审查,函数名字的识别原则,函数体效率的选择,函数体中数据的访问权限等5/6/20242函数8/1/20232第五章内容1.函数性质函数性质(Function Character)2.指针参数指针参数(Pointer Parameters)3.栈机制栈机制(Stack Mechanism)4.函数指针函数指针(Function Pointers)5.main参数参数(The mains Parameters)6.递归函数递归函数(Recursive Functions)7.函数重载函数重载(unction Overload)5/6/20243第五章内容 函数性质(Function Character1.函数性质函数性质(Function Character)函数:对输入参数负责,埋头做自己的事,最终返回结果函数组织:通过在函数中进行函数调用来扩展运行的规模,层层叠叠的函数构成树结构做法:将若干个函数组织成文件,又将若干个文件构成程序的办法来进行编程分工5/6/202441.函数性质(Function Character跨越数学函数的C+函数,有四种形态n返回类型 func(参数列表);n返回类型 func();nvoid func(参数列表);nvoid func();5/6/20245跨越数学函数的C+函数,有四种形态返回类型 func(黑盒原则:函数使用者应关注性能,而少去左右实现细节int cost(int n,int m)return n*10;/运输n次m斤int cost(int n,int m)return m*10;/运输m次n斤/选择下一个最好的int cost(int n,int m)return(nm?m:n)*10;/保证运输次数最少5/6/20246黑盒原则:函数使用者应关注性能,而少去左右实现细节int 参数传递:形参是对实参的克隆,克隆必须遵守类型匹配规则void f(Type a);/a为形参void g()Type x;f(x);/x为实参a实体x实体复制Type类型Type类型5/6/20247参数传递:形参是对实参的克隆,克隆必须遵守类型匹配规则voi.指针参数指针参数(Pointer Parameters)传递指针:指针参数也是值传递的,指针值的真正用途是进行数据间访,以达到操作数据块(大小由之)的目的传递引用:引用参数本质上也是值传递的,它表现为名字传递,即以形参的名字来代替实参名字如果实参不是实体名而是表达式,那么其表达式所对应的临时实体取名为形参,并要求其为常量引用意义:指针和引用参数的存在,使函数实际上可以访问非局部的数据区,函数的黑盒性便名存实亡但这并非一定坏事,指针是一把双刃剑,或灵巧或邪恶引用是为了防范指针非安全的无意操作5/6/20248.指针参数(Pointer Parametersvoid mySort(int*b,int size);void f()int a=3,5,7,1,8,4,9;mySort(a,sizeof(a)/sizeof(a0);传递指针须附带传递单位数据的个数元素个数传指针5/6/20249void mySort(int*b,int size);限制无意操作带来的意外副作用vector add(/向量加法 const vector&a,const vector&b)vector c(a.size();for(unsigned i=0;ia.size();+i)ci=ai+bi;return c;5/6/202410限制无意操作带来的意外副作用vector add(3.栈机制栈机制(Stack Mechanism)运行时内存布局栈区进程空间代码区全局数据区堆区5/6/2024113.栈机制(Stack Mechanism)运行未初始化局部数据的不确定性#includevoid f()int b;/未初始化 std:cout”b“n”;/-int main()int a;/未初始化 std:cout”a“n”;f();/-/8804248/27880485/6/202412未初始化局部数据的不确定性#includeiostream#includeint a=5;int b=6;int main()int*ap=(int*)4202660;*ap=8;std:couta“n”;std:coutint(&b)“n”;/8/4202664 指针的无约束性5642026604202664ab4202660ap5/6/202413#include指针的无约束性564204.函数指针函数指针(Function Pointers)函数类型:函数类型因参数类型、个数和排列顺序的不同而不同,也因返回类型的不同而不同函数指针:指向代码区中函数体代码的指针.不同的函数类型,其函数指针也不同用法:函数指针经常用作函数参数,以传递连函数本身都不知道的处理过程(函数)5/6/2024144.函数指针(Function Pointers 不同的函数指针,不能相互赋值int g(int);int(*gp)(int)=g;void f();void(*fp)();fp=f;gp=fp;/error不同的函数5/6/202415不同的函数指针,不能相互赋值int g(int);不同的函数函数指针作为参数传递(函数名看作是函数指针)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)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 785/6/202416函数指针作为参数传递(函数名看作是函数指针)bool le指定函数指针类型,定义函数指针数组typedef void(*MenuFun)();void f1()coutgood!n;void f2()coutbetter!n;void f3()coutbest!n;MenuFun fun=f1,f2,f3;指针类型名5/6/202417指定函数指针类型,定义函数指针数组typedef void 5.main参数参数(The mains Parameters)程序运行:操作系统读入命令以启动程序重定向命令:操作系统读入命令后,识别并自我消化的参数main函数参数:操作系统读入命令后,不能识别参数,将其直接传递给所启动的程序5/6/2024185.main参数(The mains Param命令重定向/f0509.cpp#includeusing namespace std;int main()for(int a,b;cinab;)couta+bf0509 f0509main函数参数/f0510.cpp#includeusing anmespace std;int main(int argc,char*argv)for(int i=0;iargc;+i)coutargvif0510 a1 a2 a3f0510a1a2a35/6/202420main函数参数/f0510.cppE:ch05f06.递归函数递归函数(Recursive Functions)形式上:一个正在执行的函数调用了自身(直接递归).或者,一个函数调用了另一个函数,而另一个函数却调用了本函数(间接递归)本质上:程序在运行中调用了相同代码实体的函数,却在函数栈中重新复制了该函数的整套数据,由于每套数据中的参数也许不同,导致了计算条件发生变化,使得函数得以逐步逼近终极目标而运行5/6/2024216.递归函数(Recursive Function递归函数可以转换为非递归函数例如,求最大公约数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;/-5/6/202422递归函数可以转换为非递归函数例如,求最大公约数long g7.函数重载函数重载(Function Overload)函数重载:一组概念相同,处理对象(参数)不同的过程,出于方便编程的目的,用同一个函数名字来命名的技术称为函数重载参数默认:一个函数,既可以严谨和地道的调用,也可以省略参数,轻灵地调用,达到此种方便编程目的的技术称为参数默认重载与参数默认:它们都是通过参数的变化来分辨处理任务的不同如果参数决定了不同的处理过程,则应重载,否则参数默认更简捷一些5/6/2024237.函数重载(Function Overload 重载是不同的函数,以参数的类型,个数和顺序来分辨void print(double);void print(int);void func()print(1);/void print(int);print(1.0);/void print(double);print(a);/void print(int);print(3.1415f);/void pirnt(double);5/6/202424重载是不同的函数,以参数的类型,个数和顺序来分辨void p参数默认是通过不同参数来分辨一个函数调用中的行为差异void delay(int a=2);/函数声明时函数声明时int main()delay();/默认延迟秒默认延迟秒 delay(2);/延迟秒延迟秒 delay(5);/延迟秒延迟秒void delay(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+;5/6/202425参数默认是通过不同参数来分辨一个函数调用中的行为差异void
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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