用函数实现模块化程序设计_第1页
用函数实现模块化程序设计_第2页
用函数实现模块化程序设计_第3页
用函数实现模块化程序设计_第4页
用函数实现模块化程序设计_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

1、用函数实现模块化程序设计用函数实现模块化程序设计( (一)一)制作:张佩婷第五组答疑:李再航讲解:王越CONTENTS1什么是函数2如何定义函数3函数的参数与函数的值4函数的调用5局部变量与全局变量6内部函数与外部函数走进函数走进函数1、函数是C程序的基本单位,一个C程序可由一个主函数和若干个其他函数构成。由主函数调用其他函数,其他函数也可以互相调用,且同一个函数可以被多次调用;mainbcdfeaghijPART12、函数的分类(1)用户使用角度库函数:由系统提供,不必自己定义;用户自己定义的函数:解决用户的需要,自定义。(2)函数的形式无参函数:一般用来执行指定的一组操作,可以带回或不带回

2、函数 值,但不带回函数值居多; 有参函数:主函数在调用被调用函数时,通过参数向被调用函数传递 数据,一般情况下,执行被调用函数时会得到一个函数值, 供主调函数使用。Q1. 以下关于函数的叙述中正确的是【 】。 A)C语言程序将从源程序中第一个函数开始执行 B)可以在程序中由用户指定任意一个函数作为主函数,程序将从此 开始执行 C)C语言规定必须用main作为主函数名,程序将从此开始执行,在 此结束 D)main可作为用户标识符,用以定义任意一个函数 C类型名 函数名()函数体或类型名 函数名(void)函数体如何定义函数如何定义函数 void Hello() printf (Hello,wor

3、ld n); 无参函数PART2如何定义函数如何定义函数类型名 函数名(形式参数表列) 函数体int max(int a, int b) if (ab) return a; else return b; 有参函数PART2如何定义函数如何定义函数 void dummy() 在编写程序的开始阶段,可以在将来准备扩充功能的地方写上一个空函数(函数名采取将来使用的实际函数名),先用空函数占一个位置,等以后扩充程序功能时用一个编好的函数代替它,使程序结构清楚,可读性强,以后扩充新功能方便,对程序的结构也影响不大。类型名 函数名 空函数PART2如何定义函数如何定义函数 C语言要求,在程序中用到的所有函

4、数,必须“先定义,后使用”. 函数体包括声明部分和语句部分. 在定义函数时要用“类型识别符”(即类型名)指定函数值的类型,即指定函数带回来的值的类型.PART2Q2. 定义一个void型函数意味着调用该函数时,函数【 】 A)通过return返回一个用户所希望的函数值 B)返回一个系统默认值 C)没有返回值 D)返回一个不确定的值 CQ3. 若程序中定义函数 float myadd(float a, float b) return a+b; 并将其放在调用语句之后,则在调用之前应对该函数进行说明。以下说明 中错误的是 【 】。 A)float myadd( float a,b); B)floa

5、t myadd(float b, float a); C)float myadd(float, float); D)float myadd(float a, float b);A 形式参数与实际参数PART3函数的参数与函数的值函数的参数与函数的值形式参数:在定义函数时函数名后面括号中的变量名称为“形式参数”(”虚拟参数“)实际参数:在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数”。注:实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用 时, 它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值、输入等办法使实 参获得确定值;形参变量只有

6、在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。 因 此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量;实参和形参在数量上,类型上,顺序上应严格一致,否则会发生类型不匹配”的错误;函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的 值反 向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。Q4、 若函数调用时的实参为变量时,以下关于函数形参和实参的叙述中正确的是【 】。 A)函数的实参和其对应的形参共占同一存储单元 B)形参只是形式上的存在,不占用具体存储单元 C)同名的实参和形参占同一存储单元

7、 D)函数的形参和实参分别占用不同的存储单元 D编写函数,计算两个整数之差的绝对值,并将差值返回调用函数。在主函数中输入两个整数,调用函数,并输出绝对值。 int f(int a,int b) int c; c=a-b; if(c0) c=(-1)*c; return c; main() int f(int a,int b); int x,y,z; scanf(%d%d,&x,&y); z=f(x,y); printf(%dn,z);例1PART3函数的参数与函数的值函数的参数与函数的值 函数的返回值函数的值是指函数被调用之后,执行函数体中的程序段所取得的并返回给主调函数的值,

8、如调用正弦函数取得正弦值。注:函数的值只能通过return语句返回主调函数。 return语句的一般形式为 return 表达式; return (表达式); 该语句的功能是计算表达式的值,并返回给主调函数。在函数中允许有多个return语句, 但每次调用只能有一个return 语句被执行,因此只能返回一个函数值。函数值的类型和函数定义中函数的类型应保持一致。如果两者不一致,则以函数类型为 准,自动进行类型转换。不返回函数值的函数,可以明确定义为“空类型”,类型说明符为“void” 一旦函数被定义为空类型后,就不能在主调函数中使用被调函数的函数值了Q5. C语言中函数返回值的类型是由【 】决定

