程序设计实践4w2-cchap5-函数.pptx
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 实践 w2 cchap5 函数
- 资源描述:
-
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2021/10/3,#,第五章 函数,1,第1页,5.1 子程序设计,5.2 函数,5.3 头文件,5.4 函数应用举例,5.5,变量作用域,5.6,变量存放类别,5.7,内部函数和外部函数,提要,2,第2页,5.1 子程序设计,5.2 函数,5.3 头文件,5.4 函数应用举例,5.5,变量作用域,5.6,变量存放类别,5.7,内部函数和外部函数,提要,3,第3页,5.3,头文件,对于一些通用函数(如输入输出函数、数学函数等),可能在不一样程序中都会用到。,为了使用这些函数,需要在程序中说明其函数原型。,一个方式是在程序中逐一写出函数原型;,double sqrt(double x);,double fabs(double x);,另一个方式是将这些函数原型集中在一起,形成,.h,头文件,然后在程序中直接包含这些头文件。,#include,4,第4页,每一个标准库都有一个对应头文件,文件扩展名为.,h(,如,stdio.h,,,示例,)。,该头文件包含了该库中全部函数原型以及这些函数所需全部常量和数据类型定义。,程序员能够依据需要自己建立头文件,使用,include,命令能够把程序员定义头文件包含到程序中,如:#,include“square.h”,注意,:,#,include,包含标准库头文件,#,include“square.h”,包含程序员自定义头文件,5.3,头文件,5,第5页,5.1 子程序设计,5.2 函数,5.3 头文件,5.4 函数应用举例,5.5,变量作用域,5.6,变量存放类别,5.7,内部函数和外部函数,提要,6,第6页,5.5,变量作用域,变量基本属性:变量名、变量类型、变量值,变量其它属性:,作用域(,scope,,程序中可引用该变量区域),存放类别(,storage class,,变量存放在哪里),存放期(,storage duration,,变量存活期),连接(,linkage,),7,第7页,5.5,变量作用域,变量作用域即能够引用该变量程序段。,C,语言中变量能够在三种位置进行定义:,函数内部定义部分(即任何语句之前);,函数内部某一个复合语句内部;,全部函数之外。,变量定义位置决定了变量作用域。,以上三种位置变量分别对应于:,函数作用域;,块作用域;,文件作用域。,在一个函数内部定义变量称为,内部变量或者局部变量,。,在全部函数之外定义变量称为,外部变量或者全局变量,。,8,第8页,若变量在函数内全部语句之前定义,则该变量含有,函数作用域,:只有在定义变量函数内部才能使用这些变量。,5.5.1,变量作用域函数作用域,9,第9页,int f1(int a)/*,函数,f1*/,int b,c;,/*a,b,c,作用域:仅限于函数,f1(),中*/,main(),int m,n;,/*m,n,作用域:仅限于函数,main(),中*/,5.5.1,变量作用域函数作用域,10,第10页,5.5.1,变量作用域函数作用域,1主函数,main(),与其它函数是平行关系。,main(),中定义内部变量,也只能在主函数中使用,其它函数不能使用。同时,主函数中也不能使用其它函数中定义内部变量。,2,形参变量,也是内部变量,属于被调用函数。,3,允许在不一样函数中使用相同变量名,它们代表不一样对象,分配不一样单元,互不干扰,也不会发生混同。,11,第11页,5.5.2,变量作用域块作用域,若变量在复合语句中定义,则其含有,块作用域,:,只在复合语句范围内才能引用该变量,。,允许函数定义部分定义变量与该函数内部复合语句中定义变量同名。在复合语句执行时,函数定义部分定义变量是“隐藏”,直到复合语句结束。提议:尽可能不要这么做。系统不会混同,并不意味着人也不会混同!,12,第12页,5.5.2,变量作用域块作用域,main(),int x=5;,printf(“local x in outer scope of main is%dn”,x);,/,复合语句中定义变量,x,作用域,int x=7;,printf(“local x in inner scope of main is%dn”,x);,printf(“local x in outer scope of main is%dn”,x);,local x in outer scope of main is 5,local x in inner scope of main is 7,local x in outer scope of main is 5,13,第13页,若变量在函数外部定义,则该变量含有,文件作用域,:从变量定义位置开始,到本文件结束为止区域能够引用该变量。,若该变量被定义成非静态外部变量,则其也能被其它文件引用(后面会讲到)。,因为变量在函数外定义,这类变量称为,外部变量,。因为其在文件范围内可引用,所以又称,全局变量,。,5.5.3,变量作用域文件作用域,14,第14页,int area;,int vs(int length,int width,int height);,main(),int volumn,length,width,height;,printf(“n input length,width and height:);,scanf(“%d,%d,%d,volumn=vs(length,width,height);,printf(“volumn=%d area=%d n,v,area,);,int vs(int length,int width,int height),int volumn;,volumn=length*width*height;,area,=2*(length*width+length*height+width*height);,return volumn;,例:输入长方体长(,l)、,宽(,w)、,高(,h),,求长方体体积及侧面积之和。,15,第15页,(1)外部变量能够降低函数参数使用,但会加强函数之间数据联络,使这些函数依赖这些外部变量,因而使得这些函数独立性降低(重用函数时必须要记得“带着”外部变量)。【,示例,】,(2),因为无法限制各函数对外部变量访问,可能会使外部变量被一些函数非法修改,当程序犯错时不好检验。,从模块化程序设计观点来看这是不利,,所以,不是非用不可时,不要使用外部变量。,(,3,)在同一源文件中,允许外部变量和内部变量同名。,在内部变量作用域内,外部变量将被屏蔽而不起作用。,【,示例,】,5.5.3,变量作用域文件作用域,16,第16页,int num=5,;/*,定义外部变量,num*/,main(),int num=6,;/*,定义内部变量,num*/,printf(“%d”,num);/*,输出结果是6,外部变量,num,在,main,函数中被屏蔽*/,.,示例:内部变量屏蔽同名外部变量,5.5.3,变量作用域文件作用域,17,第17页,(3)外部变量作用域是从定义点到本文件结束。假如文件中定义点之前函数需要引用这些外部变量时,需要在,函数内,对被引用外部变量进行,说明,。外部变量说明普通形式为:,extern,数据类型 外部变量,外部变量2,;,【,示例,】,【,Next,】,5.5.3,变量作用域文件作用域,18,第18页,函数1,函数2,外部变量,函数1先对外部变量进行了加工;然后函数2使用加工后外部变量值;,函数1 和函数2之间即使没有调用关系,但经过外部变量建立起了联络;,因为依赖于外部变量存在,函数1 和函数2独立性差;,修改,读取,Return,5.5.3,变量作用域文件作用域,19,第19页,例:外部变量定义与说明。,int CalVolumn(),extern int length,width,height,;,/*,外部变量说明*/,return(,length*width*height,)/*,使用外部变量*/,int length=3,width=4,height=5,;/*,外部变量定义*/,main(),printf(volumn=%d,CalVolumn();,Return,5.5.3,变量作用域文件作用域,注意,:,外部变量定义和外部变量说明是两回事,。,外部变量定义,必须在全部函数之外,且只能定义一次。而外部变量说明,出现在全部要使用该外部变量函数内。,20,第20页,5.1 子程序设计,5.2 函数,5.3 头文件,5.4 函数应用举例,5.5,变量作用域,5.6,变量存放类别,5.7,内部函数和外部函数,提要,21,第21页,在语言中,变量有以下四种存放类别:,自动(,auto)、,存放器(,register)、,静态(,static),、外部(,extern),。,变量存放类别,(storage class),和变量作用域,(scope),、连接,(linkage),存在着一定联络。,变量存放类别决定着变量存放空间在哪里分配(栈区、静态存放区、存放器),决定了变量存放期。,5.,6,变量存放类别,22,第22页,5.,6,变量存放类别,局部变量存放类别能够是:自动(,auto),,存放器(,register),,静态(,static),全局变量存放类别能够是:静态(,static),,外部(,extern),int solutions;/,solutions,是全局变量,main(),int i;/i,是局部变量,char ch;/ch,是局部变量,23,第23页,5.6.1,变量存放类别,auto,若,局部变量,按以下形式定义,则其含有,auto,(自动)存放类别:,auto,数据类型 变量表;,/auto,可写可不写,1,.,存放期:存放空间在进入函数体,或者复合语句体,时在,栈区,分配,退出函数体或者复合语句体时被释放。,2.,作用域:块作用域或者函数作用域。,3.,连接:不能被其它文件中函数访问。,4.,若定义而不初始化,则其值是不确定。假如初始化,则赋初值操作是在函数调用或进入复合语句时进行,且每次都要重新赋一次初值。,24,第24页,5.6.1,变量存放类别,auto,main(),int x=5;,int y=7;,x,和,y,是存放类别为,auto,局部变量,main(),auto int x=5;,auto int y=7;,等价于,25,第25页,普通情况下,变量值都是存放在内存中。为提升执行效率,语言允许将,局部变量,值存放到存放器中,这种变量称为存放器变量。定义格式以下:,register,数据类型 变量表;,如:,register,int x=5;,1,.,存放期:存放空间在进入函数体或者复合语句体时在,存放器,分配,退出函数体或者复合语句体时被释放。,2.,作用域:块作用域或者函数作用域。,3.,连接:不能被其它文件中函数访问。,4.,允许使用存放器数目是有限,不能定义任意多个存放器变量。当代编译系统普通自动分配存放器,所以程序员说明存放器变量不起作用。,5.6.2,变量存放类别,register,26,第26页,局部变量,和,全局变量,均能够定义成含有,static,(静态)存放类别变量。,含有,static,存放类别,局部变量,若局部变量按照以下形式定义,则其含有,static,存放类别。,定义格式:,static,数据类型 内部变量表;,如:,static int sum,;,/,定义静态局部变量,sum,含有静态存放类别局部变量又称,静态局部变量。,5.6.3,变量存放类别,static(1),27,第27页,5.6.3,变量存放类别,static(1),1.,静态局部变量存放特点:,a.,存放空间在,静态存放区,分配。在程序开始运行时分配空间,程序执行期间,静态局部变量一直存在。即使所在函数不被调用、或者所在函数调用结束也不释放。但其它函数不能访问它们。,b.,若定义静态局部变量但不初始化,则系统自动赋以(整型或实型)或0(字符型);,c.,每次调用它们所在函数时,不再重新赋初值,只是保留上次调用结束时值!,2.,作用域:块作用域或者函数作用域。,3.,连接:不能被其它文件中函数访问。,28,第28页,main(),int i;,for(i=1;i=10;i+),printf(“%d!=%dn”,i,fib(i);/*,函数调用*,/,system(pause);,return 0,;,int fib(int n),static mul=1;/*,静态局部变量*,/,mul=mul*n;,return mul;,1!=1,2!=2,3!=6,4!=24,5!=120,6!=720,7!=5040,8!=40320,9!=362880,10!=3628800,请按任意键继续,.,静态局部变量示例:求,1,10,中各个数阶乘,何时使用静态局部变量:,需要保留函数上一次调用结束时值。,29,第29页,5.6.3,变量存放类别,static(2),二,.,含有,static,存放类别,全局变量,定义格式:,static,数据类型 全局变量表;,含有静态存放类别全局变量又称,静态全局变量。,/*,静态全局变量定义*,/,static int out,;,main(),30,第30页,5.6.3,变量存放类别,static(2),1,.,存放期:存放空间在,静态存放区,分配。在程序开始运行时分配空间,程序执行期间,静态全局变量一直存在。,2.,作用域:文件作用域。,3.,连接:不能被其它文件中函数访问。,4.,将全局变量定义成静态用意:表达了模块间低耦合思想,使得,变量只能被本文件中函数访问,其它文件不能访问,。,31,第31页,静态局部变量和静态外部变量同属静态存放方式,但二者区分较大:,(1)定义位置不一样。静态内部变量在函数内定义,静态外部变量在函数外定义。,(2)作用域不一样。静态内部变量其作用域仅限于定义它函数内,即使生存期为整个源程序,但其它函数是不能使用它。静态外部变量在函数外定义,其作用域为定义它源文件内;生存期为整个源程序,但其它源文件中函数也是不能使用它。,(3)初始化处理不一样。静态局部变量,仅在第1次调用它所在函数时被初始化,当再次调用定义它函数时,不再初始化,而是保留上1次调用结束时值;而静态外部变量是在函数外定义,不存在“重复”调用初始化问题,其当前值由最近1次给它赋值操作决定。,5.6.3,变量存放类别,static(2),32,第32页,务必切记,:把内部变量改变为静态内部变量后,改变了它生存期,但作用域未变。,把外部变量改变为静态外部变量后,改变了它作用域,但生存期未变。,5.,7.2,外部变量存放方式,33,第33页,5.6.4,变量存放类别,extern,若全局变量按照以下形式定义,则其含有,extern(,外部,),存放类别。,定义格式:数据类型 全局变量表;,含有外部存放类别全局变量又称,非静态全局变量。,int out,;,/*,非静态全局变量定义*,/,main(),File1.c,34,第34页,5.6.4,变量存放类别,extern,1,.,存放期:存放空间在,静态存放区,分配。在程序开始运行时分配空间,程序执行期间,非静态全局变量一直存在。,2.,作用域:文件作用域。,3.,连接:能够被其它文件中函数访问。,4.,其它源文件中函数,引用非静态外部变量时,需要在引用函数所在源文件中(通常在文件开头)进行说明:,extern,数据类型 全局变量表;,35,第35页,非静态全局变量申明举例,extern int out,;,/*,非静态,全局变量,申明,不是定义*,/,int func(int num),return num*out,;,/,此处,out,就,/,是,File1,中,out,int out,;,/*,非静态全局变量,定义,*,/,main(),out=1;,File1.c,File2.c,36,第36页,5.6.4,变量存放类别,extern,注意,:在函数内,extern,变量说明,表示引用根源文件中全局变量!而函数外(通常在文件开头),extern,变量说明,表示引用其它文件中全局变量。,int CalVolumn(),extern int length,width,height,;,/*,外部变量说明*/,int length=3,width=4,height=5,;/*,外部变量定义*/,main(),printf(volumn=%d,CalVolumn();,37,第37页,5.6,变量存放类别,总结:,动态存放方式,:,动态局部变量(,auto,)、存放器变量(,register,),属于动态存放方式。存放空间在进入函数体或者复合语句体时分配,退出函数体或者复合语句体时回收。,静态存放方式,:,静态局部变量、静态全局变量、非静态全局变量,均属于静态存放方式。存放空间在程序开始执行时一次性分配和初始化,在整个程序执行期间均不回收。,38,第38页,5.6,变量存放类别,学习存放类别目标(主要是,static,和,extern,):,1.,怎样保留上一次函数调用结果值。静态局部变量;,2.,怎样定义一个文件中全局变量能,/,不能被其它文件中函数所访问。静态全局变量和非静态全局变量。,39,第39页,5.1 子程序设计,5.2 函数,5.3 头文件,5.4 函数应用举例,5.5,变量作用域,5.6,变量存放类别,5.7,内部函数和外部函数,提要,40,第40页,5.,7.1,内部函数(又称静态函数),5.,7.2,外部函数,5.,7.3,多个源程序文件编译和连接,对于较大型程序,为便于组织、管理,往往会按照一定标准将程序组织成多个源文件;,当一个源程序由多个源文件组成时,语言依据函数能否被,其它,源文件中函数调用,将函数分为,内部函数,和,外部函数,。,5.7,内部函数和外部函数,41,第41页,5.,7.1,内部函数(又称静态函数),假如在一个源文件中定义函数,只能被本文件中函数调用,而不能被同一程序其它文件中函数调用,这种函数称为,内部函数,。,定义一个内部函数,只需在函数类型前再加一个“,static”,关键字即可,以下所表示:,static,函数类型 函数名(函数参数表),使用内部函数好处是,:不一样人编写不一样函数时,不用担心自己定义函数,是否会与其它文件中函数同名。,42,第42页,假如在一个源文件中定义函数,能被同一程序其它文件中函数调用,这种函数称为外部函数。,外部函数定义:在定义函数时,假如没有加关键字“,static”,,或冠以关键字“,extern”,,表示此函数是外部函数。,extern,函数类型 函数名(函数参数表),调用外部函数时,需要在调用文件中对其进行说明:,extern,函数类型 函数名(参数类型表),函数名2(参数类型表2);,5.,7.2,外部函数,43,第43页,(,1,)文件,mylib.c,#include,#include,extern,int isPrim(int n),/*,定义一个外部函数*,/,int i;/*,不停判断,n,能否被,i,整除。,i,取值范围是,2,sqrt(n)*/,int isPrim;/*isPrim=1:,表示,n,是质数;,isPrim=0,:表示,n,不是质数*,/,i=2;,isPrim=1;,while(i=sqrt(n)&(isPrim=1),if(n%i)=0),isPrim=0;,else,i+;,;,return isPrim;,44,第44页,(,2,)文件,mylib.h,int,i,sPrim(int n);,/*,函数原型*,/,45,第45页,#include,#include,#include mylib.h,int main(),while(num=to),while(num1,新建,-,工程,.,5.7.3 工程创建,48,第48页,2.,在弹出窗口,Basic,页中选择,Console Application,,输入工程名称,选择是,c,工程,点击确定。,5.7.3 工程创建,49,第49页,3.,此时弹出对话框,要求指定工程存放路径。选择好路径后点击保留。,5.7.3 工程创建,50,第50页,4.,此时系统自动加入,main.c,文件以下。里面代码是系统自动,生成。,5.7.3 工程创建,51,第51页,二,.,往项目中增加已创建其它文件,点击菜单 工程,-,添加,5.7.3 工程创建,52,第52页,在弹出对话框中选择要添加源文件。然后点击打开。,5.7.3 工程创建,53,第53页,此时在工程管理页中出现了加入两个文件(mylib.c和mylib.h)。,5.7.3 工程创建,54,第54页,在工程管理页中点击,mylib.c,和,mylib.h,则右边代码区出现对应文件源代码。,5.7.3 工程创建,55,第55页,三、在当前工程中新建一个文件,菜单 工程,-,新建单元,5.7.3 工程创建,56,第56页,此时将加入一个文件(未命名,3,)。选择保留时,指定加入文件名字和保留路径(普通和工程在统一路径下)。以下列图所表示,5.7.3 工程创建,57,第57页,四,.,从工程中移除一个文件。,以下列图所表示。此时该文件在磁盘里还是存在,只是不包含在当前工程中了。,5.7.3 工程创建,58,第58页,五,.,编译文件,若选择编译,(Ctrl,F9),,则编译当前工程中全部文件。若只是想单独编译一个文件,则选择 编译当前文件,(Shift+Ctrl,F9),。,5.7.3 工程创建,59,第59页,此时存放工程路径下将出现以下文件:,注意:因为,mylib.c,和,mylib.h,存在于其它目录,所以在该工程文件所在目录中不出现。,.dev,是工程文件。双击该文件即可打开工程。,5.7.3 工程创建,60,第60页,61,第61页,展开阅读全文

咨信网声明:本文档由用户上传并分享,仅供学习交流、研究之用,未经授权,严禁复制、发行、汇编、翻译或网络传播等,侵权必究。
咨信网小贴示:
1、浏览或下载可查看了解,请点击【咨信网告知】。
2、下载文件中如有侵权或不适当内容,将立即纠正。
3、如果因为网速或其他原因下载失败请重新下载,重复下载[60天内]不扣币。
4、开具发票登录电脑端申请,请点击【索取发票】。
咨信网客服组:【微信客服】
1、浏览或下载可查看了解,请点击【咨信网告知】。
2、下载文件中如有侵权或不适当内容,将立即纠正。
3、如果因为网速或其他原因下载失败请重新下载,重复下载[60天内]不扣币。
4、开具发票登录电脑端申请,请点击【索取发票】。
咨信网客服组:【微信客服】


程序设计实践4w2-cchap5-函数.pptx
















自信AI助手














微信客服
客服QQ
发送邮件
意见反馈



链接地址:https://www.zixin.com.cn/doc/14207167.html