模块化程序设计.pptx

上传人:莉*** 文档编号:77731958 上传时间:2023-03-16 格式:PPTX 页数:144 大小:653.34KB
返回 下载 相关 举报
模块化程序设计.pptx_第1页
第1页 / 共144页
模块化程序设计.pptx_第2页
第2页 / 共144页
点击查看更多>>
资源描述

《模块化程序设计.pptx》由会员分享,可在线阅读,更多相关《模块化程序设计.pptx(144页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、C语言程序设计(2)通过给变量定义不同的存储类别,控制模块内部及外部的信息交换。(3)具有编译预处理功能,为程序的调试、移植提供了方便,也支持了模块化程序设计。第1页/共144页C语言程序设计第一节 函 数一、设计C语言程序就是设计函数用C语言设计程序,任务只有一种,就是编写函数,至少也要编写一个main函数。执行C程序也就是执行相应的main函数。即从main函数的第一个前花括号开始,依次执行后面的语句,直到最后的后花括号为止。第2页/共144页C语言程序设计模块化程序设计有一个原则:就是每个模块的规模一般不能太大(一般要控制在4060行之间),以便于阅读,便于检查其中的错误。在C语言中,减

2、少主函数规模的一项基本措施就是通过调用其它函数来实现主函数需要的一些功能。第3页/共144页main(void)main(void)main(void)main(void)f1();f1();f1();f1();f2();f2();f2();f2();return 0;return 0;return 0;return 0;操操作作系系统统f1()f1()f1()f1()f11();f11();f11();f11();f2()f2()f2()f2()f21();f21();f21();f21();f22();f22();f22();f22();f11()f11()f11()f11()f21()f

3、21()f21()f21()f22()f22()f22()f22()一般C语言程序的执行过程第4页/共144页main()main()f1()f1()f2()f2()f22()f22()f21()f21()f11()f11()参数参数参数参数参数参数参数参数参数参数返回返回返回返回返回返回返回返回返回返回程序结构图第5页/共144页大学信息管理系统办办公公室室管管理理图图书书管管理理设设备备管管理理教教务务管管理理科科研研管管理理人人事事管管理理财财务务管管理理后后勤勤管管理理学学籍籍管管理理成成绩绩管管理理排排课课管管理理第6页/共144页第7页/共144页C语言程序设计二、函数结构一个C语

4、言函数的结构形式如下:函数头函数体第8页/共144页C语言程序设计1.函数头函数头结构:函数类型 函数名(形式参数表列)一个函数的函数头的结构如下:(1)函数类型:指定函数值的类型,即函数返回值的类型。(2)函数名:必须采用合法的用户标识符。(3)圆括号:是“函数运算符”,表示进行函数运算,函数运算符具有很高的运算优先级别。第9页/共144页C语言程序设计(4)形式参数表:由写在一对圆括号(函数运算符)中的一系列参数组成。每一个参数由一个类型符和一个参数名组成。参数名是合法的标识符。函数可以没有参数,这时在函数运算符内写一个“void”,也可以空白,但小括号不能省略。第10页/共144页C语言

5、程序设计2.函数体函数体由一些语句组成。主要是三种类型的语句:声明语句:声明在函数中要使用的变量等程序实体。可执行语句:用来实现函数的功能,包括若干流程控制语句和表达式语句。return语句:停止本函数的执行,使流程返回到调用处。第11页/共144页C语言程序设计编译器将函数分为三类进行处理:纯粹计算型函数,如sqrt()和sin()。将返回一个计算结果。完成一项具体工作,返回完成的成败。如printf()执行成功时,返回显示的字节数;失败时,返回一个负整数。函数不产生返回值,其类型应定义为void。C99规定,对于非void类型的函数,必须使用有返回值的return语句。第12页/共144页

6、int absolutevalue(int x)/*绝对值函数*/return(x=0?x:-x);void spc(int n)/*n空格函数*/int i;for(i=0;in;i+)printf();return;/*可以不要return语句*/第13页/共144页float y(float x)if(x10)return(2*n+3);elsereturn;平行的两个返回语句,返回值不平行的两个返回语句,返回值不同,编译时可能出现警告错误,同,编译时可能出现警告错误,但不影响使用,结果不可预测。但不影响使用,结果不可预测。第15页/共144页C语言程序设计3.函数中变量的作用域作用域指

7、的是一个程序段中的变量的作用范围,在一个函数中定义的变量只在本函数中有效,在其它函数中不能使用这个变量。因此说,该变量的作用域是它所在的函数(从定义该变量的行开始到函数末尾)。即使在不同的函数中定义了同名的变量,它们也是指不同的变量。第16页/共144页#include int func(int x)x=5;return x+3;int main(void)printf(x=%dn,x);return 0;这个程序企图在这个程序企图在mainmain函数中使用函数中使用funcfunc函数中的变量函数中的变量x x。编译这个程序,。编译这个程序,系统将给出如下编译错误:系统将给出如下编译错误:

8、c(12):error C2065:x:c(12):error C2065:x:undeclared identifierundeclared identifier(未声明的标识符未声明的标识符 )第17页/共144页C语言程序设计4.空函数空函数是一个不产生任何有效操作的函数,但它却是一个合法的C函数。例如函数voidnull(void)就是一个空函数。空函数多使用在模块化程序的设计或测试中。有一些函数还未编写,可用空函数进行调试,这样就可以调试程序的其它部分,等以后再逐步补上。第18页/共144页C语言程序设计三、函数定义与函数声明1、函数定义函数定义是按照C语言的语法规则引入新的函数,并

9、提供如下信息:函数的返回值类型(如果有);参数的个数及类型和名称;调用函数时要执行的代码;函数的有效性(不能嵌套定义)。第19页/共144页C语言程序设计函数的定义类型说明符 函数名(类型名 形式参数1,类型名 形式参数2,)/*函数的首部 */说明部分 /*函数体 */语句部分 第20页/共144页C语言程序设计其中类型说明符和函数名部分共称为函数头。类型说明符即本函数的类型,实为函数返回值的类型。函数名是由用户定义的标识符,函数名后有一个括号,其内容为形参表。在形参表中给出的参数称为形式参数,即形式参数变量的定义,各参数定义之间用逗号间隔。在进行函数调用时,主调函数将赋予这些形式参数实际的

10、值。当形参表中无参数时,括号不可少。中的内容称为函数体。在函数体中也有类型说明,这是对函数体内部所用到的变量的类型说明。第21页/共144页注意:函数不能嵌套定义。void fun1()int fun2()而而应该为如下形式如下形式:void fun1()int fun2()第22页/共144页C语言程序设计2、函数的返回值及其类型(1)return语句函数的返回值通过函数体内的return语句实现。return 返回值表达式;或return (返回值表达式);如果没有返回值,格式中的左、右圆括号可以省略,即写为:return ;功能:返回调用函数,并将“返回值表达式”的值带给调用函数。第23

11、页/共144页C语言程序设计说明:1)函数的返回值只能有一个。2)当函数中不需要指明返回值时,可以写成:return;也可以不写。函数运行到右花括号自然结束。3)一个函数体内可以有多个返回语句,不论执行到哪一个,函数都结束,回到主调函数。4)当函数没有指明返回值,即return;或没有返回语句时,函数执行后实际上不是没有返回值,而是返回一个不确定的值,有可能给程序带来某种意外的影响。第24页/共144页C语言程序设计(2)函数返回值的类型函数定义时的类型就是函数返回值的类型。从理论上,C语言要求函数定义的类型应当与返回语句中表达式的类型保持一致。当两者不一致时,系统自动进行转换,将函数返回语句

