第六章 函数
1.函数的定义与声明
为了使程序大而不繁,简单明了,程序设计者要根据软件的总体要求,把相同的功能或相似的操作归纳成模块的形式,并设计成函数,以实现程序设计的结构化。
函数定义的一般格式:
类型说明符 函数名(类型说明符 形参变量1,类型说明符 形参变量2...)
{
声明语句部分;
执行语句部分;
}
函数头
包括函数名,函数的类型及形式参数表。
(1)函数名。用标识符表示,用来表示一个函数的名字,函数名后面必须有一对圆括号。
(2)函数类型。函数名前的函数类型是指函数返回值的类型。如果函数是整型,int可省略不写;如果函数无返回值,以void类型明示。
(3)形式参数表。圆括号内为形式参数列表部分,其中的参数称为形式参数,它包括函数的自变量部分。
函数体
函数体是函数头下面最外层一对花括号内的代码,它是由一系列语句构成的,用以实现函数的功能,函数体内可以有函数说明,变量说明及可执行语句。例:
void function(void)
{
}
2.函数的返回值
(1)函数的值只能通过return语句返回主调函数,当遇到return时,方法执行将终止。
(2)一个函数最多可以返回一个值,不能返回多个值;不返回函数值的函数,可以明确定义为“空类型”,类型说明符为“void”。
(3)返回值的数据类型必须与函数声明时返回值的数据类型匹配。如果两者不一致,则以函数类型为准,自动进行类型转换。
(4)如函数值为整形,在函数定义时可以省去类型说明。
例:
max(Int a,Int b){
return a>b?a:b;
}
main(){
Int max(Int a,Int b);
Int x,y;
printf("input two numbers:\n");
scanf("%d%d",&x,&y);
double z=max(x,y);
printf("maxmum=%f",z);
}
3.函数的参数(形参和实参)
函数的参数分为形参和实参两种,作用是实现数据的传送。有参函数在调用时,主调函数和被调函数之间有数据传递,主调函数传递数据给被调函数。主调函数传递来的数据称为实际参数,简称实参。
定义函数式,函数名后的参数称为形式参数,简称形参。
实参和形参之间的关系如下:
(1)实参的个数,类型应该和形参的个数和类型一致。调用函数时,系统给形参分配存储单元,并且把实参的数值传递给形参。
(2)实参和形参分别属于主调函数和被调函数,具有不同的内存单元。所以,在函数调用时形参发生改变,不会影响到实参。
(3)C语言中实参和形参的结合采取的是“单向值传递”方式,只有实参传递参数给形参,形参不会传参数给实参。例:
#include <stdio.h>
main()
{
float a,b,sum;
float add(float x,float y);
scanf("%f,%f",&a,&b);
sum=add(a,b);
printf("sum=%f\n",sum);
}
float add(float x,float y)
{
float z;
z=x+y;
return z;
}
4.函数的调用
(1)函数的调用方式
函数表达式。函数作为表达式的一项,出现在表达式中,以函数返回值参与表达式的运算。这种方式要求函数是有返回值的。例:z=max(x,y);
函数语句。C语言中的函数可以只进行某些操作而不返回函数值,这时的函数调用可作为一条独立的语句。例:
printf("%d",a);
函数参数。函数最为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的。例:d=add(a,add(b,c));
(2)函数的调用说明
函数名称必须与具有该功能的自定义函数名称完全一致。
实参的类型与形参必须一一对应和匹配。
函数调用也是一种表达式,其值是函数的返回值。
被调函数可以是自定义函数,也可以是系统函数,还可以调用自身。
被调函数中还可以调用函数。
例:
Int GDC(Int m,Int n){
Int p=0;
while(m%n){
p=m%n;
m=n;
n=p;
}
return n;
}
Int LCM(Int m,Int n){
Int p=GDC(m,n);
return m*n/p;
}
void main(){
Int x,y;
printf("input two numbers:\n");
scanf("%d%d",&x,&y);
Int gdc=GDC(x,y);
Int lcm=LCM(x,y);
printf("gdc=%d,lcm=%d",gdc,lcm);
}
5.递归函数
递归是一种方法(函数)调用自己的编程技术,它在定义自身的同时又出现了对自身的引用,有点类似我们高中学的数学归纳法。用递归的目的在于解决一个常见的问题,即子任务不过是开始试图解决的相同问题的一个较简单的方法。
(1)发现逻辑“相似性”
(2)不要忘记递归出口
递归的条件:
(1)将要解决的问题分解为一个新的问题,而这个新问题是原问题的一个子问题,即新问题的解决仍与原问题相同,只是原问题的处理对象有规律的变化。
(2)这种转换过程可以使问题得到解决。
(3)必须有一个确定的结束条件,在满足条件时返回。