第七讲-函数(一)_第1页
第七讲-函数(一)_第2页
第七讲-函数(一)_第3页
第七讲-函数(一)_第4页
第七讲-函数(一)_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

《C++语言及编程技巧》主讲:匡纲要国防科技大学电子科学与工程学院·湖南长沙·81第7讲函数82第7讲函数(一)

4.1函数概述

4.2函数定义与函数调用

4.3函数原型

4.4函数嵌套调用与递归调用

834.1函数概述

C++语言认为函数是一个能完成某一独立功能的子程序,也就是程序模块。 函数就是对复杂问题的一种“自顶向下,逐步求精”思想的体现。 编程者可以将一个大而复杂的程序分解为若干个相对独立而且功能单一的小块程序(函数)进行编写,并通过在各个函数之间进行调用,来实现总体的功能。84使用函数的优点:(1)可读性好;(2)易于查错和修改;(3)便于分工编写,分阶段调试;(4)各个函数之间接口清晰,便于相互间交换信息和使用;(5)节省程序代码和存储空间;(6)减少用户总的工作量;(7)成为实现结构程序设计思想的重要工具;(8)扩充语言和计算机的原设计能力;(9)便于验证程序正确性。4.1函数概述85 设计C++程序的过程,实际上就是编写函数的过程,至少也要编写一个main()函数。 执行C++程序,也就是执行相应的main()函数。即从main()函数的第一个左花括号“{”开始,依次执行后面的语句,直到最后一个右花括号“}”为止。如果在执行过程中遇到其他的函数,则调用其他函数。调用完后,返回到刚才调用函数的下一条语句继续执行。而其他函数也只有在执行main()函数的过程中被调用时才会执行。4.1函数概述86

函数可以被一个函数调用,也可以调用另一个函数,它们之间可以存在着调用上的嵌套关系。但是,C++不允许函数的定义嵌套,即在函数定义中再定义一个函数是非法的。

C++函数是一个独立完成某个功能的语句块,函数与函数之间通过输入和输出来联系。

4.1函数概述874.2函数定义与函数调用无参函数定义函数定义函数类型标识符函数名()/*函数首部*/{

/*函说明部分数执行部分体}

*/有参函数定义函数类型标识符函数名(形式参数及类型说明表){

说明部分执行部分}形式参数及类型说明表类型名1形式参数1,类型名2形式参数2,...88函数体里经常要用到一个指示返回函数结果值的语句—return语句。若函数确实返回一个值:return语句

return(表达式);或

return表达式;若函数没有返回值

return;或

/*不要return;语句*/(无需return语句,执行到函数体的

}时,流程控制返回函数调用点)4.2函数定义与函数调用89例1已知两实型数的值,求其和数floatfadd(float

x,floaty){return(x+y);}例2已知某直角三角形的两直角边,求其斜边长doublehypo(double

a,doubleb){doublec;c=sqrt(pow(a,2)+pow(b,2));return(c);}函数定义示例4.2函数定义与函数调用810例3已给某三角形的三边长,求该三角形的面积floatarea(float

a,float

b,floatc){floatl,s;l=(a+b+c)/2;s=sqrt(l*(l-a)*(l-b)*(l-c));return(s);}函数定义示例4.2函数定义与函数调用811例4计算前n(n

1)项自然数之和intsum(intn){inti,total=0;for(i=1;i<=n;i++)total+=i;return(total);}函数定义示例4.2函数定义与函数调用812例5实现:若ch的值是英文大写(小写)字母,则返回相对应的英文小写(大写)字母;若ch的值是任意其他字符,则返回原字符值不变。charchange(charch){charc=ch;if(ch>='A'&&ch<='Z')c=ch+32;elseif(ch>='a'&&ch<='z')c=ch-32;return(c);}函数定义示例

4.2函数定义与函数调用813无参函数调用的一般形式函数调用

函数名()有参函数调用的一般形式

