1.函数的定义
库函数是系统定义的,其定义代码存放在对应的头文件中,程序中可直接调用。自定义函数要根据函数的格式和所要求的功能自己来定义,编写函数代码,然后在程序中才能调用。
函数定义的一般格式:
类型 函数名([形式参数说明])函数说明部分
【例6.1】如果需要定义求两个数中较大数的函数,可将执行程序进行如下编辑:
1 #include<stdio.h>
2 float max(float x,float y)
3 {
4 float z;
5 z=x>y?x:y;
6 return(z);
7 }
8 int main()
9 {
10 float max(float x,float y);
11 float x,y,c;
12 scanf("%f,%f",&x,&y);
13 c=max(x,y);
14 printf("%f",c);
15 return 0;
16 }
需要注意:
(1)函数若有返回值,则函数体中应有return语句返回一个表达式作为函数的返回值。
(2)一个函数(定义)由函数说明(函数首部)和函数体两部分组成。
函数说明部分说明了函数的类型和名称、形式参数的类型和名称。如:
float max(float x,float y)
函数类型:就是函数返回值的数据类型,可以是基本数据类型也可以是构造类型。如果没有返回值,可定义为void类型(空类型)。
函数名:它是一个合法的标识符,用于区分不同的函数,调用函数时使用。
形参说明:定义函数时,函数首部中括号内的变量(数学上称自变量)称为“形式参数”,简称函数的形参。“形参说明”要说明每个形参的类型和名称,若省略形参说明,则为无参函数,但“()”不能省略,也可定义成void类型,如void main(void)。“形参说明”包括参数的类型及名称,形参之间用逗号“,”分隔。如:
float max(float x,float y)
每个形参前面都要有类型说明,与变量的定义不完全相同。
(3)函数体:一对花括号“{}”括起来的程序行就是函数体。如果函数有多个“{}”,最外层的才是函数体,内层是复合语句。函数体一般包括两部分——声明部分和执行部分。
①声明部分:这部分定义本函数所使用的变量以及进行有关声明(如函数声明)。如本例中:
float z;
②执行部分:剩余的内容就是执行部分,由若干条语句组成的程序行构成,它是函数的主体,是函数功能的体现。如本例中:
z=x>y?x:y;
return(z);
函数体的声明部分在前,执行部分在后,两者不能交叉,否则是错误的。函数若有返回值,则函数体中至少有一个return语句,否则函数返回一个不确定的值。
(4)函数说明后面没有分号,初学者往往误加上了分号,这是错误的。
(5)在C语言中函数只能单个定义,不能嵌套定义。
(6)函数的关系是平行的,没有前后、大小、主次之分,main()函数也仅仅表示程序执行的起点和终点,除此之外,和其他函数一样。
定义一个函数时,如果函数体为空,也是合法的,称之为“空函数”。空函数也有一定的作用,它就像学生在教室里占位子一样,占位者随时可以到这里学习;它也像计算机主板上的扩展槽一样,随时可以扩充其功能。
程序内容如下:
1 #include<stdio.h>
2 float funy(float x);
3 float funy(float x)
4 {
5 float y;
6 if(x>0) y=2*x+3;
7 else if(x==0) y=5;
8 else y=3*x*x+4*x-10;
9 return(y);
10 }
11 int main()
12 {
13 float x,a;
14 scanf("%f",&x);
15 a=funy(x);
16 printf("y=%f\n",a);
17 return 0;
18 }
需要注意:此程序设函数名为funy,函数的类型为float,形参用x表示,函数值用y表示。
2.函数的声明
函数定义后并不一定就能被主调函数调用,若要调用,则应在主调函数中对被调函数进行声明。所谓函数声明,是指向编译系统声明主调函数要调用此函数,并将有关信息(如函数类型,参数类型及个数等)通知编译系统。因为编译系统是从上向下一行一行进行编译的,如果不对函数进行声明,那么当系统编译到函数调用(如“c=max(a,b);”)位置时,由于编译系统还没有编译到函数定义的程序段,编译系统就不知道max是不是函数名,也不知道实参和形参的类型和个数是否一致,此时就会出现编译错误。所以在主调函数中应对被调函数加以声明。不管被调函数是标准库函数,还是自定义函数,在调用前都必须是已存在的。
函数声明的一般格式:
格式1:
类型 函数名(类型1形参1,类型2形参2,…,类型n形参n);
格式2:
类型 函数名(类型1,类型2,…,类型n);
函数声明的作用:在主调函数中声明本函数中将要调用外部已经定义好的某某类型的某某函数,以及其参数的情况。
例如:
float max(float x,float y);
float max(float,float);
该语句的作用是声明在本函数中将要调用已经定义好的名为max的单精度实型函数,并且该函数有两个单精度实型的形参。
【例6.3】求n!。
程序内容如下:
1 #include<stdio.h>
2 int main()
3 {
4 int n;
5 float g,factorial(int n);
6 printf("n=");
7 scanf("%d",&n);
8 g=factorial(n);
9 printf("%d!=%g\n",n,g);
10 return 0;
11 }
12 float factorial(int n)
13 {
14 int i;
15 float f=1;
16 for(i=2;i<=n;i++)
17 f=f*i;
18 return(f);
19 }
程序结果如图6.1所示:(www.xing528.com)
图6.1 例6.3程序结果图
【例题中关键问题说明】
设计函数factorial(),求一个数的阶乘,其形参为int n,返回值为float类型。
另外,可以将factorial()函数改写成:
float factorial(int n)
{
float f=1;
while(n)
f*=n--;
return(f);
}
请仔细阅读,认真分析该函数。
需要注意:
(1)函数声明行放在函数体的声明部分,可以和变量定义在一起,和变量共享一个类型标识符。
例如:
int main()
{
float max(float x,float y),n,i;
char a,b;
·
·
·
}
(2)函数声明与函数定义的说明部分虽然格式相似(仅差一个分号),但含义完全不同。函数声明是为了主调函数能够调用被调函数而进行的声明,被调用的函数一定是已存在的;函数定义是为完成某一功能而设计的源代码。
(3)函数声明的格式1和格式2的效果是相同的,因为编译系统不检查参数名,所以有形参时形参的名字也不必与定义时相同。
例如,函数“float max(float x,float y)”在主调函数中可以这样声明:
float max(float x,float y);
或这样声明:
float max(float a,float b);
也可以这样声明:
float max(float,float);
但不能这样声明:
float max();
(4)在主调函数中声明的被调函数的定义,位置可以在主调函数之前,也可以在主调函数之后,甚至可以在其他的源程序文件中(外部函数)。
(5)也可以在函数之外对被调函数声明,函数声明之后的所有函数均可以调用已声明的被调函数,而不必在主调函数中再声明。
例如:
float max(float x,float y);
int main()
{
float n,i;
char a,b;
n=max(10,30);
·
·
·
}
(6)在主调函数之前定义的被调函数,主调函数中可省略声明,如例6.8。因为编译系统是从上向下一行一行进行编译的,当编译到函数定义时就已经知道被调函数的信息了,因此可以省略对被调函数的声明。建议初学者尽量用这种方法编写程序,将被调函数放于主调函数之前,这样可以不必对函数进行声明。
综上所述,为了避免忘记声明或错误声明所带来的程序错误,提高程序设计的效率,在程序设计时,关于被调函数的声明,有如下建议:
(1)在函数之外、程序的最前面对被调函数进行声明,和编译预处理命令(如“#include<stdio.h>”)写在一起。
(2)尽量将被调函数写在前面,而将main()函数定义在最后。
【例6.4】用函数编程验证“关于偶数的哥德巴赫猜想”(任一大于2的偶数都可写成两个素数之和)的正确性。
程序内容如下:
1 #include<stdio.h>
2 int main()
3 {
4 int n,a,b,w=0;
5 int fun(int n);
6 do
7 {
8 printf("n=");
9 scanf("%d",&n);
10 if(n==4)
11 printf("%d=%d+%d\n",n,2,2);
12 }while(n<6||n%2!=0);
13 for(a=3;a<=n/2;a+=2)
14 if(fun(a)==1)
15 {
16 b=n-a;
17 if(fun(b)==1)
18 {
19 printf("%d=%d+%d\n",n,a,b);
20 w=w+1;
21 }
22 }
23 if(w==0)
24 printf("XXXXXX\n");
25 return 0;
27 }
28 int fun(int n)
29 {
30 int i;
31 for(i=2;i<=n-1;i++)
32 if(n%i==0)
33 return(0);
34 return(1);
35 }
程序结果如图6.2所示:
图6.2 例6.4程序结果图
【例题中关键问题说明】
素数是指在一个大于1的自然数中,除了1和自身外,不能被其他自然数整除的数,例如:2,3,5,7……若fun()函数返回值为1时,表示该数为素数,否则为非素数。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。