c语言程序设计(周经亚)第7章-利用函数实现模块化程序设计课件.ppt

上传人(卖家):晟晟文业 文档编号:4300926 上传时间:2022-11-27 格式:PPT 页数:42 大小:828KB
下载 相关 举报
c语言程序设计(周经亚)第7章-利用函数实现模块化程序设计课件.ppt_第1页
第1页 / 共42页
c语言程序设计(周经亚)第7章-利用函数实现模块化程序设计课件.ppt_第2页
第2页 / 共42页
c语言程序设计(周经亚)第7章-利用函数实现模块化程序设计课件.ppt_第3页
第3页 / 共42页
c语言程序设计(周经亚)第7章-利用函数实现模块化程序设计课件.ppt_第4页
第4页 / 共42页
c语言程序设计(周经亚)第7章-利用函数实现模块化程序设计课件.ppt_第5页
第5页 / 共42页
点击查看更多>>
资源描述

1、C语言程序设计 C语言程序设计周经亚jy_计算机科学与技术学院C语言程序设计 作用域含义:变量作用域是指该变量可以被访问的代码段范围根据作用域划分变量:1、局部变量:在某个函数内部(包括main)定义,隶属于该函数;作用范围为定义点到所属函数结束;2、全局变量:在函数(包括main)外部定义,不属于任何函数;作用范围为定义点到本源文件的结束,为本文件中其他函数所共用;C语言程序设计Soochow University2第7章 用函数实现模块化程序设计-IIC语言程序设计 全局/局部变量的注意点1)函数的形参是局部变量;2)复合语句中可定义变量;例如:if(ab)int temp;temp=a;

2、a=b;b=temp;3)不同函数中可以使用同名的局部变量,不同代码段中使用的同名变量的含义不同;4)全局变量与局部变量同名时,局部变量优先级高于全局变量;例如:C语言程序设计Soochow University3C语言程序设计 例如:int p=1,q=5;float f1(int a)int b,c;char c1;char f2(int x,int y)int b,j;main()int p,c1;C语言程序设计Soochow University4main()里看到的是局部变量pC语言程序设计 全局变量的说明o 全局变量的优点:n全局变量的作用是增加了函数间数据联系的渠道n命名惯例:例

3、如:int g_num;o 全局变量的缺点:n全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元n它使函数的通用性降低了,因为函数在执行时要依赖于其所在的外部变量。不符合:在程序设计中,在划分模块时要求模块的“内聚性”强、与其他模块的“耦合性”弱的原则n使用全局变量过多,会降低程序的清晰性,人们往往难以清楚地判断出每个瞬时各个外部变量的值o 建议:在程序中尽量限制使用全局变量!C语言程序设计Soochow University5C语言程序设计 变量的存储类别o 从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量。o 从变量值存在的时间(即生存期)角度来分,可以

4、分为静态存储方式和动态存储方式。n 静态存储方式是指在程序运行期间分配固定的存储空间的方式。n 动态存储方式则是在程序运行期间根据需要进行动态的分配存储空间的方式。C语言程序设计Soochow University6C语言程序设计 C程序的内存布局C程序一直由下列部分组成:1)正文段CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令;2)初始化数据段(数据段)在程序中所有赋了初值的全局变量,存放在这里。3)非初始化数据段(bss段)在程序中没有初始化的全局变量;内核将此段初始化为0。4)栈增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息(

5、返回地址;环境信息)。5)堆动态存储分配。|-|(后面会讲到的指针类型,它分配的内存空间就是在堆上)C语言程序设计Soochow University7|-|-|栈栈|-|/|-|堆堆|-|未初始化未初始化|-|初始化初始化|-|正文段正文段|-|C语言程序设计 C程序的内存布局/file.cint g_minV=0;/全局变量int max(int x,int y)g_minV=xy?x:y);int g_maxV;/全局变量void main()int x=6,y=9;maxV=max(x,y);printf(The max value:%d,g_maxV);printf(The min

6、value:%d,g_minV);C语言程序设计Soochow University8形参形参实参实参|-|-|栈栈|-|/|-|堆堆|-|未初始化未初始化|-|初始化初始化|-|正文段正文段|-|正文段正文段codecodeg_minV.g_maxV.堆堆x=6y=9.x=6y=9main()max()形参形参实参实参初始化初始化未初始化未初始化程序段程序段动动态态存存储储区区静态存静态存储区储区程序区程序区C语言程序设计 函数调用机制o 函数调用过程n建立被调函数的栈空间n保护调用函数的运行状态和返回地址o目的是保护好现场环境,以便函数调用完成后,能够返回到调用函数前程序运行的正确状态n传

