中国石油大学(华东)理学院C课程课件

上传人:阳*** 文档编号:81364284 上传时间:2022-04-27 格式:PPT 页数:48 大小:658KB
收藏 版权申诉 举报 下载
中国石油大学(华东)理学院C课程课件_第1页
第1页 / 共48页
中国石油大学(华东)理学院C课程课件_第2页
第2页 / 共48页
中国石油大学(华东)理学院C课程课件_第3页
第3页 / 共48页
资源描述:

《中国石油大学(华东)理学院C课程课件》由会员分享,可在线阅读,更多相关《中国石油大学(华东)理学院C课程课件(48页珍藏版)》请在装配图网上搜索。

1、中国石油大学(华东)理学院C课程第三章第三章 函数函数C+C+语言程序设计语言程序设计本章主要内容 3.1 函数的定义与调用函数的定义与调用 3.2 函数间的参数传递函数间的参数传递 3.3 内联函数内联函数 3.4 带缺省形参值的函数带缺省形参值的函数 3.5 函数重载函数重载 3.6 C+系统函数系统函数3.1 函数的定义与调用函数的定义与调用 函数是面向对象程序设计中的基本抽象单元,是对函数是面向对象程序设计中的基本抽象单元,是对功能的抽象。功能的抽象。 函数定义的语法形式函数定义的语法形式类型标识符类型标识符 函数名(形式参数表)函数名(形式参数表) 语句序列语句序列若无参数,写若无参

2、数,写void寿命仅限于函数内部寿命仅限于函数内部若无返回值,写若无返回值,写void1.函数的定义函数的定义#include using namespace std;int max(int x,int y)int z;z=xy?x:y;return (z);int main()int a,b,c;coutab;c=max(a,b);coutmax=cendl;return 0;例:求两个整数的较大值1.函数的定义函数的定义 形式参数表形式参数表 name1, name2, ., namen未出现函数调用时不占内存;调用时分配内存,调用未出现函数调用时不占内存;调用时分配内存,调用结束后,内存

3、单元被释放。结束后,内存单元被释放。 实参可以是常量、变量或表达式。实参可以是常量、变量或表达式。max(3,a+b); /(但(但a、b必须有确定值)必须有确定值) 定义参数时,必须在函数首部指定形参的类型。定义参数时,必须在函数首部指定形参的类型。 形参与实参的类型应相同或赋值相容。形参与实参的类型应相同或赋值相容。2. 函数的返回值函数的返回值 函数返回值由函数返回值由return语句获得语句获得return后的值可以是表达式。后的值可以是表达式。void型函数,不必写型函数,不必写return语句。语句。函数可以有多个函数可以有多个return。return语句后的括号可以要,也可以不

4、要。语句后的括号可以要,也可以不要。 函数值的类型函数值的类型函数类型决定返回值的类型。函数类型决定返回值的类型。3. 函数的调用函数的调用 调用一般格式调用一般格式 函数名(实参列表)函数名(实参列表) 函数调用方式函数调用方式函数语句,如:函数语句,如:printLine();函数表达式,如:函数表达式,如:c=2*max(a,b);函数参数,如:函数参数,如:m=max(c,max(a,b);在一个函数调用另一个函数需要具备哪些在一个函数调用另一个函数需要具备哪些条件?条件?3. 函数的调用函数的调用 调用前先说明函数原型调用前先说明函数原型 类型标识符类型标识符 被调用函数名被调用函数

5、名 (含类型说明的形参表含类型说明的形参表); 函数定义与声明的区别函数定义与声明的区别 函数原型函数原型类型标识符类型标识符 被调用函数名被调用函数名(参数类型参数类型1 参数名参数名1,参数类型参数类型2 参数名参数名2,););如:如:int max(int x,int y);类型标识符类型标识符 被调用函数名被调用函数名(参数类型参数类型1,参数类型,参数类型2,);如:如:int max(int ,int);例例3-1 编写一个求编写一个求x的的n次方的函数次方的函数#include using namespace std;double power (double x, int n)

6、;/函数原型声明函数原型声明int main(void)cout 5 to the power 2 is power(5,2) endl; ruturn 0;double power (double x, int n)/函数求函数求x的的n次方次方double val = 1.0;while (n-)val = val*x;return(val);运行结果:运行结果:5 to the power 2 is 25中国石油大学(华东)理学院C课程10函数的调用函数的调用 嵌套调用嵌套调用函数不允许嵌套定义,但可以嵌套调用。函数不允许嵌套定义,但可以嵌套调用。 递归调用递归调用函数直接或间接调用自身