12、中表达式的类型转换为函数定义时的类型。如果定义函数缺省函数类型,则系统一律按int型处理。第25页/共144页C语言程序设计3、函数声明函数声明是对所用到的函数的特征进行必要的声明。编译系统以函数声明为检测依据:检测形参与实参类型是否一致,返回值的类型是否正确,以保证调用表达式与函数之间的参数正确传递。声明语句提供的必要信息包括:函数名,函数的类型,函数参数的个数、排列次序以及每个参数的类型。第26页/共144页C语言程序设计函数的定义可以按任意的次序,但在主调函数中,要调用另一个函数,则需要对被调函数先做声明(或者说明)。所谓声明,就是把函数的类型、函数的名称、函数形参的类型及个数、顺序通知

13、编译系统,便于在调用时进行检查。函数声明的一般形式:函数类型 函数名(参数类型1,参数类型2);或 函数类型 函数名(参数类型1 参数名1,参数类型2 参数名2);第27页/共144页C语言程序设计说明:(1)如果被调函数的返回值为int类型,则不管被调函数位置如何均不需要在主调函数中说明。(2)如果被调用函数的声明放在源文件的开头,则该声明对整个源文件都有效。(3)如果被调用函数的声明是在调用函数定义的内部,则该声明仅对该调用函数有效。第28页/共144页C语言程序设计(4)在函数调用中,有下面几种情况可以省略声明:a.如果调用函数和被调用函数是在同一个源文件中,而且被调用函数的定义是在调用

