第3章 过程抽象——函数_第1页
第3章 过程抽象——函数_第2页
第3章 过程抽象——函数_第3页
第3章 过程抽象——函数_第4页
第3章 过程抽象——函数_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

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

文档简介

,第三章过程抽象函数,学习目标,掌握函数调用的方法,会使用函数原型;掌握函数定义的方法,理解函数返回值的意义;熟练掌握函数调用的值传递规则。掌握递归函数,3.1函数3.1.1函数概述3.1.2函数定义3.1.3函数调用3.1.4函数传递机制3.2递归函数3.3程序的结构化与模块化3.4程序测试与代码优化,第三章过程抽象函数,C函数的概念,函数是C提供的用于实现子模块的语言成分。函数的概念源于数学,是一个集合到另一个集合的映射。例如对于数学中的函数y=f(x)=x2:,用C函数表示就是:intf(intx)returnx*x;,函数,函数,函数,函数概述,在前面学习的C程序中,都有一个名称为main的函数,每个完整的C程序从该函数开始运行。在前面编写的程序中,很多处理(运算)都是通过使用库函数完成的。如数学函数:fabs()、sqrt()、pow()、sin().,C函数概述,函数概述,函数的基本要素,一个函数由函数首部和函数体两部分构成函数首部包括:函数名、函数的返回值类型、函数的参数函数体包括:声明部分(数据说明)、语句部分(运算),intmain(void)intinches,feet,fathoms;printf(inputfathoms:);scanf(%d,声明部分:三个整形变量,语句部分:输入一个英寻数,进行单位换算,函数体,函数首部,函数概述,函数定义和函数调用的概念,编写函数首部和函数体的内容就是进行函数定义,按照函数定义时给定的函数名使用函数称为函数调用,库函数是已经编写好的函数,编写程序时可直接调用,在本章我们要学习自己编写函数,并了解更多的库函数的使用方法,函数概述,3.1函数3.1.1函数概述3.1.2函数定义3.1.3函数调用3.1.4函数传递机制3.2递归函数3.3程序的结构化与模块化3.4程序测试与代码优化,第三章过程抽象函数,函数定义,函数定义的一般形式是:,返回值类型函数名(形式参数表)声明部分;语句部分;,例如,定义一个函数,将给定一个摄氏温度转换为华氏温度,并将华氏温度返回。,voidmain(void)intx;doubley;printf(CelsiustoFahrenheittable:n);for(x=0;x=100;x+=5)y=CelsToFahr(x);printf(%d%lfn,x,y);,doubleCelsToFahr(intc)doublet;t=9.0/5*c+32;returnt;,函数定义,函数参数,形式参数和实际参数,返回值类型函数名(形式参数表)声明部分;语句部分;,doubleCelsToFahr(intc)doublet;t=9.0/5*c+32;returnt;,调用函数时的参数是实际参数x=35;y=CelsToFahr(x);y=CelsToFahr(50);,函数定义中函数首部的参数称为形式参数形参说明的格式为:,函数定义,函数的返回值和return语句,函数的返回值由return语句带回,return语句使被调用函数的执行过程终止,定义一个函数,判断给定的一个十进制正整数是否为素数。,/*判断正整数d是否为素数,若是返回1,否则返回0*/intisPrime(intd)inti;if(d2)return0;for(i=2;iy)z=x;elsez=y;return(z);voidmain()inta,b,c;scanf(“%d%d”,函数定义,函数定义小结,函数定义的一般形式:,返回值类型函数名(形式参数表)声明部分;语句部分;,函数没有形式参数表时,可用“void”表示,函数调用时无须指定实际参数。函数没有返回值时,返回值类型用“void”表示,此时函数中可不写return语句。函数的返回值由return语句带回,在函数体中,return语句可出现多次,但执行到某一条return语句时,函数即结束。,函数定义,3.1函数3.1.1函数概述3.1.2函数定义3.1.3函数调用3.1.4函数传递机制3.2递归函数3.3程序的结构化与模块化3.4程序测试与代码优化,第三章过程抽象函数,函数调用,函数调用的基本格式:函数名(实际参数表),主调函数和被调用函数,调用函数时,表达式(语句)所在的函数称为主调函数实际参数(实参)在主调函数中形式参数(形参)在被调用函数中,实参由零个、一个或多个表达式构成(逗号分割),其个数和类型应与相应函数的形参相同。,函数调用,函数调用的执行过程,当一个函数被调用时,执行以下步骤:计算每个实际参数的值;将每个实参的值拷贝至对应的形参变量执行被调用函数的语句,直到遇到一条return语句或语句结束;计算return语句中表达式的值返回主调函数,用返回的值替换函数调用,然后继续执行主调函数的后续语句,函数调用,函数调用的执行过程,例:求两数之和#includefloatadd(floatx,floaty)floatz;z=x+y;return(z);voidmain()floata,b,c;scanf(“%f%f”,函数调用,程序要对被调用的函数进行声明。如果函数定义在本源文件调用点之前,则无需声明;如果函数定义在本源文件调用点之后,或者在其它文件中定义,则在调用前需要对被调用的函数进行声明。函数声明的格式如下:返回值类型函数名();/函数原型在函数声明中,中可以只列出形参的类型而不写形参名。函数原型即可以出现在main函数之前,也可以像标准库一样将它们单独列在头文件中,并在源文件中包含该头文件。,函数声明(函数原型),函数调用,例:求两数之和#includefloatadd(float,float);/函数原型voidmain()floata,b,c;scanf(“%f%f”,函数调用,举例,定义一个求n的阶乘的函数。函数返回n!,voidmain()inti=1;for(i=1;i=10;i+)printf(“%d!=%dn”,i,fact(i);,longfact(intn)longt=1,i=1;for(i=1;i=n;i+)t=t*i;return(t);,不同函数中的变量是互不干扰、相互独立的,举例,书架上有n本不同的书,从中任取k本,有多少种取法?,longcombinations(intn,intk)return(fact(n)/(fact(k)*fact(n-k);,举例,定义一个函数,对于给定一个位数不超过5位的十进制整数n,求解并返回其从右边数第k位上的数字(0k5),若k大于n的位数,则返回0。,被除数,除数,商,余数,12345,10,1234,5,被除数,除数,商,余数,1234,12345,10,1234,5,10,123,4,被除数,除数,商,余数,1234,12345,10,1234,5,10,123,4,123,10,12,3,被除数,除数,商,余数,1234,12345,10,1234,5,10,123,4,123,10,12,3,12,10,1,2,被除数,除数,商,余数,1234,12345,10,1234,5,10,123,4,123,10,12,3,12,10,1,2,1,10,0,1,被除数,除数,商,余数,1234,12345,10,1234,5,10,123,4,123,10,12,3,12,10,1,2,1,10,0,1,0,举例,定义一个函数,对于给定一个位数不超过5位的十进制整数n,求解并返回其从右边数第k位上的数字(0=1e-6)ucos+=sign*ai;i+;fib=1;for(k=1;k%cn,x,y);/把第1个/盘子从x表示的柱子移至y所表示的柱子。elsehanoi(x,z,y,n-1);/把n-1个圆盘从x表示的柱子移至/z所表示的柱子。printf(%d:%c-%cn,n,x,y);/把第n个圆盘从x表示的柱子移至y所表示的柱子。hanoi(z,y,x,n-1);/把n-1个圆盘从z表示的柱子移至/y所表示的柱子。,递归函数,#includeintmain()intn;printf(请输入盘子数:n);scanf(%d,使用循环(迭代)实现unsignedintGetFactorial(unsignedintn)unsignedintresult=1,i=0;while(+i=n)result*=i;returnresult;使用递归实现unsignedintGetFactorial(unsignedintn)unsignedintresult;if(n=0)result=1;elseresult=n*GetFactorial(n-1);returnresult;,阶乘函数,递归函数,使用循环(迭代)实现unsignedintGetFibonacci(unsignedintn)unsignedintresult,i,f1,f2;if(n=2|n=1)return1;f2=1;f1=1;for(i=3;i=n;i+)result=f1+f2;f1=f2;f2=result;returnresult;使用递归实现unsignedintGetFibonacci(unsignedintn)if(n=2|n=1)return1;elsereturnGetFibonacci(n-1)+GetFibonacci(n-2);,斐波那契数列函数,递归函数,对于一些递归定义的问题,用递归函数来解决会显得比较自然和简洁,而用循环来解决这样的问题,有时会很复杂,不易设计和理解。在实现数据的重复操作上,它们有一点不同:循环是从特殊情况到一般情况的推导;递归则从一般情况到特殊情况的嵌套。由于递归表达的重复操作是通过函数调用来实现的,而函数调用是需要开销的递归算法有时会出现重复计算。,递归与循环的选择,递归函数,3.1函数3.2递归函数3.3程序的结构化与模块化3.4程序测试与代码优化,第三章过程抽象函数,模块化与函数抽象模块化负责组织函数,进行任务划分,强调设计模块间通信使用接口,给出在本模块中定义的、提供给其它模块使用的一些程序实体(如:函数、全局变量等)的声明结构化与函数抽象结构化负责实现函数,强调编码抽象手段:函数,程序的结构化与模块化,3.1函数3.2递归函数3.3程序的结构化与模块化

温馨提示

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

评论

0/150

提交评论