函数的计算机编程 _第1页
函数的计算机编程 _第2页
函数的计算机编程 _第3页
函数的计算机编程 _第4页
函数的计算机编程 _第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第七章函数

Function

7.5函数调用时参数间的传遍

7.1模块化程序设计的概念

在C语言中,函数分为主函数、

库函数和用户自定义函数3种。程序

的执行由主函数开始,然后调用其他

函数,最终返回主函数并结束。

main函数

函数调用示意图

7.2埠函教

C语言提供了丰富的标准函数,即

库函数。这类函数是由系统提供并定义

好的,不必用户再去编写。用户只需要

了解函数的功能,并学会正确地调用标

准函数即可。

7.2.1C语言常用库的数

对每一类库函数,在调用该类库函

数时,用户在源程序的include命令中

应包含该类库函数的头文件名。

#include"math.h

#include"stdio.h"

7.2.2标准库函数的调用

incIude命令的格式为

#include<头文件名>或

#include”头文件名”

说明:

(1)include命令必须以#号开头,

系统提供的头文件名都以.h作为后缀,

头文件名用一对双引号(“")或一

对尖括号(<〉)括起来。

(2)在C语言中,调用库函数时不能

缺少库函数的头文件,include命令

不是语句,不能在最后加分号。

(3)两种格式的区别是:

使用尖括号时,系统到存放C库

函数头文件所在的目录中寻找要包含

的文件,即标准方式;使用双引号时,

系统先在用户当前目录中寻找要包含

的文件,若找不到,再按标准方式查

找。

小例子

#include<string.h>/*调用strlen函数需要

包含的头文牌*/

#include<stdio.h>/*调用printf函数需要

包含的头文件*/

main()

{charstr[]=nabcden;

inti;

i=strlen(str);

printf(n%dn,i);

7.3函数的定义和调用

由用户编写的函数称为自定义函

数。函数必须先定义后使用。

7.3.1曲教的定义

函数定义的一般格式如下:

类型说明符函数名(类型名形式参数1,类型名

形式参数2,…)

函数体;

}

说明:

(1)函数名是由用户命名的、唯一

标识一个函数的名字。

(2)各个函数必须单独定义,不能

嵌套定义,即不能在一个函数内部再

定义函数。

(3)形式参数用于在调用函数和被

调用函数之进行数据传递,两者之间

的数据类型应一致。

(4)若在函数首部省略类型名,则

默认函数返回值的数据类型为int类

型。

(5)在函数体中,除形参外,用到

的其他变量必须在说明部分进行定义,

这些变量(包括形参),只在函数调

用时才临时开辟存储单元,当退出函

数时,这些临时开辟的存储单元全被

释放掉。因此,这种变量只在函数体

内部起作用,与其他函数体中的变量

互不相关,它们可以和其他函数中的

变量同名。

例:求两实教之和

main()

{floatadd(floatx,floaty);

floata,b,c;

scanf&a,&b);

c=add(a,b);

',,,

printf(%f/c);

)

floatadd(floatx,floaty)

{floatz;

z=x+;

returnz;

}

说明:

(1)add是函数名,该函数返回值为

float型。

(2)形式参数为实型变量x和y,该

参数接受调用本函数时实参数据的传

递。

(3)函数体内的返回值是z。

自定义函数add的作用是求两实

数之和,其返回值也是float型,由于

定义add函数出现在调用该函数的赋

,,

值语句c=add(a/b);〃后,因此必须

在调用函数中对add函数的返回值做

类型说明,即

floatadd(floatx,floaty)

7.3.2曲教的调用

1.善教惆用的一般形式

函数调用的一般形式为

画数名([实参表]);add(a,b);

实参与形参的个数应相等,类型应一致。

实参与形参按顺序对应,一一传递数据。

2.备熬惆用的方式

按函数在程序中出现的位置来分,

有如下3种函数调用方式。

(1)函数语句

(2)函数表达式

(3)函数参数

(1)函数语句。

函数语句的调用,是指把被调函

数作为一个独立的语句直接出现在主

调函数中。

例如:

