C语言程序设计Chapter7

上传人:s9****2 文档编号:569278227 上传时间:2024-07-28 格式:PPT 页数:64 大小:638.50KB
返回 下载 相关 举报
C语言程序设计Chapter7_第1页
第1页 / 共64页
C语言程序设计Chapter7_第2页
第2页 / 共64页
C语言程序设计Chapter7_第3页
第3页 / 共64页
C语言程序设计Chapter7_第4页
第4页 / 共64页
C语言程序设计Chapter7_第5页
第5页 / 共64页
点击查看更多>>
资源描述

《C语言程序设计Chapter7》由会员分享,可在线阅读,更多相关《C语言程序设计Chapter7(64页珍藏版)》请在金锄头文库上搜索。

1、第第7 7章章 函函 数数1模块化程序设计模块化程序设计基本思想:将大的程序按功能分割成一些小模块基本思想:将大的程序按功能分割成一些小模块,特点:特点:各模块相对独立、功能单一、结构清晰简单各模块相对独立、功能单一、结构清晰简单控制了程序设计的复杂性控制了程序设计的复杂性每个模块简单,所以可靠性高每个模块简单,所以可靠性高避免程序开发的重复劳动,缩短开发周期避免程序开发的重复劳动,缩短开发周期易于维护和功能扩充易于维护和功能扩充开发方法开发方法:自上向下,逐步分解,分而治之自上向下,逐步分解,分而治之,是是面面向过程向过程程序设计语言的核心程序设计语言的核心第第7章章 函数函数7.1.1 C

2、程序的结构程序的结构 2 C C程序基本结构程序基本结构C C程序程序源程序文件源程序文件1 1源程序文件源程序文件2 2源程序文件源程序文件n n预编译命令预编译命令函数函数1 1函数函数2 2说明部分说明部分执行部分执行部分3p 可由可由一个或多个源程序一个或多个源程序文件组成;文件组成;p 每个源程序文件又由若干每个源程序文件又由若干函数函数构成;构成;p 但整个程序但整个程序有且仅有一个主函数有且仅有一个主函数;p 程序运行时程序运行时从从mainmain函数开始函数开始执行,执行,mainmain函函数可调用其它函数,最终一律返回数可调用其它函数,最终一律返回到到mainmain函数

3、函数结束结束运行。运行。p除除mainmain函数函数外外, ,其它函数可相互调用其它函数可相互调用;p函数不可嵌套定义函数不可嵌套定义, ,具有具有全局性、平行性全局性、平行性;p函数分为函数分为有参与无参函数有参与无参函数,有返回值和无返有返回值和无返回值函数,主调和被调函数回值函数,主调和被调函数 C C程序特点:程序特点:4函数的分类函数的分类按照函数按照函数定义定义的角度分为的角度分为:1.标准库函数标准库函数:是由系统定义地,也不必在程序中进行类型说是由系统定义地,也不必在程序中进行类型说明,明,要调用某个库函数,则要用预处理命令要调用某个库函数,则要用预处理命令#include将

4、该函数所在的头文件包含到程序中。将该函数所在的头文件包含到程序中。使用使用库函数库函数应注意:应注意:1 1、函数功能、函数功能2 2、函数参数的数目和顺序,及各参数意义和类型、函数参数的数目和顺序,及各参数意义和类型3 3、函数返回值意义和类型、函数返回值意义和类型4 4、需要使用的包含文件、需要使用的包含文件5当标准库函数中没有用户要用的函数时当标准库函数中没有用户要用的函数时, ,就必须自己设计了就必须自己设计了, ,设设计函数的原则是:计函数的原则是:1,1,函数不应处理太多的功能函数不应处理太多的功能, ,要保持函数的小型化要保持函数的小型化, ,功能单一化功能单一化. .2,2,一

