这里主要为大家介绍函数的定义声明参函数调用的基本概念以及变量名作函数参数的程序设计方法
一、函数的定义声明参函数调用的基本概念
1. 函数定义:
return_type function_name( parameter list )
{
//body of the function
}
2. 函数声明:
函数声明会告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。
函数声明包括以下几个部分:
return_type function_name( parameter list );
针对上面定义的函数 max(),以下是函数声明:
int max(int num1, int num2);
在函数声明中,参数的名称并不重要,只有参数的类型是必需的,因此下面也是有效的声明:
int max(int, int);
函数调用:
创建 C 函数时,会定义函数做什么,然后通过调用函数来完成已定义的任务。
#include <stdio.h>
/* 函数声名 */
int themax(int num1,int num2);
int main() {
/* 局部变量定义 */
int a = 100;
int b = 200;
int ret;
/* 调用函数来获取最大值 */
ret = themax(a , b);
printf("最大值是:%d\n",ret);
return 0;
}
/* 函数返回两个数中较大的那个数 */
int themax(int num1,int num2) {
/* 局部变量声名 */
int result;
if(num1 > num2)
result = num1;
else
result = num2;
return result;
}
二、函数实参与形参的对应关系以及参数的传递.
1. C语言的传值方式调用函数:
/* 函数定义 */
void swap(int x,int y)
{
int temp;
temp = x; /* 保存x的值 */
x = y; /* 把y的值赋给x */
y = temp; /* 把temp的值赋给y */
return;
}
#include <stdio.h>
/* 函数定义 */
void swap(int x,int y) {
int temp;
temp = x;
/* 保存x的值 */
x = y;
/* 把y的值赋给x */
y = temp;
/* 把temp的值赋给y */
return;
}
/*函数声明*/
void swap (int x, int y);
int main() {
/*局部变里定义*/
int a =100;
int b= 200;
printf("交换前,a的值:%d\n",a);
printf("交换前,b的值:%d\n",b);
/*调用函数来交换值*/
swap(a, b);
printf("交换后,a的值:%d\n",a);
printf("交换后,b的值:%d\n",b);
return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:
上面的实例表明了,虽然在函数内改变了 a 和 b 的值,但是实际上 a 和 b 的值没有发生变化。把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。
2. C语言的引用方式调用函数:
通过引用传递方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。
传递指针可以让多个函数访问指针所引用的对象,而不用把对象声明为全局可访问。
变量在编译的时候系统要为它分配一个地址,如用另一个变量来存放这个地址,那么这个变量就叫指向变量的指针变量。
#include <stdio.h>
/* 函数定义 */
void swap(int *x,int *y) {
int temp;
temp = *x;
/* 保存地址x的值 */
*x = *y;
/* 把y赋值给x */
*y = temp;
/* 把temp值赋给y */
return;
}
/*函数声明*/
void swap (int *x, int *y);
int main() {
/*局部变里定义*/
int a =100;
int b= 200;
printf("交换前,a的值:%d\n",a);
printf("交换前,b的值:%d\n",b);
/* 调用函数来交换值
* &a表示指向a的指针,即变量a的地址
* &a表示指向a的指针,即变量a的地址
*/
swap(&a, &b);
printf("交换后,a的值:%d\n",a);
printf("交换后,b的值:%d\n",b);
return 0;
}
当上面的代码被编译和执行时,它会产生下列结果::
三、利用函数的构造,完成一些数学公式的模拟.
1. 根据输入的整数x和n,利用函数fact实现求xn。 例如:输入:2,3 输出23=8
/* 利用函数fact实现求x的n次方*/
#include "stdio.h"
int main() {
long int fact(long x,long n) ;
/*声明fact函数*/
long int x ;
long int n;
printf("请输入x和n(>=0)的值,以逗号分割: ");
scanf("%ld,%ld", &x, &n );
printf("%ld,%ld,%ld",x,n,fact(x,n));
/*调用fact函数 */
return 0;
}
long int fact(long int x, long int n)
{ /*定义fact函数求x^n */
long int i,s;
s=1;
/*求累积变量的初始化*/
if (n==0) return 0;
for (i=1; i<=n; i++)
/*用循环实现x^n*/
s=s*x;
return s;
/*返回结果x^n*/
}
运行截图:
2. 计算 C m n C_m^n Cmn= m ! n ! ∗ ( m − n ) ! \frac{m!}{n!*(m-n)!} n!∗(m−n)!m! 的值,例如:输入:5,3 输出: C m n C_m^n Cmn=10
定义求阶乘函数,在此基础上定义求组合数函数。
主函数调用求组合数函数,求组合数函数再三次调用求阶乘函数。
/* 利用函数组合数*/
#include "stdio.h"
long int jf (int n)
{ /*定义求阶乘函数jf*/
int i;
long int t=1;
for (i=1; i<=n; i++)
t*=i;
return t;
}
long int cmn(int m, int n)
{ /*定义求组合数函数cmn*/
return(jf(m)/(jf(n)*jf(m-n)));
}
/*用return语句返回结果*/
int main( ) {
int m,n;
printf("请输入m和n的值,空格隔开: ");
scanf("%d %d", &m, &n );
printf("%ld",cmn(m,n));
return 0;
}
运行结果:
3. 读入一个整数m,计算如下公式的值: t = 1 + 1 2 \frac{1}{2} 21 + 1 3 \frac{1}{3} 31 + … + 1 m \frac{1}{m} m1,若输入5,则应输出:“计算结果是 2.28333”。
/* 利用函数实现级数求和 */
#include "stdio.h"
double fun(int m) {
float t=1.0;
int i;
for (i=2; i<=m; i++)
t += 1.0/i;
return t;
}
int main() {
int m;
printf("请输入一个整数值:");
scanf("%d",&m);
double fun(int m);
printf("计算结果是:%f",fun(m));
/*按照例子中的输出形式输出结果*/
return 0;
}
运行结果:
四、总结.
- 定义函数时,函数名后的圆括号后面不能加“;”
- 在函数体内,不能再对形参进行定义和说明
- 变量作实参时,只使用变量名,实参变量对形参变量的数据传递是“值传递”
- 一维数组作函数的实参时,只使用数组名如:fun(a);
例如:下面对函数的调用都是不正确的:
fun(int a[4]);
fun(int a[ ]);
fun(int a);