7、递参数o传递的参数是放在栈空间中的,当函数调用完成,栈空间就会释放掉,所以默认情况下,传递的参数是按值传递的(也就是形参对实参进行值拷贝,形参和实参在内存中其实是两个完全不同的地址空间,只是二者的数值相同)n将控制权转交被调用函数o被调用函数按照程序员预先编好的指令(代码)开始执行C语言程序设计Soochow University9C语言程序设计 动态存储方式与静态存储方式o 存储类别n 数据在内存中存储的方法o 两大类:n 静态存储类和动态存储类。n 具体包含四种:自动的(auto),静态的(static),寄存器的(register),外部的(extern)n 根据变量的存储类别,可以知道

8、变量的作用域和生存期。C语言程序设计Soochow University10C语言程序设计 auto变量o 自动变量:n存储在动态存储区的变量n函数中的局部变量(包括函数形参),如不专门声明为static存储类别,都是动态地分配存储空间的。n自动变量用关键字auto作存储类别的声明。而且auto关键字可以省略.C语言程序设计Soochow University11例如:例如:int f(int a)/*定义定义f函数,函数,a为形参为形参*/auto int b,c3;/*定义定义b、c为自动变量为自动变量*/C语言程序设计 用static声明局部变量o 静态局部变量n 有时希望函数中的局部变

9、量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量已有值,就是上一次函数调用结束时的值,这时就应该指定该局部变量为“静态局部变量”。n 静态局部变量用关键字static进行声明n 例如:static int a=3;C语言程序设计Soochow University12C语言程序设计 静态变量f(int a)auto int b0;static int c3;bb1;cc1;return(abc);main()int a2,i;for(i0;i3;i)printf(d,f(a));C语言程序设计Soochow University13运行结果为:运行

10、结果为:789C语言程序设计 对静态局部变量的说明o(1)生存期n静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。n自动变量(即动态局部变量)属于动态存储类别,占动态存储区空间而不占静态存储区空间,函数调用结束后即释放。o(2)初始化n静态局部变量是在编译时初始化的,即只初始化一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。n自动变量初始化不是在编译时进行的,而是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。C语言程序设计Soochow University14C语言程序设计 对静态

11、局部变量的说明o(3)默认值:(在定义局部变量时不初始化)n静态局部变量在编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。n自动变量的值是一个不确定的值。这是由于每次函数调用结束后存储单元已释放,下次调用时又重新另分配存储单元,而所分配的单元中的值是不确定的。o(4)作用域n虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的,也就是说作用域属于定义变量的函数。(这是和全局变量的区别)n自动变量的作用域是属于定义变量的函数。C语言程序设计Soochow University15C语言程序设计 需用静态局部变量的几种情况o(1)需要保留函数上一次调用结束时的值。C语言程序

12、设计Soochow University16int fac(int n)static int f1;ff*n;return(f););main()()int i;for(i1;i5;i)printf(“d!d ”,i,fac(i)););printf(“n”);运行结果为:运行结果为:1!1 2!2 3!6 4!24 5!120C语言程序设计 需用静态局部变量的几种情况o(2)如果初始化后,变量只被引用而不改变其值,这时用静态局部变量比较方便,以免每次调用时重新赋值。o 静态局部变量的缺点n 用静态存储要多占内存(长期占用不释放,而不能像动态存储那样一个存储单元可供多个变量使用,节约内存),而

13、且降低了程序的可读性,当调用次数多时往往弄不清静态局部变量的当前值是什么。因此,如不必要,不要多用静态局部变量。C语言程序设计Soochow University17C语言程序设计 register变量o 一般情况下的变量存储及运算过程o 使用频繁的变量的特殊使用方法:寄存器变量n语言允许将局部变量的值放在CPU的寄存器中n存放在CPU寄存器中的变量叫做“寄存器变量”,用关键字register作声明。C语言程序设计Soochow University18C语言程序设计 例如int fac(int n)register int i,f1;*定义寄存器变量*for(i1;in;i)ff*i;ret

