函数的调用
//函数的调用
/*单行语句的调用,如:max(x,y);
在表达式中调用,如:k=max(x,y); */
//实例5-2:计算代数式1+1/2!+1/3!+.....+1/m!
#include"stdio.h"
#include"conio.h"
double jie(int m);
void main()
{
int i,m;
float sum;
printf("请输入m的最大值:");
scanf("%d",&m);
sum=0;
for(i=1;i<=m;i++)
{
sum=sum+1/(float)jie(i);
}
printf("1+1/2!+1/3!+...+1/%d!的结果为:%f\n",m,sum);
getch();
}
double jie(int m)
{
int i;
double k=1;
for(i=1;i<=m;i++)
{
k=k*i;
}
return k;
}
//函数参数的传递
//赋值调用
/*赋值调用时,函数将实参得知复制一份,传递给形参,从而实现参数的传递,在程序运行过程中,形参的变化不会影响实参*/
/*需要注意的是,形参只在定义它的函数中存在,当从函数返回时,将释放形参所占的存储空间*/
/*实例5-3 无效的数值交换
在这个实例中,我们将要验证如下结论:在赋值调用中,形参的改变不会对实参产生影响。 */
#include"stdio.h"
#include"conio.h"
void fu(int x,int y);
main()
{
int x=10,y=11;
printf("在调用之前,x,y的值分别为:%d,%d\n",x,y);
fu(x,y);
printf("调用之后,x,y的值分别为:%d,%d\n",x,y);
getch();
}
void fu(int x,int y)
{
int t;
t=x;
x=y;
y=t;
printf("在调用时,x,y的值分别为:%d,%d\n",x,y);
}
//传址调用
/*语句格式:
void swap(int *m,int *n);
main()
{
int a,b;
...
swap(&a,&b);
....
}
void swap(int *m,int *n)
{
....
} */
/*传址调用时,函数将把实参的地址传递给形参,通过对地址的内容进行访问,可以在被调用函数中对该地址内容进行调用和修改。
这是由于实参和形参都是指向同一存储空间,因此对形参的内容进行改变时,实参的内容也会发生变化。 */
//实例5-4 传址调用对实参的影响
#include"stdio.h"
#include"conio.h"
void swap(int *n,int *m);
main()
{
int n=10,m=11;
printf("进行传址调用之前,n,m的值分别为:%d,%d\n",n,m);
swap(&n,&m);
printf("传址调用之后,n,m的值分别为:%d,%d\n",n,m);
getch();
}
void swap(int *n,int *m)
{
int t;
t=*n;
*n=*m;
*m=t;
printf("进行传址调用时,n,m的值分别为:%d,%d\n",*n,*m);
}
//函数的递归调用
//实例5-6 累加求和
//计算代数式:1+2+3+...+n的结果
#include"stdio.h"
int add(int n);
void main()
{
long sum;
int n;
printf("\t求代数式1+2+3+...+n的和\n");
printf("请输入n的值:");
scanf("%d",&n);
sum=add(n);
printf("1+2+3+...+%d=%d\n",n,sum);
}
int add(int n)
{
int m;
if(n>1)
{
m=n+add(n-1);
}
else
m=1;
return m;
}
//函数的递归调用
//实例5-7:菲波那契数列
/*菲波那契数列是这样的一个数列:1,1,2,3,5,8....,n
表达式为: f(n)= f(n-1)+f(n-2) n>2
1 n=1 or 2 */
#include"stdio.h"
#include"conio.h"
int f(int m);
void main()
{
int l,m;
long i;
printf("\t菲波那契数列\n");
printf("请输入数列的长度:");
scanf("%d",&l);
for(m=1;m<=l;m++)
{
i=f(m);
printf("%20d",i);
}
printf("\n ");
getch();
}
int f(int m)
{
long n;
if(1==m||2==m)
{
n=1;
}
else
n=f(m-1)+f(m-2);
return n;
}
//实例5-7:菲波那契数列(拓展,用循环来做)
/*菲波那契数列是这样的一个数列:1,1,2,3,5,8....,n */
#include"stdio.h"
#include"conio.h"
void main()
{
int l,i,n,m,a1,a2;
printf("\t菲波那契数列\n");
printf("请输入数列的长度:");
scanf("%d",&l);
for(i=1;i<=l;i++)
{
for(n=1;n<=i;n++)
{
if(1==n||2==n)
{
m=1;
a1=1;
a2=1;
}
else
{
m=a1+a2;
a1=a2;
a2=m;
}
}
printf("%5d",m);
}
printf("\n");
getch();
}