大学一年级C语言教学课件《C语言程序设计》第9章 函数_第1页
大学一年级C语言教学课件《C语言程序设计》第9章 函数_第2页
大学一年级C语言教学课件《C语言程序设计》第9章 函数_第3页
大学一年级C语言教学课件《C语言程序设计》第9章 函数_第4页
大学一年级C语言教学课件《C语言程序设计》第9章 函数_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

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

文档简介

C语言程序设计,函数,模块设计,掌握函数、函数值(函数返回值)以及函数调用等的基本概念。掌握函数的定义和调用方法。掌握函数参数的传递方法。掌握变量的作用范围。,目标要求,概述C的库函数简介函数的定义调用和声明函数的参数和返回值函数的嵌套调用和递归调用变量的作用域变量的存储类别典型实例剖析小结,讲课提纲,模块设计,模块设计,模块化程序设计基本思想:将一个大的程序按功能分割成一些小模块开发方法:自上向下,逐步分解,分而治之,概述,模块设计,模块化的优点,模块各司其职每个模块只负责一件事情,它可以更专心便于进行单个模块的设计、开发、调试、测试和维护等工作一个模块一个模块地完成,最后再将它们集成开发人员各司其职按模块分配任务,职责明确并行开发,缩短开发时间分而治之(Wirth,1971)信息隐藏(Parnas,1972),函数(function)和模块(module),函数是C语言中模块化编程的最小单位可以把每个函数看作一个模块若干相关的函数可以合并作一个“模块”,分而治之函数把较大的任务分解成若干个较小的任务,并提炼出公用任务复用程序员可以在其他函数的基础上构造程序,而不需要从头做起信息隐藏设计得当的函数可以把具体操作细节对程序中不需要知道它们的那些部分隐藏掉,从而使整个程序结构清楚,用函数解决问题,概述,C程序结构,模块设计,函数是程序的基本组成单位必须有且只能有一个名为main的主函数C程序的执行总是从main函数开始,在main中结束函数与函数之间是平行的独立的,不能嵌套定义,可以嵌套调用函数分类从用户角度标准函数(库函数):由系统提供用户自定义函数从函数的参数形式看无参函数;有参函数,模块设计,使用库函数应注意:1、函数功能2、函数参数的数目和顺序,及各参数意义和类型3、函数返回值意义和类型4、需要使用的包含文件,C的库函数简介,模块设计,函数定义的一般形式,函数类型函数名(数据类型参数1,数据类型参数2,)函数体;return表达式;,合法标识符,模块设计,函数运行完毕后返回值的类型,无加void,函数出口,返回值,函数定义的一般形式,例有参函数intmax(intx,inty)intz;z=xy?x:y;return(z);,例无参函数printstar()printf(“*n”);或printstar(void)printf(“*n”);,例空函数dummy(),模块设计,函数定义不允许嵌套,返回语句:形式:return(表达式);或return表达式;或return;功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数,函数的返回值,模块设计,函数是这样的一种运算:函数名说明运算规则参数是运算的操作数返回值是运算的结果当函数执行到return语句或时,函数的运算停止。程序返回到调用它的地方继续执行函数可以有多个return,但最好只有一个且是最后一行用void定义返回值类型函数没有运算结果,没有返回值return语句之后不需要任何表达式用void定义参数,表示没有参数在定义函数时,对函数类型的说明,应与return语句中返回值表达式的类型一致。如果不一致,则以函数类型为准。系统将缺省函数类型按整型(int)来处理,函数定义(definition),例函数返回值类型转换,函数的返回值,main()intmax(float,float);floata,b;intc;scanf(%f,%f,intmax(floatx,floaty)floatz;z=xy?x:y;return(z);,模块设计,模块设计,模块设计,#includeintfac(intk)/*计算阶乘值的函数*/ints,i;s=1;for(i=1;i=n)printf(%dn,fac(m)/(fac(n)*fac(m-n);elseprintf(my?x:y;return(z);main()inta,b,c;scanf(%d,%d,形式参数和实际参数,说明:形参必须指定类型形参与实参类型一致,个数相同,才能正确地进行数据传递若形参与实参类型不一致,自动按形参类型转换函数调用转换形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放实参对形参的数据传送是单向的,即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。实参和形参占用不同的内存单元,即使同名也互不影响。,形式参数和实际参数,例计算x的立方,形式参数和实际参数,#includefloatcube(floatx)return(x*x*x);voidmain()floata,product;printf(Pleaseinputvalueofa:);scanf(%f,1.2,1.728,x,模块设计,模块设计,函数调用的执行过程,语言中不允许作嵌套的函数定义。因此各函数之间是平行的,不存在上一级函数和下一级函数的问题。但是语言允许在一个函数的定义中出现对另一个函数的调用。这样就出现了函数的嵌套调用。即在被调函数中又调用其它函数。,函数的嵌套调用,模块设计,模块设计,例求三个数中最大数和最小数的差值,main()intdif(intx,inty,intz);intmax(intx,inty,intz);intmin(intx,inty,intz);inta,b,c,d;scanf(%d%d%d,intmax(intx,inty,intz)intr;r=xy?x:y;return(rz?r:z);intmin(intx,inty,intz)intr;r=x%cn,a,b);elsehanoi(n-1,a,c,b);printf(%c-%cn,a,b);hanoi(n-1,c,b,a);,hanoi(n个盘,AB)/C为过渡if(n=1)直接把盘子ABelsehanoi(n-1个盘,AC)把n号盘ABhanoi(n-1个盘,CB),源程序,/*搬动n个盘,从a到b,c为中间过渡*/voidhanoi(intn,chara,charb,charc)if(n=1)printf(%c-%cn,a,b);elsehanoi(n-1,a,c,b);printf(%c-%cn,a,b);hanoi(n-1,c,b,a);intmain(void)intn;printf(inputthenumberofdisk:);scanf(%d,#includelongfib(intg)switch(g)case0:return(0);case1:case2:return(2);printf(g=%d,g);return(fib(g-1)+fib(g-2);voidmain()longk;k=fib(4);printf(k=%ldn,k);,fib(g)=0g=0fib(g)=2g=1,2fib(g)=fib(g-1)+fib(g-2)g=3,g=4,g=3,k=6,如何求Fibonacci数列?,递归式,递归出口,写输出结果,#includestdio.hvoidmain()inta=1,b=2;inta=3,b=4;printf(n%d%d,a,b);,作用域,模块设计,作用域:若某个标识符仅能在源程序正文的某个范围内被使用,则称源程序正文的这个范围为该标识符的作用域。分程序作用域:指该复合语句的左括弧“”和右括弧“”之间的源程序正文。文件作用域:指一个编译单位内的所有程序正文。根据作用域的不同,将变量分类:局部变量、全局变量,作用域,模块设计,局部变量-内部变量在函数内定义,只在本函数内有效说明:动态分配内存单元main中定义的变量只在main中有效不同函数中同名变量,占不同内存单元形参属于局部变量可定义在复合语句中有效的变量有包含关系的两个作用域中的同名变量,外层同名变量被屏蔽。,局部变量,模块设计,局部变量,运行结果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4,模块设计,有包含关系的两个作用域中的同名变量,局部变量,main()inta,b,c;intc;c=a+b;,模块设计,全局变量-外部变量说明:有效范围:从定义变量的位置开始到本源文件结束,及有extern说明的其它源文件静态分配全局变量的内存单元减少函数调用时实参与形参之间的数据传递若外部变量与局部变量同名,则外部变量被屏蔽不足:全局变量在程序全部执行过程中占用存储单元降低程序的可读性,降低函数的通用性,全局变量,模块设计,不同作用域中的同名变量,全局变量,intk=5;main()intk=7;printf(k=%dn,k);intk=11;printf(k=%dn,k);k+=1;printf(k=%dn,k);printf(k=%dn,k);printf(k=%dn,k);,/*全局变量k*/,/*同名局部变量k*/,/*同名局部变量k*/,运行结果:k=7k=11k=12k=12k=7,模块设计,例外部变量与局部变量,全局变量,inta=3,b=5;max(inta,intb)intc;c=ab?a:b;return(c);main()inta=8;printf(max=%d,max(a,b);,运行结果:max=8,模块设计,静态存储方式:程序运行期间,始终占有固定的存储空间。动态存储方式:程序运行期间,根据需要动态的分配存储空间。变量的存储类型:auto-自动型register-寄存器型static-静态型extern-外部型变量的定义格式:存储类型数据类型变量表;,动态存储方式与静态存储方式,模块设计,内存用户区:,动态存储方式与静态存储方式,生存期静态变量:从程序开始执行到程序结束动态变量:从包含该变量定义的函数开始执行至函数执行结束,模块设计,局部变量默认为auto型静态局部变量具有全局寿命和可继承性寄存器变量个数受限,且不能为long,double,float型extern不是变量定义,可扩展外部变量作用域,动态存储方式与静态存储方式,例auto变量的作用域,局部变量的存储方式,main()voidprt(void);intx=1;prt();printf(“1stx=%dn”,x);voidprt(void)intx=5;printf(“2ndx=%dn”,x);,运行结果:2ndx=51stx=1,模块设计,考察静态局部变量的值,局部变量的存储方式,intfun(inta)autointb=0;staticintc=3;b+;c+;returna+b+c;main()inta=2,i;for(i=1;i=3;i+)printf(%d,fun(a);,运行结果:789,模块设计,用extern扩展全局变量的作用域,全局变量的存储方式,externinta,b;,模块设计,函数的定义形式为:,小结,类型标识符函数名(形式参数表)函数声明部分;函数语句部分;,函数的定义必不可少,对函数的声明可有可无变量分类:生存期:变量在某一时刻存在-静态变量与动态变量作用域:变量在某区域内有效-局部变量与全局变量,模块设计,课后作业,写出下列程序的输出结果。voidfun(intk)st

温馨提示

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

评论

0/150

提交评论