《函数与预处》PPT课件.ppt
《《函数与预处》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《函数与预处》PPT课件.ppt(102页珍藏版)》请在三一办公上搜索。
1、2023/7/10,第6章 函数与预处理,教学目的通过本章的学习,要求能熟练掌握函数的定义和调用方法,掌握函数的嵌套调用和递归调用,理解变量的作用域和存储类别,掌握内部函数和外部函数,并能够在不同情况下灵活选择函数来解决实际问题。掌握编译预处理命令的使用方法。函数和预处理命令是编写模块化程序的重要方法,这将为编写比较复杂的程序设计的学习打下基础。,2023/7/10,第6章 函数与预处理,教学内容,函数,编译预处理,文件包含命令,宏定义,条件编译,函数调用,变量的作用域和存储类别,内部函数和外部函数,函数的定义,2023/7/10,第6章 函数与预处理,重点难点 重点:(1)函数的定义和函数调
2、用(2)函数的参数传递 难点(1)函数的参数传递(2)递归调用(3)变量的作用域和存储特性,2023/7/10,6.1 函数应用实例,程序员在设计一个复杂的应用程序时,往往将整个程序划分为若干个功能较为单一的程序模块,然后分别予以实现,最后将所有的程序模块像积木一样装配起来,这种在程序设计中逐步分解、分而治之的的方法,称之为模块化程序设计。在C语言中,一个函数实现一个特定的功能。一个C语言程序可以由一个主函数和若干个其它函数构成,由主函数调用其它函数,其它函数也可以相互调用。同一个函数可以被一个函数或多个函数调用任意多次。因此,在设计时,往往将一些常用的功能模块编写成为函数,放在函数库中,供大
3、家选用或多次调用,以减少重复性的编写程序。程序员可以方便地利用函数作为程序模块,来实现 C语言程序设计的模块化。,6.1.1 模块化设计,2023/7/10,在第1章中已经介绍过,源程序是由函数组成的。虽然在前面各章的程序中都只有一个主函数main(),但实用程序往往由多个函数组成。函数是源程序的基本模块,通过对函数模块的调用实现特定的功能。语言中的函数相当于其它高级语言的子程序。语言不仅提供了极为丰富的库函数(如Turbo C,MS C 都提供了三百多个库函数),还允许用户建立自己定义的函数。用户可把自己的算法编成一个个相对独立的函数模块,然后用调用的方法来使用函数。可以说程序的全部工作都是
4、由各式各样的函数完成的,所以也把语言称为函数式语言。由于采用了函数模块式的结构,语言易于实现结构化程序设计。使程序的层次结构清晰,便于程序的编写、阅读、调试。,6.1.2 函数的基本概念,2023/7/10,先举两个函数调用的简单例子。(该例子引自书本配套案例“学生成绩管理系统”)【例6.1】函数调用的简单例子输入如下代码:/*源文件名:Li6_1.c功能:在屏幕输出显示一个菜单*/#include stdio.hvoid main()void printstart();/*对printstart()函数进行声明*/void menu();/*对 menu()函数进行声明*/printstar
5、t();/*调用printstart()函数*/menu();/*调用 menu()函数*/printstart();/*调用printstart()函数*/,6.1.3 函数的引入实例,2023/7/10,void menu()printf(*n);printf(t1登记学生成绩t tt2删除学生信息n);printf(t3查询学生信息t tt4修改学生资料n);printf(t5保存学生信息t tt6学生成绩排序n);printf(t7统计学生成绩t tt8输出学生信息n);printf(t0退出系统n);printf(*n);void printstart()printf(-n);,6.
6、1.3 函数的引入实例,2023/7/10,编译、连接、运行程序。程序运行后,屏幕显示:printstart()和menu()都是用户定义的函数,分别用来输出一行下划线和一个菜单信息。在定义这两个函数的函数时,前面加上void,表示该函数无类型,也就是函数没有返回值。而函数名后面的括号里面是空的,说明该函数没有参数。,6.1.3 函数的引入实例,2023/7/10,【例6.2】函数调用的简单例子/*源文件名:Li6_2.c功能:求两个整数的和*/#include stdio.hvoid main()int sum(int x,int y);/*对sum()函数进行声明*/int a,b,s;s
7、canf(%d%d,6.1.3 函数的引入实例,2023/7/10,编译、连接、运行程序。程序运行后,屏幕显示:程序中sum(int x,int y)函数带有两个整型参数x和y,表示sum是个有参函数,而在函数名前面加上int,表示该函数会返回一个整型的数值。,6.1.3 函数的引入实例,2023/7/10,说明:(1)源程序是由函数组成的。函数是源程序的基本模块,通过对函数模块的调用实现特定的功能。语言中的函数相当于其它高级语言的子程序。语言不仅提供了极为丰富的库函数,还允许用户建立自己定义的函数。用户可把自己的算法编成一个个相对独立的函数模块,然后用调用的方法来使用函数。可以说程序的全部工
8、作都是由各式各样的函数完成的,所以也把语言称为函数式语言。由于采用了函数模块式的结构,语言易于实现结构化程序设计。使程序的层次结构清晰,便于程序的编写、阅读、调试。(2)一个程序总是从main()函数开始执行,调用其他函数后,流程回到main主函数结束。main主函数是系统定义的,必须有且只能有一个名为main的主函数。(3)所有函数都是平行的,它们的定义都是相互独立的。一个函数并不从属于另外一个函数,即函数不能嵌套定义。函数间可以互相调用,即函数可以嵌套调用。但不能调用main函数,main函数是系统调用的。,6.1.3 函数的引入实例,2023/7/10,从函数使用的角度看,函数可分为库函
9、数和用户定义函数两种。(1)库函数:由编译系统提供的已设计好的函数,用户只需调用而无须实现它,在编译 C程序时,应尽可能的使用库函数。这样可以提高编程效率和编程的质量。在前面各章的例题中反复用到的printf、scanf、getchar、putchar、gets、puts、strcat等函数均属于库函数。使用库函数时应注意:1)函数的功能;2)函数参数的数目、顺序以及每个参数的意义和类型;3)函数返回值的意义和类型;4)需要使用的包含文件。要调用某个库函数,则需在程序的头部用包含命令(#include)将说明该函数原型的头文件包含进本程序中。,函数的分类,2023/7/10,(2)用户定义函数
10、:顾名思义,就是程序员自行定义和设计的函数。库函数一般只能提供一些低层服务的功能。而用户自定义的函数则能针对具体的应用实现一些特殊的功能。用自定义函数需要程序员自己来编写函数功能的实现代码。用户自定义函数是由用户按需要写的函数。对于用户自定义函数,不仅要在程序中定义函数本身,而且在主调函数模块中还必须对该被调函数进行类型说明,然后才能使用。,函数的分类,2023/7/10,语言的函数兼有其它语言中的函数和过程两种功能,从这个角度看,又可把函数分为有返回值函数和无返回值函数两种。(1)有返回值函数:此类函数被调用执行完后将向调用者返回一个执行结果,称为函数返回值。如数学函数即属于此类函数。由用户
11、定义的这种要返回函数值的函数,必须在函数定义和函数说明中明确返回值的类型。(2)无返回值函数:此类函数用于完成某项特定的处理任务,执行完成后不向调用者返回函数值。这类函数类似于其它语言的过程。由于函数无须返回值,用户在定义此类函数时可指定它的返回为“空类型”,空类型的说明符为“void”。,函数的分类,2023/7/10,6.2 函数的定义,定义无参函数的一般形式为:【函数类型】函数名()声明语句部分可执行语句部分,6.2.1无参函数定义的一般形式,2023/7/10,6.2 函数的定义,例6.1中的printstart()和menu()函数都是无参函数。在定义函数时要用类型标识符来指定函数类
12、型,即函数返回值的类型。如在例6.1中的printstart()和menu()函数的函数类型都为void,表示不需要带回函数值。而例6.2中的sum()函数的函数类型为int,表示该函数会返回一个整型数值。注意:在函数类型缺省的情况下,系统一律按int型处理。,6.2.1无参函数定义的一般形式,2023/7/10,定义有参函数的一般形式为:【函数类型】函数名(数据类型 参数【,数据类型 参数2】)声明语句部分可执行语句部分,有参函数定义的一般形式,2023/7/10,例6.2中的sum(int x,int y)就是一个有参函数。详细分析一下sum函数:int sum(int x,int y)/
13、*对函数sum()进行定义*/int z;/*函数体中的声明部分*/z=x+y;return z;这是一个求两个整型数据之和的函数。第一行中的int 表示函数返回值是整型的,sum为函数名,括号中的两个形式参数x和y都是整型的。在调用该函数的时候,主调函数把实际参数的值传递给被调用函数中的形式参数x和y。大括号内是函数体,通过函数体中语句的执行求出x和y的和,通过return z;语句把z作为函数值返回到主调函数中。return后面的z也称为函数返回值。注意:一般情况下,函数返回值的类型和函数类型是一致的。如果不一致,则以函数类型为准。,有参函数定义的一般形式,2023/7/10,一个较大的程
14、序一般应分为若干个程序模块,每一个模块用来实现一个特定的功能。而在第一个阶段只设计最基本的模块,功能可以在设计好框架以后慢慢补上。在编写程序的开始阶段,往往是先写上一个空函数,占个位置,以后再用编写好的函数来替换它。这样,程序的结构比较清楚,可读性比较好,以后扩充新功能也比较方便,对程序结构影响不大。在程序设计中空函数常常被使用到,它的定义形式为:【函数类型】函数名(),6.2.3 空函数,2023/7/10,例如,在设计一个学生成绩管理系统的开始阶段,可以运用空函数设计如下的程序框架 void main()void addscore()/*addscore()函数实现成绩的添加*/void
15、alterscore()/*alterscore()函数实现成绩的修改*/void deletescore()/*deletescore()函数实现成绩的删除*/之后编写程序的时候,在设计好的框架上完善就可以了。,6.2.3 空函数,2023/7/10,6.3 函数的参数和返回值,函数的参数分为形参和实参两种。形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用。形参和实参的功能是作数据传送。发生函数调用时,主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。,6.3.1 形式参数和实际参数,20
16、23/7/10,6.3 函数的参数和返回值,函数的形参和实参具有以下特点:1.形参变量只有在被调用时才分配内存单元,在调用结束时,所分配的内存单元也将被释放。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。2.实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值、输入等办法使实参获得确定值。3.实参和形参在数量、类型、顺序上应严格一致,否则会发生类型不匹配的错误。4.函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。因此在函数
17、调用过程中,形参的值发生改变,而实参中的值不会变化。,6.3.1 形式参数和实际参数,2023/7/10,函数的返回值是指函数被调用之后,执行函数体中的程序段所取得的并通过return语句返回给主调函数的值。如调用sqrt()函数取得开根号的值,调用例6.2的sum函数取得的两数之和等。对函数的返回值(或称函数的值)有以下一些说明:1.函数的值只能通过return语句返回主调函数。return 语句的一般形式为:return 表达式;或者为:return(表达式);该语句的功能是计算表达式的值,并返回给主调函数。在函数中允许有多个return语句,但每次调用只能有一个return 语句被执行,
18、因此一个函数最多只能返回一个函数值。例如:sign(int x)if(x0)return(1);if(x=0)return(0);if(x 0)renturn(-1);,6.3.2 函数的返回值,2023/7/10,2.函数返回值的类型和函数定义中的函数类型应保持一致。如果两者不一致,则以函数类型为准,自动进行类型转换。3.如果函数返回值为整型,在函数定义时可以省去类型说明。4.没有返回值的函数,可以明确定义为“空类型”,类型说明符为“void”。如例6.1中函数printstart()并不向主函数返回值,因此可定义为:void printstart()一旦函数被定义为空类型后,就不能在主调函
19、数中使用被调函数的函数值了。例如,在定义printstart为空类型后,如果在主函数中写下述语句 sum=printstart();就是错误的。为了使程序有良好的可读性并减少出错,凡不要求返回值的函数都应定义为空类型。,6.3.2 函数的返回值,2023/7/10,使用函数定义时的几点说明:1)最好在参数列表中列出每个参数的类型,即使参数是默认的int。2)如果参数的类型声明放在()内的形参表中,则对每个形参都要进行对应的类型说明,不能省略。如:float max(float x,float y)不能写成float max(foat x,y)。此时y为系统缺省的int类型。3)无论有无形参,函
20、数名后的括号都不能省略。4)函数不能嵌套定义,既一个函数的定义不能从属于另外一个函数。5)应尽可能多的使用系统提供的库函数。6)为避免混淆,传递给函数的参数和函数定义中的相应的参数尽量不使用相同的名字。7)选择有意义的参数名和函数名可以使程序具有良好的可读性,这可以避免过多地使用注释。8)需要大量参数的函数可能包含较多的功能(任务),这种情况应该考虑将该函数分成完成单个任务的较小的函数。9)函数原型、函数头部和函数调用应该具有一致的参数个数、参数类型、参数顺序和返回值类型。,6.3.2 函数的返回值,2023/7/10,6.4 函数调用,函数调用的一般形式为:函数名(实参列表);如果调用无参函
21、数,则”实参列表”是空的,但括号不能省略,见例6.1。如果实参列表包含多个实参,则各参数间用逗号隔开。实参和形参的个数应相等,类型应匹配。实参与形参按顺序对应,一一传递数据。当实参列表包括多个值时,对实参求值的顺序并不确定。有的系统按自左向右求实参的值,有的则按自右向左的顺序。要注意的是,visual c+6.0编译器是按自右向左的顺序求实参列表的值的。,6.4.1 函数调用的一般形式,2023/7/10,6.4 函数调用,【例6.3】测试多个实参的求值顺序(从右向左)/*源文件名:Li6_3.c功能:测试多个实参的求值顺序*/#include stdio.hvoid main()/int c
22、ompare(int a,int b);/*函数声明*/int i=2,p;p=compare(i,+i);/*函数调用*/printf(%dn,p);int compare(int a,int b)/*函数定义*/int c;if(ab)c=1;else if(a=b)c=0;else c=-1;return c;,6.4.1 函数调用的一般形式,2023/7/10,6.4 函数调用,编译、连接、运行程序。程序运行后,屏幕显示:如果按自左向右顺序求实参的值,则函数调用相当于compare(2,3),程序运行的结果应为”-1”。若按自右向左顺序求实参的值,则相当于compare(3,3),程序
23、运行结果为”0”。如果不清楚自己所用的编译器对实参的求值顺序,用上述代码上机一试就清楚了。注意:由于不同的编译器对实参的求值顺序不一样,为了使程序的通用性不受影响以及避免大家对同一段代码产生不同的理解,应尽量避免使用这种容易混淆的用法。,6.4.1 函数调用的一般形式,2023/7/10,按函数在程序中出现的位置来分,可以有一下三种函数调用的方式。1.函数语句把函数调用作为一个语句。如例6.1中的printstart();这时不要求函数带返回值,只要求函数完成一些操作。2.函数表达式函数出现在一个表达式中,这种表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的运算。例如:s=su
24、m(a,b)+sum(x,y);函数sum是表达式的一部分,将sum(a,b)的值加上sum(x,y)的和赋值给s。3.函数参数函数调用作为一个函数的参数,例如:s=sum(a,sum(b,c);其中,sum(b,c)是一次函数调用,它的值作为sum另一次调用的参数。s的值为a,b,c三数的总和。其实,函数调用作为函数的参数,也是函数表达式调用的一种形式,因为函数参数本身就是一个表达式的形式。,6.4.2 函数调用的方式,2023/7/10,如果一个函数要调用另外一个函数,首先是被调用的函数必须存在。其次还应在主调函数中对所有被调函数加以说明,否则,在连接时会出现找不到所调用函数的错误信息。同
25、变量一样,函数的调用也应遵循“先定义后使用”的原则。对被调函数的声明分为两种情况:(1)如果被调函数是C语言系统提供的标准库函数,则在源程序文件的开头处,使用#include命令,将存放所调用库函数的有关“头文件”包含到该程序文件中来。#include命令的一般形式为:#include或#include stdio.h,6.4.3 对被调用函数的声明和函数原型,2023/7/10,(2)如果被调用函数为用户自己定义的函数,一般情况下,应在主调函数中对被调用函数(返回值)的类型进行说明。函数的说明方法是:在主调函数的声明部分对被调函数进行声明。在主调函数中对被调函数作说明的目的是使编译系统知道被
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数与预处 函数 PPT 课件
链接地址:https://www.31ppt.com/p-5469814.html