7、。函数直接或间接调用自身。练习:递归实现练习:递归实现1+2+3+n函数调用的执行过程函数调用的执行过程main()调调fun()结束结束fun()返回返回保存:返回地址当前现场恢复:主调程序现场返回地址嵌套调用嵌套调用main调调fun1()结束结束fun1()调调fun2()返回返回fun2()返回返回例3-8 求n!分析:计算分析:计算n!的公式如下:的公式如下:这是一个递归形式的公式,应该用递归函这是一个递归形式的公式,应该用递归函数实现。数实现。)0()!1()0(1!nnnnn递归调用递归调用函数直接或间接地调用自身,称为递归调用。函数直接或间接地调用自身,称为递归调用。递归过程的

8、两个阶段:递归过程的两个阶段:递推:递推: 4!=43! 3!=32! 2!=21! 1!=10! 0!=1未知未知 已知已知回归:回归:4!=43!=243!=32!=62!=21!=21!=10!=10!=1未知未知 已知已知#include #include using namespace std;using namespace std;long long facfac(int n)(int n) long f; long f; if (n0) if (n0) coutn0,data error!endl; coutn0,data error!endl; else if (n=0) el

9、se if (n=0) f=1; f=1; else else f= f=facfac(n-1)(n-1)* *n;n; return(f); return(f); )0()!1()0(1!nnnnnint mainint main( ) long fac(int n); long fac(int n); int n; int n; long y; long y; coutEnter a positive integer:; coutn; cinn; y= y=facfac(n);(n); coutn!=yendl; coutn!=yendl; return 0; return 0; 运行结果

10、:运行结果: Enter a positive integer:8Enter a positive integer:8 8!=40320 8!=40320 在函数被调用时才分配形参的存储单元。 实参可以是常量、变量或表达式。 实参类型必须与形参相符。 传递时是传递参数值,即单向传递。函数的声明与使用 4. 函数的参数传递机制 传递参数值XN被调函数:被调函数:主调函数:主调函数:3 2.5AD = power(A,3) 2.53double power(double X, int N)函数的声明与使用 4. 函数的参数传递机制 传递参数值例3-11 输入两 整数交换后输出#includeusi

11、ng namespace std;void S 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=5 y=104. 函数的参数传递 用引用做形参引用(&)是标识符的别名,例如:int i,j;int &ri=i;/建立一个int型的引用ri,并将其 /初始化为变量i的一个别名j=10;ri=j;/相当于 i=j;声明引用同时必须对它进行初始化

12、。初始化后不能改为指向其它对象。引用可以作为形参 void s a, int& b) .例3-12 输入两个整数交换后输出#include using namespace;void S& 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 y=5t=a;x5t5x 的地址axy510y 的地址x 的地址aby 的地址x 的地址abx10y1

13、0a=bb=t;y5t5y 的地址bxy105S);例3-13 引用调用举例#include using namespace std;#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 values are ; coutsetw(5)count; coutsetw(5)indexendl; return 0

14、;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请:体会传值和传引用的区别。3.2 内联函数声明与使用内联函数声明与使用 声明时使用关键字 inline。 编译时在调用处用函数体进行替换,节省了参数传递、控制转移等开销。 注意:内联函数体内不能有循环语句

15、和switch语句。内联函数的声明必须出现在第一次被调用之前。例3-14 内联函数应用举例#includeusing namespace std;inline double CalArea(double radius)return 3.14*radius*radius;int main( )double r(3.0);double area;area=CalArea(r);coutareaendl;return 0;3.3 带默认形参值的函数带默认形参值的函数 函数在声明时可以预先给出默认的形参值函数在声明时可以预先给出默认的形参值调用时如给出实参,则采用实参值。调用时如给出实参,则采用实参值

16、。否则采用预先给出的默认形参值。否则采用预先给出的默认形参值。 例如:例如:int add(int x=5,int y=6) return x+y;int main(void) add(10,20); /10+20 add(10); /10+6 add(); /5+6 return 0;缺省形参值的说明次序 缺省形参值必须从缺省形参值必须从右向左右向左顺序声明,并且在顺序声明,并且在缺省形参值的右面不能有非缺省形参值的参缺省形参值的右面不能有非缺省形参值的参数。数。 例:int add(int x,int y=5,int z=6); /正确int add(int x=1,int y=5,int

17、 z); /错误int add(int x=1,int y,int z=6); /错误缺省形参值与函数的调用位置 调用在函数实现前:缺省形参值必在函数原型中给出 调用在函数实现后:缺省形参值可在函数实现时给出int add(int x=5,int y=6);int main(void) add(); /调用在实现前 return 0 ;int add(int x,int y) return x+y; int add(int x=5,int y=6) return x+y; int main(void) add(); /调用在实现后 return 0;缺省形参值的作用域 相同作用域内,缺省形参值