printf("%d

max(azb);/*调用有参函数max*/

printsiT。;/*调用无参函数printsir*/

这3个语句都是函数调用语句,简称

函数语句。由函数语句直接调用的函数,

一般不需要返回值,只要求函数完成某操

作。

(2)函数表达式。

必须有一个函数返回值,例如:

c=5*max(a,b);

(3)函数参数。

例如:

main()

{

printf(“%d”,max(a,b));

}

3.稠用房熬时的谈意*项

(1)被调函数必须是已存在的函数。

(2)在主调函数中,要对被调函数先

做声明。如果被调函数在主调函数之

前出现,则在主调函数中对被调函数

可以不做声明。

(3)如果被调函数的返回值为int类

型,不需要在主调函数中说明。

(4)如果被调用函数的声明放在源

文件的开头,则该声明对整个源文件

都有效。

(5)如果被调用函数的声明是在调

用函数定义的内部,则该声明仅对该

调用函数有效。

(6)函数调用应该注意以下几点。

①实参应在个数、类型和顺序上与形

参相一致。

②实参可以是常量、变量名、数组名、

数组元素或表达式,即必须具有确定的值。

③为了保证函数调用的正确性,在调

用之前应该先弄清被调用函数的功能、输

入参数、返回值等,然后再进行调用。

【例7・5】编制程序,求两教的乘积。

main()

{floatmul();/*进行两数相乘的函数*/

floatx,y,z;/*定义主函数内部的局部函数*/

scanf(n%f%f\&x,&y);

/*输入要进行相乘的两个数*/

z=mul(x,y);/*调用函数,进行两数的相乘*/

printf(nTheproductis%f",z);/*输出结果*/

floatmul(floatx,floaty)/*函数及形

参类型定义*/

floatz;/*定义浮点变量*/

z=x*y;/*两数相乘*/

return(z);/*返回结果*/

7.4函数的返回值及其类型

一个函数有其特定的功能,也有其功

能所实现的结果。这一结果可以通过函数

的返回值表现出来。函数的返回值通过函

数体内的return语句实现。

return语句的格式为

return表达式;

return(表达式);

如果没有返回值,写为return;

用〃void〃定义无返回值函数,只需在

定义函数时,在函数名前加上void即可。

例如:

voidprintstr();

/*定义prits什为无返回值函数*/

}

函数类型决定返回值的类型。类型不

一致时,对于数值型数据可以自动进行类

型转换。

如果函数有返回值,则在函数定义和

函数调用时,一般都应该指明返回值的类

型。

例如:

floatcount(intn)

{floats;

return(s);

}

在以下情况中,可以不在调用函数内对被调

用函数进行类型说明:

(1)当被调用函数的定义位于调用函数

之前时,可以不必进行类型说明

(2)函数没有返回值或返回值的类型为

整型或字符型。

(3)C语言允许在所有函数的外面、文件

的开头对函数的类型进行说明,这样在调

用函数时就可以不对被调用函数的类型进

行说明。

【例7-6】编一函数,求x的n次方的值,

其中n是整数。

止匕程序可以将x和n作为函数参数,所

求结果通过return语句返回调用程序。

doublepower(floatx,intn)

{inti;

doublepw;

pw=l;

for(i=l;i<=n;i++)

pw*=x;

return(pw);

}

7.5的教调用时参数间的传遗

7.5.1变量、常量、数组元素

作为国数参数

形参和实参分别占用不同的存储单

元,这种传递方式称为“值传递”O

实参一一〉形参(单向)

阅读下列程序,观察程序的运行结果。

main()

{inta=2,b=3,c=O;

printfC(l)a=%drb=%d,c=%d

\n"fafbfc);

try(a,b,c);

printfC1(4)a=%d,b=%d,c=%d

\n”,a,b,c);

}

try(intx,inty,intz)

{printf("(2)x=%dfy=%d,z=%d\n'\

X,y,z);

z=x+y;

x=x*x;

y=y*y;

printf("(3)x=%dfy=%d,z=%d\n"/

X,y,z);

)

运行结果为

(1)a=2,b=3c=0

(2)x=2,y=3z=0

(3)x=4,y=9z=5

(4)a=2,b=3c=0

由以上输出结果可看出:

(1)是在主函数中未调用十ry函数前

执行printf函数的结果;

(2)是try函数中形参值未发生变化

时的结果;

(3)是什y函数中形参值发生变化后

的结果;

(4)是try函数调用结束后返回调用

函数后的结果。可以看出,形参的变

化未曾影响主函数中的实参,所以输

出结果(1)和(4)是完全相同的。

7.5.2数组名作为函数参数

作为实参的数组名将数组元素首地址

传递给形参所表示的数组名,即实参传给

形参的是地址。

【例7-10]编写程序,由主函数输入