14、函数之前。b.函数的返回值是整数或字符。c.所有被调用函数的声明都是在源文件开头。d.如果被调用函数不是在源文件开头,而是在源文件中间且在所有函数之外某处被声明时,则在被声明之后引用它时,不必再声明,但在被声明之前引用它时,需要对其进行声明。(5)如果调用函数和被调用函数的定义是在同一源文件中,应该先说明或定义被调用函数。第29页/共144页设有一函数的定义为:double func(double a,int b,char c)/*函数体*/与之相应的函数声明应为:double func(double x,int y,char z);/*注意末尾的分号*/第30页/共144页3131C语言程序

15、设计例求二实数之和main()floatadd(float,float);floata,b,c;scanf(%f%f,&a,&b);c=add(a,b);/*函数表达式调用形式*/printf(sum=%f;c);floatadd(floatx,floaty)floatz;z=x+y;returnz;说明:调用过程中参数的对应关系。第31页/共144页C语言程序设计例定义一个求两个整数中极大值的max()函数。/*功能:求2个整数中的较大数*/*形参:2个,整型*/*返回值:2个整数中的较大数*/intmax(intn1,intn2)/*函数定义*/intz;z=n1n2?n1:n2;retu

16、rn(z);第32页/共144页C语言程序设计voidmain(void)intmax(intn1,intn2);/*对被调函数说明*/intnum1,num2;printf(inputtwonumbers:);scanf(%d%d,&num1,&num2);printf(max=%dn,max(num1,num2);第33页/共144页C语言程序设计四、虚实结合与传值调用一个函数中的函数体,只有在该函数被调用时才会执行。在函数被调用时进行如下两个操作:将函数调用中的实际参数值传送给函数定义中的形式参数;将流程从调用处转到被调用函数的开头,开始执行函数体中的代码。第34页/共144页C语言程序

17、设计1、函数调用的一般形式格式:函数名(实参表)函数按名称调用。如果是调用无参函数,则实参表可以没有,但括号不能省略。用逗号分隔多个实参。实参与形参的个数应相等,类型应一致。实参与形参按顺序对应,一一传递数据。调用时,实参必须具有确定的值,且与形参个数相等、类型匹配。第35页/共144页C语言程序设计(1)形参与实参形式参数:定义函数时函数名后面括号中的变量名实际参数:调用函数时函数名后面括号中的表达式开参是虚的,类似于占位符,而实参是实的,具体的。形参出现在函数定义中,只能在该函数体内表示欲处理的数据,并没有确定的值。发生函数调用时,调用函数把实参的值传送给被调用函数中的形参,从而实现调用函

18、数向被调用函数的数据传送。第36页/共144页C语言程序设计(2)函数调用的方式按函数在程序中出现的位置分,有2种函数调用方式。1)函数语句函数语句的调用,是指把被调函数作为一个独立的语句直接出现在主调函数中。2)函数表达式被调函数出现在主调函数中的表达式中,这种表达式称为函数表达式。在被调函数中,必须有一个函数返回值,返回主调函数以参加表达式的运算。第37页/共144页C语言程序设计(3)说明1)按函数名调用函数。2)实参在类型上按顺序与形参一一对应和匹配。如果类型不匹配,C编译程序将按赋值兼容的规则进行转换。如果实参和形参的类型不赋值兼容,通常并不给出出错信息,且程序仍然继续执行,只是得不