5、个函数要保持自己的独立性一个函数要保持自己的独立性, ,如同一个黑匣子一样如同一个黑匣子一样, ,有进有有进有出出. .3,3,在函数中多使用复合语句在函数中多使用复合语句, ,使函数也具有结构化使函数也具有结构化, ,并且可以提并且可以提高执行效率和节省存储空间高执行效率和节省存储空间. .4,4,在主函数前在主函数前, ,要罗列出所有使用自定义函数的原型说明要罗列出所有使用自定义函数的原型说明, ,这有这有利于在大型程序设计中追踪要调用的函数设置是利于在大型程序设计中追踪要调用的函数设置是 否正确否正确. .5,5,在程序适当的地方加入注释在程序适当的地方加入注释( (用用/*.*/*.*

6、/包含的语句包含的语句) )这便于程这便于程序的阅读和调试序的阅读和调试. .6,6,采用层次的书写程序格式采用层次的书写程序格式, ,按程序的不同功能分层次按程序的不同功能分层次.2.用户自定义的函数用户自定义的函数6按照函数的按照函数的参数传递参数传递形式分为形式分为:无参函数无参函数有参函数有参函数按照函数的按照函数的返回值返回值类型分为类型分为:有返回值有返回值无返回值无返回值按照函数的按照函数的使用范围使用范围分为:分为:内部函数内部函数外部函数外部函数按函数的定义形式和使用范围的分类:78.2函数的定义函数的定义-无参函数的定义无参函数的定义类型名类型名 函数名函数名( ) 声明部

7、分声明部分 执行部分执行部分 说明:说明:类型名为函数返回值类型,类型名为函数返回值类型,p如果定义时如果定义时未指定未指定,系统默认为,系统默认为intint型型; ;p无返回值无返回值的函数的类型名应为的函数的类型名应为voidvoid。函数名须是合法标识符函数名须是合法标识符, ,不能与其他函数或变量重名不能与其他函数或变量重名8#include void printstar() printf(*n);void print_message() printf(How are you!n);main() printstar(); print_message(); printstar();9类

8、型标识符类型标识符 函数名函数名( 形参表列形参表列 ) 声明部分声明部分 执行部分执行部分 形参表列必须声明形参表列必须声明形参的类型形参的类型函数的定义函数的定义-有参函数的定义有参函数的定义形参类型说明表,一般格式为:形参类型说明表,一般格式为:数据类型数据类型1 形参形参1, , 数据类型数据类型n 形参形参n10#include float average(float x,float y,float z) float aver; aver=(x+y+z)/3; return(aver); main() float a,b,c,ave; a=6.5; b=4.2; c=25.3; av

9、e=average(a,b,c); printf(“average=%f”,ave);11void 函数名函数名( ) 函数体函数体可以没有可以没有, , 表示占个位置表示占个位置, , 实现功能以后补写。实现功能以后补写。函数的定义函数的定义-空函数的定义空函数的定义12/*求最大值求最大值*/void max( int x) /*求最大值求最大值*/空函数的应用空函数的应用main() int a10=.; /*求最大值求最大值*/intm_max=max(a);printf(“m_max=%d”,m_max);13函数的调用:函数的调用:1、主调函数与被调函数主调函数与被调函数main函

10、数是整个程序的执行入口函数是整个程序的执行入口程序的执行是从程序的执行是从main函数开始的函数开始的一般函数必须由一般函数必须由main函数函数(或其它函数或其它函数)调用才能执行。调用才能执行。函数调用关系示意图函数调用关系示意图142、函数参数和函数的值函数参数和函数的值函数参数分为函数参数分为:实际参数和形式参数实际参数和形式参数在函数在函数定义定义的函数首部的函数首部,函数名后的括号中说明的函数名后的括号中说明的变量变量,简称形参。形参的个数可以有多个简称形参。形参的个数可以有多个,多个形参多个形参之间用逗号隔开。之间用逗号隔开。形式参数形式参数:实际参数实际参数:函数函数被调用被调

