《C语言程序设计能力》-第7章_第1页
《C语言程序设计能力》-第7章_第2页
《C语言程序设计能力》-第7章_第3页
《C语言程序设计能力》-第7章_第4页
《C语言程序设计能力》-第7章_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

C源程序的组成包括一个main函数若干个子函数标准函数(库函数)

用户自定义函数主函数子函数1子函数2子函数3子函数4函数间结构示意图例7-1-1根据三边计算三角形的面积。main(){floatx,y,z,s,area;printf(“请输入三边:”);scanf(“%f,%f,%f”,&x,&y,&z);if((x+y>z)&&(y+z>x)&&(z+x>y)){s=0.5*(a+b+c);area=sqrt(s*(s-a)*(s-b)*(s-c));printf(″三边为%5.2f,%5.2f,%5.2f

的三角形面积等于%5.2f\n″,x,y,z,area);elseprintf(″不能构成三角形!\n″);}例7-1-2用调用函数的方式求三角形的面积。#include<math.h>floatfun(a,b,c)floata,b,c;

{floats;s=0.5*(a+b+c);sarea=sqrt(s*(s-a)*(s-b)*(s-c));return(area);

}main()/*主函数*/{floatx,y,z;printf(“请输入三边:”);scanf(“%f,%f,%f”,&x,&y,&z);函数头函数体if((x+y>z)&&(y+z>x)&&(z+x>y)){area=fun(x,y,z);//函数调用

printf(″三边为%5.2f,%5.2f,%5.2f的三角形面积等于%5.2f\n″,x,y,z,area);}elseprintf(″不能构成三角形!\n″);}7.1函数的定义函数定义的一般形式:

函数值类型函数名(形式参数表列)

{……}函数首部函数体1.函数首部函数头有经典与现代两种形式,现代形式称之为函数原型。经典形式:

如:floatf1(a,b,c)

floata,b,c;现代形式:

如:floatf1(floata,floatb,floatc)注意,以上函数头不可以写成:floatf1(floata,b,c)

2.函数体

函数体由变量定义与执行语句两部分组成。例1:floatsf(floata,floatb,floatc)

{floathl,area;hl=0.5*(a+b+c);area=(sqrt(hl*(hl-a)*(hl-b)*(hl-c)));

return(area);}函数体3.返回语句

通过在函数中使用返回语句,返回一个值给函数,同时终止函数的调用,返回主函数。格式:

return(表达式);

或return表达式;

功能:(1)计算表达式的值,将表达式的值返回给函数。

(2)从被调用的函数返回主调函数。

函数的定义过程(1)确定函数值的类型。(2)给函数取一个名字。(3)设计函数的参数。(4)对函数中使用的变量进行定义。(5)对函数的执行部分进行描述。

小结函数首部函数体求两个数的最大值函数/*求两个数的最大值函数*/floatmax(x,y)(1)函数值类型floatfloatx,y;(2)函数名max

(3)函数参数x、y,类型为float{floatm;(4)定义变量

if(x>y)m=x;elsem=y;

return(m);/*返回最大值*/}(5)执行部分

/*素数判断函数*/intpn(intn)

{inti;intflag;/*素数标志*/flag=1;for(i=2;i<=n-1;i++)

if(n%i==0){flag=0;break;}return(flag);}素数判断函数longfn(intn){inti;longt;t=1;for(i=1;i<=n;i++)

t=t*i;return(t);}阶乘函数

7.2函数的调用函数调用的一般形式:

函数名(实参表);

说明:

(1)调用时,实参与形参的个数应相同,类型应一致。

(2)实参与形参按顺序对应,一一传递数据。调用后,形参得到实参的值。

(3)实参可以是表达式。如是表达式实参,先计算表达式的值,再将值传递给形参。例调用素数判断函数,求2~1000之间的所有素数。/*素数判断函数*/intpf(intn)

{inti;intflag;flag=1;for(i=2;i<=n-1;i++)

if(n%i==0){flag=0;break;}return(flag);}main()/*主函数*/{intn;intcount=0;/*统计素数个数,用以控制输出格式*/printf(″2~1000之间的素数如下:\n″);for(n=2;n<=1000;n++)

if(pf(n)==1)

{printf(″%6d″,n);count++;if(count%10==0)printf(″\n″);/*每行输出5个素数*/

}}

被调函数说明(申明):

用户自定义函数一般需在调用前在主调函数中进行说明。函数说明是一种申明,是告诉主调函数这里调用的是一个什么样的函数。函数说明的一般形式为:

被调函数类型被调函数名(形参列表);

注意,不是函数定义,其后有分号。

求2~n之间的所有素数,n值由键盘输入。main(){intn,i,count=0;

intpf(int);/*函数说明*/printf(″请输入n:″);scanf(″%d″,&n);printf(″2~n之间的素数如下:\n″);for(i=2;i<=n;i++)

if(pf(i)==1)/*调用前申明的函数*/{printf(″%6d″,i);count++;if(count%5==0)printf(″\n″);}}

有下面一些情况,在调用函数前可不加说明:(1)如果是整型函数或字符型函数,可以不加说明,系统自动按整型函数处理。

(2)如果被调用函数的定义出现在主调函数之前,可以不加说明。

(3)如果已在所有函数定义之前,或在文件的开头,或在函数的外部已作说明,可以不加说明。除了上述情况,其它情况均必须对被调用的函数在调用前进行说明。

另请注意:

(1)函数一般先定义,后使用。

(2)为清晰起见,一般均对被调用的函数在调用前进行说明,以增加程序的可读性。

(3)函数不能重复定义,但可以反复说明。

(4)对于标准函数,还应在文件开头用文件包含指令#include指明调用有关库函数时所需用到的信息。例如:#include″stdio.h″,stdio.h是一个头文件,它包含了输入输出库函数所用到的一些宏定义信息,

函数之间数据的传递C语言程序由若干相对独立的函数组成,在程序运行期间,必然存在数据在函数中流动(流入或流出),这就是函数之间的数据传递,也是函数之间的接口。参数传递方法:

实参形参

单向值传递例如,求三个数的最大值:①主调函数:……

m=max(a,b,c);abcm

……↓↓↓↑②被调函数:floatmax(x,y,z)xyzt

floatx,y,z;{floatt;t=x;if(y>t)t=y;if(z>t)t=z;return(t);}分析下列程序,写出运行结果。voidswap(intx,inty)/*函数swap*/

{intt;t=x;x=y;y=t;}main(){inta,b;printf(“\npleaseenterdata(a,b):”);scanf(“%d,%d”,&a,&b);swap(a,b);/*函数调用*/printf(“a=%d,b=%d\n”,a,b);}运行时键盘输入:3,6运行结果:3,67.3嵌套调用和递归调用一、嵌套调用函数的嵌套调用是逐级调用,逐层返回。main()f1()f2(){…{…{……}

调用f1()调用f2()…}}练习:P186例7-8二、递归调用

包含有递归调用的函数称为递归函数。递归算法具有两个基本特征:(1)转化。

(2)终止。年龄问题:

有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁。问第4个人多少岁,他说比第3个人大2岁。问第3个人多少岁,又说比第2个人大2岁。问第2个人多少岁,说比第1个人大2岁。最后问第1个人多少岁,他说是10岁。请问第5个人多少岁?

①转化:n>1,age(n)=age(n-1)+2

温馨提示

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

评论

0/150

提交评论