《c语言程序设计教学资料》第7章---函数.ppt
《《c语言程序设计教学资料》第7章---函数.ppt》由会员分享,可在线阅读,更多相关《《c语言程序设计教学资料》第7章---函数.ppt(120页珍藏版)》请在三一文库上搜索。
1、第7章 函数,主要内容,模块化程序设计 函数的定义 向函数传递值和从函数返回值 函数的调用 函数的作用域和存储类别,为什么要用函数?,问题:,如果程序的功能比较多,规模比较大,把所有代码都写在main函数中,就会使主函数变得庞杂、头绪不清,阅读和维护变得困难 有时程序中要多次实现某一功能,就需要多次重复编写实现此功能的程序代码,这使程序冗长,不精炼,在设计一个较大的程序时,往往把它分为若干个程序模块,每一个模块包括一个或多个函数,每个函数实现一个特定的功能 采用“分而治之”的办法简化程序设计的过程 C程序可由一个主函数和若干个其他函数构成 事先编好一批实现各种不同功能的函数 主函数调用其它函数
2、,其它函数也可以互相调用 同一个函数可以被一个或多个函数调用任意多次,用模块化程序设计,main,a,b,c,f,g,h,d,e,i,e,功能分解 自顶而下、逐步求精的过程 模块化分解原则 保证模块的相对独立性 高聚合(模块的功能独立、单一)、低耦合(模块对外接口简单) 设计好模块接口 接口是指罗列出一个模块的所有与外部打交道的变量 定义好后不要轻易改动 在模块开头(文件的开头)进行函数声明,模块化程序设计方法,* How do you do! *,例:输出以下的结果,用函数调用实现。,在输出的文字上下分别有一行“*”号,显然不必重复写这段代码,用一个函数printstar来实现输出一行“*”
3、号的功能 再写一个print_message函数来输出中间一行文字信息 用主函数分别调用这两个函数,解题思路:,例:函数调用的简单例子 # include void main() void printstar(); /*对printstar函数声明*/ void print_message(); /*对print_message函数声明*/ printstar(); /*调用printstar函数*/ print_message(); /*调用print_message函数*/ printstar(); /*调用printstar函数*/ ,void printstar() /*定义print
4、star函数*/ printf(“* * * * * * * * * * * * * * * *n“); void print_message() /*定义print_message函数*/ printf(“How do you do!n“); ,运行情况如下: * * * * * * * * * * * * * * * * How do you do! * * * * * * * * * * * * * * * *,(1)一个C程序由一个或多个程序模块组成,每一个程序模块作为一个源程序文件。对较大的程序,一般不希望把所有内容全放在一个文件中,而是将它们分别放在若干个源文件中,由若干个源程序文
5、件组成一个C程序。这样便于分别编写、分别编译,提高调试效率。一个源程序文件可以为多个C程序共用。,说明:,(2) 一个源程序文件由一个或多个函数以及其他有关内容(如命令行、数据定义等)组成。一个源程序文件是一个编译单位,在程序编译时是以源程序文件为单位进行编译的,而不是以函数为单位进行编译的。 (3) C程序的执行是从main函数开始的,如果在main函数中调用其他函数,在调用后流程返回到main函数,在main函数中结束整个程序的运行。,(4)所有函数都是平行的,即在定义函数时是分别进行的,是互相独立的。一个函数并不从属于另一函数,即函数不能嵌套定义。函数间可以互相调用,但不能调用main函
6、数。main函数是系统调用的。,(5)从用户使用的角度看,函数有两种: 标准函数,即库函数。这是由系统提供的,用户不必自己定义这些函数,可以直接使用它们。不同的C系统提供的库函数的数量和功能会有一些不同,但许多基本的函数是共同的。 用户自己定义的函数。用以解决用户的专门需要。,(6) 从函数的形式看,函数分两类: 无参函数。无参函数一般用来执行指定的一组操作。在调用无参函数时,主调函数不向被调用函数传递数据。 有参函数。主调函数在调用被调用函数时,通过参数向被调用函数传递数据。,怎样定义函数?,为什么要定义函数 定义函数的方法,C语言要求,在程序中用到的所有函数,必须“先定义,后使用” 指定函
7、数名字、函数返回值类型、函数实现的功能以及参数的个数与类型,将这些信息通知编译系统。,指定函数的名字,以便以后按名调用 指定函数类型,即函数返回值的类型 指定函数参数的名字和类型,以便在调用函数时向它们传递数据 指定函数的功能。这是最重要的,这是在函数体中解决的,对于库函数,程序设计者只需用#include指令把有关的头文件包含到本文件模块中即可 程序设计者需要在程序中自己定义想用的而库函数并没有提供的函数,函数定义的一般形式,(1)无参函数的定义一般形式 (2)有参函数定义的一般形式 (3)空函数,函数定义的一般形式,(1)无参函数的定义一般形式,类型 函数名() 声明部分 语句部分 ,类型
8、标识符指明函数类型,函数的类型实际上是函数返回值的类型。函数名后面有一个空括号,其中无参数,但是括号不能少。,类型 函数名(void) 声明部分 语句部分 ,例如: void hello() printf(“hello world!n”); ,(2)有参函数定义的一般形式,类型 函数名(类型 形式参数1,类型 形式参数2,) 声明部分 语句部分 ,有参函数比无参函数多了形式参数列表,它们可以是各种类型的变量,个参数之间用逗号间隔。进行函数调用时,主调函数将赋予这些形式参数实际的值,形参是变量,必须在形参表中给出形参的类型说明,例如: int max(int x, int y) int z; /
9、 *函数体中的声明部分*/ z=xy?x:y; return (z); ,(3)空函数,类型 函数名(形参列表) 例如:,Dummy(形参列表) ,先用空函数占一个位置,以后逐步扩充 好处:程序结构清楚,可读性好,以后扩充新功能方便,对程序结构影响不大,调用函数,函数的调用形式 函数调用时的数据传递 函数调用的过程 函数的返回值,函数调用的形式,函数调用的一般形式为:函数名(实参表列) 如果是调用无参函数,则“实参表列”可以没有,但括号不能省略 如果实参表列包含多个实参,则各参数间用逗号隔开。,按函数调用在程序中出现的形式来分,可以有以下3种函数调用方式: (1)函数调用语句 把函数调用单独作
10、为一个语句 如:printfstar(); 这时不要求函数带回值,只要求函数完成一定的操作,(2)函数表达式 函数调用出现在另一个表达式中 如:c=2*max(a,b); 这时要求函数带回一个确定的值以参加表达式的运算 (3)函数参数 函数调用作为另一函数调用时的实参 如:mmax(a,max(b,c); 其中max(b,c)是一次函数调用,它的值作为max另一次调用的实参,函数参数:用于函数间数据的传递 形式参数(形参):定义函数时给出的参数 实际参数(实参):调用函数时给出的参数 实参与形参的个数应相等,类型应匹配。实参与形参按顺序对应,一一传递数据。 如果实参列表包括多个实参,对实参求值
11、的顺序并不是确定的,有的系统按自左至右顺序求实参的值,有的系统则按自右至左顺序。,说明:,例 : 实参求值的顺序,如果按自左至右顺序求实参的值,则函数调用相当于f(2,3),如果按自右至左顺序求实参的值,则函数调用相当于f(3,3),函数调用时的数据传递,形式参数:函数名后面括号中的变量名称为“形式参数”(简称“形参”)。 实际参数:主调函数中调用一个函数时,函数名后面括号中的参数(可以是一个表达式)称为“实际参数”(简称“实参”)。,实参和形参间的数据传递 在调用函数过程中,系统会把实参的值传递给被调用函数的形参 该值在函数调用期间有效,可以参加被调函数中的运算 用return语句返回计算结
12、果,通过函数调用使主调函数得到的确定值。,例: 调用函数时的数据传递,运行情况如下: , max is,通过函数调用,可使两个函数中的数据发生联系。,函数调用的过程,在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元。在发生函数调用时,函数max的形参被临时分配内存单元。 调用结束,形参单元被释放 实参单元仍保留并维持原值,没有改变 如果在执行一个被调用函数时,形参的值发生改变,不会改变主调函数的实参的值,关于形参与实参的说明:,(1) 在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元。只有在发生函数调用时,函数max中的形参才被分配内存单元。在调用结
13、束后,形参所占的内存单元也被释放。 (2) 实参可以是常量、变量或表达式, 例如: max (3,a+b); 但要求它们有确定的值。在调用时将实参的值赋给形参。,(3)在被定义的函数中,必须指定形参的类型。 (4)实参与形参的类型应相同或赋值兼容。 (5)值传递:实参向形参的数据传递是单向“值传递”,只能由实参传给形参,而不能由形参传回来给实参。 在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,实参单元仍保留并维持原值。,函数的返回值说明: (1)函数的返回值是通过函数中的return语句获得的。一个函数中可以有一个以上的return语句,执行到哪一个
14、return语句,哪一个语句起作用。 return语句后面的括弧也可以不要 例如: “return z;” 等价于 “ return (z);” return后面的值可以是一个表达式。 例如: max(int x,int y) return(?:); ,(2)函数的返回值应当属于某一个确定的类型,在定义函数时指定函数返回值的类型。 例如:下面是3个函数的首行: int max(float x,float y) /* 函数值为整型 */ char letter(char c1,char c2) /* 函数值为字符型 */ double min(int x,int y) /* 函数值为双精度型 *
15、/,注意: 凡不加类型说明的函数,自动按整型处理。,(3)在定义函数时指定的函数类型一般应该和return语句中的表达式类型一致。 如果函数值的类型和return语句中表达式的值不一致,则以函数类型为准。 对数值型数据,可以自动进行类型转换。即函数类型决定返回值的类型。,(4)对于不带回值的函数,应当用“void”定义函数为“无类型”(或称“空类型”)。此时在函数体中不得出现return语句。,例: 返回值类型与函数类型不同,运行情况如下: 1.5, 2.5 max is 2,1.5,2.6,2.6,2,变为2,main()函数,main()函数是由系统调用的,使得C程序从main()函数开始
16、执行,调用其它函数后流程返回到main()函数,在main()中结束整条程序的运行。 若定义main()时没有指定返回值类型,也没有使用void,则返回值默认为int类型,虽然语法允许这样做,但实际编程时通常将main()函数写成如下形式:,第一种形式:用void指明函数没有返回值 第二种形式:return返回值的0等价于调用exit()时提供的参数。 第三种形式:进一步用void指出main函数没有参数,在一个函数中调用另一函数(即被调用函数)需要具备哪些条件呢 ?,首先被调用的函数必须是已经存在的函数(是库函数或用户自己定义的函数)。但光有这一条件还不够。 如果使用库函数,还应该在本文件开
17、头#include 命令将调用有关库函数时所需用到的信息“包含”到本文件中来。 如果使用用户自己定义的函数,而该函数的位置在调用它的函数(即主调函数)的后面,应该在主调函数中对被调用的函数作声明。,例:对被调用的函数作声明 # include void main() float add(float x, float y); /*对被调用函数的声明*/ float a,b,c; scanf(f,f, printf(sum is f n,c); float add(float x,float y) /*函数定义*/ float z; /* 函数体 */ zxy; return(z); ,例:对被调
18、用的函数作声明 # include float add(float x,float y) /*函数定义*/ float z; /* 函数体 */ zx+y; return (z); void main() float a,b,c; scanf(“%f,%f, printf(sum is %f n,c); ,函数原型的一般形式为: 1. 函数类型 函数名(类型1,类型2,); 2. 函数类型 函数名(类型1,参数1,参数2,参数2,); 如: float add(float x, float y); float add(float, float); 在调用函数时,需要进行函数原型声明,声明的作用
19、: 是把函数名、函数参数的个数和参数类型等信息通知编译系统,以便在遇到函数调用时,编译系统能正确识别函数并检查调用是否合法。,注意: 函数的“定义”和“声明”的区别: 函数的定义是指对函数功能的确立,包括指定函数名,函数值类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位。 函数的声明的作用则是把函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查。,函数小结,函数的嵌套调用和递归调用,嵌套调用:在定义一个函数时,其函数体内又包含另一个函数的完整定义 。 递归调用:在调用一个函数的过程中又出现直接或间接地调用该函数本身。,解题思路: ma
20、in中调用max4函数,找4个数中最大者 max4中再调用max2,找两个数中的大者 max4中多次调用max2,可找4个数中的大者,然后把它作为函数值返回main函数 main函数中输出结果,例: 输入4个整数,找出其中最大的数。用函数的嵌套调用来处理。,#include int main() int max4(int a,int b,int c,int d); /*对被调用函数max4的声明*/ int a,b,c,d,max; printf(“4 interger numbers:“); scanf(“%d,%d,%d,%d“, ,int max4(int a,int b,int c,i
21、nt d) /*max4函数*/ int max2(int a,int b); /*对被调用函数max2的声明*/ int m; m=max2(a,b); /*a,b中较大者*/ m=max2(m,c); /*a,b,c中较大者*/ m=max2(m,d); /*a,b,c,d中较大者*/ return(m); ,int max2(int a,int b) /*max2函数*/ if(a=b) return a; else return b; ,return(ab?a:b);,int max4(int a,int b,int c,int d) /*max4函数*/ int max2(int a
22、,int b); /*对被调用函数max2的声明*/ int m; m=max2(a,b); /*a,b中较大者*/ m=max2(m,c); /*a,b,c中较大者*/ m=max2(m,d); /*a,b,c,d中较大者*/ return(m); int max2(int a,int b) /*max2函数*/ return (ab?a:b); ,m=max2(max2(a,b),c);,m=max2(max2(max2(a,b),c),d);,return (max2(max2(max2(a,b),c),d);,#include int main() int max4(int a,int
23、 b,int c,int d); /*对被调用函数max4的声明*/ int a,b,c,d,max; printf(“4 interger numbers:“); scanf(“%d,%d,%d,%d“, ,int max2(int a,int b) /*max2函数*/ return ab?a:b; int max4(int a,int b,int c,int d) /*max4函数*/ return max2(max2(max2(a,b),c),d); #include int main() int a,b,c,d,max; printf(“4 interger numbers:“);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c语言程序设计教学资料 语言程序设计 教学 资料 函数
链接地址:https://www.31doc.com/p-3045513.html