11、用时时,在调用处给出对应的参数在调用处给出对应的参数,简称实参简称实参,实参往往是具有明确值的常量、变量或表达式等。实参往往是具有明确值的常量、变量或表达式等。15#include float average(float x,float y,float z) float aver; aver=(x+y+z)/3; return(aver); main() float a,b,c,ave; a=6.5; b=4.2; c=25.3; ave=average(a,b,c); printf(“average=%f”,ave);形式参数(形参)形式参数(形参)实际参数(实参)实际参数(实参)16注意注

12、意:1.形参形参在在未未出现函数出现函数调用时调用时,他们,他们并不占内存并不占内存, 只有发生函数只有发生函数调用时调用时才会才会被分配空间被分配空间,而且在,而且在 该该函数结束函数结束后,它所占的所有后,它所占的所有内存内存也被也被释放释放;2.实参必须是具有实参必须是具有确定值确定值的常量,变量或表达式;的常量,变量或表达式;3.形参必须在定义时就形参必须在定义时就声明其类型声明其类型;6.实参与形参的实参与形参的类型类型应应相同或赋值兼容相同或赋值兼容;7.C语言规定,实参与形参之间必须是语言规定,实参与形参之间必须是单向的值传递单向的值传递。4.实参的实参的个数个数和形参的个数应该

13、和形参的个数应该相等相等;5.实参与形参在实参与形参在顺序顺序上应该一一上应该一一对应对应;参数的结合问题参数的结合问题:在函数调用时,将实参值传给对应在函数调用时,将实参值传给对应的形参的形参17例如:例如: 编一程序,将主函数中的两个变量的编一程序,将主函数中的两个变量的值传递给值传递给swap函数中的两个形参,交换两个函数中的两个形参,交换两个形参的值。形参的值。#include void swap(int x, int y) int z; z=x; x=y; y=z; printf(nx=%d,y=%d,x ,y);main( ) int a= 10,b=20; swap(a,b);

14、printf(na=%d,b=%dn,a,b);形式参数(形参)形式参数(形参)实际参数(实参)实际参数(实参)单向值传递单向值传递18例如:例如: 编一程序,将主函数中的两个变量的编一程序,将主函数中的两个变量的值传递给值传递给swap函数中的两个形参,交换两个函数中的两个形参,交换两个形参的值。形参的值。#include void swap(int x, int y) int z; z=x; x=y; y=z; printf(nx=%d,y=%d,x ,y);main( ) int a= 10,b=20; swap(a,b); printf(na=%d,b=%dn,a,b);程序输出结果:

15、程序输出结果:x=20,y=10a=10,b=20mainswap20b10az10y20x101020交换失败交换失败19例例 计算计算x x的立方的立方#includefloatcube(floatx)return(x*x*x);main()floata,product;printf(Pleaseinputvalueofa:);scanf(%f,&a);product=cube(a);printf(”Cubeof%.4fis%.4fn,a,product);xaproduct1.21.21.72820函数的值函数的值即即函数的返回值函数的返回值,是通过函数中的,是通过函数中的return语

16、句获得的语句获得的.return语句的一般形式语句的一般形式:return (表达式表达式);return 表达式表达式 ;执行过程执行过程: 执行执行return语句后语句后,如果该表达式的类型如果该表达式的类型与函数首部中定义的函数类型一致与函数首部中定义的函数类型一致,则直则直接将结果返回主调函数接将结果返回主调函数;否则否则,系统自动将系统自动将结果的类型转换成定义的函数类型。结果的类型转换成定义的函数类型。21无返回值的函数无返回值的函数 如果被调用函数中没有如果被调用函数中没有return语句语句,函数带回的是一个函数带回的是一个不确定的值。为了明确表示不确定的值。为了明确表示“不

