C语言程序设计第六章.ppt_第1页
C语言程序设计第六章.ppt_第2页
C语言程序设计第六章.ppt_第3页
C语言程序设计第六章.ppt_第4页
C语言程序设计第六章.ppt_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

第6章:函数,学习的意义,模块化程序设计方法:人们在求解某个复杂问题时,通常采用逐步分解、分而治之的方法,也就是将一个大问题分解成若干个比较容易求解的小问题,然后分别求解。程序员在设计一个复杂的应用程序时,往往也是把整个程序划分成若干个功能较为单一的程序模块,然后分别予以实现,最后再把所有的程序模块象达积木一样装配起来,这种在程序设计中分而治之的策略,被称为模块化程序设计方法。,子模块1,子模块2,子模块n,学习的意义,功能模块1,功能模块2,功能模块n,软件项目,C语言程序,C语言函数,学习的意义,使用函数,不仅可以实现程序的模块化,程序设计得简单和直观,提高了程序的易读性和可维护性。编写自定义函数库。把一些常用的或某些特定功能的程序制作成自己的函数库,以供随时调用,这样可以大大减轻日后编写代码的工作量。通过对函数的学习,掌握模块化程序设计的理念,为将来进行团队合作,协同完成大型应用软件奠定一定的基础。,学习目标,正确理解函数在C语言程序设计中的作用和地位;理解函数、形参、实参、作用域、生存期的概念;掌握各种函数的定义、原型声明和调用的方法;理解全局变量、局部变量、静态变量、静态函数的作用域和生存期;掌握递归函数的编写规则;,学习内容,函数概述函数的定义与调用无参数无返回值的函数无参数有返回值的函数带参数无返回值的函数带参数有返回值的函数函数参数传递的传递方式变量的作用域和生存期变量的存储类型函数的作用域函数应用综合举例本章小结,6.1函数概述,1、函数的概念,函数其实就是一段可以重复调用的、功能相对独立完整的程序段。,C是函数式语言必须有且只能有一个名为main的主函数C程序的执行总是从main函数开始,在main中结束函数不能嵌套定义,可以嵌套调用,2、函数的分类,从用户角度,标准函数(库函数):由系统提供用户自定义函数,从函数形式,无参数函数有参数函数无返回值函数有返回值函数,使用库函数应注意:1、函数功能2、函数参数的数目和顺序,及各参数意义和类型3、函数返回值意义和类型4、需要使用的包含文件,6.2函数的定义和调用,1、无参数无返回值的函数,定义格式,void函数名(void)变量声明部分执行部分,空类型,表明函数无返回值,不可省!,表明无参数,可缺省!,必须为合法的标识符,函数用途,此类函数用于完成某项固定的处理任务,执行完成后不向调用者返回函数值。它类似于其它语言的过程。,函数的原型声明,void函数名(void);或void函数名();,C语言规定,对函数调用之前必须对其原型加以声明,否则会出现编译错!,1、无参数无返回值的函数,函数的调用,函数名();,注意:不能将这种函数调用赋值给任何变量,因为它没有返回值。调用时,()中间不能有void。,实例,#include#includevoidprintstar();/声明printstar函数的原型voidmain()inta;for(a=0;a形参2实参n-形参n,3、有参数无返回值的函数,#includevoidprintnstar(intn);voidmain()inti=8;printnstar(i);voidprintnstar(intn)for(inti=0;iy?x:y;return(z);voidmain()inti;i=z;printf(%dn,i);,说明,(1)主函数main()中定义的变量也是局部变量,它只能在主函数中使用,其它函数不能使用。同时,主函数中也不能使用其它函数中定义的局部变量。,intf3(intx);voidmain()inta=2,b;b=a+y;printf(%dn,b);intf3(intx)inty;y=a+5;return(y);,局部变量,说明,(2)允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。,#includevoidsubf();voidmain()inta,b;a=3,b=4;printf(main:a=%d,b=%dn,a,b);subf();printf(main:a=%d,b=%dn,a,b);,voidsubf()inta,b;a=6,b=7;printf(subf:a=%d,b=%dn,a,b);,运行结果:main:a=3,b=4subf:a=6,b=7main:a=3,b=4,说明,(3)在复合语句中定义的变量也是局部变量,其作用域只在复合语句范围内。,#includevoidmain()inta=2,b=4;intk,b;k=a+5;b=a*5;printf(k=%dn,k);printf(b=%dn,b);printf(b=%dn,b);a=k+2;,main中的局部变量,复合语句中的局部变量,输出k=7,输出b=10,输出b=4,3、全局变量,定义在函数外部作定义说明的变量。作用域从定义变量的位置开始到程序所在的文件结束,可解决多个函数间变量共用问题。,#include#includeintsign();/计算数n的平方根floatsqr()if(n0)return(sqrt(n);elsereturn(-1);,floatn=0;voidmain()ints;floatt;scanf(%f,定义全局变量,并赋初值,局部变量,局部变量,说明,(1)应尽量少使用全局变量。,全局变量在程序全部执行过程中始终占用存储单元降低了函数的独立性、通用性、可靠性及可移植性降低程序清晰性,容易出错,(2)若全局变量与局部变量同名,则全局变量不起作用。要引用全局变量,则必须在变量名前家上两个冒号“:”,#includeinta=10;/全局变量voidmain()inta=100;/局部变量(与全局变量同名)printf(locala=%dn,a);printf(globala=%dn,:a);,运行结果:locala=100globala=10,注意:局部变量与全局变量同名极易导致程序员犯逻辑错误。,6.5变量的存储方式,概述,变量的存储方式静态存储方式:在程序运行期间分配固定的存储空间。动态存储方式:在程序运行期间根据需要动态的分配存储空间。用户存储空间的划分:程序区、静态存储区、动态存储区其中,全局变量存放在静态存储区,形参存放在动态存储区中。用户变量的分类:自动变量(auto),静态变量(static),寄存器变量(register)和外部变量(extern),存储类型说明符数据类型说明符变量名1,变量名2,变量名n;,变量定义的完整形式应为:,例如:autocharc1,c2;/c1,c2为自动字符变量registeri;/i为寄存器型变量staticinta,b;/a,b为静态整型变量externintx,y;/x,y为外部整型变量,1、自动变量(auto型变量),auto数据类型说明符变量名1,变量名2,变量名n;,定义格式,说明,存储类型说明符auto可以省略。自动变量只能在函数内或复合语句中定义,它属于局部变量。,voidfunc()inti,j,k;,等价于autointi,j,k;,autointk;voidfunc(),自动变量不可定义在函数外,注意:在函数外部定义的没有带存储类型说明符的全局变量是外部变量,属于静态存储类型。如:intk;/k为外部变量,属静态存储类型voidfunc(),2、外部变量(extern型变量),外部变量和全局变量是对同一类变量的两种不同角度的提法。全局变是是从它的作用域提出的,外部变量从它的存储方式提出的,表示了它的生存期。它属于静态存储类型。,例:引用其它文件中的外部变量,原文件f1.cpp#includefloatPI;/外部变量定义floatarea(floatr);voidmain()floatr;PI=3.1415926;scanf(%f,原文件prg2.cppexternPI;/外部变量定义floatarea(floatr)return(4*PI*r*r);,编译、链接、运行,运行结果:max=5,3、静态变量(static型变量),静态变量,静态变量的类型说明符是static。静态变量属于静态存储类型。静态变量可以用来存放全局变量和静态局部变量。,静态局部变量,在局部变量的说明前加上static就构成静态局部变量,它有如下特点:占据固定的存储单元,直到程序结束才释放。作用域只能在所声明的函数内有效如果没有赋初始值,系统自动赋0,并且以后调用时使用前一次调用保留的值。,例如:staticinta,b;staticcharc;,#includevoidmain()inti;voidfunc();/函数说明for(i=1;i=5;i+)func();/函数调用voidfunc()/函数定义intj=0;+j;printf(%d,j);,#includevoidmain()inti;voidfunc();/函数说明for(i=1;i=5;i+)func();/函数调用voidfunc()/函数定义staticintj=0;+j;printf(%d,j);,局部变量,静态变量,运行结果:11111,运行结果:12345,静态全局变量,全局变量(外部变量)的说明之前再冠以static就构成了静态全局变量。全局变量改变为静态变量后改变了它的作用域,限制了它的使用范围。当一个源程序由多个源文件组成时,非静态的全局变量可通过外部变量说明使其在整个源程序中都有效。而静态全局变量只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能通过外部变量说明来使用它。,prg1.cppinta,b;staticcharch;voidmain(),prg2.cppexterninta,b;externcharch;intfunc(intx,inty),外部(全局)变量定义,静态全局变量定义,6.7宏定义,宏定义分为两种:不带参数的宏定义和带参数的宏定义。,1、不带参数的宏定义,一般形式,#define标识符字符串,指令名称,宏名,被定义代表后面的单词串,宏体,是宏的内容文本,功能,用指定标识符(宏名)代替字符序列(宏体),如#defineYES1#defineNO0#definePI3.1415926#defineOUTprintf(“Hello,World”);,#defineSIZE10#defineINT_STR%dnvoidmain()inta;a=SIZE;printf(INT_STR,a),voidmain()inta;a=10;printf(%d,a);,注意:宏替换时仅仅是将源程序中与宏名相同的标识符替换成宏的内容文本,并不对宏的内容文本做任何处理。,宏定义注意事项,C程序员通常用大写字母来定义宏名,以便与变量名区别。,如:#definePI3.14159,宏定义的位置任意,但一般放在函数外面。,宏名的作用域是从#define定义之后直到该宏定义所在文件结束,#undef可终止宏名作用域,#undef标识符,程序中字符串常量即双引号中的字符,不作为宏进行宏替换操作,宏定义一般以换行结束,不要用分号结束,以免引起不必要的错误,#definePI3.14;a=PI*2*2;,a=3.14;*2*2;,错误!,#defineXYZthisisatestprintf(XYZ);输出:XYZ,而不是:thisisatest。,2、带参数的宏定义,一般形式,#define标识符(参数列表)单词串,参数表由一个或多个参数构成,参数只有参数名,没有数据类型符,参数之间用逗号隔开,参数名必须是合法的标识符,通常会引用宏的参数,例:#defineS(a,b)a*b.area=S(3,2);宏展开:area=3*2;,宏展开:形参用实参换,其它字符保留宏体及各形参外一般应加括号(),例#definePOWER(x)x*xx=4;y=6;z=POWER(x+y);宏展开:z=x+y*x+y;一般写成:#definePOWER(x)(x)*(x)宏展开:z=(x+y)*(x+y);,6.8函数应用综合举例,【例】编写求最小公倍数的程序,设计思想:设正数a,b的最大公约数为d,最小公倍数为c,则a,b,c,d之间的关系为c=a*b/d。这样我们的程序可以分成3个函数:(1)intdivisor(inta,intb);/求最大公约数(2)intmultiple(inta,intb);/求最小公倍数(3)主函数。,#includeintdivisor(inta,intb);intmultiple(inta,intb);voidmain()inta,b,c;printf(Pleaseinputtwointeger.n);scanf(%d,%d,intdivisor(inta,intb)/最小公倍数intr;while(r=a%b)!=0)a=b;b=r;returnb;,intmultiple(inta,intb)/最大公因数intd;d=divisor(a,b);returna*b/d;,【例】输入四个数,返回最大值和最小值,#includeintmax(inta,intb);intmin(inta,intb);voidmain()inta,b,c,d;printf(Pleaseinputfourinteger.n);scanf(%d,%d,%d,%d,intmax(inta,intb)/最大值returnab?a:b;,设计思想:对于输入的四个数a,b,c,d,我们可以先判断两个数,如a,b的最大值,然后用c与第一次所求的结果比较,得到a,b,c中的最大值,最后再用d与第二次求得结果进行比较。求最小值的方法同上,【例】求,用三个函数来实现:(1)intpower(intn,intk)函数实现nk;(2)intsum(intn,intk)函数调用power函数求各项之和;(3)main函数调用sum函数并输出结果,#includeintpower(intn,intk);/计算nkintsum(intn,intk);/计算各项之和voidmain()intn,k;printf(Pleaseinputtwointeger.n);scanf(%d,%d,intpower(intn,intk)intt=1;for(intj=0;jk;j+)t*=n;returnt;,intsum(intn,intk)intsum=0,s=1;for(intj=0;jn;j+)sum+=s*power(j,k);s=-s;returnsum

温馨提示

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

评论

0/150

提交评论