14、urn(f);main()int i;for(i1;i5;i)printf(“d!dn”,i,fac(i));C语言程序设计Soochow University19C语言程序设计 有关寄存器变量说明o(1)。在调用一个函数时占用一些寄存器以存放寄存器变量的值,函数调用结束释放寄存器。此后,在调用另一个函数时又可以利用它来存放该函数的寄存器变量。o(2)一个计算机系统中的寄存器数目是有限的,不能定义任意多个寄存器变量。o(3)局部静态变量不能定义为寄存器变量。不能写成register static int a,b,c;不能把变量a、b、c既放在静态存储区中,又放在寄存器中,二者只能居其一。对一个

15、变量只能声明为一个存储类别。C语言程序设计Soochow University20C语言程序设计 用extern声明外部变量o 外部变量(即全局变量)的作用域的规定:它的作用域为从变量的定义处开始,到本程序文件的末尾。在此作用域内,全局变量可以为程序中各个函数所引用。编译时将外部变量分配在静态存储区。o 外部变量(即全局变量)的作用域的扩展:有时需要用extern来声明外部变量,以扩展外部变量的作用域C语言程序设计Soochow University21C语言程序设计 用extern声明外部变量o 1.在一个文件内声明外部变量n 如果外部变量不在文件的开头定义,其有效的作用范围只限于从定义处开

16、始处起到文件终了的区域。如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。C语言程序设计Soochow University22C语言程序设计 例如/file.cint max(int x,int y)*定义max函数*return(xy?x y);main()extern A,B;/*外部变量声明*/printf(d,max(A,B);int A13,B8;/*定义外部变量*/C语言程序设计Soochow University23F用用extern

17、声明外部变量时,类型名可以写也可以省写。声明外部变量时,类型名可以写也可以省写。例如上例中的例如上例中的“extern int A;”也可以写成:也可以写成:“extern A;”。C语言程序设计 用extern声明外部变量o 2.在多文件的程序中声明外部变量n 多文件的程序结构中一个文件要使用另一个文件中定义的外部变量o 如果一个程序包含两个文件,在两个文件中都要用到同一个外部变量Num,不能分别在两个文件中各自定义一个外部变量Num,否则在进行程序的连接时会出现“重复定义”的错误。o 多文件的程序结构中外部变量引用的正确的做法:在任一个文件中定义外部变量Num,而在其他文件中用extern

18、对Num作“外部变量声明”。即extern Num;在编译和连接时,系统会由此知道Num是一个已在别处定义的外部变量,并将在另一文件中定义的外部变量的作用域扩展到本文件,在本文件中可以合法地引用外部变量Num。C语言程序设计Soochow University24C语言程序设计 多文件程序实例例 用extern将外部变量的作用域扩展到其他文件。本程序的作用是给定b的值,输入a和m,求ab和am的值。文件file1c中的内容为:int A;/*定义外部变量*/main()int power(int);/*对调用函数作声明*/int b3,c,d,m;printf(“enter the numbe

19、r a and its power m:n”);scanf(d,d,A,m);cA*b;printf(d*ddn,A,b,c);dpower(m);printf(“d*dd”,A,m,d);C语言程序设计Soochow University25文件文件file2c中的内容为:中的内容为:extern A;/*声明声明A为一个已定义的外部为一个已定义的外部变量变量*/power(int n)int i,y1;for(i1;in;i)y*A;return(y););C语言程序设计 用extern声明外部变量o 多文件中外部变量声明的注意事项:n用这样的全局变量应十分慎重,因为在执行一个文件中的函数

20、时,可能会改变了该全局变量的值,它会影响到另一文件中的函数执行结果。o 多文件中外部变量声明的深入理解:n先在本文件中找外部变量的定义,如果找到,就在本文件中扩展作用域。n如果找不到,就在连接时从其他文件中找外部变量的定义,如果找到,就将作用域扩展到本文件。n如果找不到,按出错处理。C语言程序设计Soochow University26C语言程序设计 用static声明外部变量o static声明的含义:有时在程序设计中希望某些外部变量只限于被本文件引用,而不能被其他文件引用。这时可以在定义外部变量时加一个static声明。C语言程序设计Soochow University27这里的这里的ex