9、。 A)return语句中的表达式类型 B)调用函数的主调函数类型 C)调用函数时临时 D)定义函数时所指定的函数类型D有如下程序 int func(int a,int b) return(a+b); main() int x=2,y=5,z=8,r; r=func(func(x,y),z); printf(%dn,r); 该程序的输出的结果是( )。 A. 12 B. 13 C. 14 D.15 例2 Dl 函数调用语句函数调用语句 eg:printf_star()l 函数参数函数参数 eg:m=max(a,max(b,c)l 函数表达式函数表达式eg:c=max(a,b) 函数的调用方式(

10、在程序中出现的形式和位置)函数的调用函数的调用PART4函数的调用函数的调用PART4l 对被调用函数的声明和函数原型 在主调函数中调用某函数之前应对该被调函数进行说明(声明),这与使用变量之前要先进行变量说明是一样的。在主调函数中对被调函数作说明的目的是使编译系统知道被调函数返回值的类型,以便在主调函数中按此种类型对返回值作相应的处理。 其一般形式为: 类型说明符 被调函数名(类型 形参,类型 形参); 或为: 类型说明符 被调函数名(类型,类型); 括号内给出了形参的类型和形参名,或只给出形参类型。这便于编译系统进行检错,以防止可能出现的错误。注: 如果被调函数的返回值是整型或字符型时,可

11、以不对被调函数作说明,而直接调用。 当被调函数的函数定义出现在主调函数之前时,在主调函数中也可以不对被调函数再作说明而直接调用。 如在所有函数定义之前,在函数外预先说明了各个函数的类型,则在以后的各主调 函数中,可不再对被调函数作说明。 对库函数的调用不需要再作说明,但必须把该函数的头文件用include命令包含在 源文件前部。 #include #include #include函数的调用函数的调用PART4l 对被调用函数的声明和函数原型Q6.若有以下程序 #include void f(int n); main() void f(int n); f(5); void f(int n) p

12、rintf(%dn,n); 则以下叙述中不正确的是( )。 A. 若只在主函数中对函数f进行说明,则只能在主函数中正确调用函数f B. 若在主函数前对函数f进行说明,则在主函数和其后的其它函数中都可以正确调用 函数f C. 对于以上程序,编译时系统会提示出错信息:提示对f函数重复说明 D. 函数f无返回值,所以可用void将其类型定义为无值型CPART4函数的调用函数的调用 语言中不允许作嵌套的函数定义。因此各函数之间是平行的,不存在上一级函数和下一级函数的问题。但是语言允许在一个函数的定义中出现对另一个函数的调用。其关系如图所示。main函数调用a函数b函数a函数调用b函数结束1423875

13、69l 函数的嵌套调用下列程序的运行结果是(下列程序的运行结果是( )。)。 main( ) int i=3; printf(%d,%d,%dn,i,i+,i+); A. 5,5,4 B. 3,4,5 C. 3,3,4 D. 5,4,3在函数调用中还应该注意的一个问题是求值顺序的问题。所谓求值顺序是指对实参表中各量是自左至右使用呢,还是自右至左使用。对此,各系统的规定不一定相同。应特别注意的是,无论是从左至右求值, 还是自右至左求值,其输出顺序都是不变的, 即输出顺序总是和实参表中实参的顺序相同。例4D#includeint Prime(int n) int i; for(i=2;in) if

14、(in) if(Prime(int n)=1) if(Prime(int n)=1)PART5局部变量与全局变量局部变量与全局变量变量有效性的范围称变量的作用域。语言中所有的量都有自己的作用域。变量说明的方式不同,其作用域也不同。语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。u局部变量:也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内, 离开该函数后再使用这种变量是非法的。u全局变量:也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量,一般应作全局变量说明。只有在函数内经过说明的全局变

15、量才能使用。全局变量的说明符为extern。但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。局部变量Eg: main() int i=2,j=3,k; k=i+j; int k=8; printf(%dn,k); printf(%dn,k); PART5局部变量与全局变量局部变量与全局变量注:主函数中定义的变量也只能在主函数中使用,不能在其它函数中使用。形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元, 互不干扰,也不会发生混淆。在复合语句中也可定义变量,其作用域只在复合语句范围内。PART

16、5局部变量与全局变量局部变量与全局变量全局变量外部变量与局部变量不同名输入正方体的长宽高l,w,h。求体积及三个面x*y,x*z,y*z的面积。 int s1,s2,s3; int vs( int a,int b,int c) int v; v=a*b*c; s1=a*b; s2=b*c; s3=a*c; return v; main() int v,l,w,h; printf(ninput length,width and heightn); scanf(%d%d%d,&l,&w,&h); v=vs(l,w,h); printf(nv=%d,s1=%d,s2=%d,s

17、3=%dn,v,s1,s2,s3); 外部变量与局部变量同名。 int a=3,b=5; /*a,b为外部变量*/ max(int a,int b) int c; c=ab?a:b; return(c); main() int a=8; printf(%dn,max(a,b); 如果同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,即它不起作用。若不对全局变量赋值,则系统默认为0.PART5内部函数与外部函数内部函数与外部函数内部函数:又称静态函数。若一个函数只能被本文件中其他函数所调用,它称为内部函数。 在定义内部函数时,在函数名和函数类型的前边加static static 类型名 函数名(形参表);外部函数:如果在定义函数时,在函数首部的最左端加关键字extern,则此函数是外部函数, 可供其他文件调用.例: extern int fun (int a,int b)程序设计第五组 答疑李再航01函数说明和函数调用语句之间有矛盾!请找出下面程序中的错误:02void print1()printf(a);printf(b);void print2()printf(c);print1();printf(d);void print3()printf(e);print2();printf(f);void main()print3();该程序的执行

温馨提示

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

评论

0/150

提交评论