第6章函数源程序.docx
《第6章函数源程序.docx》由会员分享,可在线阅读,更多相关《第6章函数源程序.docx(16页珍藏版)》请在冰豆网上搜索。
第6章函数源程序
第6章函数
例6.1从键盘输入三个小的整数,求三个整数的阶乘之和。
不用函数实现:
#include"stdio.h"
voidmain()
{
inta,b,c,n;
longm,s=0;
scanf("%d%d%d",&a,&b,&c);
for(n=1,m=1;n<=a;n++)
m=m*n;
s=s+m;
for(n=1,m=1;n<=b;n++)
m=m*n;
s=s+m;
for(n=1,m=1;n<=c;n++)
m=m*n;
s=s+m;
printf("%ld\n",s);
}
下面改用函数方法实现上述程序:
#include"stdio.h"
longfun(intx)
{
longm=1;
intn;
for(n=1;n<=x;n++)
m=m*n;
returnm;
}
voidmain()
{
inta,b,c;
longs;
scanf("%d%d%d",&a,&b,&c);
s=fun(a)+fun(b)+fun(c);
printf("%ld\n",s);
}
例6.2从键盘输入两个整数,求较大的整数。
#include"stdio.h"
intmax(intx,inty)
{
intz;
if(x>y)
z=x;
else
z=y;
returnz;
}
voidmain()
{
inta,b,c;
scnaf("%d,%d",&a,&b);
c=max(a,b);
printf("Max=%d\n",c);
}
例6.3定义一个函数,其功能输出一个字符串。
#include"stdio.h"
voidPrint(void)
{
printf("Thisisaexample.\n");
}
voidmain()
{
Print();
}
例6.4用函数编程实现两个实数的加减运算。
#include"stdio.h"
floatAdd(floatop1,floatop2)
{
floatres;
res=op1+op2;
returnres;
}
floatSub(floatop1,floatop2)
{
floatres;
res=op1-op2;
returnres;
}
voidmain()
{
floatx,y;
scanf("%f%f",&x,&y);
printf("%f+%f=%f\n",x,y,Add(x,y));
printf("%f-%f=%f\n",x,y,Sub(x,y));
}
例6.5编一函数求y=xn,其中x≠0,n为整数且不为0。
doublePower(doublex,intn)
{
doubley=1;
inti;
for(i=1;i<=n;i++)
y=y*x;
returny;
}
voidmain()
{
doublex;
intn;
scanf("%lf,%d",&x,&n);
printf("y=%f\n",Power(x,n));
}
例6.6求球的表面积和体积。
程序为:
#include"stdio.h"
floatArea(floatr)
{
floats;
s=4*3.14*r*r;
returns;
}
floatVolume(floatr)
{
floatv
v=4*3.14/3*r*r*r;
returnv;
}
voidmain()
{
floatR;
scanf("%f",&R);
printf("Area=%f,Volume=%f\n",Area(R),Volume(R));
}
例6.7将例6.6改用嵌套调用的方式实现程序。
程序为:
#include"stdio.h"
floatArea(floatr)
{
floats;
s=4*3.14*r*r;
returns;
}
floatVolume(floatr)
{
floatv;
v=Area(r)*r/3;
returnv;
}
voidmain()
{
floatR;
scanf("%f",&R);
printf("Area=%f,Volume=%f\n",Area(R),Volume(R));
}
例6.8求n!
=n•(n-1)•(n-2)•…•2•1
例6.9递归法求f(n)=n!
.
计算阶乘可用如下形式描述:
程序如下:
#include"stdio.h"
unsignedlongfact(intn)
{
unsignedlongp;
if(n==1)
p=1;
else
p=n*fact(n-1);
returnp;
}
voidmain()
{
intn;
unsignedlongp;
scanf("%d",&n);
p=fact(n);
printf("%d!
=%lu\n",n,p);
}
例6.10当f(0)=1,f
(1)=1,f(n)=f(n-1)+(f(n-2)(n>1)用递归法求f(10)的值。
程序如下:
#include"stdio.h"
longintfun(intn)
{
longintp;
if(n==0||n==1)
p=1;
else
p=fun(n-1)+fun(n-2);
returnp;
}
voidmain()
{
printf("%ld\n",fun(10));
}
递归程序的设计很容易进行无休止的递归,在例6.10中,将fun函数改成以下时,整个程序就会无法得到终止:
longintfun(intn)
{
longintp;
if(n==0)
p=1;
if(n==1)
p=1;
else
p=fun(n-1)+fun(n-2);
returnp;
}
例6.11汉诺塔问题。
有3个塔,每个堆放若干个盘子。
开始时,所有盘子均在塔A上,前且,盘从上到下,按直径增大的次序放置(如图6-3所示)。
设计一个移动盘子的程序,使得塔A上的所有盘子借助于塔B移到塔C上,但有两个限制条件:
一是一次只能搬动一个盘子,二是任何时候不能把盘子放在比它小的盘子的上面。
#include"stdio.h"
intstep;
voidmove(intn,charfrom,charbuf,charto)
{
if(n>0)
{
move(n-1,from,to,buf);
step++;
printf("step=%d\tn=%d\t",step,n);
printf("%c-à%c\n",from,to);
move(n-1,buf,from,to);
}
}
voidmain()
{
inttotal,num;
scanf("%d",&num);
for(total=1;total<=num;total++)
{
printf("total=%d\n",total);
step=0;
move(total,‘a’,‘b’,‘c’);
printf("\n");
}
}
例6.12局部特性的分析。
#include"stdio.h"
voidadd(intx)
{
x++;
printf("%d,",x);
}
voidsub(intx)
{
x--;
printf("%d,",x);
}
voidmain()
{
inty=1;
add(y);
sub(y);
add(y);
sub(y);
}
例6.13局部变量作用域示例。
#include"stdio.h"
main()
{
intx=1,y=2;
{
intx=10;
x=x+10;
printf("x=%d,",x);
printf("y=%d,",y);
}
x=x+9;
printf("x=%d\n",x);
}
例6.14用函数实现求ax2+bx+c=0(a≠0)的根。
#include"stdio.h"
#include"math.h"
floatx1,x2;/*定义两个全局变量*/
voidf1(floata,floatb,floatc)
{
x1=(-b+sqrt(b*b-4*a*c))/(2*a);
x2=(-b-sqrt(b*b-4*a*c))/(2*a);
}
voidf2(floata,floatb)
{
x1=x2=-b/(2*a);
}
voidf3(floata,floatb,floatc)
{
x1=-b/(2*a);
x2=sqrt(4*a*c-b*b)/(2*a);
}
main()
{
floata,b,c;
scanf("%f%f%f",&a,&b,&c);
if(b*b-4*a*c>1e-5)
{
f1(a,b,c);
printf("x1=%f,x2=%f\n",x1,x2);
}
else
if(fabs(b*b-4*a*c)<1e-5)
{
f2(a,b);
printf("x1=x2=%f\n",x1);
}
else
{
f3(a,b,c);
printf("x1=%f+I%f,x2=%f-I%f\n",x1,x2,x1,x2);
}
}
例6.15外部变量引用示例。
#include
intx=10;
voidf1()
{
x++;
printf("x=%d,",x);
printf("y=%f\n",y);
}
floaty=2;
main()
{
intx=1;
x++;
fl();
printf("x=%d,y=%f\n",x,y);
}
程序运行时,编译将显示y变量在fl函数中未定义。
这是因为外部变量y是定义在f1函数之后,在f1函数中不能直接引用。
f1函数的定义应改成如下:
voidf1()
{
externfloaty;/*外部变量的引用说明*/
x++;
printf("x=%d,",x);
printf("y=%f\n",y);
}
例6.16静态局部变量示例。
#include
voidf1()
{
intx=1;
x++;
printf("x=%d,",x);
}
voidf2()
{
staticintx=1;/*静态局部变量的定义*/
x++;
printf("x=%d\n",x);
}
voidmain()
{
f1();f2();
f1();f2();
}
例6.17静态局部变量求10!
。
程序如下:
#include"stdio.h"
longintfun(intn)
{
staticlongints=1;
s=s*n;
returns;
}
voidmain()
{
intn;
longintp;
for(i=1;i<=10;i++)
p=fun(i);
printf("%ld\n",p);
}
例6.18多文件运行示例。
/*filename:
f1.c*/
floatfun1(floatx)
{
floaty;
y=x*x;
returny;
}
/*filename:
f2.c*/
floatfun2(floatx)
{
floaty;
y=x*x*x;
returny;
}
/*filename:
f3.c*/
voidmain()
{
floatx,y;
scanf("%f",&x);
y=fun1(x);
printf("y=%f*%f=%f\n",x,x,y);
y=fun2(x);
printf("y=%f*%f*%f=%f\n",x,x,x,y);
}
编辑3个文件,分别以文件f1.c、f2.c和f3.c文件命名存到磁盘上。
2.创建一个工程文件。
同样使用TurboC编辑器编辑一个文件,内容如下:
f1.c
f2.c
例6.19改用文件包含命令形式实现例6.18。
文件f1.c和f2.c不作任何改变,main改成如下程序:
#include"f1.c"
#include"f2.c"
voidmain()
{
floatx,y;
scanf("%f",&x);
y=fun1(x);
printf("y=%f*%f=%f\n",x,x,y);
y=fun2(x);
printf("y=%f*%f*%f=%f\n",x,x,x,y);
}