C语言函数ppt课件.ppt_第1页
C语言函数ppt课件.ppt_第2页
C语言函数ppt课件.ppt_第3页
C语言函数ppt课件.ppt_第4页
C语言函数ppt课件.ppt_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

5函数,5.1函数概述5.2函数基本用法5.3函数应用举例5.4数组名作函数参数5.5递归函数5.6变量作用域与编译预处理,1,思考:输入n个整数到一维数组中,然后完成以下任务:(1)输出数组元素;(2)把数组就地逆置后后输出;(3)把数组升序排列并输出。提示:输出数组元素在(1)(3)中都有要求,每次输出都写一遍输出语句不是不可以,但代码冗余大,有没有更好的方法?思考并讨论:输入2个整数,求它们各自逆序之后的和的逆序数。如输入123,456;求321+654=975;975的逆序数579为所求结果。,2,5.1函数概述,把相关语句组织在一起,并给它们注明相应的名称,利用这种方法把程序分块,这种形式的组合就称为函数。从用户的角度分函数分为库函数和用户自定义函数。库函数有abs、fabs、ceil、floor、rand等,使用时须包含相应头文件。我们主要介绍用户自定义函数。一个大的程序一般分为若干个程序模块,每个模块用来实现一个特定的功能,每个模块一般由一个函数定义来实现。,3,一个C/C+程序由一个main函数及若干个其它函数构成。程序从main函数中开始执行,在main函数中结束。函数的作用是通过函数调用实现的。由主函数调用其它函数,其它函数可以相互调用。同一函数可以被一个或几个函数调用任意次。主函数由操作系统调用。例如,main函数调用f1、f2函数,f1函数调用f3函数的函数的调用示意图如下:,4,5.2函数基本用法,5.2.1函数的定义任何函数定义都是由函数头和函数体两部分组成。一般形式如下:函数类型函数名(形参列表)函数体函数类型可以是各种基本数据类型、指针类型、结构体类型、void(指定函数不返回值)等。函数名必须是合法的标识符。,5,函数定义中的参数为形式参数,简称形参。形参列表的每个参数包括参数类型和参数名,可以带默认值;形参列表可以没有,此时为无参函数;形参列表若有多个参数,则以逗号分开。函数可分为有返回值函数和无返回值函数两种。函数的返回值是通过函数中的return语句来获得的。return语句的一般格式:return返回值表达式;/表示可选返回值表达式的类型一般应与返回类型一致,否则以返回类型为准。return语句后带返回值表达式时控制程序流程返回调用点的同时带回一个值,语句“return;”控制程序流程返回到调用点。,6,下面是若干函数定义的例子:voidprint()/无参函数,也没有返回值printf(hellon);intmax(inta,intb)/求两个整数的最大值if(a=b)returna;elsereturnb;,7,5.2.2函数的声明函数调用之前必须先进行函数声明,形式为:“函数类型函数名(形参列表);”,函数声明中形参名可以省略;若函数定义在函数调用之前,则定义时的函数头可以充当函数声明,此时,可以不必进行函数声明。例如,下面是函数声明的例子:intmax(inta,intb);intmax(int,int);/省略形参名,8,5.2.3函数的调用函数的调用的形式一般如下:变量=函数名(实际参数表);void返回类型的函数只能以语句形式调用,其它返回类型的函数一般以表达式形式调用。调用时的参数称为实际参数,简称实参,一般不需要指定数据类型,除非是进行强制类型转换。参数的类型、顺序、个数一般须与函数定义中的一致。函数调用时,把实参依序传递给形参,然后执行函数定义体中的语句,执行到函数结束或return语句时,程序流程返回到调用点。,9,例如调用上面定义的函数的方法如下:print();/void返回类型的函数以语句形式调用有返回值的函数一般以表达式形式调用:intt=max(123,99);printf(%dn,max(1,2);,10,5.3函数应用举例,例1:逆序数的加法:输入两个正整数,先将它们分别倒过来,然后再相加,最后再将结果倒过来输出。注意:前置的零将被忽略。例如,输入305和794。倒过来相加得到1000,输出时只要输出1就可以了。因为得到逆序数的方法是一样的,故编写一个求逆序数的函数,调用3次即可完成2个输入的整数和1个结果整数的逆序。思考:n=1234,如何逆置?提示:考虑(4*10+3)*10+2)*10+1=4321。,11,#include/构成逆序数的函数intreverseNum(intx)/x是正整数intr=0;while(x0)r=r*10+x%10;x=x/10;returnr;,12,intmain()inta,b,c;scanf(%d%d,13,例2:素数判定素数是除了1与本身之外没有其它因子的自然数(1不是素数),可以考虑从2n-1判断是否有n的因子,若有,则n不是素数。可以仅在2sqrt(n)的范围内判断是否有因子。因为若n不是素数,则n=i*j(i=sqrt(n)),故只需判断2sqrt(n)范围内是否有因子。代码如下:#include#include/使用系统函数sqrt求开方须包含此头文件,14,intisPrime(intn)/n为素数返回1,否则返回0inti,flag=1;/一开始假设n为素数doublelimit=sqrt(1.0*n);/参数须为double类型for(i=2;i=limit;i+)if(n%i=0)/有因子,则可以判断为不是素数flag=0;break;if(n=1)flag=0;returnflag;,15,intmain()inti,n,T;scanf(%d,16,例3:最小回文数输入整数n,输出比该数大的最小回文数。其中回文数指的是正读、反读一样的数,如131,1221等。故可以调用例1中的求逆序数的函数reverseNum再判断该数与逆序数是否相等来判断是否回文数。,intisSymmetric(intn)/n为回文数返回1,否返回0if(n=reverseNum(n)/回文数的判断,调用reverseNumreturn1;elsereturn0;,17,#includeintmain()inti,n,T;scanf(%d,18,5.4数组名作函数参数,数组元素作函数实际参数时与普通的简单变量相同。以数组元素调用例1中定义的函数reverseNum的代码如下:#includeintmain()inti,a5=1234,56789,34567,43663464,46563432;for(i=0;i5;i+)ai=reverseNum(ai);/数组元素作为函数实参for(i=0;i1,27,调用f(5)的过程如上所示。递归分为扩展阶段和回代阶段,先扩展到递归出口(n=1|n=0)求出结果为1,然后逐步返回结果到各调用点,最终f(5)的调用结果为120。,28,例9:求两个整数的最大公约数两个整数的最大公约数是能够同时整除它们的最大的正整数。求最大公约数可以采用辗转相除法。辗转相除法,又名欧几里德算法(Euclideanalgorithm),是求两个正整数之最大公因子的算法。利用辗转相除法确定两个正整数a和b的最大公因子的算法思想是:令r是ab的余数,则gcd(a,b)=gcd(b,r),至r为0为止。例如:a=63,b=36,则:abr633627362792790,29,intgcd(inta,intb)/求最大公约数的递归版函数if(a%b=0)returnb;returngcd(b,a%b);intgcd1(inta,intb)/求最大公约数的迭代版函数while(b!=0)intt=a%b;a=b;b=t;returna;,30,思考1:求两个整数的最小公倍数?提示:其中一个先除以最大公约数,再乘以另一个数。思考2:如何求多个整数的最大公约数/最小公倍数?提示:使用循环。例9:斐波那契(Fibonacci)数列斐波那契(LeonardoFibonacci,约1170约1250),意大利数学家,是12、13世纪欧洲数学界的代表人物。他的一个“兔子问题”引起了后人的极大兴趣。题目假定一对大兔子每一个月可以生一对小兔子,而小兔子出生后两个月就有生殖能力,问从一对小兔子开始,n个月后能繁殖成多少对兔子?写出数列:1,1,2,3,5,8,13,21,发现规律:从第3项起,每一项都是前两项的和。,31,时间(月)初生兔子(对)成熟兔子(对)兔子总数(对)11012011311241235235635875813881321913213410213455,32,递归式:f1=1(n=1)f2=1(n=2)fn=fn-1+fn-2(n3)/求解斐波那契数列(递归法)intfib(intn)/n=0if(n=0inti,f1=1,f2=1,fib;if(n=2)return1;for(i=3;i%cn,get,put);voidhanoi(intn,charfrom,charto,charby)if(n=1)move(from,to);elsehanoi(n-1,from,by,to);move(from,to);hanoi(n-1,by,to,from);,38,intmain()intm;printf(inputtotaldiskes);scanf(%d,39,变量的作用域变量都有自己的作用域,变量说明的位置不同,其作用域也不同,常见的有:块作用域、文件作用域。块作用域:变量在花括号内声明时,该变量的作用域从声明位置开始,到块结束处为止。通常称之为局部变量。文件作用域:变量在函数外部声明时,该变量的作用域从声明位置开始,到文件结束处为止。通常称之为全局变量。,5.6变量作用域与编译预处理,40,块作用域示例,intmain(inty)intsum,n;scanf(%d,sum,n作用域,a,b,i作用域,41,文件作用域示例,intn;voidfun1(void)scanf(%d,n作用域,sum作用域,42,变量的可见性说明:有些情况下,变量在作用域内是不可见的(最近优先),例如:floatx=1.0;voidfun()printf(%dn,x);/全局变量floatx可见intmain()intx=100;printf(%dn,x);/全局变量floatx不可见fun();return0;运行结果:2001.0为避免这种易引起误解的情况,建议不要取相同的名字。,43,对于全局变量还有以下几点说明:,全局变量可加强函数模块之间的数据联系,但又使这些函数依赖这些外部变量,因而使得这些函数的独立性降低。从模块化程序设计的观点来看这是不利的,因此不是非用不可时,一般不使用外部变量。在同一源文件中,允许外部变量和内部变量同名。在内部变量的作用域内,外部变量将被屏蔽而不起作用。外部变量的作用域是从定义点到本文件结束。如果定义点之前的函数需要引用这些外部变量时,需要在函数内对被引用的外部变量进行说明。为了便于管理,有时会使用多个文件。此时,全局变量可以起到数据共享的功能。,44,编译预处理,文件包含宏定义条件编译,45,文件包含,所谓“文件包含”处理是指一个源文件可以将另外一个源文件的全部内容包含进来,即将另外的文件包含到本文件之中。C语言提供了#include命令用来实现“文件包含”的操作。其一般形式为#include“文件名”或#include,46,在#include命令中,文件名可以用双引号或尖括号括起来。二者的区别是:用尖括弧时,系统到存放C库函数头文件所在的目录中寻找要包含的文件,这称为标准方式。用双引号时,系统先在用户当前目录中寻找要包含的文件,若找不到,再按标准方式查找(即再按尖括号的方式查找)。一般来说,如果为调用库函数而用#include命令来包含相关的头文件,则用尖括号,以节省查找时间。如果要包含的是用户自己编写的文件(这种文件一般都在当前目录中),一般用双引号。在VC等特定的开发工具中使用多个文件

温馨提示

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

评论

0/150

提交评论