17、带回值不带回值”,可以用可以用“void”定义定义“无类型无类型”(或称或称“空类型空类型”)。 这样这样,系统就保证不使函数带回任何值系统就保证不使函数带回任何值,即禁止在调用函数即禁止在调用函数中使用被调用函数的返回值。为使程序减少出错中使用被调用函数的返回值。为使程序减少出错,凡不要求凡不要求带回函数值的函数带回函数值的函数,一般应定义为一般应定义为void类型类型。printstar( ) printf(*n);voidsx,inty)inttemp;temp=x;x=y;y=temp;22p通过通过 return 语句只能返回一个数值。语句只能返回一个数值。p函数内可有函数内可有多条

18、返回语句多条返回语句,但每条返回语句但每条返回语句的的返回值只有一个返回值只有一个。p当函数不需指明返回值时,可以写成:当函数不需指明返回值时,可以写成: return ;p当当函函数数中中无无返返回回语语句句时时,表表示示最最后后一一条条语语句句执行完后执行完后遇遇 自动返回。自动返回。说明说明: :23函数的调用函数的调用函数调用是使函数进行一次实际的执行。函数调用是使函数进行一次实际的执行。格式:格式:函数名(实际参数表)函数名(实际参数表)说明说明v实实参参在在调调用用时时必必须须有有确确定定的的值值,可可以以是是常常量量、变变量量和和表达式。表达式。v函函数数的的实实参参和和形形参参

19、应应在在个个数数、类类型型和和顺顺序序上上一一一一对对应应,否则会发生类型不匹配的错误。否则会发生类型不匹配的错误。v对于对于无参无参函数函数, ,调用时调用时实参表列为空实参表列为空,但,但( )( )不能省不能省。24按函数在程序中出现的位置有以下按函数在程序中出现的位置有以下3 3种函数调用方式:种函数调用方式:函数调用的方式函数调用的方式 1.函数语句调用函数语句调用把函数调用作为一个语句把函数调用作为一个语句不要求函数带回明确的返回值不要求函数带回明确的返回值只完成一定的操作只完成一定的操作#include void printstar() printf(*n);void print