19、到正确的结果。3)实参可以是常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此,应预先用赋值、输入等办法,使实参获得确定的值。第38页/共144页C语言程序设计4)形参变量只有在被调用时,才分配内存单元;调用结束时,即刻释放所分配的内存单元。因此,形参只有在该函数内有效。调用结束,返回调用函数后,则不能再使用该形参变量。5)实参对形参的数据传送是单向的,即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。6)实参和形参占用不同的内存单元,即使同名也互不影响。第39页/共144页2、函数调用时的虚实结合参数是函数调

20、用时进行信息交换的载体。实参是调用函数中的变量,形参是被调函数中的变量。函数调用时实现了实参与形参的结合。这称为“虚实结合”。第40页/共144页#include float add();int main(void)float x=1.5,y=-5.7;printf(%f+%f=%fn,x,y,add(x,y);float add(unsigned int a,unsigned int b)printf(a=%u,b=%un,a,b);return(a+b);分析结果为什么错分析结果为什么错误?误?如何改正?如何改正?第41页/共144页3、传值调用的虚实结合过程程序进行编译时,并不为形式参数

21、分配存储空间。只有在被调用时,形式参数才临时地占有存储空间,其过程如下:(1)调用开始,系统为形参开辟一个临时存储区,形参与实参各占一个独立的存储空间。(2)将各实参之值传递给对应形参,形参得到了实参的值。这种虚实结合方式称为“值结合”。第42页/共144页(3)函数返回时,临时存储区也被撤销。特别注意:在C程序中实参与形参是传值调用(callbyvalue)的特点。即实参与形参是“单向的值传递”即函数中对形参变量的操作不会影响到调用函数中的实参变量,即形参值不能传回给实参。第43页/共144页#include void swap(int x,int y);int main(void)int

22、a=3,b=5;swap(a,b);printf(a=%d,b=%dn,a,b);return 0;void swap(int x,int y)int temp;temp=x,x=y,y=temp;/*交换变量的值*/printf(x=%d,y=%dn,x,y);执行结果:x=5,y=3a=3,b=5企图交换变量a,b的值,没有成功第44页/共144页五、函数的嵌套调用语言的函数定义是互相平行、独立的函数不能嵌套定义可以嵌套调用函数调用一个函数的过程中,又可以调用另一个函数。第45页/共144页函数的嵌套调用的过程main函数调用a函数结束a函数调用b函数b函数第46页/共144页C语言程序设

23、计例一个偶数为两个素数之和。德国数学家哥德巴赫(GoLdbach)在1725年写给欧拉(Euler)的信中写下了以下猜想:任何不小于6的偶数都是两个素数之和(俗称为1+1)。如633,1257等等。两个多世纪过去了,这一猜想既无法证明也没被推翻。试设计程序验证这一猜想是否成立。对于一个偶数,找出一个小于它的数,判断是否是素数,如果是就计算该偶数与该素数的差并判断它是否是素数。如果两者都是素数则猜想得到验证。问题表现为:任意输入一个偶数,可将其分解为两个素数之和。第47页/共144页4848C语言程序设计#includemain()voideven(intx);inta;printf(“请输入一