函数名(实参1,实参2,……)要求实参和形参:参数个数相等顺序一一对应类型赋值匹配4.2函数定义与函数调用814方式一

函数调用可出现在表达式中例6承例3,设已说明实型变量s,可写s=area(3.0,4.0,5.0);Cout<<"Theareais:”<<s<<endl;或写Cout<<"Theareais:”<<area(3.0,4.0,5.0)<<endl;函数调用方式Theareais:6.000000.4.2函数定义与函数调用815方式二

可作为函数调用语句出现设定义无返回值函数printvoidprint()/*或写voidprint(void)*/{

inti;

for(i=1;i<=5;i++)

cout<<"**********\n";}可写如下函数调用语句print();**************************************************函数调用方式4.2函数定义与函数调用816例7:求整数的立方体,并以列表形式输出10、20、30、……、100及其立方体。//programc04_01.cpp#include<iostream.h>#include<iomanip.h>longcube(intn){

return(n*n*n);}voidmain(){

int

i,n=10; longl;

cout<<"n\tn*n*n"<<endl<<endl;

cout<<setiosflags(ios::left);

for(i=1;i<=10;i++) { l=cube(n);

cout<<setw(8)<<n<<setw(8)<<l<<endl; n+=10; }}运行示例:nn*n*n10008000270006400012500021600034300051200072900010010000004.2函数定义与函数调用8174.3函数原型函数说明又称函数原型。函数说明告知编译器:函数返回的数据类型函数所接收的参数个数函数所接收的参数类型函数所接收的参数顺序编译器用函数说明检验函数调用。

函数说明

8184.3函数原型

无参函数说明语句的一般形式函数类型标识符函数名();有参函数说明语句的一般形式函数类型标识符函数名(类型名1形参1,类型名2形参2,...);或函数类型标识符函数名(类型名1,类型名2,...);函数说明819例8编写程序,求两个已给整数中的大者并输出结果。/*programfindmax.cpp*/#include<iostream.h>main(){inta,b,c;intmax(inti,intj);/*函数说明*/

cout<<"Entertwointegernumbers:";

cin>>a>>b;c=max(a,b);

cout<<"Themaximumvalueis“<<c<<“.\n";}intmax(inti,intj)/*函数定义*/{intk;k=(i>j)?i:j;return(k);}函数说明示例Entertwointegernumbers:25

Themaximumvalueis5.4.3函数原型820简化程序之一/*programfindmax1.cpp*/#include<iostream.h> main(){inta,b,c;

intmax(inti,intj);/*函数说明*/

cout<<"Entertwointegernumbers:";

cin>>a>>b;c=max(a,b);

cout<<"Themaximumvalueis“<<c”.\n";}max(inti,intj)/*函数返回值类型缺省时,隐含为int型*/{intk;k=(i>j)?i:j;return(k);}

被调用函数的返回值为int型或char型时,可省写函数说明语句函数说明示例4.3函数原型821简化程序之二/*programfindmax2.cpp*/#include<iostream.h> main(){inta,b,c;intmax(int,int);

cout<<"Entertwointegernumbers:";

cin>>a>>b;c=max(a,b);

cout<<“Themaximumvalueis“<<c<<”.\n";}intmax(inti,intj)/*此处不能写成intmax(int,int)*/{intk;k=(i>j)?i:j;return(k);}函数说明中省略形参名函数说明示例4.3函数原型822简化程序之三/*programfindmax3.cpp*/#include<iostream.h> intmax(inti,intj)/*函数定义*/{intk;k=(i>j)?i:j;return(k);}main(){inta,b,c;/*函数定义在先,可省略函数说明语句*/

cout<<"Entertwointegernumbers:";

cin>>a>>b;c=max(a,b);

cout<<"Themaximumvalueis“<<c<<“.\n";}函数说明示例4.3函数原型823例9