字符串,调用一函数使输入的字符串按反

序排列,并在主函数中输出字符串。

main()

{voidfun();/*函数声明*/

charstr[50];

printfC'inputstrplease:");

scanf("%s",str);

fun(str);

printf("反序后字符串:%s\心

str);

}

voidfun(charstrl[])

{charc;

inti,j;

j=strlen(strl);

for(i=0;i<j/2;i++/j—)

{c=s1rl[i];

strl[i]=strl[j-l];

strl[j-l]=c;}

}

运行结果为

输入:ABCDEF

输出:FEDCBA

程序说明:

(1)在主调函数main中,定义了数

组str,并调用fun函数,数组名str

作为实参。

(2)被调国数fun中,s什1为形参数

组名,它与实参数组名类型必须一致。

(3)调用fun函数时,只是将实参数

组的首地址传递给形参数组,故实参

数组与形参数组的长度可以不一致,

其大小由实参数组决定。例如形参数

组的定义为fun(charstrl[])o

7.6的数的嵌套调用

函数的嵌套调用:在某函数体中调用

了另一个函数,则在该函数被调用的过程

中将发生另一次函数调用。

4n"X)/*定义函数fl*/

intf2()/*定义函数f2*/

fl();}/*f2中调用函数fl*/

voidmain()

{…

f2();〃主函数中调用函数f2*/

}

main函数

图7-3函数嵌套调用过程

7.7的教的遗归调用

递归调用:一个函数自己调用自己。

【例7・12】用递归算法计算n!

根据数学知识,负数没有阶乘,0的阶乘

为1,正整数n的阶乘为

nx(n-1)x(n-2)x...x2x1

可以用下列式子表示:

由以上表达式可以看出:当n>0时,

求n!可以转化为求解nx(n-l)!的新问题,

而求解(n-1)!与原来求n!的方法完全相

同,只是所处理的对象在递减1,由n变成

了(n-1)o依此类推,求(n-1)!的问

题又可转化为(n-l)(n-2)!的问题,直至

所处理对象的值减至0(即n=0)时,阶乘

的值为I,递归结束,不再进行下去。至此,

求n!的这个递归算法结束。

总之,上面的公式说明了每一循环的

结果都有赖于上一循环的结果,递归总有

一个“结束条件",例如n!的结束条件为

n=0o

floatfac(intn)

{intt;

if(n==0||n==1)t=l;

elset=fac(n-l)*n;

returnt;

}

main()

{intn,t;

printf("entern:H);

scanfC%d“,An);

if(n<0)

,,11

printf(n<0,dataerrorlXn);

else

t=fac(n);

',,,

printf(\n%d!=%d/n,t);

运行结果为

输入:5/

输出:5!=120

7.8局部变量和全局变量

一个函数中的语句和数据都有自己的

作用域。根据作用域的不同,变量可以分

为局部变量和全局变量。

7.8.1局部变量

在一个函数内部定义的变量称做局部

变量,也称内部变量。

作用域:本函数内部,不能在其他函

数中使用。

形参a,b和变量i,k有效

intfl(inta,intb)

在fl函数内部

inti,k;;形参a,b和变

量i,k有效

}

7.8.2全局变量

c程序中可以在函数的外部定义变量。

在函数外部定义的变量是全局变量,也称

做外部变量。作用域:从定义变量的位置

开始到本源文件末尾结束。全局变量可以

被本文件中的多个函数共同使用。

intp=1,q=5;/*夕卜部变量*/

fl(inta)"定义函数*/

{intb,c;

…}

charcl,c2;"外部变量大/全局变

f2(inta,intb)〃定义函数*/

全局变量p,q

的作用

量cl,

范围

c2的作

用范围

)

main()

{intm,n

)j

7.9静态存储变量和动态存储变量

变量值存在的时间(即时域,亦称生

存期)角度来分,分为静态存储变量和动

态存储变量。

7.9.1静态存储变量

静态存储变量:指在程序运行期间分

配固定的存储空间的变量。

格式为

static数据类型名

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论