




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第三章第三章 函数函数华中师范大学物理系华中师范大学物理系C+语言程序设计 前一页 休息2本章主要内容本章主要内容l函数的声明和调用函数的声明和调用l函数间的参数传递函数间的参数传递l内联函数内联函数l带缺省形参值的函数带缺省形参值的函数l函数重载函数重载l函数模板函数模板lC+系统函数系统函数 前一页 休息3函数的声明函数的声明l函数是面向对象程序设计中的基本抽象函数是面向对象程序设计中的基本抽象单元,是对功能的抽象单元,是对功能的抽象l函数定义的语法形式函数定义的语法形式类型标识符 函数名(形式参数表) 语句序列函数的声明与使用若无参数,写void是被初始化的内部变量,寿命和可见性仅限于函
2、数内部若无返回值,写void 前一页 休息4函数的声明函数的声明l形式参数表形式参数表 name1, name2, ., namenl函数的返回值函数的返回值 由 return 语句给出,例如:return 0 无返回值的函数(void类型),不必写return语句。函数的声明与使用 前一页 休息5函数的调用函数的调用l调用前先说明函数原型:调用前先说明函数原型: 在调用函数的说明部分,或程序文件开头所有函数之前,按如下形式说明: 类型标识符 被调用函数名 (含类型说明的形参表);l调用形式调用形式 函数名(实参列表)l嵌套调用嵌套调用 函数不允许嵌套声明,但可以嵌套调用。l递归调用递归调用
3、函数直接或间接调用自身。函数的声明与使用 前一页 休息6例例3-1编写一个求编写一个求x的的n次方的函数次方的函数#include doublepower (double x, int n);void main(void)cout 5 to the power 2 is power(5,2) endl;doublepower (double x, int n)double val = 1.0;while (n-)val = val*x;return(val);函数的声明与使用 前一页 休息7运行结果:运行结果:5 to the power 2 is 25例例3-1编写一个求编写一个求x的的n次
4、方的函数次方的函数函数的声明与使用 前一页 休息8例例3-2 数制转换数制转换题目:题目: 输入一个输入一个8位二进制数,将其转换位二进制数,将其转换为十进制数输出。为十进制数输出。例如:例如:000011012 =0(27) +0(26) +0(25) +0(24) +1(23) + 1(22) + 0(21) + 1(20)= 1310 所以,若输入所以,若输入00001101,则应输出,则应输出13函数的声明与使用#include double power (double x, int n);void main(void)int i;int value = 0;char ch;cout
5、= 0; i-)cin ch;if (ch = 1)value += int(power(2,i);cout Decimal value is valueendl;double power (double x, int n)double val = 1.0;while (n-)val *= x;return(val);运行结果:运行结果:Enter an 8 bit binary number 01101001Decimal value is 105 前一页 休息11例例3-3编写程序求编写程序求的值的值其中其中arctan用如下形式的级数计算:用如下形式的级数计算:直到级数某项绝对值不大于直
6、到级数某项绝对值不大于10-15为止;为止;和和x均为均为double型。型。函数的声明与使用2391arctan451arctan16753)arctan(753xxxxx#includevoid main() double a,b; double arctan(double x) ; a=16.0*arctan(1/5.0) ; b=4.0*arctan(1/239.0) ; /注意:因为整数相除结果取整,注意:因为整数相除结果取整, /如果参数写如果参数写1/5,1/239,结果就都是,结果就都是0 coutPI=a-b1e-15) f=e/i; r=(i%4=1)? r+f : r-f
7、 ; e=e*sqr; i+=2; return r ;运行结果:运行结果:PI=3.14159运行结果:运行结果:PI=3.14159 前一页 休息15例例3-4l寻找并输出寻找并输出11999之间的数之间的数m,它满,它满足足m、m2和和m3均为回文数。均为回文数。 回文:各位数字左右对称的整数。例如:11满足上述条件 112=121,113=1331。l分析:分析: 10取余的方法,从最低位开始,依次取出该数的各位数字。按反序重新构成新的数,比较与原数是否相等,若相等,则原数为回文。函数的声明与使用#include void main() bool symm(long n); long
8、m; for(m=11; m1000; m+) if (symm(m)&symm(m*m)&symm(m*m*m) coutm=m m*m=m*m m*m*m=m*m*mendl;bool symm(long n) long i, m; i=n ; m=0 ; while(i) m=m*10+i%10; i=i/10 ; return ( m=n );运行结果:运行结果:m=11 m*m=121 m*m*m=1331m=101 m*m=10201 m*m*m=1030301m=111 m*m=12321 m*m*m=1367631 前一页 休息19函数调用的执行过程函数调用的执
9、行过程函数的声明与使用main()调fun()结束fun()返回保存:返回地址当前现场恢复:主调程序现场返回地址 前一页 休息20嵌套调用嵌套调用函数的声明与使用main调fun1()结束fun1()调fun2()返回fun2()返回 前一页 休息21例例3-6 输入两个整数,求平方和。输入两个整数,求平方和。#include iostream#include .hvoid main(void)void main(void) int a,b; int a,b; int fun1(int x,int y); int fun1(int x,int y); cinab; cinab; c o u t
10、 c o u t a a 、 b b 的 平 方 和 :的 平 方 和 : fun1fun1(a,b)endl(a,b)endl; ; 函数的声明与使用intint fun1fun1(int x,int(int x,int y) y) int int fun2fun2(int(int m); m); return (fun2(x)+fun2(y); return (fun2(x)+fun2(y); intint fun2fun2(int(int m) m) return (m return (m* *m);m); 运行结果:运行结果:3 43 4a a、b b的平方和:的平方和:2525 前一
11、页 休息23递归调用递归调用l函数直接或间接地调用自身,称为递归调用。l递归过程的两个阶段:递推: 4!=43! 3!=32! 2!=21! 1!=10! 0!=1未知 已知回归:4!=43!=243!=32!=62!=21!=21!=10!=10!=1未知未知 已知已知函数的声明与使用 前一页 休息24例例3-8 求求n!分析:计算n!的公式如下:这是一个递归形式的公式,应该用递归函数实现。函数的声明与使用)0()!1()0(1!nnnnn源程序:源程序:# #include iostreaminclude .hlong long facfac(int(int n) n) long f; l
12、ong f; if (n0) if (n0) coutn0,data error!endl coutn0,data error!endl; ; else if (n=0) f=1;else if (n=0) f=1; else f= else f=facfac(n-1)(n-1)* *n;n; return(f); return(f); void main()void main() long fac(int n); long fac(int n); int int n; n; long y; long y; coutEnter a positive integer:; coutn;n; y=
13、y=facfac(n);(n); coutn!=yendl coutn!=yendl; ; 运行结果:运行结果:Enter a positive integer:8Enter a positive integer:88!=403208!=40320 前一页 休息27函数的参数传递机制函数的参数传递机制 传递参数值传递参数值l在函数被调用时才分配形参的存储在函数被调用时才分配形参的存储单元。单元。l实参可以是常量、变量或表达式。实参可以是常量、变量或表达式。l实参类型必须与形参相符。实参类型必须与形参相符。l传递时是传递参数值,即单向传递。传递时是传递参数值,即单向传递。函数的声明与使用 前一页
14、 休息28函数的参数传递机制函数的参数传递机制 参数值传递举例参数值传递举例XN被调函数:被调函数:主调函数:主调函数:3 2.5AD = power(A,3) 2.53double power(double X, int N)函数的声明与使用 前一页 休息29例例3-11 输入两输入两 整数交换后输出整数交换后输出#includevoid Swap(int a, int b);int main()int x(5), y(10);coutx=x y=yendl;Swap(x,y);coutx=x y=yendl;return 0;函数的声明与使用void Swap(int a, int b)i
15、nt t;t=a;a=b;b=t;运行结果运行结果:x=5 y=10 x=5 y=10 前一页 休息31函数的参数传递函数的参数传递 用引用做形参用引用做形参l引用引用(&)是标识符的别名是标识符的别名,例如例如:int i,j;int &ri=i; /建立一个int型的引用ri,并将其 /初始化为变量i的一个别名j=10;ri=j;/相当于 i=j;l声明一个引用时,必须同时对它进行初始化,声明一个引用时,必须同时对它进行初始化,使它指向一个已存在的对象。使它指向一个已存在的对象。l一旦一个引用被初始化后,就不能改为指向一旦一个引用被初始化后,就不能改为指向其它对象。其它对象
16、。l引用可以作为形参引用可以作为形参 void swap(int& a, int& b) .函数的声明与使用 前一页 休息32例例3-12 输入两个整数交换后输出输入两个整数交换后输出#includevoid Swap(int& a, int& b);int main()int x(5), y(10);coutx=x y=yendl;Swap(x,y);coutx=x y=yendl;return 0;函数的声明与使用void Swap(int& a, int& b)int t;t=a;a=b;b=t;运行结果运行结果:x=5 y=10 x=10
17、 y=5t=a;x5t5x 的地址axy510y 的地址x 的地址aby 的地址x 的地址abx10y10a=bb=t;y5t5y 的地址bxy105Swap(x,y); 前一页 休息35例例3-13 引用调用举例引用调用举例#include #include void fiddle(int in1, int &in2);int main() int count = 7, index = 12; cout The values are ; coutsetw(5)count; coutsetw(5)indexendl; fiddle(count, index); cout The val
18、ues are ; coutsetw(5)count; coutsetw(5)indexendl; return 0;函数的声明与使用void fiddle(int in1, int &in2) in1 = in1 + 100; in2 = in2 + 100; cout The values are ; coutsetw(5)in1; coutsetw(5)in2endl;运行结果:运行结果: The values are 7 12 The values are 107 112 The values are 7 112 前一页 休息37内联函数声明与使用内联函数声明与使用l声明时使用
19、关键字声明时使用关键字 inline。l编译时在调用处用函数体进行替换编译时在调用处用函数体进行替换,节节省了参数传递、控制转移等开销。省了参数传递、控制转移等开销。l注意:注意: 内联函数体内不能有循环语句和switch语句。 内联函数的声明必须出现在内联函数第一次被调用之前。 对内联函数不能进行异常接口声明。内联函数 前一页 休息38例例3-14 内联函数应用举例内联函数应用举例#includeinline double CalArea(double radius)return 3.14*radius*radius;int main()double r(3.0);double area;a
20、rea=CalArea(r);coutareaendl;return 0;内联函数 前一页 休息39缺省形参值的作用缺省形参值的作用l函数在声明时可以预先给出默认的形参值,函数在声明时可以预先给出默认的形参值,调用时如给出实参,则采用实参值,否则采调用时如给出实参,则采用实参值,否则采用预先给出的默认形参值。用预先给出的默认形参值。l例如:例如:int add(int x=5,int y=6) return x+y;void main(void) add(10,20); /10+20 add(10); /10+6 add(); /5+6带缺省形参值的函数 前一页 休息40缺省形参值的说明次序缺
21、省形参值的说明次序l缺省形参值必须缺省形参值必须从右向左从右向左顺序声明,顺序声明,并且在缺省形参值的右面不能有非缺并且在缺省形参值的右面不能有非缺省形参值的参数。因为调用时实参取省形参值的参数。因为调用时实参取代形参是从左向右的顺序。代形参是从左向右的顺序。l例:例:int add(int x,int y=5,int z=6); /正确int add(int x=1,int y=5,int z); /错误int add(int x=1,int y,int z=6); /错误带缺省形参值的函数 前一页 休息41缺省形参值与函数的调用位置缺省形参值与函数的调用位置l调用出现在函数体实现之前时,缺
22、省形参值必调用出现在函数体实现之前时,缺省形参值必须在函数原形中给出;而当调用出现在函数体须在函数原形中给出;而当调用出现在函数体实现之后时,缺省形参值需在函数实现时给出。实现之后时,缺省形参值需在函数实现时给出。l例:例:int add(int x=5,int y=6);void main(void) add(); /调用在实现前int add(int x,int y) return x+y; int add(int x=5,int y=6) return x+y; void main(void) add(); /调用在实现后带缺省形参值的函数 前一页 休息42缺省形参值的作用域缺省形参值的
23、作用域l在相同的作用域内,缺省形参值的说明应在相同的作用域内,缺省形参值的说明应保持唯一,但如果在不同的作用域内,允保持唯一,但如果在不同的作用域内,允许说明不同的缺省形参。许说明不同的缺省形参。l例:例:int add(int x=1,int y=2);void main(void) int add(int x=3,int y=4); add(); /使用局部缺省形参值(实现3+4)void fun(void) . add(); /使用全局缺省形参值(实现1+2)带缺省形参值的函数 前一页 休息43例例3-15带缺省形参值的函数举例带缺省形参值的函数举例#include #include i
24、nt get_volume(int length, int width = 2, int height = 3);int main()int x = 10, y = 12, z = 15; cout Some box data is ; cout get_volume(x, y, z) endl; cout Some box data is ; cout get_volume(x, y) endl; cout Some box data is ; cout get_volume(x) endl; cout Some box data is ; cout get_volume(x, 7) end
25、l; cout Some box data is ; cout get_volume(5, 5, 5) endl; return 0;带缺省形参值的函数int get_volume(int length, int width, int height) coutsetw(5)length setw(5)widthsetw(5)height ; return length * width * height;运行结果运行结果:Some box data is 10 12 15 1800Some box data is 10 12 3 360Some box data is 10 2 3 60Some
26、 box data is 10 7 3 210Some box data is 5 5 5 125 前一页 休息45重载函数的声明重载函数的声明lC+允许功能相近的函数在相同的作用允许功能相近的函数在相同的作用域内以相同函数名声明,从而形成重载。域内以相同函数名声明,从而形成重载。方便使用,便于记忆。方便使用,便于记忆。l例:例:形参类型不同int add(int x, int y);float add(float x, float y);形参个数不同int add(int x, int y);int add(int x, int y, int z); 函 数 重 载 前一页 休息46注意事项
27、注意事项 不要将不同功能的函数声明为重载函数,以免出现调用结果的误解、混淆。这样不好:int add(int x,int y);int add(int a,int b);编译器不以形参名来区分int add(int x,int y);void add(int x,int y);编译器不以返回值来区分int add(int x,int y) return x+y; float add(float x,float y) return x-y; 函 数 重 载 重载函数的形参必须不同: 个数不同或类型不同。 编译程序将根据实参和形参的类型及个数的最佳匹配来选择调用哪一个函数。 前一页 休息47例例3
28、-16重载函数应用举例重载函数应用举例编写三个名为编写三个名为add的重载函数,分别实现两整数的重载函数,分别实现两整数相加、两实数相加和两个复数相加的功能。相加、两实数相加和两个复数相加的功能。#includestruct complexdouble real;double imaginary;void main(void)int m, n;double x, y;complex c1, c2, c3;int add(int m, int n);double add(double x, double y);complex add(complex c1, complex c2);coutmn;
29、coutinteger m+n=add(m,n)endl;coutxy;coutreal number x+y= add(x,y) endl;coutc1.realc1.imaginary;coutc2.realc2.imaginary;c3=add(c1,c2);coutcomplex number ( c1.real , c1.imaginary )+(c2.real, c2.imaginary)=(c3.real, c3.imaginary)n;int add(int m, int n) return m+n; double add(double x, double y) return
30、x+y; complex add(complex c1, complex c2) complex c;c.real=c1.real+c2.real;c.imaginary=c1.imaginary+c2.imaginary;return c;运行结果:运行结果:Enter two integer: 3 5integer 3+5=8Enter two real number: 2.3 5.8real number 2.3+5.8= 8.1Enter the first complex number: 12.3 45.6Enter the second complex number: 56.7 6
31、7.8complex number (12.3,45.6)+(56.7,67.8)= (69,113.4) 前一页 休息52函数模板的声明函数模板的声明l函数模板可以用来创建一个通用功能函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,进一的函数,以支持多种不同形参,进一步简化重载函数的函数体设计。步简化重载函数的函数体设计。l声明方法:声明方法:template 函数声明 函 数 模 板 前一页 休息53例例3-17 求绝对值函数的模板求绝对值函数的模板#includetemplateT abs(T x) return x0?-x:x; void main() int n=-5;
32、double d=-5.5; coutabs(n)endl; coutabs(d)endl; 函 数 模 板l运行结果:运行结果:55.5l分析分析 编译器从调用abs()时实参的类型,推导出函数模板的类型参数。例如,对于调用表达式abs(n),由于实参n为int型,所以推导出模板中类型参数T为int。 当类型参数的含义确定后,编译器将以函数模板为样板,生成一个函数:int abs(int x) return x0?-x:x; 前一页 休息55C+系统函数系统函数lC+的系统库中提供了几百个函数可的系统库中提供了几百个函数可供程序员使用。供程序员使用。例如:求平方根函数(sprt)、求绝对值函
33、数(abs)等。l使用系统函数时要包含相应的头文件。使用系统函数时要包含相应的头文件。例如:math.h使用C+系统函数 前一页 休息56例例3-18系统函数应用举例系统函数应用举例l题目:题目:从键盘输入一个角度值,求出该角度的正弦值、余弦值和正切值。l分析:分析:系统函数中提供了求正弦值、余弦值和正切值的函数:sin()、cos()、tan(),函数的说明在头文件math.h中。使用C+系统函数#include#includeconst double pi(3.14159265);void main() double a,b; cina; b=a*pi/180; coutsin(a)=si
34、n(b)endl; coutcos(a)=cos(b)endl; couttan(a)=tan(b)(“活动子集”栏)Visual C+ Documentation - Visual C+ Documentation -Using Visual C+ - Visual C+ Programmers Guide - Run-Time Library Reference -Run Time Routines by Category - Run Time Routines by Category 使用C+系统函数 前一页 休息60作作 业业l复习第三章,预习第四章复习第三章,预习第四章l3-2, 3-8, 3-11, 3-13, 3-15l学习使用联机帮助系统查找系统函数学习使用联机帮助系统查找系统函数l实验三实验三 前一页 休息62例例3-9l用递归法计算从用递归法计算从n个人中选择个人中选择k个人组个人组成一个委员会的不同组合数。成一个委员会的不
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 燕麦栽培与利用考核试卷
- 建设工程承包合同与合同管理
- 农村合伙买房合同标准文本
- 中超合同标准文本
- 借款合同标准文本标准文本表格
- 农村住房采购合同范例
- 个人捐赠款合同标准文本
- 公正处授权卖房合同标准文本
- 代购销合同标准文本
- 伊利低价代言合同范例
- 妈妈课堂系列医生讲课文档
- 2022 年山东省职业院校技能大赛高职组复杂部件数控多轴联动加工技术赛项-试题图纸
- 欧洲门窗标准
- DL∕T 5131-2015 农村电网建设与改造技术导则
- 2024年泉州市泉港区小升初考试数学试卷含解析
- 《公路桥梁施工监控技术规程》(JTGT3650-01-2022)
- 人流综合征课件
- 18文言文二则《囊萤夜读》公开课一等奖创新教学设计
- 汽车设计(第6版) 课件 闵海涛 第1、2章 汽车总体设计、离合器设计
- 北京海淀区-第2学期高二数学教概率统计教材分析-(64)课件
- JB-T 6895-2023 铝制空气分离设备安装焊接技术规范
评论
0/150
提交评论