输入三个正实数,计算三角形面积并输出结果。/*programfindarea.cpp*/#include<iostream.h>#include<math.h>/*包含求平方根函数sqrt*/main(){floata,b,c,s;floatarea(floata,floatb,floatc);/*函数说明*/do{

cout<<"Enterthreerealnumbers(>0):";

cin>>a>>b>>c;}while(!(a>0&&b>0&&c>0&&a+b>c&&b+c>a&&c+a>b));s=area(a,b,c);/*函数调用*/

cout<<"Theareais“<<s<<“.\n";}函数说明示例4.3函数原型824/*以下为函数定义*/floatarea(floata,floatb,floatc){floatl,s;l=(a+b+c)/2;s=sqrt(l*(l-a)*(l-b)*(l-c));return(s);}Enterthreerealnumbers(>0):3.04.05.0

Theareais6.000000.函数说明示例4.3函数原型825示例

编写程序,输出1到10之间所有自然数及其平方、立方表:函数定义、函数调用与函数说明使用示例

numbersquarecube____________________

111248392741664525125636216749343864512981729101001000

4.3函数原型826/*programnsc.cpp.tableofnumberandit'ssquare,cube*/#include<iostream.h>#include<iomanip.h>#defineN10intsquare(int);/*函数说明*/intcube(int);/*函数说明*/main(){inti,sq,cu;

cout<<"\nnumber\tsquare\tcube\n";

cout<<setiosflags(ios::left);for(i=1;i<=20;i++)

cout"_";

cout<<endl<<endl;for(i=1;i<=N;i++){sq=square(i);cu=cube(i);

cout<<setw(8)<<i<<setw(8)<<sq<<setw(8)<<cu;}} /*函数调用函数调用*/函数定义、函数调用与函数说明使用示例4.3函数原型827/*函数定义*/intsquare(intx){return(x*x);}/*函数定义*/intcube(intx){return(x*x*x);}函数定义、函数调用与函数说明使用示例4.3函数原型8284.4函数的嵌套调用与递归调用C语言不允许嵌套定义函数,但允许嵌套调用函数,还可递归调用函数嵌套调用就是一个函数调用另一函数,而另一函数又调用再一函数,如此继续递归调用就是一个函数可间接地或直接地调用自身函数的嵌套调用与递归调用8294.4函数的嵌套调用与递归调用例10下述程序体现了函数的嵌套调用。/*programnestedcalls.cpp*/#include<iostream.h>voidgreeting()/*函数定义*/{

cout<<“Goodmorning!”<<endl;

cout<<"Howareyou?”<<endl;}voidsmalltalk()/*函数定义*/{inti;

cout<<"SMALLTALK...”<<endl;for(i=1;i<=3;i++)

cout<<"CHATTER...";

cout<<endl;}

