程序设计百科

广告

函数的三个设计方法

2012-07-03 10:49:39 本文行家:玻尔特.李

函数有三个设计方法:形参+返回值,数组作为形参,指针与函数

函数的三个设计方法[]

函数有三个设计方法:形参+返回值,数组作为形参,指针与函数。

§1形参+返回值

   当函数调用语句是函数表达式时,表达式的计算需要函数有一个值,与数学函数一样。所以,函数的设计用形参+函数值的形式。

函数返回值还可作为变量在printf()语句中使用。

    返回语句可以用表达式。

1.1数据传递过程

形参接受实参的值,返回语句将函数的计算结果返回到主调函数。形参和实参存在在不同的内存单元。在内存中,实参单元与形参单元是不同的单元。在调用函数时,给形参分配存储单元,将实参的值传递给形参,调用结束后,形参单元被释放,实参单元仍保留并维持原值。因此,在执行一个被调用函数时,形参的值如果发生变化,不会改变主调函数的实参的值。

eg1[1] .两个数的最大值。

c=max(a,b)   (main函数,实参)

max(int x,int y)  (max函数,形参)

{if x>y  z=x;

else  z=y;

return(z);}

形参与实参内存形式

                                                                    2

                                                        

                         1.调用时,形参x,y分配内存单元,实参将值传递给形参a,b,称为值传递。

                            调用前,形参没有被分配单元。

 

                                                                    1

                                                                 2.调用结束,形参单元被释放

若在某个函数中,形参值改变

                                                                    3

                                                                 3.形参值改变,实参不变。

                                                                    用return语句实现函数的有效调用。

 

1 形参与实参的内存形式

 

eg2.过级考试函数11.4.3同步练习

fun2(int a,int b)

{int c;

c=(a*b)%3;

return c;

}

fun1(int a,int b)

{int c;

a+=a;b+=b;

c=fun2(a,b);               //赋值语句,可变化为c=fun2(a,b)+3

return c*c;                //返回语句用表达式

}

main()

{int x=11,y=19;

 printf(%d ,fun1(x,y));     //返回值作为变量在printf()语句使用

}

详细:形参与实参内存形式与数据传递过程

 

44

                                                                           2-1  调用过程

说明:main()的语句printf(%d ,fun1(x,y))调用函数fun1, 分配内存单元到形参a,b,实参x,y将值传递给fun1的形参a,b。在fun1中,局部变量c在定义处分配内存单元,形参a,b得到新的值,调用语句c=fun2(a,b)调用函数fun2,将使c得到赋值。fun2的形参在调用时分配得到内存单元,局部变量c的值计算得到。

55

    

    2-2  函数fun2返回过程

说明:fun2的局部变量c的值,用fun1的调用语句c=fun2(a,b)返回,使fun1的局部变量c得到赋值。在fun1中,形参a,b值改变,main()函数中的实参x,y的值不变。所以用return语句实现函数的有效调用

 

66

 

2-3 fun2调用结束

说明:fun1调用fun2结束,fun2 的形参单元a,b被释放,局部变量单元c被释放。程序执行权到fun1

 

77

                  

2-4  fun1调用结束

说明:形参单元a,b被释放,局部变量单元c被释放,main()函数中的实参x,y的值不变。函数返回值是return c*c=4,返回到main()的调用语句printf(%d ,fun1(x,y))

形参的变化不能影响实参,从形参将函数计算结果传递到实参的目的不能达到,eg.2中,在fun1中,形参a,b值改变(见图2-2),main()函数的实参x,y的值不变。只有通过返回语句,将函数的计算结果返回到主调函数的调用语句,eg.2中,fun1的调用语句c=fun2(a,b)fun2的返回语句return c。所以应用形参+返回值的形式,实现有效的函数调用。

形参对实参不能产生影响的原因:实参分配内存单元。形参没有内存单元,因为函数调用语句而分配的内存单元,因为函数调用语句结束而释放。eg.2中,main()的调用语句printf(%d ,fun1(x,y)),分配内存单元到fun1的形参a,b,实参x,y将值传递给形参a,b(见图2-1)。形参的内存单元是临时的,与函数调用语句的存在期一致。eg.2中,调用语句printf(%d ,fun1(x,y))结束,fun1的形参单元a,b被释放(见图2-4)。实参在编译阶段分配内存单元。

1.2 最常用的函数形式形参+返回值

函数计算结果,可存放在全局变量、数组、指针中,或者返回到调用函数,或者在函数中打印出来(并不是很好的方法)

用变量作为形参,用返回值的方法将函数计算结果返回到调用函数,调用函数的实参是变量形式。

传值的方法。

有参函数编写,要知道主调函数的函数调用语句。自定义函数的定义语句,函数的参数与返回值。

用辗转相除法求两个数的最大公约数。函数形式的选择

决定形参;1.调用函数的调用语句2.函数的功能。

最大公约数是两两公约数为1的所有约数的积。(612的最大公约数6,最小公倍数1248最大公约数4,最小公倍数8

1.形参的设置

 

最大公约数的形式参数。两个数的公约数,所以形式参数应有两个数int a,int b。求最大公倍数的函数有三个形参:int a,int b,int c.ca,b的最大公约数,这是根据函数的实现方法设置的,因此并不仅仅是函数的调用语句决定。

main()

{int hcf(int ,int);

 int lcd(int,int,int);

 int u,v,h,l;

 scanf(“%d,%d”,&u,&v);          //从键盘输入两个数

 h=hcf(u,v);

 printf(“H.C.F=%d ”,h);

 l=lcd(u,v,h);

printf(“L.C.D=%d ”,l);

}

hcf(int u,int v)    

{int t,r;

 if(v>u)                 //u>v

   {t=u;u=v;v=t}

 while((r=u%v)!=0)       //余数不为0

   {u=v;v=r;}

 return(v)

}

lcd(int u,int v,int h)       //最小公倍数=两个数的积除最大公约数

{int c;

c= u*v/h;

return(c)

}

 

 

参考资料

1.谭浩强.C语言程序设计.清华大学出版社.1999.

2.谭浩强,张基温.C语言习题集与上机指导.高等教育出版社.1998.

3.Robert W.Sebesta,徐明星等译.程序设计语言概念.清华大学出版社.2011.

4.程序员.

百科的文章(含所附图片)系由网友上传,如果涉嫌侵权,请与客服联系,我们将按照法律之相关规定及时进行处理。如需转载,请注明来源于www.baike.com
广告

本文行家向Ta提问

玻尔特.李软件专业硕士生,编程,计算机硬件设计,网络。

行家更新