24、个偶数:”);scanf(“%d”,&a);if(a%2=0)even(a);/*函数调用语句*/elseprintf(“所输入的数不是偶数!n”);第48页/共144页4949C语言程序设计voideven(intx)intisprime(inta);inti;for(i=2;i=x/2;i+)if(isprime(i)&isprime(x-i)printf(“%d=%d+%dn”,x,i,x-i);return;第49页/共144页C语言程序设计intisprime(inta)inti;for(i=2;i=a/2;i+)if(a%i=0)return0;return1;注意两个返回语句。第

25、50页/共144页C语言程序设计例输入一个由若干个单词组成的文本串,每个单词之间用空格、换行符、跳格符(制表符)分隔,且分隔符可以不至一个(如连续的两个空格),以作为输入的结束标志,统计此文本串单词的个数?如输入:Thisisastudent.分析:因为计算机无法直接识别单词因为计算机无法直接识别单词,所以从输入的文本串中逐个读取每一个字符,当读到每一个单词的第一个字母时,计数器加1。如何知道读取到的字符是单词的第一个字母呢?如果读取到的字符是分隔符,则不是单词的一部分;如果读取到的字符不是分隔符,且它的上一个字符是分隔符,则它是单词的第一个字母,计数器加1。如果读取到的字符不是分隔符,且它的

26、上一个字符也不是分隔符,则它是单词的非首字母,计数器不加1。第51页/共144页C语言程序设计当前读取到的字符是否是单词的一部分,可用一个状态变量来表示,如果是单词的一部分,则用1表示,反之用0表示。#include#defineIN1#defineOUT0intcountword();main()intn;n=countword();printf(“单词数为:%dn”,n);第52页/共144页5353C语言程序设计intcountword()/*没有形参*/intc,nw,state;state=OUT;nw=0;while(c=getchar()!=)if(c=|c=n|c=t)stat

27、e=OUT;elseif(state=OUT)state=IN;nw+;return(nw);第53页/共144页六、递归函数一个函数可以调用另一个函数。递归函数一个函数自己调用自己(直接地或间接地调用自己)。前者称为直接递归调用函数,后者称为间接递归调用函数。1.递归调用次数有限2.程序执行有规律3.有结束调用的条件第54页/共144页C语言程序设计递归调用是指一个函数直接或间接地调用自己。这种函数称为递归函数。自己调用自己,即要解决一个问题,转化为一个用同样的方法解决的新问题,只是参数在不断地递增或者递减。在递归调用中,主调函数又是被调函数。执行递归函数将反复调用其自身。对于一些特定的问题

28、,用递归算法来解决,可以简化问题的复杂程度。第55页/共144页2/15/202356第56页/共144页2/15/202357第57页/共144页C语言程序设计例:用递归调用求n!。要用递归法解决此问题,必须明确两个问题:、递归算法n!=n*(n-1)!(n-1)!=(n-1)*(n-2)!;求n的阶乘的问题,转化为用同样的方法求(n-1)的阶乘。如:4!4*3!3!3*2!如果编写成一个函数,则调用如下:f(n)=n*f(n-1);不断地自己调用自己。第58页/共144页C语言程序设计、递归终结条件递归到一定的程度后,必须终止。如求阶乘时,当求到1!时,必须停止递归。f(1)=1这一条是必

29、须的,否则将会没完没了的进行下去。通常用条件判断,满足某种条件后就不再作递归调用,然后逐层返回。第59页/共144页C语言程序设计例如有函数f如下:intf(intx)z=f(x1);returnz;上页中的函数是一个递归函数。但是运行该函数将无休止地调用其自身,这当然是不正确的。为了防止递归调用无终止地进行,必须在函数内有终止递归调用的手段。第60页/共144页C语言程序设计例用递归法计算n!。#includelongf(intn)longy;if(n1)y=n*f(n-1);elsey=1;return(y);第61页/共144页6262C语言程序设计main()intn;longy;pr

30、intf(“inputainteagernumber:”);scanf(%d,&n);y=f(n);printf(%d!=%ldn,n,y);程序运行情况如下:inputainteagernumber:55!=120第62页/共144页C语言程序设计程序说明:程序中给出的函数f是一个递归函数。主函数调用f后即进入函数f执行,如果n0,n=0或n=1时都将结束函数的执行,否则就递归调用f函数自身。由于每次递归调用的实参为n-1,即把n-1的值赋予形参n,最后当n-1的值为1时再作递归调用,形参n的值也为1,将使递归终止。然后可逐层退回。第63页/共144页C语言程序设计如求4!的过程分解如下:f

31、(4)=4*f(3)f(3)=3*f(2)f(2)=2*f(1)f(1)=1f(4)=4*6=24f(3)=3*2=6f(2)=2*1=2第64页/共144页C语言程序设计例:用 递 归 法 求 菲 波 那 契 数 列 第 40项 的 值,该 数 列 为:1,1,2,3,5,8,13,21,规律:每一项为其前两项的和。递归算法如下:fib(n)=fib(n-1)+fib(n-2);递归的终结条件如下:fib(1)=1;fib(2)=1;第65页/共144页C语言程序设计#includemain()intn;longfib(int);/*第40项的值很大*/printf(“请输入项数:”);sc

32、anf(“%d”,&n);printf(“第%d项的值为:%ldn”,n,fib(n);第66页/共144页6767C语言程序设计longfib(intn)longresult;if(n=1|n=2)result=1;elseresult=fib(n-1)+fib(n-2);returnresult;第67页/共144页第二节 变量的存储属性变量是对程序中数据存储的抽象。C语言程序中变量都有类型,数据类型是变量的运算属性的抽象,决定了该变量的取值范围和可以施加的运算种类。除此之外,变量还有一些属性,例如:一个变量在程序的哪个范围内是可以使用的变量的可用域;它什么时候生成以及什么时候被撤消变量的

33、生存期;第68页/共144页它存储在什么哪种类型的存储器中以及用什么机制进行存储变量的存储区。这些都称为变量的存储属性。第69页/共144页一、变量的作用域与生存期在函数中形参变量只在被调用期间才分配内存单元,调用结束立即释放。形参变量只有在函数内才是有效的,离开该函数就不能再使用了。如:货币的使用范围,校园卡的使用范围。1.局部变量和全局变量变量的可用域是指一个变量在程序的哪个域内才是可以被识别的,也称为可见(或可用)的。变量可分为两种:全局可用全局变量局部可用局部变量。第70页/共144页C语言程序设计局部变量:在一个函数或者复合语句(如函数体、循环体)内部定义的变量是局部变量,它只在该函

34、数或者复合语句范围内有效。而在其它函数内不能使用。只有在包含变量定义的函数内部,才能使用被定义的变量,在此函数之外就不能使用这些变量了。又称为内部变量。例如:intf1(inta)/*函数f1*/intb,c;/*a,b,c作用域:仅限于函数f1()中*/第71页/共144页C语言程序设计intf2(intx)/*函数f2*/inty,z;/*x,y,z作用域:仅限于函数f2()中*/main()intm,n;/*m,n作用域:仅限于函数main()中*/由于局部变量只在一个局部范围中使用,因此在不同的函数中可以定义同名的局部变量,它们互不干扰,各自分配不同的独立存贮单元。这种特性便于进行模块

35、化设计,不同的模块由不同的程序员设计,各模块中使用的变量名由用户自己确定,即便相同也不会彼此影响。第72页/共144页7373C语言程序设计#includemain()voidfun1();voidfun2();intx=1;printf(“x=%dn”,x);intx=3;printf(“x=%dn”,x);printf(“x=%dn”,x);fun1();printf(“x=%dn”,x);fun2();printf(“x=%dn”,x);fun1();第73页/共144页C语言程序设计fun1()intx=5;printf(“x=%dn”,x);fun2()intx=7;printf(“

36、x=%dn”,x);说明:四个X分别分配了不同的存贮单元。同一函数的两次调用分配了不同的单元。第74页/共144页#include#include#include#include int main(void)int main(void)int main(void)int main(void)/*printf(a1=%d,a);*/*printf(a1=%d,a);*/*printf(a1=%d,a);*/*printf(a1=%d,a);*/int a=3;int a=3;printf(a2=%d,a);printf(a2=%d,a);int b=5;int b=5;printf(b1=%d,

37、b);printf(b1=%d,b);/*printf(b2=%d,b);*/*printf(b2=%d,b);*/printf(a3=%d,a);printf(a3=%d,a);return 0;return 0;b b的作用域a a a a的作用域的作用域则运行可以得到如则运行可以得到如下结果:下结果:a2=3a2=3b1=5b1=5a3=3a3=3第75页/共144页C语言程序设计全局变量:也称为外部变量,是在函数外部定义的变量,作用域为从定义全局变量位置开始到源程序结束,是多个函数间进行数据传递的一种手段。全局变量可以在其作用范围内,由各函数所共用。在函数中使用全局变量,一般应作全局变

