函数的调用
一个C程序由一个主函数和若干个函数组成。。主函数调用其他函数,其他函数也可以互相调用。函数调用遵循“先定义,后引用”的原则。如果对某函数的调用出现在该函数定义之前,则必须用说明语句对函数进行说明。
1、函数的声明
如果要在函数中调用一个已经定义的函数时,一般还应在主函数中对调用函数进行说明(声明)。函数声明的作用是告知编译程序本函数将要调用的某个函数的函数类型、函数名、参数类型和参数个数。
函数声明与该函数定义时第一行给出的函数类型、函数名称、形参的个数及类型、形参的次序相一致。其一般形式为:
类型名 函数名(参数类型说明列表);
函数声明语句由函数定义的首部加分号构成。参数列表可以省略形参名,但参数类型和数目必须一致。
float power(float, int);
void putdata(int a);
例子:
编写计算x的n次方的程序。
分析:
①输入x和n;
②调用power()函数进行乘幂运算;
③输出运算结果。
程序:
#include <stdio.h>
#include <windows.h>
int main()
{
float x ,y;
int n;
float power(float x, int n); //对函数进行说明
scanf("%f,%d",&x,&n);
y=power(x,n);
printf("\n%8.2f\n",y);
system("pause");
}
float power(float x,int n) //power函数的定义
{
int i;
float t=1;
for(i=1;i<=n;i++)
t=t*x;
return t;
}
主函数中语句“float power(float x,int n);”是对power()函数的声明,也称为函数原型(function prototype)。目的是是系统知道本函数将要用到的power()函数的主要信息,即它的返回值是浮点数类型的,他有两个形参。
注意:
“函数声明”与“函数定义”是不同的。函数定义是用来建立和实现函数功能的,所以必须有函数体;
函数声明(或原型)仅仅给出函数的类型及其参数的类型。
当函数定义在主函数之前,及先定义后调用。这样在调用时,就已经具有了被调函数的全部信息,函数声明可以省略。
2、函数体
根据函数的有参数和无参数的两种不同形式,函数调用也分有参和无参两种。
有参函数调用的一般形式:
函数名 (实参表达式 1,实参表达式 2,……)
无参函数调用的一般形式:
函数名 ()
关于函数的调用,在前面我们已经多次接触到。根据方式的不同,函数的调用又分为函数语句调用和表达式调用。例如:
scanf(“%8.2f”,power(x,3)); //函数语句调用
y=sin(x+power(sin(x),3)); //表达式调用
3、函数的嵌套调用
如果在某一函数体中调用了另一个函数,则在该函数被调用的过程中将发生另一次函数调用。这叫做函数的嵌套调用。
int f1( ) //定义f1()函数
{
……
}
int f2( ) //定义f2()函数
{
……
f1(); //f2中调用f1函数
}
void main()
{
……
f2(); //主函数中调用f2()函数
}
例子:
编程求组合
分析:
根据组合的计算公式,可以知道组合函数有两个形参:m和n。函数需要计算3次阶乘,如果定义函数fac(k)来计算k的阶乘,则求组合可以通过调用阶乘函数完成:
c=fac(m)/(fac(n)*fac(m-n))
#include <stdio.h>
#include <windows.h>
float fac(int n) //定义求阶乘的函数
{
int i;
for(i=1;i<=n;i++)
f=f*i;
return f;
}
float comb(int n,int m) //定义求组合的函数
{
float c;
c=fac(m)/(fac(n)*fac(m-n)); //嵌套调用求阶乘的函数
return c;
}
void main()
{
int n,m;
float c;
scanf("%d,%d",&n,&m);
c=comb(n,m); //调用求组合的函数
printf("%10.0f\n",c);
system("pause");
}