高等职业教育示范专业规划教材C语言程序设计第7章函数年9月20日本章目录第7章函数7.1函数概述7.2函数的定义与调用7.3函数调用中的数据传递方式7.4函数的嵌套调用7.5函数的递归调用7.6数组作函数的参数7.7变量的作用域与存储类型7.8内部函数和外部函数7.9多文件程序的运行本章小结习题C语言程序设计机械工业出版社章函数学习目标:返回目录①了解模块化程序设计思想。②掌握函数的概念与分类。③掌握函数的定义与调用。④掌握递归函数的编写及调用方法。⑤掌握数组作为函数参数的用法,变量的作用域与存储类型。⑥了解内部函数和外部函数的使用,工程文件的编写与调试。C语言程序设计机械工业出版社函数概述(1)C源程序是由函数组成的,C语言中的函数相当于其它高级语言的子程序。函数是C源程序的基本模块,通过对函数模块的调用实现特定的功能。由于C程序的全部工作都是由各式各样的函数完成的,所以也把C语言称为函数式的模块化语言。7.1.1C程序的模块化设计模块化程序设计,是现代程序设计的基础。在进行程序设计时,最好的办法是根据结构化程序设计思想,把复杂问题按照自顶向下、逐步细化的方法划分为功能相对独立的若干模块,然后再用同样的方法把各个模块划分为功能更独立的子模块,直到不需要细分为止。这是一个从抽象到具体的过程。划分子模块时要做到:内聚性强(指模块的独立性要强,一个模块完成一个功能),耦合性弱(模块间的关联度要小,最好没有关联关系)。返回目录C语言程序设计机械工业出版社日可以看出,模块化程序设计的思想实际上是一种“分而治之”的思想,将一个大任务(复杂问题)分解为若干个小任务甚至于更小的任务(简单问题),每个小任务实现起来就相对容易了。这里的每个任务对应一个模块,相当于C语言中的函数。函数是C语言程序的基本组成单位,因此,可以很方便地用函数作为程序模块来实现C语言程序的模块化。返回目录7.1函数概述(2)C语言程序设计机械工业出版社函数的概念与分类(1)1.函数的概念函数是一个可以反复使用的、功能相对独立的程序段。在一个用户程序中,如果在不同地方需多次执行某些操作,则可以把完成这些操作的程序段从程序中独立出来,定义成函数,需要时再进行调用它。建立函数的过程称为“定义函数”,使用函数的过程称为“调用函数”。由于函数可以被其它函数调用,通常把调用其它函数的函数称为“主调函数”,而被调用的函数称为“被调函数”。在C语言中,所有的函数定义,包括主函数main在内,都是平行的。也就是说,在一个函数的函数体内,不允许再定义另外一个函数,即不能嵌套定义。但是函数之间允许相互调用,也允许嵌套调用。甚至还允许函数自己调用自己(递归调用)。但不允许调用main函数(主函数)。C程序的执行总是从main函数开始,完成对其它函数的调用后再返回到main函数,最后由main函数结束整个程序。一个C源程序必须有也只能有一个主函数main。返回目录C语言程序设计机械工业出版社函数的分类在C语言中,可从不同的角度对函数进行分类。(1)从函数定义的角度看,函数可分为库函数和用户定义函数两种。(2)从主调函数和被调函数之间数据传送的角度看又可分为无参函数和有参函数两种。(3)从有无返回值的角度看,又可把函数分为有返回值函数和无返回值函数两种。(4)从使用范围来看又可分为内部函数和外部函数。返回目录7.1.2函数的概念与分类(2)C语言程序设计机械工业出版社年9月20日7.2.1函数的定义(1)函数的定义,就是确定该函数完成什么功能以及如何完成此功能的过程,相当于其它程序设计语言的子程序。函数的定义从形式上可以分为以下三种:1.无参函数无参函数的定义形式如下:存储类型数据类型函数名()/*函数首部*{声明部分/*说明部分*/语句序列/*执行部分*/}返回本节目录C语言程序设计机械工业出版社有参函数有参函数的一般形式如下:存储类型数据类型函数名(形式参数表){声明部分/*说明部分*/语句序列/*执行部分*/}存储类型:可以是extern或static两种。extern表示定义的函数是外部函数,它可以被其它编译单位中的函数调用;static表示定义的函数是内部函数,只能被本程序单位中的函数调用。存储类型可以省略,省略时,默认为外部函数。返回本节目录7.2.1函数的定义(2)C语言程序设计机械工业出版社日数据类型:规定了该函数的类型,函数的类型实际上就是函数返回值的类型,可以是以前介绍过的各种基本数据类型,也可以是指针型。缺省时,函数类型为int型。此外,数据类型符还可以是void(空类型),它表示本函数没有返回值。函数名:是由用户定义的标识符。在同一个编译单位中,不允许函数同名。形式参数表:用逗号分隔的若干个形式参数(简称形参,也称虚参),每个形式参数可以是变量名、数组名、指针变量名、指针数组名等。注意:当形式参数是数组时,只需写出数组名。返回本节目录7.2.1函数的定义(3)C语言程序设计机械工业出版社日形式参数表只出现在有参函数中,无参函数没有形式参数,但括号不可少。对形式参数的声明有两种方式:传统方式和现代方式。传统方式在函数名后的括号中只列出用逗号分隔的形参变量名,紧接着在其后再定义形参变量的数据类型;现代方式采用合二为一的方法,即在函数名后的括号中声明形参变量名的同时,指出其数据类型。返回本节目录7.2.1函数的定义(4)C语言程序设计机械工业出版社日【例7-1】用传统方式和现代方式分别定义求两个数中较大数的函数。程序清单如下:方式一:传统方式intmax(a,b)inta,b;{if(ab)returna;elsereturnb;}方式二:现代格式intmax(inta,intb){if(ab)returna;elsereturnb;}等价TurboC和目前流行的C版本都允许使用这两种方法,它们是等价的。但ANSI推荐使用现代方式。因为传统方式不利于编译系统检查,会引起一些非常细微而且难于跟踪的错误。而现代方式在函数定义和函数声明(后面将要介绍)时,给出了形式参数及其类型,在编译时易于对它们进行查错,从而保证了函数说明和定义的一致性。返回本节目录7.2.1函数的定义(5)C语言程序设计机械工业出版社日【例7-2】定义求三个整型数最大值的函数。程序清单如下:#includestdio.hintmax_number(intx,inty,intz){intmax;max=xy?x:y;max=maxz?max:z;return(max);}返回本节目录7.2.1函数的定义(6)C语言程序设计机械工业出版社日【例7-3】定义“判断m是否是素数”的函数。【分析】素数是只能被1和本身整除的数。判断一个数是否是素数,可把数m用从①2~m-1②2~m/2③2~sqrt(m)范围内的数逐个去除,若某次除尽则说明m不是素数;否则,m就是素数。上述判素数的三种方法中,第三个方法效率最高,第一个方法效率最差,第二个方法居中。下面给出第三个方法的函数,其余两个方法的函数,请读者自己完成。在此约定:若m是素数,返回值为1;否则,返回值为0。程序清单如下:intisprime(intm){inti;for(i=2;im;++i)if(m%i==0)return(0);return(1);}返回本节目录7.2.1函数的定义(7)C语言程序设计机械工业出版社日【例7-4】定义一个求xn的函数power,其中x是整数,n是无符号整数。程序清单如下:longpower(intx,unsignedn){inti;longp;for(i=1,p=1;i=n;i++)p*=x;returnp;}思考:这里为什么要将p定义成长整型?如果当x和n的值都比较大时,p的类型应如何修改?返回本节目录7.2.1函数的定义(8)C语言程序设计机械工业出版社语言中,函数允许有“空函数”,即函数体为空的没有任何作用的函数。这往往是在程序开发的开始阶段,为了能使编译、连接顺利通过,将该函数置成一个空函数,仅起占位作用,等以后编写好函数后替代它。这样做的目的,能使程序结构清晰,可读性好,便于功能扩充,空函数在程序设计中经常用到。空函数的一般形式如下:存储类型数据类型函数名()/*函数首部*/{}/*函数体为空*/如dump(){}返回本节目录7.2.1函数的定义(9)C语言程序设计机械工业出版社函数的参数与返回值(1)1.形式参数和实际参数函数的参数分为形参和实参两种。定义函数时函数名后面括号中的变量名称为“形式参数”(简称“形参”或“虚参”),调用函数时,函数名后面括号中的参数称为“实际参数”(简称“实参”)。形参和实参的作用是数据传送。当发生函数调用时,主调函数把实参的值传送给被调函数的形参,从而实现主调函数向被调函数的数据传送。形参和实参的特点:(1)形参只有在发生函数调用时,系统才为其分配存储单元。调用结束时,即刻释放所分配的存储单元。可见,形参只有在函数内部有效。(2)形参可以是变量名、数组名、指针变量名、指针数组名等,实参可以是常量、变量、表达式、函数等。不论实参以何种形式和类型出现,但在进行函数调用时,要求它们必须具有确定的值,以便把这些值传送给形参(如果形参是数组名,则传递的是数组首地址而不是数组的值。请参阅7.6节)。(3)要求实参和形参数量相等,顺序一致,类型相容或相同。如果类型不相容(或不相同),则按第2章介绍的不同类型数值的赋值规则进行转换。返回本节目录C语言程序设计机械工业出版社函数的返回值(1)函数的值只能通过return语句返回给主调函数。return语句的一般形式为:return表达式;或return(表达式);该语句的功能是计算表达式的值,退出被调函数,返回到主调处,同时将此表达式的值作为函数值返回给主调函数。注意:在函数中允许有多个return语句,执行到那一个return,那一个return语句起作用,因此只能返回一个函数值。(2)函数值的类型和函数定义中函数的类型应保持一致。如果两者不一致,则以函数类型为准,自动进行类型转换。函数值的类型可以是C语言数据类型中的任何一种(如int、char、float、结构体、指针等)。返回本节目录7.2.2函数的参数与返回值(2)C语言程序设计机械工业出版社日【例7-5】函数值类型转换。max(floatx,floaty){floatz