《函数与预处理》PPT课件.ppt_第1页
《函数与预处理》PPT课件.ppt_第2页
《函数与预处理》PPT课件.ppt_第3页
《函数与预处理》PPT课件.ppt_第4页
《函数与预处理》PPT课件.ppt_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

第4章函数与预处理,一.函数的概念、分类及定义,第4章函数与预处理,函数的概念,逻辑上独立的、完成指定功能的一段代码,是编译的最小单位.有的程序设计语言分成子程序和函数两种,如Basic,Fortran等.,由一个main函数及若干个其它函数组成.,另外,在main函数前还可以定义全局变量,声明所用函数.,C程序的结构,函数可看作为一个“黑箱”,通过参数和返回值与外界进行数据交换.,C+的程序结构,第4章函数与预处理,一个程序中有且只能有一个main函数;函数的定义是独立的,不能嵌套定义;函数可以相互调用,但不能调用main函数;在函数被调用之前,必须先定义或声明.,关于函数的几点规定,函数是模块化程序设计的基本单位,C程序就是由函数组成,因此被认为是面向函数的语言;C+采用类结构设计方式,将对象的数据及操作(函数)捆绑起来,封装于类中,如下图.,函数的分类,从用户使用的角度看,可分成两类:,标准库函数:编译系统自带的函数,用户只需在程序中包含相应的头文件,就可以调用.在连接时,系统会将相应的代码连接到用户的执行程序中.,VC+几个常用的头文件及库函数:,输入/输出库(iostream):getchar,gets,puts,scanf,printf等;数学函数库(cmath):abs,fabs,labs,sin,cos,tan,exp等;(cstdlib):_max,_min,itoa,atoi,atol,atof,rand等;字符串处理(cstring):strlen,strcpy,strncpy,strcmp,strlwr,strupr,strchr,strrchr,strstr等;字符分类及转换(cctype):isalpha,isdigit,islower,isupper等;动态存储分配(C语言)(malloc.h):calloc,malloc,realloc,free等;时间库函数(ctime):time,ctime,_strtime等;,用户自定义函数:按C+的语法定义函数.,第4章函数与预处理,函数的定义,定义无参函数的一般格式,第4章函数与预处理,(void)函数体;return;,注:,如果没有返回值,则为void,return后面不需要任何返回值,甚至return本身也可省略.函数体可以是空的,但不能省.,例:下面的函数用于输出当前时间.,#includevoidPrnTime(void),chartm11;_strtime(tm);couttmab;c=gcf(a,b)coutgcf=cxy;t=gcf(x,y);coutt=txy;t=gcf(x,y);coutt=txyz;coutMax=y;/函数调用t=gcf(x,y);coutgcf=ty;swap(x,y);coutx=x,;couty=yyz;s=sum(x,y,z);/普通考生/s=sum(x,y,z,1);/1-类考生coutsum=s0.0)coutNorootatall!endl;elser=root(a,b,er,ev);coutsetiosflags(ios:fixed)=er);c=0.5*(a+b);returnc;doublef(floatx)return(2*x-4)*x+3.)*x-6.0;,运行程序,coutRoot:r,bc;d=add(a,b,c);coutxy;z=add(x,y);coutx+y=zb;c=add(a,b);coutxy;z=add(x,y);coutT1add(T1a,T2b)returna+b;,第4章函数与预处理,例4.6求两个不同类型的数之和并返回.,若输入:5202.53.2,则输出:5+20=252.5+3.2=5.75+2.5=7,运行程序,四.函数的递归调用,一个函数直接或间接调用自身,称为递归调用.这样的函数称为递归函数(Recursivefunction).,递归的两种形式,直接递归:在函数f()的函数体中直接调用f()自身.,递归的特点:递归是函数的循环调用,因此必须要有结束条件;另外,递归要占用较多的堆栈空间来存放函数的参数.,例4.7:求n!,floatfactorial(intn)floatf=1.0;inti;for(i=2;in;k=gcf(m,n);coutTheGreatestCommonFactorofmandn;coutis:kendl;,说明:,第4章函数与预处理,例4.8用递归法求两个整数的最大公因子.,intgcf(intm,intn)coutm,nn;while(n15);hanoi(n,A,B,C);coutendl;,第4章函数与预处理,/Hanoidisk:/ndiskfromatocwithhelpofb.voidhanoi(intn,chara,charb,charc)if(n=1)coutct;hanoi(n-1,b,a,c);,运行程序,第4章练习-1,第4章函数与预处理,4-6题.牛顿切线法的迭代公式为:,从初值x0=1.0出发开始迭代,收敛精度为10-6.,五.作用域与存储类,定义:一个对象(数据或函数)的有效作用范围称为它的作用域.,作用域,是指在函数体(包括main函数)内或复合语句内定义的变量以及函数的形参.其作用域仅限于函数体或复合语句内.这样,不同作用域内的变量或函数可以同名.如下例:,voidmain(void)inti,a10;doublex;for(i=0;i10;i+)intt;.,voidfunc1(inta)inti;floatx,y;.,这里a,i,x与main中变量同名,但占用不同内存空间.,第4章函数与预处理,根据作用域的不同,变量和函数可作如下分类.,局部变量,全局变量,intp=10;intf1(intx)inti,p;p=5;.charc;intf2(inta)inti,k;.i=p+k;.voidmain()intm,n;.p=f1(m);,在函数之外定义的变量称为全局变量.其自动作用域从定义位置开始到当前文件的末尾.如下例:,说明:,第4章函数与预处理,全局变量增加了数据联系的渠道,加快了联系速度;全局变量降低了程序的可读性和独立性;全局变量如未赋初值,则在编译时自动置为0(数值型)或空(字符型).全局变量习惯上放在文件头部,当变量数比较多时,可放在头文件中,用#include包含到文件中.,局部变量与全局变量同名:运算符,第4章函数与预处理,在C语言中,如果局部变量与全局变量同名且作用域出现重叠,则全局变量会被局部变量屏蔽掉.C+提供作用域运算符:来访问全局变量.请看下例:,#includeusingnamespacestd;intp=10;voidmain(void)floatp=3.5;coutpendl;cout:pendl;,说明,:运算符只能用来访问全局变量,不能用于访问局部变量;:运算符还可用于访问类成员变量、函数和类的静态成员变量;,存储类auto,static,extern,register,作用域(可见性):指数据是否可以被访问.在作用域内数据是可访问的,在作用域之外的数据是不可访问的,即使它是存在的.,在变量所在的代码段运行期间分配内存,代码段运行结束后被释放.,数据具有两个属性:作用域和存储期.,存储期(存在性):在程序运行的某个阶段,数据是否存储在内存中,也称为生命期.,从存储期的角度看,变量可分为动态、静态两类.数据在内存中的存放也是这样区分的.,实例:函数的形参,函数内定义的变量,复合语句内定义的变量.,定义方式:用auto存储类说明,如:autointa;对局部变量,auto是缺省存储类,因此,可省略.,自动变量的存在性和可访问性是一致的.,第4章函数与预处理,动态(自动)变量,静态变量,第4章函数与预处理,在程序运行过程中始终存在.在编译阶段分配内存地址(位于静态数据区).如果未赋初值,系统自动置为0(包括0,NULL,).分两种:静态局部变量、静态全局变量;,例4.10生成01之间的伪随机数.,定义方式:用static存储类说明,如:staticintb;,局部静态变量:在函数内部定义的静态变量,#include#includeusingnamespacestd;floatPrand(void);voidmain(void)inti,n=10;for(i=0;in;i+)coutPrand()t;cout(y)?(x+2):(y);,注意:,宏定义中#与#的特殊作用,第4章函数与预处理,:,在执行一次宏替换后,“#”符号被删除.,#definePRT(s,t)printf(y#s=%d,y#t=%dn,y#s,y#t)调用:PRT(1,2);经一次宏展开,替换成:printf(y1=%d,y2=%dn,y1,y2);,在带参数的宏定义中,如果在中形参的前面加上#或#,则会起到特殊的作用.,经字符串合并后成为:printf(y1=%d,y2=%dn,y1,y2);,在宏展开时,将替换成“实参”字符串;,:,例:,文件包含(include),第4章函数与预处理,格式1:#include文件名格式2:#include作用:在编译前将指定的文件加到include宏命令处.,习惯用法:,:只在系统指定的include目录下查找包含文件,如找不到,就发出错误信息.在VC+中,可从ToolsOptionsDirectories下的includefiles栏下查看.,格式1与格式2的区别:,通常将一些宏定义、自定义数据类型、函数的声明、全局变量的定义、内置函数的定义等信息放在各个头文件(C+标准库的头文件没有扩展名)中,然后用include宏命令包含到源文件的头部.,文件名:先到用户的当前工作目录下查找包含文件,若找不到,再到系统指定的include目录下查找,如还是找不到,就发出错误信息.,条件编译,第4章函数与预处理,格式1:#ifdef#else#endif,条件编译类似于if语句,但这种选择是在编译时进行的,而不是在运行时进行的.,条件编译格式1,当已定义时,编译,否则编译.这里只判断是否已定义,而不管它的是什么.所以可以用宏定义:#define,变化形式:当为空时,可写成:#ifdef#endif,#ifdef_DEBUGcouta=aendl;#endif,功能:,例,条件编译格式2,第4章函数与预处理,格式2:#ifndef#else#endif,当为空时,可

温馨提示

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

评论

0/150

提交评论