20、_message() printf(How are you!n);main() printstar(); print_message(); printstar();252.函数表达式调用函数表达式调用以表达式形式出现在程序中以表达式形式出现在程序中要求函数必须带回确定的返回值要求函数必须带回确定的返回值c=2*max(a,b);3.函数参数调用函数参数调用作为参数出现在程序中作为参数出现在程序中要求函数必须带回确定的返回值要求函数必须带回确定的返回值m=max(a,max(b,c);26函数的调用过程函数的调用过程1. 根据根据函数名找到被调函数函数名找到被调函数, 若没找到若没找到, 系统将

21、系统将 报告出错信息报告出错信息; 若找到若找到, 为形参开辟存储空间;为形参开辟存储空间;2. 计算实参的值计算实参的值。将实参的值。将实参的值传递给形参传递给形参;3. 保护主调函数的现场保护主调函数的现场, 中断主调函数中断主调函数, 转到被转到被 调函数的函数体中开始执行调函数的函数体中开始执行;4. 遇到遇到return语句语句或函数结束的或函数结束的花括号时花括号时, 返回返回 主调函数;主调函数;5. 释放释放形参和调用函数中临时变量的形参和调用函数中临时变量的内存空间;内存空间;6. 恢复现场恢复现场从主调函数的中断处继续执行从主调函数的中断处继续执行。函数函数开始开始调用调用

22、函数函数结束结束调用调用27#include float average(float x,float y,float z) float aver; aver=(x+y+z)/3; return(aver); main() float a,b,c,ave; a=6.5; b=4.2; c=25.3; ave=average(a,b,c); printf(“average=%f”,ave);mainaverage12.0ave25.3c4.2b6.5aaver12.0z25.3y4.2x6.528函数之间的位置关系函数之间的位置关系在一个程序中有多个函数,那么,在一个程序中有多个函数,那么,各函数

23、之间的前后位置关系规定如下:各函数之间的前后位置关系规定如下:1、被调函数在前面、被调函数在前面,主调函数在后面主调函数在后面.即先定义后调用。即先定义后调用。2、主调函数在前面,被调函数在后面。这时,必须在主调函数在前面,被调函数在后面。这时,必须在调用的语句之前,对被调用的函数进行原型声明调用的语句之前,对被调用的函数进行原型声明(说明说明),可在主调函数的说明部分,也可在程序的开始处的,可在主调函数的说明部分,也可在程序的开始处的说明部分进行。说明部分进行。3、被调函数是库函数或另一文件中的自定义函数被调函数是库函数或另一文件中的自定义函数,则在本程序文件的起始部分用则在本程序文件的起始

24、部分用#include命令将对应的命令将对应的文件包含到本文件中来。文件包含到本文件中来。29int add(int x,int y) return(x+y);main() int a=10,b=24,sum; printf(input a,b:); sum=add(a, b); printf(”sum= %dn,sum);main() int a=10,b=24,sum; printf(input a,b:); sum=add(a, b); printf(”sum= %dn,sum);int add(int x,int y) return(x+y);int add(int x,int y);

25、int add(int x,int y);30函数原型声明方法函数原型声明方法常常用用的的是是:用用函函数数定定义义中中的的函函数数首首部部,再再加加上上一一个个分分号号;也也可可以以省省略略函函数数首首部部中中的的形形参参名名,但但必必须须保保留形参的类型。留形参的类型。longfac(); /* /* 对除对除mainmain之外的所有自定义函数进行原型说明之外的所有自定义函数进行原型说明 */ */intcmn(intm,intn);main()/*main函数函数*/intm,n,c;longfac(intx)/*fac函数函数*/intcmn(intm,intn);/*cmn函数函数

26、*/*也可以写成也可以写成longfac(int);*/*也可以写成也可以写成intcmn(int,int);*/31例例:longfac(intx);/*函数原型说明函数原型说明*/main()intm,n,c;printf(inputm,n:);scanf(%d%d,&m,&n);if(mn)c=fac(m)/(fac(n)*fac(m-n);/*三次调用三次调用*/printf(c(%d,%d)=%dn,m,n,c);elseprintf(inputdataerrorn);longfac(intx)inti;longf=1;for(i=1;i=x;i+)f=f*i;return(f);3

27、2数组作为函数参数数组作为函数参数p数组元素数组元素作函数实参作函数实参p一维数组名一维数组名作函数参数作函数参数p多维数组名多维数组名作函数参数作函数参数33例:计算数组中相邻两元素之间的差值。例:计算数组中相邻两元素之间的差值。数组元素作函数实参数组元素作函数实参值传递值传递int dif(int x,int y) return x-y;main() int i, a4=0,1,2,3; for(i=0;i3;i+) printf(the diff between %d and %d is ,i,i+1); printf(%dn, dif(ai,ai+1) ); the diff betw

28、een 0 and 1 is -1the diff between 1 and 2 is -1the diff between 2 and 3 is -134数组名作函数参数数组名作函数参数地址传递地址传递p在主调函数与被调函数分别定义数组在主调函数与被调函数分别定义数组,且且类型应一致类型应一致。p形参数组大小形参数组大小(多维数组第一维多维数组第一维)可不指定,但可不指定,但 不能不能 省省。编译程序并不为形参数组分配空间。编译程序并不为形参数组分配空间。p数组名数组名表示数组在内存中的表示数组在内存中的起始地址起始地址。35例例: :从键盘输入从键盘输入8 8学生的成绩,编写函数使用简学

29、生的成绩,编写函数使用简单选择排序将成绩由高到低排序,并输出成绩。单选择排序将成绩由高到低排序,并输出成绩。#define N 10void SelectSort(int a , int n);void InputArray(int a , int n);void OutputArray(int a , int n);main()int n=8,scoreN;InputArray(score,n);SelectSort(score,n);OutputArray(score,n);36void InputArray(int a,int n) int i;printf(Input %d score

30、s:n,n);for(i=0;in;i+) scanf(%d,&ai);void OutputArray(int a,int n) int i;printf(The sorted scores:n);for(i=0;in;i+) printf(%4d,ai);37void SelectSort(int a , int n) int i,j,k,t;for(i=0;in-1;i+)k=i;for(j=i+1;jn;j+)if(akaj)k=j;if(k!=i)t=ai; ai=ak; ak=t;38p用数组名作函数参数,用数组名作函数参数,应该在主调函数和被调函数应该在主调函数和被调函数分别定义

31、数组分别定义数组,不能只在一方定义;,不能只在一方定义;p实参数组与形参数组实参数组与形参数组类型应一致;类型应一致;p形参数组也可以不指定大小形参数组也可以不指定大小,在定义数组时在数组,在定义数组时在数组名后面名后面跟一个跟一个 ;为了在被调用函数中处理数组元素为了在被调用函数中处理数组元素的需要,将数组的需要,将数组个数个数作为一个参数;作为一个参数;p用数组名作函数实参时,不是把数组的值传递给形用数组名作函数实参时,不是把数组的值传递给形参,而是把参,而是把实参数组的起始地址传递给形参数组实参数组的起始地址传递给形参数组,这样两个数组就共占同一段内存单元。这样两个数组就共占同一段内存单

32、元。说明:说明:39例:求数组中所有元素的最大值。例:求数组中所有元素的最大值。int getmax( int b34 ) /*或或 int getmax(int b 4)*/ int i, j , max=b00; for(i=0; i3; i+); for(j=0; j4; j+) if(max bij) max=bij; return max;main() int a34, i, j; printf(“nEnter 6 integers:); for(i=0;i3;i+) for(j=0;jy?x:y; return(rz?r:z);int min(int x,int y,int z)

33、int r; r=xy?x:y; return(rz?r:z);43例例: :求圆环的面积。求圆环的面积。#include #define PI 3.1415926 float area_ring(float x,float y);float area(float r);main() float r,r1; printf(“input tow figure:n”); scanf(“%f%f”,&r,&r1); printf(“area_ring is %f”,area_ring(r,r1);float area_ring(float x,float y) float c; c=fabs(are

34、a(x)-area(y); return(c);float area(float r) return(PI*r*r); 44函数的递归调用函数的递归调用 在函数的执行过程中又直接或间接调用该函数本身在函数的执行过程中又直接或间接调用该函数本身 直接直接递归调用递归调用 在函数中直接调用函数本身在函数中直接调用函数本身间接间接递归调用递归调用 在函数中调用其它函数在函数中调用其它函数, ,其它函数又调用原函数其它函数又调用原函数int f1(int x) int y,z; z=f2(y); . return(2*z);int f2(int t) int a,c; c=f1(a); . retur

35、n(3+c);int f(int x) int y,z; z=f(y); . return(2*z);C C编译系统对递归函数的编译系统对递归函数的自调用次数没有限制自调用次数没有限制。f( )调调f调调f2调调f1f1( )f2( )45例:计算例:计算n!n!。分析:分析:求解求解n n的阶乘实际上有两种方法的阶乘实际上有两种方法, ,一种是连乘法一种是连乘法, ,它基于阶乘定义公式它基于阶乘定义公式: : n!=1*2*3*n!=1*2*3* *n n实现方法是用实现方法是用循环循环完成。完成。46另一种方法基于阶乘递归定义公式:另一种方法基于阶乘递归定义公式:n!= 1 ( 1 (n=

36、0)n=0)n*(n-1)! (n1)n*(n-1)! (n1)用函数的用函数的直接递归直接递归调用实现调用实现main( ) int n; long y; printf(ninput a integer number:n); scanf(%d,&n); if (n0) printf(data errorn); else y= fac (n); printf(%d!=%ld,n,y);long fac (int n) long f; if(n=0) f=1; else f=n*fac (n-1); return(f); 47main()n=1n=2n=3n=4f=24f=6f=2f=1f=4*

37、fac(3)f=3*fac(2)f=2*fac(1)f=1fac(4)注意:注意: 在递归调用过程中,不同层的同名局部在递归调用过程中,不同层的同名局部变量是不同的变量是不同的 变成机器代码后变成机器代码后, , 执行时相当于将其拉执行时相当于将其拉成直线成直线 ( (线性程序代码线性程序代码) )。第一次第一次调用调用fac第二次第二次调用调用fac第三次第三次调用调用fac第四次第四次调用调用faclong fac(int n) return(n=1) ? 1 : fac(n-1)*n ); long fac(int n) long f; if(n=1) f=1; else f=fac(n

38、-1)*n; return( f ); 48main() int n; long y; printf(ninput an integer number:n); scanf(%d,&n); if (n0) printf(data errorn); else y=fac(4); long fac(4) long f; if(4=1) f=1; else f=fac(4-1)*4;long fac(3) long f; if(3=1) f=1; else f=fac(3-1)*3; long fac(2) long f; if(2=1) f=1; else f=fac(2-1)*2;long fac

39、(1) long f; if(1C ;2.n1时,时,p只要先将前只要先将前n-1个借助个借助C从从A-B, p那么可以把第那么可以把第n个直接从个直接从A-C;p将剩下的将剩下的n-1个借助个借助A从从B-C,问题性质相同问题性质相同,因此适合因此适合采用递归过程采用递归过程!递归结束条件递归结束条件问题分解问题分解BC51设将设将n个盘个盘从从a借助借助b移到移到c杆杆的算法为的算法为move(n,a,b,c),则:移动盘子算法如下:则:移动盘子算法如下:把把a上面的上面的n-1个盘个盘借助借助c移到移到b,记做记做 move(n-1,a,c,b);把最下面的把最下面的1个盘从个盘从a直接

40、移到直接移到c;把把b上的上的n-1个盘个盘借助借助a移到移到c,记做记做 move(n-1,b,a,c);显然这是一个显然这是一个递归递归算法,按此算法编程如下:算法,按此算法编程如下:52main( ) int m; printf(nInput number:); scanf(%d,&n); printf(the step to moving %2d diskes:n,m); move(n,a,b,c);void move(int n,int x,int y,int z) if(n=1) printf(%c-%cn,x,z); else move(n-1,x,z,y); printf(%c

41、-%cn,x,z); move(n-1,y,x,z); 53 .move(3,a,b,c); . move(n, x, y, z);3, a,b,cn!=1move(n-1,x , z , y); printf(-,x,z);move(n-1,y, x, z);move(n, x, y, z);2, a,c,bn!=1move(n-1,x, z, y); printf(-,x,z);move(n-1,y, x, z);move(n, x, y, z);1, a,b,c2, a,c,b1, a,b,cn=1printf(-,x, z);1.a-c2.a-bmove(n, x, y, z);1,

42、c,a,b1, c,a,bn=1printf(-,x, z);3.c-b4.a-cmove(n, x, y, z);2, b,a,c2, b,a,cn!=1move(n-1,x, z, y); printf(-,x,z);move(n-1,y, x, z);move(n, x, y, z);1, b,c,a1, b,c,an=1printf(-,x, z);5.b-a6.b-cmove(n, x, y, z);1, a,b,c1, a,b,cn=1printf(-,x, z);7.a-c54 局部变量和全局变量局部变量和全局变量根据根据变量作用域变量作用域不同不同, 变量分为变量分为局部变量局

43、部变量和和全局变量。全局变量。所谓变量的作用域所谓变量的作用域, 是指该变量定义和使用的范围。是指该变量定义和使用的范围。局部变量局部变量, 是指作用域在某程序块是指作用域在某程序块(函数函数)中的变量。中的变量。说明说明: 局部变量的使用范围仅限于定义它的程序块;局部变量的使用范围仅限于定义它的程序块;不同函数中的变量可以同名不同函数中的变量可以同名,它们互不影响;它们互不影响;形式参数也属于局部变量;形式参数也属于局部变量;main函数定义的变量也仅在函数定义的变量也仅在main函数中有效。函数中有效。55全局变量全局变量:是指在任何函数之外定义的变量是指在任何函数之外定义的变量有效范围是

44、从定义开始,直至整个程序结束有效范围是从定义开始,直至整个程序结束定义一个全局变量的定义一个全局变量的目的就是让多个函数可以共享目的就是让多个函数可以共享全局变量的全局变量的定义在函数外定义定义在函数外定义56例例:int fun( ); int n=5; main( ) int x; printf(“%dn”,n ); x=fun( ); printf(“%d,%d”,x,n); int fun( ) int a=4; n=a; return(n); 5 4,457全局变量的初始值全局变量的初始值全局变量在编译阶段分配内存,在执行阶段不释放全局变量在编译阶段分配内存,在执行阶段不释放全局变量

45、只进行一次初始化,并且只能用常量全局变量只进行一次初始化,并且只能用常量如果程序中没有给全局变量初始化,系统自动置如果程序中没有给全局变量初始化,系统自动置0 0如果全局变量和局部变量通明如果全局变量和局部变量通明,则在局部变量的作则在局部变量的作用范围内用范围内,全局变量被屏蔽。全局变量被屏蔽。58int d=1;fun(int p) int d=5; d+=p+; printf(“%dn”,d);main( ) int a=3; fun(a); d+=a+; printf(“%d”,d);8459全局变量的作用全局变量的作用增加函数间数据的联系通道及数据共享增加函数间数据的联系通道及数据共

46、享(1)(1)如果在一个程序的开始处定义了全局变量,如果在一个程序的开始处定义了全局变量, 则这个程序中的所有函数都能引用全局变量,则这个程序中的所有函数都能引用全局变量, 在一个函数中改变了全局变量的值,其他函在一个函数中改变了全局变量的值,其他函 数中就可以访问这个改变了的变量,相当于数中就可以访问这个改变了的变量,相当于 多了一个数据传递的通道。多了一个数据传递的通道。(2)(2)由于函数的调用只能带回一个返回值,在需由于函数的调用只能带回一个返回值,在需 要带回两个以上的结果时,可以使用全局变量。要带回两个以上的结果时,可以使用全局变量。 60全局变量的缺点全局变量的缺点(1)全局变量

47、是静态的)全局变量是静态的,在程序的整个运行过程中都在程序的整个运行过程中都要占用内存单元要占用内存单元,可能造成内存可能造成内存资源的浪费资源的浪费;(2)使用全局变量使函数的)使用全局变量使函数的通用性较差通用性较差;(3)在编写大型程序时)在编写大型程序时,由于某全局变量值在别处由于某全局变量值在别处意外的被修改而使程序出错。意外的被修改而使程序出错。降低了模块的独降低了模块的独立性立性,给程序设计、调试和维护工作造成困难给程序设计、调试和维护工作造成困难。61变量的存储类别变量的存储类别存储类别存储类别: 是数据在内存中存储的方法是数据在内存中存储的方法.分类分类: 自动的自动的(au

48、to),静态的静态的(static), 寄存器的寄存器的(register),外部的外部的(extern)自动的自动的(auto):动态局部变量动态局部变量,默认类别默认类别 静态的静态的(static)声明局部变量时声明局部变量时:静态局部变量静态局部变量声明全局变量时声明全局变量时:该变量只被本文件使用该变量只被本文件使用62例例:fun(int a,int b) static int m=0,i=2; i+=m+1; m+=i+a+b; return(m);main( ) int k=4,m=1,p; p=fun(k,m);printf(“%dn”,p); p=fun(k,m);printf(“%dn”,p);8 2563作作 业业P164.7.1,7.2,7.6, 7.864

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号