38、量说明。只有在函数内经过说明的全局变量才能使用。全局变量的说明符为extern。但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。第76页/共144页C语言程序设计例如:inta,b;/*外部变量*/voidf1()/*函数f1*/floatx,y;/*外部变量*/intf2()/*函数f2*/第77页/共144页C语言程序设计main()/*主函数*/*全局变量x,y作用域全局变量a,b作用域*/从上例可以看出a、b、x、y都是在函数外部定义的外部变量,都是全局变量。但x,y定义在函数f1之后,而在f1内又无对x,y的说明,所以它们在f1内无效。a,b定义在源程序最前面,因此在f

39、1,f2及main内不加说明也可使用。第78页/共144页7979C语言程序设计#includeinta=3,b=5;main()voidfun();printf(“a=%d,b=%dn”,a,b);fun();printf(“a=%d,b=%dn”,a,b);voidfun()intc;c=a;a=b;b=c;printf(“a=%d,b=%dn”,a,b);第79页/共144页C语言程序设计【例】输入长方体的长宽高l,w,h。求体积及三个面x*y,x*z,y*z的面积。ints1,s2,s3;intvs(inta,intb,intc)intv;v=a*b*c;s1=a*b;s2=b*c;s

40、3=a*c;returnv;第80页/共144页C语言程序设计main()intv,l,w,h;printf(ninputlength,widthandheight:);scanf(%d%d%d,&l,&w,&h);v=vs(l,w,h);printf(v=%ds1=%ds2=%ds3=%dn,v,s1,s2,s3);程序运行结果如下:inputlength,widthandheight:456v=120s1=20s2=30s3=24第81页/共144页C语言程序设计程序说明:本程序中定义了三个外部变量s1,s2,s3,用来存放三个面积,其作用域为整个程序。函数vs用来求正方体体积和三个面积,

