c语言程序设计 教学课件 ppt 作者 金升灿 第七章 函数_第1页
c语言程序设计 教学课件 ppt 作者 金升灿 第七章 函数_第2页
c语言程序设计 教学课件 ppt 作者 金升灿 第七章 函数_第3页
c语言程序设计 教学课件 ppt 作者 金升灿 第七章 函数_第4页
c语言程序设计 教学课件 ppt 作者 金升灿 第七章 函数_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

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

文档简介

学习目标:第七章第七章 函数函数1)熟悉定义函数的方法及调用函数的方法;2)掌握函数实参与形参的对应关系,以及数据的传递方式;3)熟悉函数的嵌套调用和递归调用的方法;4)掌握局部变量和全局变量的区别。27.1 函数的概念函数是可以重复调用的、功能相对独立的程序段。使用函数主要解决两个问题:1)解决代码的重复问题。如果有一个程序段在程序中要出现很多次,每次都写出来比较繁琐。可以把该程序段定义成一个函数,在需要该程序段的地方直接调用该函数。2)便于进行结构化、模块化的编程。在日常生活中,人们常将复杂问题分解成若干个比较简单的问题分别求解。程序员在设计一个复杂的应用程序时也一样,常把整个程序划分为若干个功能较为单一的程序模块,然后分别予以实现。37.1 函数的概念在 C语言中可以从不同角度对函数分类:1)从函数定义的角度可分为库函数和用户定义函数;2)从主调函数和被调用函数之间数据传送的角度可分为无参函数和有参函数;3)从函数起作用的范围来分,又可以将函数分为外部函数和内部函数。4)从函数的功能角度可分为有返回值函数和无返回值函数;5) Turbo C提供了丰富的库函数,从功能角度可分为13类。47.1 函数的概念在语言程序中,所有的函数,包括主函数 main()在内,都是平行的、互相独立的。即在一个函数内可以调用其它函数(或自己),但不能再定义一个函数(嵌套定义)。习惯上把调用者称为主调用函数,被调用者称为被调用函数;函数还可以自己调用自己,称为递归调用。main() 函数是主函数,它可以调用其他函数,而不允许被其他函数调用。因此,程序的执行总是从 main()函数开始执行,完成对其他函数的调用后再返回到 main()函数,最后由 main()函数结束整个程序。一个源程序必须有,也只能有一个主函数 main()。57.2 函数的定义与调用 7.2.1 函数的设计【 例 7-1】 编程序,求两个数的最大值。main() float max(float a,float b);float x,y,z;printf(“input two numbers:n“);scanf(“%f%f“,z=max(x,y); printf(“Max is %f“,z);程序运行 结 果:input two numbers :26.2 53.5Max is 53.500000float max(float a,float b) float m;if(ab)m=a; else m=b;return m;67.2.1 函数的设计 1)程序由函数 main() 和 max()两个函数组成。 max()函数有两个参数 a 和 b。 max()函数的功能是找出 a和 b中的最大者赋值给 m,并将 m作为函数值返回到主函数。2)在函数定义及函数声明中的参数 a和 b,称为形式参数 (简称为形参 )。在函数调用中的参数 x, y,称为实际参数 (简称为实参 )。进行函数调用时,主调函数将把实参 x和 y的值传送给形参 a和 b,供被调函数使用。 71有参函数的定义数据类型说明符 函数名 (形式参数说明表列 ) 说明语句部分执行语句部分例如:float max(float a,float b) if(ab) return a;else return b;82无参函数定义数据类型说明符 函数名 () 说明语句部分执行语句部分例如:printstar() printf(“*n“);92无参函数定义【 例 7-2】 定义两个函数,其作用分别是打印欢迎词“ Hello,world” 和一行星号。void printstar(void) printf(“*n“);程序运行结果:*Hello,world.*void hello(void) printf(“Hello,world.n“);main() printstar(); hello();printstar(); 107.2.2 函数的调用 1函数调用的一般形式函数名 (实际参数表列 )例如: printstar();, hello();, z=max(x,y);1)调用函数时,函数名称必须与具有该功能的自定义函数名称完全一致。2)被调用函数是无参函数时,函数调用没有实际参数表,但括弧不能省略。3)实际参数表列中的参数称为实参,各实参之间用逗号分隔,并且要求实参的个数、类型和顺序,应该与被调用函数所要求的参数个数、类型和顺序一致。4)实参可以是常量、变量、表达式、函数等。无论实参是何种类型的量,在调用函数时,它们都必须具有确定的值,以便把这些值传递给形参。117.2.2 函数的调用 2函数调用的方式函数的调用格式:函数名 (实际参数表列 )有三种函数调用方式。1)函数语句。把函数调用作为一条语句。一般形式为:函数名 (实际参数表列 );2)函数表达式。函数调用作为表达式中的一项出现在表达式中,以函数返回值参与表达式的运算。这种方式要求函数具有返回值。3)函数实参。函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传递,因此要求该函数必须是有返回值的。127.2.2 函数的调用 3函数调用的过程在执行函数调用时,实际上系统要完成以下过程:1)为被调函数的所有形式参数分配内存,再计算实际参数的值,并一一对应地赋予相应的形式参数(对于无参函数,不做该项工作)。2)为函数体内说明部分定义的变量分配存储空间,再依次执行函数的可执行语句。当执行到 “return(表达式) ”语句时,计算返回值(如果无返回值的函数,不做该项工作)。3)释放在本函数中定义的变量所占用的存储空间(对于static类型的变量,其空间不释放),返回主调函数继续执行。137.2.2 函数的调用 4函数声明(说明)函数与变量一样在使用之前必须声明(说明)。在 ANSI C新标准中,采用函数原型方式,对被调用函数在主调用函数中进行声明,其一般格式为:函数类型说明符 被调函数名 (参数类型 形参 1,参数类型 形参 2, );或者:函数类型说明符 被调函数名 (参数类型 ,参数类型 , );147.2.3 函数的嵌套调用 1函数的嵌套调用语言不允许嵌套定义函数。因此各函数之间是平行的,不存在上一级函数和下一级函数的问题。但是语言允许在函数的定义中出现对另一个函数的调用。这样就出现了函数的嵌套调用。即在被调函数中又调用其他函数。如图 7-1所示。图 7-1 main()函数结束f2()函数返回返回f1()函数调用函数 f1()后续语句调用函数 f2()后续语句151函数的嵌套调用【 例 7-3】 编程序计算函数值。其中 s(n)=p(1)+p(2)+ p(n), p(i)=i! (i的阶乘 )。float p(int k) int i;float f=1.0;for(i=1;iy?x:y); main() int a10,i,m;printf(“Enter 10 integer:n“);for(i=0;i10;i+)scanf(“%d“,m=a0;for(i=1;i10;i+)m=max(m,ai); printf(“Max is %d“,m);运行结果为:Enter 10 integer:8 12 36 24 46 99 123 54 39 76Max is 123237.3.2 数组作为参数 1)用数组元素作实参时,只要数组类型和函数的形参类型一致即可,并不要求函数的形参也是下标变量。换句话说,对数组元素的处理是按普通变量对待的。2)在普通变量或下标变量作函数参数时,形参变量和实参变量是由编译系统分配的两个不同的内存单元。在函数调用时发生的值传送,是把实参变量的值赋予形参变量。242数组名作为函数的参数【 例 7-7】 已知某个学生 5门课程的成绩,求平均成绩。float aver(float a, int n) int i;float av,s=a0; for(i=1;in;i+) s+=ai; av=s/5;return av;main() float sco5,av;int i;printf(“ninput 5 scores:n“);for(i=0;i5;i+) scanf(“%f“,av=aver(sco,5); printf(“average score is %5.2fn“,av); 运行 结 果 为 :input 5 scores:67 78 85 89 92average score is 82.20 257.3.2 数组作为参数 1)用数组名作函数参数,应该在调用函数和被调用函数中分别定义数组,且数据类型必须一致,否则结果将出错。2) C编译系统对形参数组大小不作检查,所以形参数组可以不指定大小。如果指定形参数组的大小,则实参数组的大小必须大于等于形参数组,否则因形参数组的部分元素没有确定值而导致计算结果错误。3)数组名作形参时,接收实参数组的起始地址;数组名作实参时,将数组的起始地址传递给形参数组,使形参数组与实参数组共享存储单元。因此,数组名作为参数时,实参向形参传递地址。 267.3.3 指针变量作为函数的参数【 例 7-8】 指针变量作为函数的参数。main() void sub(int *px,int *py);int x=8,y=11;printf(“%d,%dn”,x,y);sub( printf(“%d,%dn”,x,y);void sub(int *px,int *py) *px=10;*py=20;运行 结 果:8,1110,20 277.3.3 指针变量作为函数的参数【 例 7-9】 求一维数组中全部元素之和。int add(int *pt,int n) int i,sum=0;for(i=0;in;i+)sum=sum+pti;return(sum);main() int a10=1,2,3,4,5,6,7,8,9,10;int *p,total;p=a;total=add(p,10); /* total=add(a,10); */printf(“total=%dn“,total);程序运行 结 果:total=55287.3.3 指针变量作为函数的参数数组及指向数组的指针变量作函数参数时,可有种等价形式(本质上是一种,即指针数据作函数的参数): 形参、实参都用数组名; 形参、实参都用指针变量; 形参用指针变量、实参用数组名; 形参用数组名、实参用指针变量。297.4 变量的存储类别在程序运行期间,计算机系统提供给用户使用的存储空间可分为三部分;程序区、静态存储区和动态存储区。程序区用来存放程序代码,静态存储区和动态存储区用来存放数据,即程序与数据的存储是分离的。静态存储方式是指在程序运行期间给变量分配固定的存储空间的方式。而动态存储方式则是在程序执行期间根据需要动态地分配存储空间的方式。在 C语言中变量的定义包含三方面的内容:一是变量的数据类型(如:

温馨提示

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

评论

0/150

提交评论