




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、会计学1第五部分函数第五部分函数abcdefgS1S2S3xyz)(21)()(zyxczcycxccarea 5.1.1 引例 已知五边形的各条边的长度,计算其面积 计算多边形面积,可将多边形分解成若干个三角形 计算三角形面积的公式如下: 5.1 函数的定义、调用与说明第1页/共58页用前面所学的知识实现:#include math.h#include iostream.hvoid main()float a,b,c,d,e,f,g,p1,p2,p3,s1,s2,s3,s; cinabcdefg; p1=(a+b+c)/2; s1=sqrt(p1*(p1-a)*(p1-b)*(p1-c);
2、p2=(c+d+e)/2; s2=sqrt(p2*(p2-c)*(p2-d)*(p2-e); p3=(e+f+g)/2; s3=sqrt(p3*(p3-e)*(p3-f)*(p3-g); s=s1+s2+s3; coutsabcdefg; s=area(a,b,c)+area(c,d,e) +area(e,f,g); coutsy) z=x; else z=y; return z; /将大的数返回void main() int a,b,c,m; cinabc; m=max(a,b); m=max(c,m); coutmendl; 第4页/共58页【例5.2】编一程序,输出如右图形。 void
3、pic(int n) for(int i=0;in;i+) cout.width(10-i); /控制每行输出的起始位 for(int j=0;j2*i+1;j+)cout*; coutendl; void main() pic(4); pic(6); 将n行构成的三角形独立出来编一函数: 第5页/共58页说明:函数类型指函数返回值的数据类型函数体由语句和其它分程序组成。形式参数可以为空,但圆括号不能省略。函数体中不允许再嵌套定义函数对没有返回值的函数,函数类型定为void型(无类型或空类型)。第6页/共58页函数名(实在参数表) 注意: 实参与形参的个数、位置与类型必须一致。它可以是同类型的
4、常量、变量或表达式。 调用的形式可以是表达式,也可以是语句。 函数定义中的形参只有当发生函数调用时,才被分配内存单元。函数调用的过程: 第7页/共58页#include iostream.h#include iomanip.hvoid main() pic(4); /以语句形式调用 pic(6);void pic(int n) for(int i=0;in;i+) cout.width(10-i); for(int j=0;j2*i+1;j+) cout*; coutmn;coutgcd(m,n)endl;coutsct(m,n)ab; c=max(a,b); coutcy?x:y ; 【例5
5、.4】函数说明示例 省略参数名注意: 函数调用在前,定义在后,则必须对函数进行说明,函数说明可以放在函数调用之前所在的函数内,也可以放在源文件开头、函数的外部。 函数说明和函数定义在返回类型、函数名和参数表上必须要完全一致。第12页/共58页5.2.1 传值参数特点:形参的改变不会影响实参的值【例5.5】m是一个3位的正整数,将满足m、m2、m3均为回文数的正整数输出。所谓回文数是指顺读与倒读数字相同,如4、151、34543。分析:将正整数的每位数取出,构造一个逆序的正整数,若该数与原来的相同,即为回文数。bool palindrome(int x) int m=x,n=0,k; while
6、(x!=0) /构造一逆序数 k=x%10; n=n*10+k; x/=10; return m=n; 实参:常量、变量和表达式。形参:变量第13页/共58页#include iostream.hvoid swap(int x,int y)int temp; temp=x;x=y;y=temp;void main()int a,b;cinab;swap(a,b);couta=a b=bab; swap(&a,&b); coutabendl;void swap(int *x,int *y)int temp=*x;*x=*y;*y=temp; 第15页/共58页【例5.8】随机生成10个1100之
7、间的数放在一维数组中,求其平均值及最大的元素值 。程序:#include iostream.h#include stdlib.hconst int N=10;void fun(float *p,float *p1,int *p2) float sum,max1; sum=max1=*p+; for(int i=1;iN;i+) if (max1*p) max1=*p; sum=sum+*p;p+; *p1=sum/N; *p2=max1;void main() float a10,aver,max,x; for(int i=0;i10;i+) x=rand()%100+1; ai=x; fun
8、(a,&aver,&max);/注意实参的写法 coutavermaxendl;第16页/共58页【例5.9】字符串的复制#include iostream.hvoid copy_string(char *from, char *to) while(*from!=0) *to+=*from+; *to=0; void main() char a=I am a teacher., b=You are a student.; coutaendlbendl; copy_string(a,b); coutaendlbab;copy_string(a,b);couta bendl;delete a; d
9、elete b;若该二语句删除,程序运行时将异常终止。 第18页/共58页2形参为常指针 防止被调函数对实参所指对象的修改 #include iostream.h int f(const int * p) int a=100; a=*p; return a;void main() int x=5; coutf(&x); *p=a; return *p;错误,不能修改const对象 第19页/共58页注意:若实参是常对象的地址,则形参必须定义为常指针。#include iostream.hint f(const int *p)int a=100; a=*p; return a;void main
10、() const int x=5; coutf(&x);形参不能定义为int *p第20页/共58页3函数返回值为指针 即函数的返回值可以是变量的地址、数组名或指针变量等。 如:float *fun(float x,float y);char *strcat(char *strDest,const char *strSource); 在说明或定义返回值为指针的函数时,只须在函数名前加一指针类型说明符即可。第21页/共58页【例5.10】拼接两个字符串s1和s2,将拼接后的字符串存于s1中返回。 char *strcat1(char *s1,const char *s2) char *p=s1;
11、 while(*p+); -p; while(*p+=*s2+) ; return(s1); 思考:若不定义为返回指针值的函数,则程序应如何修改?第22页/共58页注意:不能返回一个局部变量(在函数内定义的变量)的地址#include iostream.hint *fun(int x) int y=x*x; return &y;void main() int a=5, *p; p=fun(a); coutab; swap(a,b); couta=ab=10&flag) /判断是否降序数 if(x/10%10=x%10) x/=10; else flag=0; return flag;第25页/
12、共58页特点:在被调函数中对形参数组的任何改变均会影响实参所指地址里的内容 。形参:数组名 实参:数组名或指针变量 【例5.12】对含有n个元素的整型数组a,从大到小进行排序。 调用:sort(a,10);void sort(int x,int n) int i,j,k,w; for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+)if(xkxj)k=j; if(i!=k)w=xi;xi=xk;xk=w; 数值型数组的元素个数一般须传给形参第26页/共58页【例5.13】 求字符串长度,并调用之。 int len(char s)int i=0; while(si!=0)i+
13、; return i; 调用: cout=0) count+; k=str1.GetLength(); str1=str1.Mid(i+1,k-i); i=str1.Find(sub); return count;第29页/共58页用自身的结构来描述自身就称为递归。最典型的例子是对阶乘运算: 特点: 原始问题可转化为解决方法相同的新问题; 新问题的规模比原始问题小; 新问题又可转化为解决方法相同的规模更小的新问题,直至终结条件为止。第30页/共58页递推回归fac(2)=2*fac(1)fac(1)=1fac(4)=4*6fac(3)=3*2fac(2)=2*1fac(3)=3*fac(2)f
14、ac(4)=4*fac(3)【例5.15】编fac(n)=n! 的递归函数long fac(int n) if(n=1) return(1); return (n*fac(n-1);递推过程每调用自身,当前参数压栈,直到达到递归结束条件。回归过程不断从栈中弹出当前的参数,直到栈空。思考:若fac函数中没有语句 if(n=1) return(1);程序运行结果将如何?第31页/共58页【例5.16】用递归函数实现将一个十进制整数转换成二至十六任意进制的字符 void convert(int m,int r) char b17=0123456789ABCDEF;if(m!=0) convert(m
15、/r,r);cout=eps) w+=t; t=t*x/(n+); return w; void main() couts1=s(2.0); couts2=s(3.0); couts3=s(1.0,1e-5); 参数eps取默认值1e-6参数eps的值为1e-5【例5.17】求下面级数的部分和。精度为: .!.!212nxxxsn第33页/共58页 默认参数的说明必须出现在函数调用之前。若一个函数说明已给出参数的默认值,则在函数定义中不允许再设置。 要求赋予默认值的参数必须放在形参表列中的最右端。说明:分析下面各例: void fun(int i, int j, int k, int m=3,
16、int n=4); 假设函数调用语句为: fun(1,2); /错误,至少应有三个实参 fun(10,20,30); /正确,m、n取默认值 fun(10,20,30,40); /正确,m取40 、n取默认值4 fun(10,20,30, ,50); /错误,只能从左至右匹配第34页/共58页#include #include void main()int x1=-1; double x2=2.5; long x3=3L; coutabs(x1)endl; coutfabs(x2)endl; coutlabs(x3)endl; 不足:易出错、难记忆函数重载:一组参数(个数或类型)不同的函数共用
17、一个函数名。不同名函数实现同一类的操作第35页/共58页#include int abs(int x)return x0?x:-x; double abs(double x)return x0?x:-x; long abs(long x)return x0?x:-x; void main()int x1=1; double x2=2.5; long x3=3L; coutabs(x1)endl; coutabs(x2)endl; coutabs(x3)endl; 一. 参数类型不同的重载函数编译器根据函数参数的类型来确定应该调用哪个函数【例5.18】第36页/共58页二. 参数个数不同的重载函
18、数可见:重载使得函数的使用更加灵活、方便。 它体现了c+对多态性的支持一个名字,多个入口 。 【例5.19】 #include int min(int a,int b) return ab?a:b; int min(int a,int b,int c)int t=min(a,b); return min(t,c);int min(int a,int b,int c,int d)int t1=min(a,b); int t2=min(c,d); return min(t1,t2);void main() coutmin(13,5,4,9)endl; coutmin(-2,8,0)endl;编译器
19、根据调用语句中实参的个数来确定应该调用哪个函数注意:不要同时使用重载函数和缺省参数函数。第37页/共58页 使用函数重载需编写多个函数,而利用函数模板只需定义一个通用函数即可。 利用函数模板定义的函数称为模板函数,形式:template 类型 函数名( 参数表)#include template T min(T a,T b)return ab?a:b; void main() coutmin(3,5)endl; coutmin(8.5,5.6)endl;【例5.20】定义一个数据类型T使用模板函数时,模板中的类型参数T用实参的类型替换第38页/共58页分析以下几种模板函数:template T
20、 fun1(T a,int b) /可含有模板参数表中未给出的数据类型 template /模板中可带有多个参数 void fun1(T1 a,T2 b,T3 c) template void fun1(int a,int b) /必须至少有一个参数的类型为模板的类型参数 template void fun1(int a,int b) T i,j; 第39页/共58页【例5.21】定义一个通用的函数,对n个数按递增排序。 #include iostream.h template void sort(TEM x,int n) int i,j,k; TEM w; for(i=0;in-1;i+)
21、k=i; for(j=i+1;jxj)k=j; if(i!=k) w=xi;xi=xk;xk=w; void main()int i,a6=6,9,2,4,1,0;double b4=5.5,8.0,3.3,0;sort(a,10);sort(b,5);for(i=0;i10;i+)coutaiendl;for(i=0;i5;i+)coutbix; cout digit(x)endl;从下面三方面分析各变量作用域(可见性): 在什么范围内可以访问 空间概念生存期: 在什么时间存在 时间概念 初始化 全局变量(外部变量): 在函数外部定义的变量局部变量(内部变量):在函数内部定义的变量, 包括形
22、式参数【例5.22】第41页/共58页 作用域:从定义点开始到所在的分程序结束 生存期:开始执行分程序就生成,分程序执行结束就消亡 初始化:可以初始化,缺省值为随机值。作用域不可以扩展 #include iostream.h int f(int x)x+;int y=5; /auto int k=5;y+;return x+y; void main()int k=2; coutf(k)endl; coutf(k+1)endl; 缺省的存储类别:auto注意:只有内部变量存储类别才能auto【例5.23】第42页/共58页作用域:从定义点开始到所在的分程序结束。生存期:程序的执行周期初始化:可以
23、初始化,缺省值为0或0 。 初始化一次 在开始执行程序时初始化作用域不可以扩展一个函数可能被调用多次,前一次调用的结果带到下一次去。#include iostream.hint fac(int n) static int f=1; f=f*n; return(f);void main()auto int i; for(i=1;i=5;i+) couti!=fac(i);【例5.24】第43页/共58页作用域:从定义点开始到所在的文件结束生存期:程序的整个执行周期初始化:可以初始化,缺省值为0或0 。作用域可以扩展: 向上扩展 横向扩展,扩展到另一个文件注意:扩展的地方不能初始化第44页/共58
24、页#include iostream.hint m=10; void f1(int n) n=2*n;m=m/3; int n; void f2() n=5;m+;n+; void main() int n=2; f1(n); f2(); coutmnendl; 【例5.25】外部变量示例注意: 外部变量的作用域只限于定义处到文件结束,定义点之前的函数或其它文件中的函数不可以引用该外部变量。可以使用extern声明符来扩展外部变量的作用域 外部变量与局部变量同名,起作用的是局部变量第45页/共58页(1)作用域向定义点之前的函数扩展 #include extern int i;void fun
25、() /extern int i; 错误 couti;void g()i+;int i=5;void main() int j=20; coutj; g(); fun();#include extern int i; /不能初始化void fun() / extern int i; couti;int i=5;void main() int j=20; coutj; fun();第46页/共58页(2)作用域扩展到另一个文件【例5.26】作用域横向扩展示例 /file1.cppextern max,min; #include iostream.hvoid main() void maxmin(
26、int x,int n); int a10=11,2,3,-4,5,6,7,8,0,20; maxmin(a,10); coutmax minendl;/file2.cppint max,min; void maxmin(int x,int n) max=x0;min=x0; for(int i=0;imax)max=xi; if(xix; for(n=6;n=x;n+=2) for(a=3;a=n/2;a+=2)if(isprime(a) b=n-a; if(isprime(b) coutn=a+b0。但这样处理的数据是从个位向前的,所以还要作反转处理。第51页/共58页程序: #inclu
27、de iostream.h #include string.h void main() void itoc(int,char ); int n;char s100; cinn; itoc(n,s); coutsendl; void itoc(int n,char s) void reverse(char ); int i=0; int sign; if(sign=n)0); if(sign0) si+=-; si=0; reverse(s); void reverse(char s) int c,i,j;j=strlen(s)-1;for(i=0;ij;i+,j-) c=si;si=sj;sj=c; si+j+1=0;第52页/共58页【例5.29】用梯形法求积分:分析:n等分积分区间a,b,每一个小梯型的面积和即近似为f(x)在a,b的积分值。即将求积分转化求和。第53页/共58页#include iostream.h#include math.hdouble f(double x) return exp(-x*x/2);double integral(double
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国水处理过滤器行业市场发展监测及投资潜力预测报告
- 2025年中国可印刷磁胶行业市场全景分析及前景机遇研判报告
- 2025年中国可调节床底座和床套行业市场全景分析及前景机遇研判报告
- 2025年中国建筑集成光伏(BIPVBIPV)天窗行业市场全景分析及前景机遇研判报告
- 2025年南极冰藻提取物项目节能评估报告(节能专)
- 2025年中国配电断路器行业发展监测及发展趋势预测报告
- 税务师网课老师和课件
- 中国制动毂拆装翻转架行业市场发展现状及投资潜力预测报告
- 2025年 云南省快开门式压力容器R1证理论考试练习题附答案
- 2025年酿造葡萄汁项目节能评估报告(节能专)
- 中国铝业股份有限公司偃师市东沟铝土矿矿山地质环境保护与土地复垦方案
- 2023-2024学年河南省濮阳市小学语文五年级期末通关考试题附参考答案和详细解析
- 国语经典歌曲歌词接龙考试题库(180题)
- 【真题】2023 云南省特岗教师初中物理学科专业知识试卷全解析版
- 2021年暖通工程师专业基础考试真题及答案
- 项目信息报备表(模板)
- 压力容器制造过程控制点一览表
- 《干部履历表》填写样本-1999年
- 工程建设EHS管理协议
- 如在水底如在空中
- GB/T 42100-2022游乐园安全应急管理
评论
0/150
提交评论