41、函数的返回值为体积v。由主函数完成长宽高的输入及结果输出。由于语言规定函数返回值只有一个,当需要增加函数的返回数据时,用外部变量是一种很好的方式。本例中,如不使用外部变量,在主函数中就不可能取得v,s1,s2,s3四个值。而采用了外部变量,在函数vs中求得的s1,s2,s3值在main中仍然有效。因此外部变量是实现函数之间数据传输的有效手段。第82页/共144页C语言程序设计当在函数外定义了一个全局变量后,定义点之后的函数都可以使用该变量.当全局变量的值在一个函数中改变后,另一个函数使用的就是改变后的值.从定义开始到程序结束,全局变量自始至终占用存储空间.全局变量的使用使函数间的联系加强,与程

42、序设计”低耦合”的原则相违背,所以很少使用。第83页/共144页例同名局部变量#include int main(void)int a=3;printf(a1=%d,a);int a=5;printf(a2=%d,a);return 0;第84页/共144页例演示全局变量#include void a()int a=1;printf(a1=%dn,a);printf(x1=%dn,x);int x=3;*定义外部变量*/void b()printf(x2=%dn,x);int main(void)a();b();printf(x3=%dn,x);return 0;例演示全局变量与局部变量同名#

43、include int x=3;/*定义外部变量*/int main(void)int x=5;printf(x=%dn,x);return 0;第85页/共144页2.动态变量与静态变量运行中的程序,在内存中被分成代码区和数据区两大部分。数据区又分为静态存储区、自动存储区和动态分配区三部分。自动存储区是按栈组织的存储区。除特别声明的外,局部变量通常被存放在栈区。这些变量在进入所在的块时被创建,所在的块结束时被撤销,其值不再保留。并且,变量必须有程序员显式地进行初始化,否则它们的初始值是不确定的。第86页/共144页静态存储区是在程序编译时就分配的存储区。分配在静态存储区的变量在程序开始执行时