21、ternextern声明声明是无效的是无效的file1.c file2.cfile1.c file2.cstatic int A;extern int A;static int A;extern int A;main()fun(int n)main()fun(int n).A=A A=A*n;n;C语言程序设计 用static声明外部变量o 静态外部变量n用static声明、只能用于本文件的外部变量(全局变量)称为静态外部变量。n在程序设计中,常由若干人分别完成各个模块,各人可以独立地在其设计的文件中使用相同的外部变量名而互不相干。只需在每个文件中的外部变量前加上static即可。这就为程序的

22、模块化、通用性提供方便。如果已知道其他文件不引用本文件的外部变量,可以对本文件中的外部变量都加上static,成为静态外部变量,以免被其他文件误用。o 重要理解:n需要指出对外部变量加static声明,并不意味着这时才是静态存储(存放在静态存储区中),而不加static的是动态存储(存放在动态存储区)。两种形式的外部变量都是静态存储方式,只是作用范围不同而已,都是在编译时分配内存的。C语言程序设计Soochow University28C语言程序设计 关于变量的声明和定义o 函数的声明和定义的明显区别:n 函数的声明是函数的原型,而函数的定义是函数的本身。n 其实声明就是通知编译器函数的类型,

23、参数的类型,返回值类型等;而定义是实实在在的分配内存空间。同理,变量的声明和定义也是一样o 变量的定义和声明之间的区别不是特别明显:n 定义性声明:o 需要建立存储空间的变量声明(如:int a;)n 引用性声明:o 不需要建立存储空间的声明(如:extern a;)。C语言程序设计Soochow University29C语言程序设计 关于变量的声明和定义o 广义地说,声明包括定义,但并非所有的声明都是定义。对“int a;”而言,它既是声明,又是定义。而对“extern a;”而言,它是声明而不是定义。o 一般为了叙述方便,把建立存储空间的声明称定义,而把不需要建立存储空间的声明称为声明。

24、显然这里指的声明是狭义的,即非定义性声明。C语言程序设计Soochow University30 main()extern A;/*是声明不是定义。声明是声明不是定义。声明A是一个已定义的外部变量是一个已定义的外部变量*/int A;/*是定义,定义是定义,定义A为整型外部变量为整型外部变量*/C语言程序设计 关于变量的声明和定义o外部变量定义和外部变量声明的含义是不同的n外部变量的定义只能有一次,它的位置在所有函数之外,而同一文件中的外部变量的声明可以有多次,它的位置可以在函数之内(哪个函数要用就在哪个函数中声明)也可以在函数之外(在外部变量的定义点之前)。o 变量的extern声明 只用作

25、声明,而不用于定义。o 变量的static声明n(1)对局部变量用static声明,则为该变量分配的空间在整个程序执行期间始终存在。n(2)全局变量用static声明,则该变量的作用域只限于本文件模块(即被声明的文件中)。o 某些声明不能单独进行n用auto、register、static声明变量时,是在定义变量的基础上加上这些关键字,而不能单独使用。C语言程序设计Soochow University31C语言程序设计 存储类别小结o 对一个数据的定义,需要指定两种属性:数据类型和存储类别,分别使用两个关键字。如:nstatic int a;(静态内部整型变量或静态外部整型变量)nauto c

26、har c;(自动变量,在函数内定义)o 用extern声明变量为已定义的外部变量,如:nextern b;(声明b是一个已被定义的外部变量)C语言程序设计Soochow University32C语言程序设计 从不同角度做归纳o(1)从作用域角度分,有局部变量和全局变量。o(2)从变量存在的时间来区分,有动态存储和静态存储两种类型。o(3)从变量值存放的位置来区分,可分为:n内存中静态存储区中存放;n内存中动态存储区中存放;nCPU中的寄存器中存放。o(4)关于作用域和生存期的概念。o(5)static对局部变量和全局变量的作用不同。o 详细的请参考原书内容C语言程序设计Soochow Un

27、iversity33C语言程序设计 内部函数和外部函数o 基本概念 n函数本质上是全局的,因为一个函数要被另外的函数调用,但是,也可以指定函数不能被其他文件调用。根据函数能否被其他源文件调用,将函数区分为内部函数和外部函数。o内部函数n内部函数的概念:如果一个函数只能被本文件中其他函数所调用,它称为内部函数。n内部函数定义方法 在定义内部函数时,在函数名和函数类型的前面加static。即static 类型标识符函数名(形参表)如static int fun(int a,int b)n内部函数又称静态函数。使用内部函数,可以使函数只局限于所在文件,如果在不同的文件中有同名的内部函数,互不干扰。这

