C语言课件第08章函数.ppt
《C语言课件第08章函数.ppt》由会员分享,可在线阅读,更多相关《C语言课件第08章函数.ppt(100页珍藏版)》请在三一文库上搜索。
1、,第八章,函数,本章要点,函数的概念 函数的定义与调用 函数的递归调用 变量的作用域 函数的作用域,主要内容, 8.1 概述 8.函数定义的一般形式 8.函数参数和函数的值 8. 函数的调用 8. 函数的嵌套调用 8.函数的递归调用 8.数组作为函数参数 8.8 局部变量和全局变量 8.变量的存储类别 8.10 内部函数和外部函数,8.1概述,一个较大的程序可分为若干个程序模块,每一个模块用来实现一个特定的功能。在高级语言中用子程序实现模块的功能。子程序由函数来完成。一个程序可由一个主函数和若干个其他函数构成。,由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任
2、意多次。,函数间的调用关系,# include void main() void printstar(); /*对printstar函数声明*/ void print_message(); /*对print_message函数声明*/ printstar(); *调用printstar函数* print_message(); /*调用print_message函数*/ printstar(); *调用printstar函数*/ ,例8.1先举一个函数调用的简单例子,void printstar() *定义printstar函数* printf(“* * * * * * * * * * * *
3、* * * *n“); void print_message() *定义print_message函数* printf(“How do you do!n“); ,运行情况如下: * * * * * * * * * * * * * * * * How do you do! * * * * * * * * * * * * * * * *,说明: (1)一个程序由一个或多个程序模块组成,每一个程序模块作为一个源程序文件。对较大的程序,一般不希望把所有内容全放在一个文件中,而是将他们分别放在若干个源文件中,再由若干源程序文件组成一个C程序。这样便于分别编写、分别编译,提高调试效率。一个源程序文件可以为
4、多个C程序公用。,(2) 一个源程序文件由一个或多个函数以及其他有关内容(如命令行、数据定义等)组成。一个源程序文件是一个编译单位,在程序编译时是以源程序文件为单位进行编译的,而不是以函数为单位进行编译的。,(3)程序的执行是从函数开始的,如是在函数中调用其他函数,在调用后流程返回到函数,在函数中结束整个程序的运行。,(4) 所有函数都是平行的,即在定义函数时是分别进行的,是互相独立的。一个函数并不从属于另一函数,即函数不能嵌套定义。函数间可以互相调用,但不能调用函数。函数是系统调用的。,(5)从用户使用的角度看,函数有两种: 标准函数,即库函数。这是由系统提供的,用户不必自己定义这些函数,可
5、以直接使用它们。应该说明,不同的C系统提供的库函数的数量和功能会有一些不同,当然许多基本的函数是共同的。 用户自己定义的函数。用以解决用户的专门需要。,(6) 从函数的形式看,函数分两类: 无参函数。如例8.1中的printstar和print_message就是无参函数。在调用无参函数时,主调函数不向被调用函数传递数据。无参函数一般用来执行指定的一组操作。例如,例8程序中的printstar函数。 有参函数。在调用函数时,主调函数在调用被调用函数时,通过参数向被调用函数传递数据,一般情况下,执行被调用函数时会得到一个函数值,供主调函数使用。,8.函数定义的一般形式,8.2.1. 无参函数的定
6、义一般形式,定义无参函数的一般形式为: 类型标识符 函数名() 声明部分 语句部分 ,在定义函数时要用“类型标识符”指定函数值的类型,即函数带回来的值的类型。例8.中的printstar和print_message函数为void类型,表示不需要带回函数值。,8.2.2. 有参函数定义的一般形式,定义有参函数的一般形式为: 类型标识符 函数名(形式参数表列) 声明部分 语句部分 ,例如: (int ,int ) ;/ *函数体中的声明部分* ?; (); ,8.2.3 空函数,定义空函数的一般形式为: 类型标识符 函数名() 例如: () ,调用此函数时,什么工作也不做,没有任何实际作用。在主调
7、函数中写上“();”表明“这里要调用一个函数”,而现在这个函数没有起作用,等以后扩充函数功能时补充上。,8.函数参数和函数的值,8.形式参数和实际参数,大多数情况下,主调函数和被调用函数之间有数据传递的关系。,在不同的函数之间传递数据,可以使用的方 法: 参数:通过形式参数和实际参数 返回值:用return语句返回计算结果 全局变量:外部变量,#include void () int max(int ,int ); /* 对函数的声明 */ int ,; scanf(,); (,); printf( ,); ,例8.调用函数时的数据传递,int max(int ,int )*定义有参函数max
8、 * int ; ?; return(); ,运行情况如下: , ,通过函数调用,使两个函数中的数据发生联系,关于形参与实参的说明:,(1) 在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元。只有在发生函数调用时,函数中的形参才被分配内存单元。在调用结束后,形参所占的内存单元也被释放。,(2) 实参可以是常量、变量或表达式,如: (,); 但要求它们有确定的值。在调用时将实参的值赋给形参。,(3) 在被定义的函数中,必须指定形参的类型(见例8.2程序中的 “(,);” )。,(4) 实参与形参的类型应相同或赋值兼容。例8中实参和形参都是整型。如果实参为整型而形参x为实型,
9、或者相反,则按第3章介绍的不同类型数值的赋值规则进行转换。,例如实参值a为3.5,而形参x为整型,则将实数3.5转换成整数3,然后送到形参b。字符型与整型可以互相通用。,(5) 在语言中,实参向对形参的数据传递是“值传递”,单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参单元与形参单元是不同的单元。,在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,实参单元仍保留并维持原值。因此,在执行一个被调用函数时,形参的值如果发生改变,并不会改变主调函数的实参的值。例如,若在执行函数过程中和的值变为和,而和仍为和。,8.3.2 函数的返回值,通
10、常,希望通过函数调用使主调函数能得到一个确定的值,这就是函数的返回值。例如,例8.中,(,)的值是,(,)的值是5。赋值语句将这个函数值赋给变量。,关于函数返回值的一些说明:,(1)函数的返回值是通过函数中的return语句获得的。,如果需要从被调用函数带回一个函数值供主调函数使用,被调用函数中必须包含return语句。如果不需要从被调用函数带回函数值可以不要return语句。,一个函数中可以有一个以上的return语句,执行到哪一个return语句,哪一个语句起作用。return语句后面的括弧也可以不要, 如: “return ;” 等价于 “return ();”,return语句将被调用
11、函数中的一个确定值带回主调函数中去。见图8.2中从return语句返回的箭头。,return后面的值可以是一个表达式。 例如,例8中的函数可以改写成:,(int ,int ) (?); ,(2) 函数的返回值应当属于某一个确定的类型,在定义函数时指定函数返回值的类型。,例如:下面是3个函数的首行: int max(float ,float ) /* 函数值为整型 */ char letter(char c1,char c2) /* 函数值为字符型 */ double min(int ,int ) /* 函数值为双精度型 */,在语言中,凡不加类型说明的函数,自动按整型处理。例8.中的函数首行的
12、函数类型int可以省写,用Turbo C 2.0编译程序时能通过,但用Turbo C 3.0编译程序时不能通过,因为C+要求所有函数都必须指定函数类型。因此,建议在定义时对所有函数都指定函数类型。,(3)在定义函数时指定的函数类型一般应该和return语句中的表达式类型一致。,如果函数值的类型和return语句中表达式的值不一致,则以函数类型为准。对数值型数据,可以自动进行类型转换。即函数类型决定返回值的类型。,(4)对于不带回值的函数,应当用“void”定义函数为“无类型”(或称“空类型”)。这样,系统就保证不使函数带回任何值,即禁止在调用函数中使用被调用函数的返回值。此时在函数体中不得出现
13、return语句。,例 8. 返回值类型与函数类型不同,# include void main() int (float ,float ); float ,; int ; scanf(,); (,); printf( ,); int max(float ,float ) float ; /* z为实型变量 */ ?; return(); ,运行情况如下: , Max is ,8. 函数的调用,8. 函数调用的一般形式,函数调用的一般形式为: 函数名(实参表列),如果实参表列包含多个实参,则各参数间用逗号隔开。实参与形参的个数应相等,类型应匹配。实参与形参按顺序对应,一一传递数据。,如果是调用无
14、参函数,则“实参表列”可以没有,但括弧不能省略。,例 8 实参求值的顺序,#include void main() int f(int a,int b); /* 函数声明 */ int i=2,p; p=f(i,+i); /* 函数调用 */ printf(“%dn“,p); ,int f(int a,int b) /* 函数定义 */ int c; if(ab) c=1; else if(a=b) c=0; else c=-1; return(c); ,如果按自左至右顺序求实参的值,则函数调用相当于(,),如果按自左至右顺序求实参的值,则函数调用相当于(3,),对于函数调用 int i=2,
15、p; p=f(i,+i);,8.函数调用的方式,按函数在程序中出现的位置来分,可以有以下三种函数调用方式:,函数语句 把函数调用作为一个语句。如例8.1中的printstar(),这时不要求函数带回值,只要求函数完成一定的操作。,函数表达式 函数出现在一个表达式中,这种表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的运算。例如:*(,);,函数参数 函数调用作为一个函数的实参。例如: m = max (a , max ( b , c ) ) ; 其中max ( b , c )是一次函数调用,它的值作为max另一次调用的实参。m的值是a、b、c三者中的最大者。又如: printf
16、 (“%d“, max (a,b);也是把max ( a , b )作为printf函数的一个参数。 函数调用作为函数的参数,实质上也是函数表达式形式调用的一种,因为函数的参数本来就要求是表达式形式。,8.对被调用函数的声明和函数原型,在一个函数中调用另一函数(即被调用函数)需要具备哪些条件呢 ?,(1) 首先被调用的函数必须是已经存在的函数(是库函数或用户自己定义的函数)。但光有这一条件还不够。,8.对被调用函数的声明和函数原型,(3) 如果使用用户自己定义的函数,而该函数的位置在调用它的函数(即主调函数)的后面(在同一个文件中),应该在主调函数中对被调用的函数作声明。,(2) 如果使用库函
17、数,还应该在本文件开头用命令将调用有关库函数时所需用到的信息“包含”到本文件中来。,函数原型的一般形式为 (1) 函数类型 函数名(参数类型1,参数类型2); (2) 函数类型 函数名(参数类型1,参数名1,参数类型2,参数名2);,“声明”一词的原文是declaration,过去在许多书中把它译为“说明”。声明的作用是把函数名、函数参数的个数和参数类型等信息通知编译系统,以便在遇到函数调用时,编译系统能正确识别函数并检查调用是否合法。 (例如函数名是否正确,实参与形参的类型和个数是否一致)。,注意:函数的“定义”和“声明”不是一回事。函数的定义是指对函数功能的确立,包括指定函数名,函数值类型
18、、形参及其类型、函数体等,它是一个完整的、独立的函数单位。而函数的声明的作用则是把函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查。,# include void main() float add(float x, float y); *对被调用函数add的声明* float a,b,c; scanf(f,f,a,b); cadd(a,b); printf(sum is f n,c); float add(float ,float ) *函数首部* float ; /* 函数体 */ z; return(z); ,例8 对被调用的函数作声明,如
19、果 被调用函数的定义出现在主调函数之前,可以不必加以声明。因为编译系统已经先知道了已定义函数的有关情况,会根据函数首部提供的信息对函数的调用作正确性检查。,如果 被调用函数的定义出现在主调函数之前,可以不必加以声明。因为编译系统已经先知道了已定义函数的有关情况,会根据函数首部提供的信息对函数的调用作正确性检查。,改写例 8.,# include float add(float ,float ) *函数首部* float ; /* 函数体 */ z; return(z); void main() float a,b,c; scanf(f,f,a,b); cadd(a,b); printf(sum
20、 is f n,c); ,函数举例,例1 计算10!+9!+6! 例2 写一个函数使输入的字符串按反次序存放,然后输出。,作业,输入10个数x,计算下列函数值。 编写程序计算1+(1+2)+(1+2+3)+(1+n) 编写函数计算m!/(m-n)!,函数回顾,函数定义的一般格式 函数类型 函数名(形参表)/ 函数首部 / 函数体 函数实现过程 return 表达式; ,函数的参数,形式参数表 类型1 参数1 ,类型2 参数2 ,类型n 参数n 参数之间用逗号分隔,每个参数前面的类型都必须分别写明 函数定义时的参数被称为形式参数(简称形参) int max(int ,int ) 函数调用时的参数
21、被称为实际参数(简称实参) C= max(a,b),函数原型声明,函数类型 函数名(参数表); int max(int ,int ); 函数声明:说明函数的类型和参数的情况,以保证程序编译时能判断对该函数的调用是否正确。 函数必须先定义后调用,将主调函数放在被调函数的后面,就像变量先定义后使用一样。 如果自定义函数在主调函数的后面,就需要在函数调用前,加上函数原型声明。,只写函数定义中的第1行(函数首部),并以分号结束。,参数传递,实参形参 在参数传递过程中,实参把值复制给形参。 形参和实参一一对应:数量一致,类型一致,顺序一致 形参:变量,用于接受实参传递过来的值 实参:常量、变量或表达式,
22、例 求100以内的全部素数,每行输出10个,#include #include int main(void) int count, m; int prime (int m); count = 0; for(m = 2; m = 100; m+) if ( prime(m) != 0 ) printf(“%6d“, m ); count+; if (count %10 = 0) printf (“n“); printf (“n“); ,int prime (int m) int i, n; if ( m = 1 ) return 0; n = sqrt (m); for( i = 2; i =
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课件 08 函数
链接地址:https://www.31doc.com/p-2143338.html