44、被创建并自动初始化(数值变量被初始化为0),当程序结束时才被撤销。所以常称静态变量的生存期是永久的。全局变量就是被分配在静态存储区的。第87页/共144页/*企图交换两个变量的值*/#includevoidswap(void);/*说明函数*/inta=3,b=5;/*声明外部变量*/intmain(void)printf(a=%d,b=%dn,a,b);swap();printf(a=%d,b=%dn,a,b);return0;voidswap(void)intc;/*声明自动变量*/c=a;a=b;b=c;/*交换变量的值*/第88页/共144页二、C语言中变量的存储类型根据可用域和生存期

45、,变量有4种存储类型:局部自动类型,在函数内部用标识符auto或register声明。静态局部类型,在函数内部,使用static声明。静态全局类型,在函数外部,使用static声明,也称静态外部变量。全局类型,不需要标识符声明。在函数外部直接声明即可,通称外部变量。第89页/共144页1、auto存储类型和register存储类型使用auto声明的变量是局部变量,编译器将其分配在自动存储区。其格式为:auto数据类型变量名=初值表达式,;其中方括号表示可省略,省略auto,系统隐含认为此变量为auto。函数的参数(形参)也是一种自动变量。第90页/共144页C语言程序设计自动变量的类型说明符为

46、auto;语言规定,函数内凡未加存储类型说明的变量均视为自动变量,也就是说自动变量可省去说明符auto。在前面所学的程序中定义的变量凡未加存储类型说明符的都是自动变量。第91页/共144页C语言程序设计例如:inta,b,k;charc;等价于:autointa,b,k;autocharc;第92页/共144页C语言程序设计自动变量的特点:自动变量的作用域仅限于定义该变量的函数或复合语句内。自动变量存贮在自动存贮区,只有在使用它,即定义该变量的函数被调用时才给它分配存储单元,开始它的生存期。函数调用结束,释放存储单元,结束生存期。因此函数调用结束之后,自动变量的值不能保留。未初始化时,自动变量

47、的值是不确定的。由于自动变量的作用域和生存期都局限于定义它的函数或复合语句内,因此不同的函数中允许使用同名的变量而不会混淆。第93页/共144页C语言程序设计寄存器变量的说明符是register。存放在CPU的寄存器中,使用时,不需要访问内存,而直接从寄存器中读写,这样可提高访问效率。特点:加快运算速度,函数运行完即消失、使用有限。如定义一个频繁使用的变量为寄存器类型:registerinti;第94页/共144页C语言程序设计2、静态局部类型类型说明符:static,属于静态存储方式;在一个函数内部,可以用static定义一个变量,称为静态局部变量。其作用域仍在定义它的函数内部,但其生存期却

48、程序运行期。函数调用结束后,并不释放所占用的存贮空间(总是占用固定的存贮空间),在程序运行期间,始终存在,但除了定义它的函数以外,别的函数不能使用。整个程序运行结束后,才释放占用的空间。第95页/共144页C语言程序设计静态局部变量的特点:(1)静态局部变量在每次调用函数结束后能够保留调用结束后的值不变,留待下一次调用,变量值具有继承性。(2)静态局部变量只限于被本函数使用,不能被其他函数使用(3)静态局部变量属于静态存储类别,在整个程序运行期间都不释放;而动态存储变量属于动态存储类别,函数调用结束即释放,再次调用又将重新分配空间。(4)在定义静态局部变量时,如果不赋初值,系统自动赋值为0或空

49、字符(对字符型变量)。第96页/共144页9797C语言程序设计#includefunc()staticintb=10;b=b+2;returnb;main()inti;for(i=1;i4;i+)printf(“%d,b=%dn”,i,func();第97页/共144页#include void increment(void);int main(void)increment();increment();increment();return 0;void increment(void)int x=0;/*auto*/x+;printf(%dn,x);运行结果:运行结果:1 11 11 1第98

50、页/共144页#include void increment(void);int main(void)increment();increment();increment();return 0;void increment(void)static int x=0;/*使用了static说明符*/x+;printf(%dn,x);运行结果:运行结果:1 12 23 3第99页/共144页3、静态全局类型在多文件程序中,用static声明外部变量,使该外部变量的作用域仅限于所在的文件,而不用static声明的外部变量的作用域为整个程序。例如:某个程序中要用到大量函数,而有几个函数需要共同使用几个全局

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > PPT文档

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