28、样不同的人可以分别编写不同的函数,而不必担心所用函数是否会与其他文件中函数同名n通常把只能由同一文件使用的函数和外部变量放在一个文件中,在它们前面都冠以static使之局部化,其他文件不能引用。C语言程序设计Soochow University34C语言程序设计 外部函数o(1)在定义函数时,如果在函数首部的最左端冠以关键字extern,则表示此函数是外部函数,可供其他文件调用。如函数首部可以写为extern int fun(int a,int b)注意:C语言规定,如果在定义函数时省略extern,则隐含为外部函数。本书前面所用的函数都是外部函数。o(2)在需要调用此函数的文件中,用exte

29、rn声明所用的函数是外部函数。例。有一个字符串,内有若干个字符,今输入一个字符,要求程序将字符串中该字符删去。用外部函数实现。C语言程序设计Soochow University35C语言程序设计 多文件实例file1c(文件1)extern enter-string(char str80);extern delete-strin g(char str,char ch);extern print-string(char str);/*以上3行声明在本函数中将要调用的在其他文件中定义的3个函数*/main()char c;char str80;enter-string(str);scanf(“c”

30、,c);delete-string(str,c);print-string(str);C语言程序设计Soochow University36file2c(文件2)include enter-string(char str80)gets(str);*读入字符串str*C语言程序设计 多文件实例file3c(文件3)delete_string(char str,char ch)int i,;for(i=0;stri!=0;i)if(stri!=ch)strj+stri;strj0;file4c(文件4)print_string(char str)printf(s,str);C语言程序设计Sooch

31、ow University37运行情况如下:运行情况如下:abcdefgc(输入(输入str)c (输入要删去的字符)(输入要删去的字符)abdefg (输出已删去指定字符的字符串)(输出已删去指定字符的字符串)C语言程序设计 函数实例o 例题1:n 定义一个函数实现数组前后元素互换。如int ary5=1,2,3,4,5=ary5=5,4,3,2,1n 函数原型:o void convertArray(int array,int n);C语言程序设计Soochow University38in/2i=0;temp=arrayi;arrayi=arrayn-i-1;arrayn-i-1=tem

32、p;i+Y结束C语言程序设计 函数实例1C语言程序设计Soochow University39#include void convertArray(int array,int n)int i,temp;for(i=0;in/2;i+)temp=arrayi;arrayi=arrayn-i-1;arrayn-i-1=temp;void main()int array5=1,2,3,4,5;int i;for(i=0;i5;i+)printf(%3d,arrayi);printf(n);convertArray(array,5);for(i=0;i5;i+)printf(%3d,arrayi);p

33、rintf(n);C语言程序设计 函数实例2o 设计一个函数,实现字符串到double数据的转换。要求不使用系统函数。n用多文件形式实现 C语言程序设计Soochow University40/file1.cdouble strToDouble(char str)double num=0,multi=1;int flag=0,i=0;while(stri!=0)if(stri=.)flag=1;i+;continue;/处理整数部分if(flag=0)num=num*10+stri-0;/处理小数部分elsemulti*=10;num+=(stri-0)/multi;i+;C语言程序设计 函数

34、实例2/file2.c#include#include“file1.c”或 extern double strToDouble(char str);void main()char str20;double num;printf(Pleas input a number string:n);scanf(%s,str);num=strToDouble(str);printf(“原来字符串str:%sn,str);printf(“转换后的数:%fn,num);C语言程序设计Soochow University41C语言程序设计 作业(与上次作业一起检查)o【基本函数设计、用地址传递参数】用随机数来初始化一个整形数组,数组元素个数自定。编写一个函数,对数组进行排序。编写一个函数,在屏幕上输出数组内容,每行输出 5 个元素。编写主函数,调用上述函数测试其功能。o【基本函数设计或递归函数设计】从键盘输入一个十进制正整数,输出这个整数的二进制形式。转换过程用一个函数来完成。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(c语言程序设计(周经亚)第7章-利用函数实现模块化程序设计课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|