欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    第8章函数.ppt

    • 资源ID:4785417       资源大小:149.02KB        全文页数:58页
    • 资源格式: PPT        下载积分:10金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第8章函数.ppt

    第8章函数,主要内容:1,函数的定义的一般形式2,函数参数和函数值3,函数的一般调用、嵌套调用和递归调用4,数组作为函数参数5,局部变量和全局变量6,变量的存储类别7,内部函数和外部函数,1,掌握函数的定义形式,调用格式,返回值,值传送与地址传送的区别;2,掌握变量的作用域,存在范围,存储类别,要求,8.1 概述,一个较大型的程序一般均分成多个模块,每个模块完成一个特定的功能。在C语言中用函数来实现模块。一个C程序可由一个main函数和若干个其他函数构成。由主函数调用其他函数,其他函数之间也可相互调用,甚至可以调用函数自己(递归调用),但不能调用主函数。程序开发人员常用的方法是将一些经常使用的功能编写成函数,放在公共函数库中。,C语言程序的结构如图所示。在每个程序中,主函数main是必须的,它是所有程序的执行起点,main函数只调用其它函数,不能为其它函数调用。其它函数没有主从关系,可以相互调用。所有函数都可以调用库函数。程序的总体功能通过函数的调用来实现。,参见书中P155页例8.1 了解C程序通过函数调用实现所需功能,例8.1函数调用的简单例子,#includevoid main()void printstar();void print_message();printstar();print_message();printstar();void printstar()printf(*n);void print_message()printf(How do you do!n);,说明:1,一个C程序由一个或多个程序模块组成。每一个程序模块作为一个源程序文件。2,一个源程序文件由一个或多个函数组成,编译是以源程序为单位;3,程序的执行是由主函数开始到主函数结束,其它函数是通过函数调用来实现的。4,所有函数都是平行的。即函数定义不能嵌套,即函数内不能定义函数,但函数之间可以互相调用,甚至可以调用该函数本身(递归调用)但不能调用主函数5,从用户的角度函数分为:标准函数(即库函数)和用户定义函数。6,从函数的形式看,函数分为无参函数和有参函数,8.2.1无参函数定义的一般形式 函数类型 函数名(void)变量声明部分;可执行语句部分;当函数类型为int型时可以省略。,8.2 函数定义的一般形式,8.2.2.有参函数定义的一般形式函数类型 函数名(数据类型 参数,数据类型 参数2)说明语句部分;可执行语句部分;有参函数比无参函数多了一个参数表。调用有参函数时,调用函数将赋予这些参数实际的值。为了与调用函数提供的实际参数区别,将函数定义中的参数表称为形式参数表,简称形参表。,例定义一个函数用以返回两个数中的大者,int max(int x,int y)int z;/*声明部分*/z=xy?x:y;return(z);,函数类型,函数名,参数类型,形式参数,执行部分,函数的返回值,8.2.3空函数它的形式为:类型说明符函数名(),对形参声明的传统方式int max(x,y)int x,y;return xy?x:y;,函数定义举例:输入三个整数,求三个整数中的最大值不使用函数(除main外)#includevoid main()int n1,n2,n3,max;scanf(%d%d%d,使用函数#includevoid main()int n1,n2,n3,nmax;int max(int,int,int);scanf(%d%d%d,和调用库函数一样调用,函数定义,8.3函数的参数和函数值,8.3.1表达式参数和实际参数函数的参数分为形参和实参两种,作用是实现数据传送。形参出现在函数定义中,只能在该函数体内使用。发生函数调用时,调用函数把实参的值复制1份,传送给被调用函数的形参,从而实现调用函数向被调用函数的数据传送。,例8.2调用函数时的数据传递#includevoid main()int a,b,c,max(int,int);scanf(%d%d,int max(int x,int y)int z;z=xy?x:y;return(z);,说明:(1)形参变量只有在被调用时,才分配内存单元;调用结束时,即刻释放所分配的内存单元。因此,形参只有在该函数内有效。调用结束,返回调用函数后,则不能再使用该形参变量。(2)实参可以是常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参因此,应预先用赋值、输入等办法,使实参获得确定的值。(3)在被定义的函数中,每个形参都必须指定其类型。(4)实参和形参必须赋值兼容。(5)实参对形参的数据传送是单向的,即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。,8.3.2函数的返回值1,函数的返回是通过return语句,格式为:return(表达式);或 return 表达式;表达式的值即为函数返回的值。当程序执行return时会将流程转移到被调函数。2,返回值的类型:为函数的类型(函数名前的类型),当表达式的类型与函数类型不相同时系统会自动转换成函数类型。3,没有return语句时系统将返回一个不确定的值。4,若不需要返回数据,则可将函数类型声明为空类型(void),例8.3返回值类型与函数类型不同#includevoid main()int a,b,c,max(float,float);scanf(%d%d,例8.4:实参求值顺序#includevoid main()void f(int,int);int i=2;f(i,+i);f(+i,i);void f(int a,int b)printf(ta=%dtb=%dn,a,b);,8.4函数调用,8.4.1函数调用的一般形式:函数名(实参表列)说明:1,其中实参表列中的实参个数应和形参个数相同,且对应位置上的实参与形参的数据类型必须相同。2,实参之间用逗号分隔。3,对实参的求值是从右到左的顺序执行的。,8.4.2函数调用的形式函数调用可以是单独调用,或在表达式中,或作为函数参数。如printstar();c=2*max(a,b);m=max(a,max(b,c);8.4.3对被调用的声明和函数原型(1)对自定义函数。当函数定义在函数调用后面且函数类型不是int型时必须在调用前对调用函数进行说明,说明格式为:函数类型函数名(形参类型1,形参类型2,.);(2)对库函数,则必须将包含该库的原型声明的头文件包含到程序中:#include,例8.5对被调函数的声明。#includevoid main()float add(float,float);/*对被调函数的声明*/float a,b;scanf(%f%f,课堂练习,习题8.3:写一个判素数的函数,在主函数中输入一个整数,输出是否素数的信息主函数:函数声明与变量声明输入一个整数函数调用并根据返回值输出是否素数的信息判断素数函数:for i=2 to n/2 若n能被某一整数整除则返回0返回1,#includevoid main()int n,prime(int);printf(输入一个正整数:n);scanf(%d,8.5函数的嵌套调用,被调函数也可调用其它函数,形成调用的嵌套,返回时必须一层层返回。,例:一个函数的嵌套调用的例#includevoid main()void f1();printf(n调用函数f1之前:);f1();printf(n调用函数f1之后:);void f1()void f2();printf(n这是函数f1:);f2();void f2()printf(n这是函数f2:n);,8.6函数的递归调用,函数的递归调用是指,一个函数在它的函数体内,直接或间接地调用它自身。语言允许函数的递归调用。在递归调用中,调用函数又是被调用函数,执行递归函数将反复调用其自身。每调用一次就进入新的一层。为了防止递归调用无终止地进行,必须在函数内有终止递归调用的手段。常用的办法是加条件判断,满足某种条件后就不再作递归调用,然后逐层返回。,例8.8用递归方法求n!。#includestdio.hfloat fac(int n)float f;if(n1)f=n*fac(n-1);else f=1;return(f);void main()int n;float y;printf(input a integer number:);scanf(%d,课堂练习习题8.13:用递归方法求n阶勒让德多项式的值,#includevoid main()float p(int,int);int x,n;printf(输入n和x的值:n);scanf(%d%d,8.7 数组作为函数参数,数组作为函数参数的主要功能是将整个数组的数据传递给被调函数。8.7.1.数组元素作为函数实参使用方法和变量作为函数参数相同,只须把数组元素看作变量。此时实参为数组元素,形参为与数组相同类型的变量。,例8.10有两个数组a,b,比较其大小。算法设计:1,用2个for循环语句输入数组元素2,for(i=0;ibi的个数/调用函数进行比较用m表示ai=bi的个数用k表示aibi的个数 3,输出结果4,定义比较函数,#includevoid main()int large(int,int);int a10,b10,i,n=0,m=0,k=0;printf(请输入数组a的10个数,用空格分隔n);for(i=0;i10;i+)scanf(%d,if(nk)printf(na比b大n);if(ny)return 1;if(xy)return-1;return 0;,2.数组名作为函数参数调用格式:函数名(数组名)函数定义格式:类型函数名(数组类型数组名)说明:(1)用数组名作函数参数,应该在调用函数和被调用函数中分别定义数组,且数据类型必须一致,否则结果将出错。(2)C编译系统对形参数组大小不作检查,所以形参数组可以不指定大小。(3)数组名作为函数参数采用的是地址传送方法,若在函数中对形参数组作了改变,返回后实参数组也会作相应的改变。,例8.11有一个一维数组score,内放10个学生的成绩,求平均成绩,算法设计1,用for循环语句输入数组元素2,调用函数求平均值3,输出平均值4,定义求平均值函数4.1用for循环语句求总成绩4.2返回平均值,float average(float array)int i;float aver,sum=array0;for(i=1;i10;i+)sum+=arrayi;aver=sum/10;return aver;main()float score10,aver;int i;printf(input 10 score:n);for(i=0;i10;i+)scanf(%f,形参数组,实参,例8.13 用选择法对数组的10个元素排序,算法设计S1用for循环语句输入数组元素S2调用函数排序S3用for循环语句输出数组元素S4定义排序函数,选择法排序的基本思想:第1轮:从a2到an中选择最小的数与a1交换第2轮:从a3到an中选择最小的数与a2交换第3轮:从a4到an中选择最小的数与a3交换第i轮:从ai+1到an中选择最小的数与ai交换第n-1轮:从an到an中选择最小的数与an-1交换for(i=1;in;i+)for(j=i+1;j=n;j+)/从剩余的数中找最小的数的下标 找出aj中最小数的下标k if(aiak)交换ai与ak,#includevoid main()int a11,i;printf(input 10 number:n);for(i=1;i=10;i+)scanf(%d,void sort(int array,int n)int i,j,k,t;for(i=1;iarrayk t=arrayi;arrayi=arrayk;arrayk=t;/endfori/end sort,8.7.3多维数组名作为函数参数,例:有一个33的矩阵,求所有元素中的最大值。#includevoid main()int max_value(int array34);int a34=1,3,5,7,2,4,6,8,15,17,34,12;printf(max value is%dn,max_value(a);int max_value(int array34)int i,j,max;max=array00;for(i=0;imax)max=arrayij;return max;,8.8 局部变量和全局变量,语言中所有的变量都有自己的作用域。变量说明的位置不同,其作用域也不同,据此将语言中的变量分为内部变量和外部变量。在一个函数内部说明的变量是内部变量,它只在该函数范围内有效。也就是说,只有在包含变量说明的函数内部,才能使用被说明的变量,在此函数之外就不能使用这些变量了。所以内部变量也称局部变量。,例如:int f1(int a)/*函数f1*/int b,c;/*a,b,c作用域:仅限于函数f1()中*/int f2(int x)/*函数f2*/int y,z;/*x,y,z作用域:仅限于函数f2()中*/main()int m,n;/*m,n作用域:仅限于函数main()中*/,关于局部变量的作用域还要说明以下几点:1主函数main()中定义的内部变量,也只能在主函数中使用,其它函数不能使用。同时,主函数中也不能使用其它函数中定义的内部变量。因为主函数也是一个函数,与其它函数是平行关系。这一点是与其它语言不同的,应予以注意。2形参变量也是内部变量,属于被调用函数;实参变量,则是调用函数的内部变量。3允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。4在复合语句中也可定义变量,其作用域只在复合语句范围内。,8.8.2 全局变量 在函数外部定义的变量称为外部变量。以此类推,在函数外部定义的数组就称为外部数组。外部变量不属于任何一个函数,其作用域是:从外部变量的定义位置开始,到本文件结束为止。外部变量可被作用域内的所有函数直接引用,所以外部变量又称全局变量。,int p=1,q=5;/*外部变量p,q*/float f1(int a)/*a,b,c为局部变量*/int b,c;.char c1,c2;/*外部变量ch1,ch2*/char f2(int x,int y)int i,j;.main()int m,n;.,p与q的作用范围,c1与c2的作用范围,对于全局变量还有以下几点说明:(1)外部变量可加强函数模块之间的数据联系,但又使这些函数依赖这些外部变量,因而使得这些函数的独立性降低。从模块化程序设计的观点来看这是不利的,因此不是非用不可时,不要使用外部变量。(2)在同一源文件中,允许外部变量和内部变量同名。在内部变量的作用域内,外部变量将被屏蔽而不起作用。(3)外部变量的作用域是从定义点到本文件结束。如果定义点之前的函数需要引用这些外部变量时,需要在函数内对被引用的外部变量进行说明。外部变量说明的一般形式为:extern 数据类型 外部变量,外部变量2;注意:外部变量的定义和外部变量的说明是两回事。外部变量的定义,必须在所有的函数之外,且只能定义一次。而外部变量的说明,出现在要使用该外部变量的函数内,而且可以出现多次。,例8.15有一个一维数组,内放10个学生的成绩,写一个函数求出平均分,最高分和最低分。分析:函数只能返回一个值,现要返回三个值,可将其中两个设为外部变量,如最高分和最低分。算法设计:average函数:1,定义变量2,求出总分,最高分和最低分3,返回平均分主函数:1,定义变量,数组2,输入成绩3,函数调用4,输出平均分最高分和最低分,float max=0,min=0;float average(float score,int n)int i;float aver,sum=score0;max=min=score0;for(i=1;imax)max=scorei;if(scoreimin)min=scorei;aver=sum/n;return(aver);,main()int i;float ave,score10;printf(input 10 numbern);for(i=0;i10;i+)scanf(%f,8.9变量的存储类别,8.9.1动态存储方式与静态存储方式在语言中,对变量的存储类型说明有以下四种:自动变量(auto)、寄存器变量(register)、外部变量(extern)、静态变量(static)。自动变量和寄存器变量属于动态存储方式,外部变量和静态内部变量属于静态存储方式。动态存储方式:使用时分配存储空间,使用完释放。静态存储方式:程序开始执行时分配存储空间,程序结束时释放。,8.9.2auto变量(自动变量)(1)定义格式:auto 数据类型 变量表;其中存储类型符auto可以省略。(2)存储特点1)自动变量属于动态存储方式。在函数中定义的自动变量,只在该函数内有效;函数被调用时分配存储空间,调用结束就释放。在复合语句中定义的自动变量,只在该复合语句中有效;退出复合语句后,也不能再使用,否则将引起错误。2)定义而不初始化,则其值是不确定的。如果初始化,则赋初值操作是在调用时进行的,且每次调用都要重新赋一次初值。3)由于自动变量的作用域和生存期,都局限于定义它的个体内(函数或复合语句),因此不同的个体中允许使用同名的变量而不会混淆。即使在函数内定义的自动变量,也可与该函数内部的复合语句中定义的自动变量同名。,8.9.3用static声明局部变量(静态变量)(1)定义格式:static 数据类型 内部变量表;(2)存储特点1)静态内部变量属于静态存储。在程序执行过程中,即使所在函数调用结束也不释放。换句话说,在程序执行期间,静态内部变量始终存在,但其它函数是不能引用它们的。2)定义但不初始化,则自动赋以(整型和实型)或0(字符型);且每次调用它们所在的函数时,不再重新赋初值,只是保留上次调用结束时的值!(3)何时使用静态内部变量1)需要保留函数上一次调用结束时的值。2)变量只被引用而不改变其值。,例8.17考察静态局部变量的值f(int a)auto int b=0;static c=3;b=b+1;c=c+1;return(a+b+c);main()int a=2,i;for(i=0;i3;i+)printf(%d,f(a);,8.9.4 register变量一般情况下,变量的值都是存储在内存中的。为提高执行效率,语言允许将局部变量的值存放到寄存器中,这种变量就称为寄存器变量。定义格式如下:register 数据类型 变量表;(1)只有局部变量才能定义成寄存器变量,即全局变量不行。(2)对寄存器变量的实际处理,随系统而异。例如,微机上的MSC和TC 将寄存器变量实际当作自动变量处理。(3)允许使用的寄存器数目是有限的,不能定义任意多个寄存器变量。,8.9.5用extern声明外部变量1,在一个文件内声明外部变量。当同一个文件的外部变量的定义在后,而使用在前时,可以通过对其进行声明的方法扩大该外部变量的使用范围。声明格式为:extern 数据类型外部变量表;例8.20用extern声明外部变量,扩展它在程序文件中的作用域int max(int x,int y)return xy?x:y;main()extern int A,B;printf(%d,max(A.,B);int A=13,b=-6;,2,在多文件的程序中声明外部变量一个程序可以由多个源程序文件组成(但其中只能有一个主函数),若要在一个文件中使用其它源程序文件中定义的外、部变量,可以用如下方法声明该外部变量:extern 外部变量名;8.9.6用static声明外部变量若要使得一个源程序文件中定义的外部变量不被其它源程序文件使用,可将该外部变量声明为static型。,8.10内部函数和外部函数,8.10.1内部函数若一个函数只能被本文件的函数调用,则可在函数定义时在函数类型前加:static,则该函数不能被其它文件调用,这样的函数称为内部函数。8.10.2外部函数当在函数类型前加:extern时,该函数可供其它文件的函数调用,这样的函数称为外部函数。extern可以省略。,8.11如何运行一个多文件的程序,最简单的方法:使用文件包含命令,即在文件开头加如下命令#include文件名其中文件名为其它文件的文件名,可以包含路径,路径中的要用代替。这些文件必须先建立并保存为源程序文件(扩展名为.c),或头文件(扩展名为.h)。,作业:,1,习题8.4 8.112,编写一个程序实现以下功能:定义一个函数input用于输入n个学生的三门课程成绩,定义一个函数sum用于求每个人的总成绩,定义一个函数average用于求各门课程的平均成绩并输出定义一个函数print用于输出每个人的学号、三门成绩和总成绩在主函数中输入学生人数然后依次调用这些函数,

    注意事项

    本文(第8章函数.ppt)为本站会员(sccc)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开