18、的说明应保持唯一,但如果在不同的作用域内,允许说明不同的缺省形参。 int add(int x=1,int y=2);int main(void) int add(int x=3,int y=4); add( ); return 0;void fun(void) . add( ); /使用局部缺省形参值(实现3+4)/使用全局缺省形参值(实现1+2)例3-15 带缺省形参值的函数举例int get_volume(int length, int width = 2, int height = 3);int main( ) int x = 10, y = 12, z = 15; cout get_

19、volume(x, y, z) endl; cout get_volume(x, y) endl; cout get_volume(x) endl; cout get_volume(x, 7) endl; cout get_volume(5, 5, 5) endl; return 0;int get_volume(int length, int width, int height) coutlengthwidthheight; return length * width * height;运行结果:10 12 15 180010 12 3 36010 2 3 6010 7 3 2105 5 5

20、 1253.4 函数重载 C+允许功能相近的函数在相同作用域内以相同函数名声明,从而形成重载。方便使用,便于记忆。 例:形参类型不同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);注意事项不要将不同功能的函数声明为重载函数,以免出现调用结果的误解、混淆。这样不好:int add(int x,int y);int add(int a,int b);编译器不以形参名来区分int add(int x,int y);void add(in

21、t x,int y);编译器不以返回值来区分int add(int x,int y) return x+y; float add(float x,float y) return x-y; 重载函数的形参必须不同重载函数的形参必须不同: 个数不同个数不同或或类型不同类型不同。编译程序将根据实参和形参的类型及个数的最佳编译程序将根据实参和形参的类型及个数的最佳匹配来选择调用哪一个函数。匹配来选择调用哪一个函数。例3-16 重载函数应用举例编写三个名为add的重载函数,分别实现两整数相加、两实数相加和两个复数相加的功能。#include using namespace;struct complexd

22、ouble real;double imaginary;int 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;coutinteger m+n=add(m,n)endl;coutxy;coutreal number x+y= add(x,y)endl;coutc1.realc1.imaginary;coutc2.realc2.imaginary;c3=

23、add(c1,c2);coutcomplex number ( c1.real , c1.imaginary )+(c2.real, c2.imaginary)=(c3.real, c3.imaginary)n; return 0;int add(int m, int n) return m+n; double add(double x, double y) return x+y; complex add(complex c1, complex c2) complex c;c.real=c1.real+c2.real;c.imaginary=c1.imaginary+c2.imaginary;

24、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 67.8complex number (12.3,45.6)+(56.7,67.8)= (69,113.4)3.5 C+系统函数 C+的系统库中提供了几百个函数可供程序员使用。例如:求平方根函数(sqrt)、求绝对值函数(ab

25、s)等。 使用系统函数时要包含相应的头文件。例如:cmath函数函数作用作用示例示例exp(x)求指数求指数exexp(1.0)=2.71828;log(x)求求x的自然对数的自然对数logexlog(2.718282)=1.0log10(x)求求x的普通对数的普通对数log10 xlog10(10.0)=1.0pow(x,y)计算计算xypow(2,7)=128,pow(9,0.5)=3sqrt(x)求求x的平方根的平方根sqrt(900.0)=30.0fmod(x)取取x/y的浮点余数的浮点余数fmod(3.657,2.333)=1.992abs(x)求整数求整数x的绝对值的绝对值abs(

26、-2)=2fabs(x)求求x的绝对值的绝对值fabs(5.1)=5.1,fabs(-2.3)=2.3sin(x)求求x的正弦的正弦sin(0.0)=0cos(x)求求x的余弦的余弦cos(0.0)=1tan(x)求求x的正切的正切tan(0.0)=0例3-18 系统函数应用举例 题目:从键盘输入一个角度值,求出该角度的正弦值、余弦值和正切值。#include using namespace;#includeconst double pi(3.14159265);int main( ) double a,b; cina; b=a*pi/180; coutsin(a)=sin(b)endl; coutcos(a)=cos(b)endl; couttan(a)=tan(b)endl; return 0;运行结果:运行结果: 30 sin(30)=0.5 cos(30)=0.866025 tan(30)=0.57735中国石油大学(华东)理学院C课程48

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

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

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


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