函数的嵌套调用示例8304.4函数的嵌套调用与递归调用voidtalk()/*函数定义,包含函数说明语句*/{voidinquire();/*函数说明,先使用后定义*/voiddeparture();/*函数说明,先使用后定义*/inquire();/*函数调用*/departure();/*函数调用*/}voidinquire()/*函数定义*/{greeting();/*函数调用*/smalltalk();/*函数调用*/}voiddeparture()/*函数定义*/{

cout<<"Goodtohearthatthingsaregoingwell.\n";

cout<<"Haveaniceday.\n";}函数的嵌套调用示例8314.4函数的嵌套调用与递归调用voidhello() /*函数定义*/{

cout<<"Hello.”<<endl;talk(); /*函数调用*/

cout<<"Goodbye.”<<endl;}main(){hello(); /*函数调用*/}Hello.Goodmorning!Howareyou?SMALLTALK...CHATTER...CHATTER...CHATTER...Goodtohearthatthingsaregoingwell.Haveaniceday.Goodbye.函数的嵌套调用示例8324.4函数的嵌套调用与递归调用假如一个对象,它部分地由自己组成,或者是用自己来定义,则称它是递归的。递归问题的共性递归的概念(1) 有一个“基本实例”,即结束递归的条件;(2) 问题可转化为相似问题,但较原始问题简化;(3) 可以应用此转化过程使问题获得解决。递归的概念与数学中的递推、迭代等概念相似。8334.4函数的嵌套调用与递归调用示例计算阶乘的递推算法数学公式递推算法递归的概念8344.4函数的嵌套调用与递归调用示例计算斐波那契数序列的递推算法斐波那契数序列0,1,1,2,3,5,8,13,21,34,55,89,144,233,...

递归的概念8354.4函数的嵌套调用与递归调用示例

计算n阶勒让德多项式的递推算法leg(x,1)=xleg(x,2)=(3x2-1)leg(x,3)=(15x3-9x)

......递归的概念8364.4函数的嵌套调用与递归调用示例计算阿克曼(Ackermann)函数的递推算法Ack(0,0)=1Ack(1,0)=2Ack(1,1)=3......Ack(2,2)=?

Ack(1,2)=Ack(0,Ack(1,1))=Ack(0,3)=4Ack(1,3)=Ack(0,Ack(1,2))=Ack(0,4)=5Ack(1,4)=Ack(0,Ack(1,3))=Ack(0,5)=6Ack(1,5)=Ack(0,Ack(1,4))=Ack(0,6)=7Ack(2,0)=Ack(1,1)=3Ack(2,1)=Ack(1,Ack(2,0))=Ack(1,3)=5Ack(2,2)=Ack(1,Ack(2,1))=Ack(1,5)=7

递归的概念8374.4函数的嵌套调用与递归调用例11计算某非负整数n的阶乘的递归函数定义fac(5)fac(5)返回120

5*fac(4)5*fac(4)返回120

4*fac(3)4*fac(3)返回24

3*fac(2)3*fac(2)返回6

2*fac(1)2*fac(1)返回2

1*fac(0)1*fac(0)返回1

11longfac(intn){longf;if(n==0)f=1;elsef=n*fac(n-1);return(f);}printf("%d\n",fac(5));120递归函数定义示例8384.4函数的嵌套调用与递归调用例12求两个非负整数m、n最大公因子的递归函数定义intgcd(int

m,intn){intc;if(n==0)c=m;elsec=gcd(n,m%n);return(c);}递归函数定义示例8394.4函数的嵌套调用与递归调用例13给定n(0

n

30),用递归算法计算斐波那契数序列的前n+1项(序号从0至n)并输出结果。/*programfibonacci.cpp*/#include<iostream.h>#include<iomanip.h>#defineMAX30longfib(intn)/*求序号为n(n>=0)的斐波那契数*/{longres;/*result*/switch(n){case0:res=0;break;case1:res=1;break;

default:res=fib(n-1)+fib(n-2);}return(res);}

递归函数应用示例8404.4函数的嵌套调用与递归调用main(){intm,n;do{

cout<<"Inputn(0<=n<=“<<MAX<<“):";

cin>>n;}while(!(n>=0&&n<=MAX));for(m=0;m<=n;m++){

cout<<setw(7)<<fib(m);if((m+1)%8==0)

cout<<endl;}

cout<<endl;}

递归函数应用示例8414.4函数的嵌套调用与递归调用Inputn(0<=n<=30):24

01123581321345589144233377610987159725844181676510946177112865746368Inputn(0<=n<=30):

-6

Inputn(0<=n<=30):6

0112358

递归函数应用示例8424.4函数的嵌套调用与递归调用示例承例13,求序号为n(n

0)的斐波那契数函数定义的另一语句编码形式longfib(intn){if(n==0||n==1)return(n);elsereturn(fib(n-1)+fib(n-2));}

递归函数定义示例8434.4函数的嵌套调用与递归调用例14

求n(n

0)阶勒让德多项式的递归函数定义f

温馨提示

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

评论

0/150

提交评论