常州信息学院C语言课程组课件

上传人:无*** 文档编号:243847329 上传时间:2024-10-01 格式:PPT 页数:72 大小:410.94KB
返回 下载 相关 举报
常州信息学院C语言课程组课件_第1页
第1页 / 共72页
常州信息学院C语言课程组课件_第2页
第2页 / 共72页
常州信息学院C语言课程组课件_第3页
第3页 / 共72页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,比比培训,_C语言程序设计,第八章 函数,本章主要任务:,1、,掌握函数定义、调用、声明。,2、函数参数传递方式了解函数递归调用。,3、掌握变量作用域、生命期。,4、掌握插入排序,第八章 函数本章主要任务:,C语言的函数,C语言的函数是子程序的总称,包括函数和过程。(有返回值、无返回值,教材中称为:有返回值函数,无返回值函数)。,C语言函数可以分为库函数、用户自定义函数。库函数由系统提供,程序员只需要使用(调用),用户自定义函数需要程序员自己编制。,C语言的函数C语言的函数是子程序的总称,包括函数和过程。(,函数是C语言程序的基本单位,函数是C语言程序的基本单位,C程序是由函数构成,1、一个C源程序至少包含一个main函数,也可以包含一个main函数和若干个其它函数。函数是C程序的基本单位。,2、被调用的函数可以是系统提供的库函数,也可以是用户根据需要自己编写设计的函数。,3、C函数库非常丰富,ANSI C提供100多个库函数,Turbo C提供300多个库函数。,C程序是由函数构成1、一个C源程序至少包含一个main函数,main函数是每个程序执行的起始点,一个C程序总是从main函数开始执行,而不论main函数在程序中的位置。可以将main函数放在整个程序的最前面,也可以放在整个程序的最后,或者放在其它函数之间。,main函数是每个程序执行的起始点,使用函数的意义,1、使用函数可以控制任务的规模。,使用函数可以将程序划分为若干功能相对独立的模块,这些模块还可以再划分为更小的模块,直到各个模块达到程序员所能够控制的规模。然后程序员再进行各个模块的编制。因为各个模块功能相对独立,步骤有限,所以流程容易控制,程序容易编制,修改。,使用函数的意义1、使用函数可以控制任务的规模。,使用函数的意义,2、使用函数可以控制变量的作用范围。,函数-函数通过接口(参数表,返回值)通讯,交换数据。,使用函数的意义2、使用函数可以控制变量的作用范围。,使用函数的意义,3、使用函数,程序的开发可以由多人分工协作。,将程序划分为若干模块(函数),各个相对独立的模块(函数)可以由多人完成,每个人按照模块(函数)的功能要求,接口要求编制代码,调试,确保每个模块(函数)的正确性。最后将所有模块(函数)合并,统一调试、运行。,使用函数的意义3、使用函数,程序的开发可以由多人分工协作。,使用函数的意义,4、使用函数,可以重新利用已有的、调式好的、成熟的程序模块 。,使用函数的意义4、使用函数,可以重新利用已有的、调式好的、成,函数的一般形式,函数的一般形式,函数的组成,一个函数(定义)由函数头(函数首部)和函数体两部分组成,函数的组成一个函数(定义)由函数头(函数首部)和函数体两,函数头,函数头(首部):说明了函数类型、函数名称及参数。,函数类型:函数返回值的数据类型,可以是基本数据类型也可以是构造类型。如果省略默认为int,如果不返回值,定义为void类型。,函数头 函数头(首部):说明了函数类型、函数名称及参数。,函数头,函数名:给函数取的名字,以后用这个名字调用。函数名由用户命名,命名规则同标识符。,函数名后面是参数表,无参函数没有参数传递,但“()”号不能省略,这是格式的规定。参数表说明参数的类型和形式参数的名称,各个形式参数用“,”分隔。,函数头函数名:给函数取的名字,以后用这个名字调用。函数名由,函数体,函数体:函数首部下用一对括起来的部分。如果函数体内有多个,最外层是函数体的范围。,函数体一般包括:,(1)声明部分:在这部分定义本函数所使用的变量和进行有关声明(如函数声明)。,(2)执行部分:程序段,由若干条语句组成命令序列(可以在其中调用其它函数)。,函数体 函数体:函数首部下用一对括起来的部分。如果函数,函数举例,例8-1:输入三个整数,求三个整数中的最大值,打印。,函数举例例8-1:输入三个整数,求三个整数中的最大值,打印,不使用函数解决,不使用函数解决,使用函数解决,使用函数解决,函数的参数,函数的参数包括,形式参数与实际参数。,函数的参数 函数的参数包括,形式参数(形参),形式参数(形参):函数定义时设定的参数。,例8-1中,函数头int max(int x,int y,int z)中x,y,z就是形参,它们的类型都是整型。,形式参数(形参)形式参数(形参):函数定义时设定的参数。,实际参数(实参),实际参数(实参):调用函数时所使用的实际的参数。,例8-1中,主函数中调用max函数的语句是:nmax=max(n1,n2,n3); 其中n1,n2,n3就是实参,它们的类型都是整型。,实际参数(实参)实际参数(实参):调用函数时所使用的实际的,参数的传递,在调用函数时,主调函数和被调函数之间有数据的传递-实参传递给形参。具体的传递方式有两种:,(1)值传递方式(传值):将实参单向传递给形参的一种方式。,(2)地址传递方式(传值):将实参地址单向传递给形参的一种方式。,参数的传递 在调用函数时,主调函数和被调函数之间有数据的传递,注意,单向传递:,不管“传值”、还是“传址”,C语言都是单向传递数据的,一定是实参传递给形参,反过来不行。也就是说C语言中函数参数传递的两种方式本质相同-“单向传递”。,注意单向传递:,注意,“传值”、“传址”只是传递的数据类型不同(传值-一般的数值,传址-地址)。传址实际是传值方式的一个特例,本质还是传值,只是此时传递的是一个地址数据值。,注意“传值”、“传址”只是传递的数据类型不同(传值-一般的,注意,系统分配给实参、形参的内存单元是不同的,也就是说即使在函数中修改了形参的值,也不会影响实参的值。,注意系统分配给实参、形参的内存单元是不同的,也就是说即使在,注意,对于传值,即使函数中修改了形参的值,也不会影响实参的值。,对于传址,即使函数中修改了形参的值,也不会影响实参的值。但是,注意:不会影响实参的值,不等于不影响实参指向的数据。,注意对于传值,即使函数中修改了形参的值,也不会影响实参的值,注意,传址与传值一样不能通过参数返回数据,但因为传递的是地址,那么就可能通过实参参数所指向的空间间接返回数值。,两种参数传递方式中,实参可以是变量、常量、表达式;形参一般是变量,要求两者类型相同或赋值兼容。,注意传址与传值一样不能通过参数返回数据,但因为传递的是地址,示意图,示意图,函数的返回值,C语言可以从函数(被调用函数)返回值给调用函数(这与数学函数相当类似)。在函数内是通过return语句返回值的。使用return语句能够返回一个值或不返回值(此时函数类型是void)。,return语句的格式:,return 表达式;,或,return (表达式);,函数的返回值C语言可以从函数(被调用函数)返回值给调用函数(,说明,1、函数的类型就是返回值的类型,return语句中表达式的类型应该与函数类型一致。如果不一致,以函数类型为准(赋值转化)。,2、函数类型省略,默认为int。,3、如果函数没有返回值,函数类型应当说明为void(无类型)。,说明 1、函数的类型就是返回值的类型,return语句中表达,函数的调用方法,函数调用的一般方法:,函数名(实参表列);,函数的调用方法 函数调用的一般方法:,说明,1、无参函数调用没有参数,但是“()”不能省略,有参函数若包含多个参数,各参数用“,”分隔,实参参数个数与形参参数个数相同,类型一致或赋值兼容。,说明1、无参函数调用没有参数,但是“()”不能省略,有参函数,说明,2、以单独语句形式调用(注意后面要加一个分号,构成语句)。以语句形式调用的函数可以有返回值,也可以没有返回值。,例如:,printf(,“,max=%d,”,nmax);,swap(x,y);,puts(s);,说明2、以单独语句形式调用(注意后面要加一个分号,构成语句),说明,3、在表达式中调用(后面没有分号)。在表达式中的函数调用必须有返回值。,例如:,if(strcmp(s1,s2)0),/函数调用strcmp()在关系表达式中。,nmax=max(n1,n2,n3) ; /函数调用max()在赋值表达式中,“;”是赋值表达式作为语句时加的,不是max函数调用的。,fun1(fun2(); /函数调用fun2()在函数调用表达式fun1()中。函数调用fun2()的返回值作为fun1的参数。,说明3、在表达式中调用(后面没有分号)。在表达式中的函数调用,函数调用时数据的传递(函数之间的通讯),函数是相对独立的,但是不是孤立的,它们通过调用时1)参数传递和2)函数的返回值3)全局变量(后面介绍)来相互联系。,函数调用时数据的传递(函数之间的通讯)函数是相对独立的,,函数的声明,函数定义的位置可以1)在调用它的函数之前,也可以2)在调用它的函数之后,甚至位于3)其它的源程序模块中。,l 函数定义位置在前,函数调用在后,不必声明,编译程序产生正确的调用格式。,函数定义在调用它的函数之后或者函数在其它源程序模块中,且函数类型不是整型,这时,为了使编译程序产生正确的调用格式,可以在函数使用前对函数进行声明。这样不管函数在什么位置,编译程序都能产生正确的调用格式。,函数的声明函数定义的位置可以1)在调用它的函数之前,也可以2,函数声明的格式,函数类型 函数名(参数类型,,,参数类型);,C语言的库函数就是位于其它模块的函数,为了正确调用,C编译系统提供了相应的.h文件。.h文件内许多都是函数声明,当源程序要使用库函数时,就应当包含相应的头文件。,函数声明的格式 函数类型 函数名(参数类型,参数,函数的嵌套调用,函数嵌套调用:,函数调用中又存在调用。如函数1调用函数2,函数又调用函数3。函数之间没有从属关系,一个函数可以被其它函数调用,同时该函数也可以调用其它函数。,函数的嵌套调用 函数嵌套调用:,函数的递归调用,函数的递归调用:,是指函数直接调用或间接调用自己,或调用一个函数的过程中出现直接或间接调用该函数自身。前者称为直接递归调用,后者称为间接递归调用。,函数的递归调用函数的递归调用:,递归调用过程(两个阶段),1、递推阶段:将原问题不断地分解为新的子问题,逐渐从未知的向已知的方向推测,最终达到已知的条件,即递归结束条件,这时递推阶段结束。,2、回归阶段:从已知条件出发,按照“递推”的逆过程,逐一求值回归,最终到达“递推”的开始处,结束回归阶段,完成递归调用。,递归调用过程(两个阶段) 1、递推阶段:将原问题不断地分解为,递归实例,例8-7:用递归法求n! 。,解:,n!=n*(n-1)*(n-2)*,*1=n(n-1)!。,递归公式:,1 n0,1,n!=,n*(n-1)! 其它,递归实例例8-7:用递归法求n! 。,变量的作用域,变量的作用域:,变量的有效范围或者变量的可见性。变量定义的位置决定了变量的作用域。,变量的作用域变量的作用域:,变量的分类,变量从作用域(变量的有效范围,可见性)的角度可以分为:局部变量,全局变量。,变量的分类变量从作用域(变量的有效范围,可见性)的角度可以分,局部变量,局部变量:是指在一定范围内有效的变量。C语言中,在以下各位置定义的变量均属于局部变量。,(1)在函数体内定义的变量,在本函数范围内有效,作用域局限于函数体内。,(2)在复合语句内定义的变量,在本复合语句范围内有效,作用域局限于复合语句内。,(3)有参函数的形式参数也是局部变量,只在其所在的函数范围内有效。,局部变量 局部变量:是指在一定范围内有效的变量。C语言中,在,局部变量举例,局部变量举例,说明,1、不同函数中和不同的复合语句中可以定义(使用)同名变量。因为它们作用域不同,程序运行时在内存中占据不同的存储单元,各自代表不同的对象,所以它们互不干预。,即:同名,不同作用域的变量是不同的变量。,说明1、不同函数中和不同的复合语句中可以定义(使用)同名变量,说明,2、局部变量所在的函数被调用或执行时,系统临时给相应的局部变量分配存储单元,一旦函数执行结束,则系统立即释放这些存储单元。所以在各个函数中的局部变量起作用的时刻是不同的。,说明2、局部变量所在的函数被调用或执行时,系统临时给相应的局,全局变量,全局变量:,在函数之外定义的变量。(所有函数前,各个函数之间,所有函数后),全局变量作用域:,从定义全局变量的位置起到本源程序结束为止。,全局变量 全局变量:,说明,1、在引用全局变量时如果使用“extern”声明全局变量,可以扩大全局变量的作用域。例如,扩大到整个源文件(模块),对于多源文件(模块)可以扩大到其它源文件(模块)。,2、在定义全局变量时如果使用修饰关键词static,表示此全局变量作用域仅限于本源文件(模块)。,说明1、在引用全局变量时如果使用“extern”声明全局变量,全局变量举例,全局变量举例,全局变量举例,全局变量举例,全局变量举例,全局变量举例,说明,1、全局变量可以和局部变量同名,当局部变量有效时,同名全局变量不起作用。,2、使用全局变量可以增加各个函数之间的数据传输渠道,在一个函数中改变一个全局变量的值,在另外的函数中就可以利用。但是,使用全局变量使函数的通用性降低,使程序的模块化、结构化变差,所以要慎用、少用全局变量。,说明1、全局变量可以和局部变量同名,当局部变量有效时,同名全,变量的存储类别(生存期、生命期),从变量存在的时间的长短(即变量生存期)来划分,变量还可以分为:动态存储变量、静态存储变量。变量的存储方式决定了变量的生存期。,C语言变量的存储方式可以分为:动态存储方式、静态存储方式。,变量的存储类别(生存期、生命期) 从变量存在的时间的长短,示意图,示意图,动态存储方式,动态存储方式:,在程序运行期间根据需要为相关的变量动态分配存储空间的方式。C语言中,变量的动态存储方式主要有自动型存储方式和寄存器型存储方式。,动态存储方式 动态存储方式:,自动型存储方式(auto),auto型存储方式是C语言默认的局部变量的存储方式,也是局部变量最常使用的存储方式。,自动型存储方式(auto) auto型存储方式是C语言默,说明,1、自动变量属于局部变量的范畴,作用域限于定义它的函数或复合语句内。,2、自动变量所在的函数或复合语句执行时,系统动态为相应的自动变量分配存储单元,当自动变量所在的函数或复合语句执行结束后,自动变量失效,它所在的存储单元被系统释放,所以原来的自动变量的值不能保留下来。若对同一函数再次调用时,系统会对相应的自动变量重新分配存储单元。,说明1、自动变量属于局部变量的范畴,作用域限于定义它的函数或,寄存器型存储方式(register),register型存储方式是C语言使用较少的一种局部变量的存储方式。该方式将局部变量存储在CPU的寄存器中,寄存器比内存操作要快很多,所以可以将一些需要反复操作的局部变量存放在寄存器中。,寄存器(局部变量)的定义格式:,其中:register为寄存器存储类别关键词,不能省略。,寄存器型存储方式(register) register型存储,注意,CPU的寄存器数量有限,如果定义了过多的register变量,系统会自动将其中的部分改为auto型变量。,注意 CPU的寄存器数量有限,如果定义了过多的regis,静态存储方式,静态存储方式:,在程序编译时就给相关的变量分配固定的存储空间(在程序运行的整个期间内都不变)的存储方式。C语言中,使用静态存储方式的主要有静态存储的局部变量和全局变量。,静态存储方式 静态存储方式:,静态存储的局部变量,静态存储的局部变量,说明,1、静态局部变量的存储空间是在程序编译时由系统分配的,且在程序运行的整个期间都固定不变。该类变量在其函数调用结束后仍然可以保留变量值。下次调用该函数,静态局部变量中仍保留上次调用结束时的值。,说明1、静态局部变量的存储空间是在程序编译时由系统分配的,且,说明,2、静态局部变量的初值是在程序编译时一次性赋予的,在程序运行期间不再赋初值,以后若改变了值,保留最后一次改变后的值,直到程序运行结束。,说明2、静态局部变量的初值是在程序编译时一次性赋予的,在程序,全局变量全部是静态存储的,C语言中,全局变量的存储都是采用静态存储方式,即在编译时就为相应全局变量分配了固定的存储单元,且在程序执行的全过程始终保持不变。全局变量赋初值也是在便宜时完成的。,因为全局变量全部是静态存储,所以没有必要为说明全局变量是静态存储而使用关键词static。,全局变量全部是静态存储的 C语言中,全局变量的存储都是采,全局变量的extern声明及令人困惑的全局变量的static定义,全局变量的static定义,不是说明“此全局变量要用静态方式存储”(全局变量天生全部是静态存储),而是说,这个全局变量只在本源程序模块有效(文件作用域)。,全局变量的extern声明及令人困惑的全局变量的static,全局变量的extern声明及令人困惑的全局变量的static定义,如果没有static说明的全局变量就是整个源程序范围有效(真正意义上的全局)。也就是说,变量的作用域有:分程序(复合语句)作用域,函数作用域,文件(模块)作用域,整个程序作用域。,全局变量的extern声明及令人困惑的全局变量的static,全局变量的extern声明及令人困惑的全局变量的static定义,在引用全局变量时如果使用“extern”声明全局变量,可以扩大全局变量的作用域。例如,扩大到整个源文件(模块),对于多源文件(模块)可以扩大到其它源文件(模块)。,全局变量的extern声明及令人困惑的全局变量的static,内部函数,内部函数:,只能被本源文件(模块)中的各个函数所调用,不能为其它模块中函数所调用的函数。,内部函数的定义:,内部函数内部函数:,说明,1、内部函数又称为静态函数,其使用范围仅限于定义它的模块(源文件)内。对于其它模块它是不可见的。,2、内部函数定义,static关键词不能省略。,3、不同模块中的内部函数可以同名,它们的作用域不同-事实上根本就是不同的函数。,说明1、内部函数又称为静态函数,其使用范围仅限于定义它的模块,外部函数,外部函数:能被任何源文件(模块)中的任何函数所调用的函数。,外部函数的定义:,外部函数 外部函数:能被任何源文件(模块)中的任何函数所调用,说明,1、外部函数定义,extern关键词可以省略。如果省略,默认是外部函数。,2、外部函数可以在其它模块中被调用。如果需要在某个模块中调用它,可以模块中某个位置声明extern 函数类型 函数名(形参表);就可以了。,说明 1、外部函数定义,extern关键词可以省略。如果省略,函数应用举例,例8-14:字符串逆序。P124.,例8-15:求矩阵最大元素。P124-125.,例8-16:利用插入法将10个字符从小到大进行排序。P125-126.,函数应用举例例8-14:字符串逆序。P124.,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!