第4章函数的应用_第1页
第4章函数的应用_第2页
第4章函数的应用_第3页
第4章函数的应用_第4页
第4章函数的应用_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

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

文档简介

1、1第4章 函数4.1 函数概述4.2 函数的声明和定义4.3 函数的参数和函数的返回值 4.4 函数的调用 4.5 局部变量和全局变量 4.6 变量的存储类型 4.7 外部函数和内部函数 4.8 综合应用 语言程序设计教学目标v了解函数的分类v掌握函数的声明和定义规范v掌握函数的形式参数和实际参数的定义和用法v掌握函数返回值的大小和类型v掌握函数的调用方法和参数传递v了解函数的嵌套调用v掌握函数的递归调用及其程序规范v了解变量存储类型的基本概念v掌握局部变量与全局变量的概念 语言程序设计1. 函数概述v模块化程序设计 基本思想: 分而治之 特点v 各模块相对独立、功能单一、结构清晰、接口简单v

2、 降低了程序设计的复杂性v 提高了程序的可靠性v 缩短开发周期v 避免程序开发的重复劳动v易于维护和功能扩充 开发方法: 自上向下,逐步分解,分而治之next part语言程序设计vC语言是模块化程序设计语言c程序源程序文件1源程序文件n源程序文件2函数1函数2函数n关于c程序结构的说明:& C是函数式语言& 必须有且只能有一个名为main的主函数& c程序的执行总是从main函数开始,在main中结束& 函数可以嵌套调用,但不能嵌套定义语言程序设计v函数的分类return 无参函数有参函数标准函数(库函数) 用户自定义函数 从用户的角度如: sqrt(x),

3、getchar( ) 从函数形式如: getchar( )如: sqrt(x), putchar(ch) 从函数的使用权限内部函数外部函数使用库函数应注意: 需要使用的包含文件 函数功能 函数参数的个数和顺序,及各参数意义和类型 函数返回值意义和类型语言程序设计2. 函数的定义v函数定义的语法格式函数类型 函数名(形参类型说明表)说明部分语句部分函数返回值类型无返回值void;缺省int型合法标识符函数体next part语言程序设计函数定义实例: 例1: 有参函数int max(int x,int y) int z; z=xy?x:y; return(z);例2: 无参函数void prin

4、tstar( ) printf(“*n”); 或void printstar(void ) printf(“*n”); 例3: 空函数 dummy( ) 语言程序设计函数定义的相关说明: v函数定义的传统风格:函数类型 函数名(形参表)形参类型说明说明部分语句部分例1: (现代风格)int max(int x,int y) int z; z=xy?x:y; return(z);例2: (传统风格)int max(x,y)int x,y; int z; z=xy?x:y; return(z);语言程序设计练习: 下列哪些函数定义是合法的?int max(x,y) int x,y; int max

5、(int x,y) int max(x,y)int x,y,z; z = x y ? x : y; return( z );return 语言程序设计3. 函数的返回值v返回语句 语法格式 功能格式1: return (表达式);格式2: return 表达式;格式3: return;使程序控制从被调用函数返回到调用函数中,同时把返回值给调用函数next part语言程序设计v关于返回语句的相关说明 函数中可有多个return语句 若无return语句,遇时,自动返回调用函数 若函数返回值类型与return语句中表达式值的类型不一致,按前者为准,自动转换-函数调用转换 void型函数,不带回确

6、定的值example语言程序设计关于函数返回值若干情形的实例说明:例1: int max(int x,int y) int z; z=xy?x:y; return(z); 例2: void swap(int x,int y ) int temp; temp=x; x=y; y=temp; 注意:当省略返回类型时,系统默认返回类型为int。语言程序设计关于函数返回值若干情形的实例说明:例3: int max(float x,float y) float z; z=xy?x:y; return(z); 思考:若: x=1.5,y=2.5则: 当发生函数调用max(x,y)时 z的值为? max(x

7、,y)的值为?2.52注意:若函数返回值类型与return语句中表达式值的类型不一致,按前者为准,自动转换-函数调用转换return 语言程序设计4. 函数的调用v函数调用的一般形式v函数声明v函数参数及参数传递方式v函数的嵌套调用和递归调用gogogogonext part语言程序设计函数名( 实参表列 )v函数调用的一般形式相关说明: 实参与形参个数相等,类型一致,按顺序一一对应 在C语言中,把函数调用也作为一个表达式。 因此凡是表达式可以出现的地方都可以出现函数调用。 实参表求值顺序,因系统而定 函数语句printstar(); 函数表达式c=2*max(a,b); 函数参数m=max(

8、a,max(b,c);printf(“%d”,max(a,b);语言程序设计关于实参表求值顺序的实例:#include void main()int f(int a,int b);int i=2,p;p=f(i,i+);printf(%dn,p);int f(int a,int b)int c;if(ab) c=1;else if(a=b) c=0;else c=-1;return(c);#include void main()int f(int a,int b);int i=2,p;p=f(i,+i);printf(%dn,p);int f(int a,int b)int c;if(ab)

9、c=1;else if(a=b) c=0;else c=-1;return(c);在Tc2.0下运行结果:10在vc6.0下运行结果:00注意: 实参的求值顺序与编译系统有关。 在Tc2.0中,自右至左return 语言程序设计v函数声明 语法格式 作用函数声明的位置注意函数类型 函数名(形参类型 形参名,. ); 告诉编译系统函数类型、参数个数及类型,以便检验 程序的数据说明部分(函数内或外) 函数声明与函数定义不同!语言程序设计函数使用规范预处理预处理函数原型声明函数原型声明int main() return 0;其它函数定义其它函数定义语言程序设计#include float add(f

10、loat x, float y);int main()float a,b,c;scanf(%f,%f,&a,&b);c=add(a,b);printf(sum is %fn,c); return 0;float add(float x,float y)float z;z=x+y;return(z);函数声明函数调用函数定义语言程序设计v函数参数及参数传递方式 实例分析 函数参数: 形参、实参 参数传递方式: 单向值传递gogogoreturn 语言程序设计#include void main() int a,b,c; scanf(%d,%d,&a,&b); c=

11、max(a,b); printf(Max is %d,c);max(int x, int y) int z; z=xy?x:y; return(z);形参实参return 实例: 比较两个数并输出大者语言程序设计 函数参数: 形参、实参 形式参数: 定义函数时函数名后面括号中的变量名 实际参数: 调用函数时函数名后面括号中的表达式 注意事项: 形参必须指定类型;实参必须有确定的值 形参与实参类型一致,个数相同,顺序一致 若形参与实参类型不一致,自动按形参类型转换函数调用转换 形参在函数被调用前不占内存; 函数调用时为形参分配内存; 调用结束,内存释放example语言程序设计例: 找两个数中较

12、大者#include void main() int a,b,c; scanf(%d,%d,&a,&b); c=max(a,b); printf(Max is %d,c);max(int x, int y) int z; z=xy?x:y; return(z);函数定义函数调用return abcxxxxxx59xyz5999语言程序设计 参数传递方式: 单向值传递过程:特点:函数调用时,为形参分配单元,并将实参的值复制到形参中调用结束时,形参单元被释放,实参单元仍保留并维持原值形参与实参占用不同的内存单元单向传递,维持原值example语言程序设计711x:y:调用前:调用结

13、束:711x:y:例: 交换两个数(采用值传递方式)#include void swap(int a,int b) int temp; temp=a; a=b; b=temp;void main() int x=7,y=11; printf(x=%d,ty=%dn,x,y); printf(swapped:n); swap(x,y); printf(x=%d,ty=%dn,x,y);调用:711a:b:711x:y:swap:711x:y:117a:b:tempgo语言程序设计v函数的嵌套调用和递归调用 嵌套调用 - 在调用一个函数的过程中,又调用另一个函数main( )调用函数a结束a函数b

14、函数调用函数b注意: 函数可以嵌套调用,但不能嵌套定义!语言程序设计嵌套调用实例: 求三个数中最大数和最小数的差值#include int dif(int x,int y,int z); int max(int x,int y,int z); int min(int x,int y,int z);void main() int a,b,c,d; scanf(%d%d%d,&a,&b,&c); d=dif(a,b,c); printf(Max-Min=%dn,d); int dif(int x,int y,int z) return max(x,y,z)-min(x,y,

15、z); int max(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z); int min(int x,int y,int z) int r; r=xy?x:y; return(r1)#include int fact(int n) int f; if(n0) printf(n=0) f(x,n)=1n=0f(x,n-1)*xn0goreturn 语言程序设计递归程序书写规范ifif(最简单情形最简单情形) 直接得到最简单情形下的解直接得到最简单情形下的解 elseelse 将原始问题转化为稍微简单一些的一个或多个将原始问题转化为稍微简单一些

16、的一个或多个子问题子问题 以递归方式逐个求解这些子问题以递归方式逐个求解这些子问题 以合理有效的方式将这些子问题的解组装成原以合理有效的方式将这些子问题的解组装成原始问题的解始问题的解 语言程序设计5. 数组作为函数参数v数组元素作为函数实参 值传递v数组名作为函数实参 地址传递 要求:v在主调函数与被调函数中分别定义数组,且类型一致v形参数组大小可以不指定exampleexamplenext part语言程序设计例8.10: a和b为有10个元素的整型数组,比较两数组对应元素要求: 分别用变量l,e,s记录aibi,ai=bi,ais,认为数组ab 若ls,认为数组ay)flag=1;els

17、e if(xy)flag=-1;elseflag=0;return(flag);/* 函数定义 */语言程序设计#include void main()int large(int x,int y);int a10,b10,i,l=0,e=0,s=0;for(i=0;i10;i+)scanf(%d,&ai);for(i=0;i10;i+)scanf(%d,&bi);for(i=0;is)printf(abn);else if(ls)printf(abn);elseprintf(a=bn);函数声明输入数组a输入数组b调用函数比较输出结论return 语言程序设计例8.11: 有1

18、个一维数组score,内放10个学生成绩,求平均成绩要求: 在主函数中输入10个成绩,并输出平均成绩 编写函数对数组求平均值语言程序设计float average(float array10)int i;float aver,sum=0;for(i=0;i10;i+)sum=sum+arrayi;aver=sum/10;return(aver);/* 函数定义 */语言程序设计#include void main()float average(float array10);float score10,aver;int i;for(i=0;i10;i+)scanf(%f,&scorei)

19、;aver= average(score);printf(aver=%fn,aver);函数调用函数声明.2109score562312.88array语言程序设计float average(float array,int n)int i;float aver,sum=0;for(i=0;in;i+)sum=sum+arrayi;aver=sum/n;return(aver);改进:语言程序设计#include void main()float average(float array,int n);float score10,aver;int i;for(i=0;i10;i+)scanf(%f

20、,&scorei);aver=average(score,10);printf(aver=%fn,aver);/* 函数调用*/* 函数声明 */语言程序设计例8.13: 用选择法对数组中10个整数按由小到大排序要求: 在主函数中输入待排序的数组元素并输出排序后的数组元素 编写函数对包含n个整数的数组进行排序选择法基本思想: 选出n个数中最小的数与第1个数对换; 选出次小的数与第2个对换; 依此类推,;选出次大的与第(n-1)个对换语言程序设计初始序列:(n=4)4312第1趟:(i=1)第2趟:(i=2)第3趟:(i=3)4312jjjkkk1342342kjkj24343kj k3

21、4比较3次比较2次比较1次语言程序设计void sort(int array,int n)int i,j,k,t;for(i=0;in-1;i+)k=i;for(j=i+1;jn;j+)if(arrayjarrayk)k=j;t=arrayk; arrayk=arrayi; arrayi=t;/* 函数定义 */* 找最小数组元素的下标 */语言程序设计#include void main()void sort(int array,int n);int a10,i;for(i=0;i10;i+)scanf(%d,&ai);sort(a,10);for(i=0;i10;i+)printf

22、(%d ,ai); printf(n);/* 函数声明 */* 函数调用 */* 输入数组元素 */* 输出数组元素 */return 语言程序设计5. 变量的属性v变量概述v局部变量和全局变量v动态变量和静态变量v变量的存储类别gonext partgogogo语言程序设计v变量概述(1) 变量是对程序中数据的存储空间的抽象(2) 变量的属性数据类型存储类别决定了变量的作用域生存期作用域: 变量有效的区域-局部变量与全局变量生存期: 变量存在的时间-静态变量与动态变量寄存器静态存储区动态存储区存储器类型void main() int a; a=10; printf(“%d”,a);内存.编译

23、或函数调用时为其分配内存单元2000200110语言程序设计(3) 变量定义的语法格式:存储类型 数据类型 变量名;auto 自动类型register 寄存器类型static 静态类型例: int sum;auto int a,b,c;register int i;static float x,y;return语言程序设计v局部变量和全局变量局部变量全局变量在函数内定义,只在本函数内有效在函数外定义,可为本文件所有函数共用(内部变量)(外部变量)return语言程序设计 局部变量相关说明:v main中定义的变量只在main中有效v 形参属于局部变量v 可定义在复合语句中有效的变量v 不同函数

24、中同名变量,占不同内存单元v 局部变量可用存储类型: auto register staticexample1example2example3next section语言程序设计float f1(int a) int b,c; .char f2(int x,int y) int i,j; void main() int m,n; .a,b,c有效x,y,i,j有效m,n有效example1:return语言程序设计example2:#include #define N 5void main() int i; int aN=1,2,3,4,5; for(i=0;iN/2;i+) int temp

25、; temp=ai; ai=aN-i-1; aN-i-1=temp; for(i=0;iN;i+) printf(%d ,ai);returntemp有效区域语言程序设计#include void main() void sub(); int a=3,b=4; printf(main:a=%d,b=%dn,a,b); sub(); printf(main:a=%d,b=%dn,a,b);void sub() int a=6,b=7; printf(sub:a=%d,b=%dn,a,b);example3:return语言程序设计 全局变量的相关说明v 有效范围:从定义变量的位置开始到本源文件结

26、束; 以及有extern说明的其它源文件v 外部变量声明: extern 数据类型 变量表;v 若外部变量与局部变量同名,则外部变量被屏蔽v 外部变量可用存储类型:缺省 或 staticv 尽量少用全局变量gogogo 全局变量在程序全部执行过程中占用存储单元 降低程序清晰性,容易出错 降低了函数的通用性、可靠性,可移植性returngo语言程序设计float max,min;float average(float array, int n) int i; float sum=array0; max=min=array0; for(i=1;imax) max=arrayi; else if(a

27、rrayiy?x:y; return(z);void main() extern int a,b; printf(max=%d,max(a,b);int a=13,b=-8;extern int a,b;int max() int z; z=ab?a:b; return(z);void main() printf(max=%d,max();int a=13,b=-8;运行结果: max=13/ 外部变量定义/ 外部变量定义/ 外部变量声明/ 外部变量声明语言程序设计注意: 外部变量定义与外部变量声明不同!只能1次可说明多次所有函数之外函数内或函数外分配内存,可初始化不分配内存,不可初始化定义说

28、明次数位置分配内存return语言程序设计外部变量与局部变量同名实例:int a=3,b=5;int max(int a, int b) int c; c=ab?a:b; return(c);void main() int a=8; printf(max=%d,max(a,b);运行结果: max=8/* 外部变量 */* 局部变量 */* 局部变量 */return语言程序设计return外部变量副作用实例:#include int i;void main() void prt(); for(i=0;i5;i+)prt();void prt() for(i=0;i5;i+)printf(%c

29、,*); printf(n);#include void main() void prt(); int i; for(i=0;i5;i+)prt();void prt() int i; for(i=0;i5;i+)printf(%c,*); printf(n);/*函数声明*/*局部变量*/*局部变量*/*全局变量*/*函数声明*/语言程序设计v动态变量和静态变量return(1) 存储方式静态存储:动态存储:程序运行期间分配固定存储空间程序运行期间根据需要动态分配存储空间(3) 生存期 静态变量:动态变量:从程序开始执行到程序结束从包含该变量定义的函数开始执行至函数执行结束(2) 内存用户区

30、 程序区静态存储区动态存储区全局变量、局部静态变量形参变量局部动态变量(auto register)函数调用现场保护和返回地址等语言程序设计v变量的存储类别return局部变量外部变量存储类别存储方式存储区生存期作用域赋初值未赋初值register局部staticauto外部static外部动态静态静态存储区动态区寄存器程序整个运行期间函数调用开始至结束定义变量的函数或复合语句内本文件其它文件编译时赋初值,只赋一次自动赋初值0或空字符每次函数调用时不确定特别注意1:局部变量默认为auto型特别注意2:extern不用于变量定义;用于变量说明来扩展外部变量作用域特别注意3: 局部static变量

31、具有全局寿命和局部可见性;具有可继承性特别注意4: register型变量个数受限;且不能为long, double, float型example语言程序设计int a;main( ) . f2; . f1; .f1( ) auto int b; f2; .f2( ) static int c; C作用域b作用域a作用域mainf2f1mainf1f2maina生存期:b生存期:c生存期: 局部static变量具有全局寿命和局部可见性实例1:设有一文件file.c,分析变量a、b、c的作用域和生存期语言程序设计实例2: 分析程序的执行结果,讨论auto变量的作用域#include void m

32、ain() void prt( ); int x=1; int x=3; prt(); printf(“2nd x=%dn”,x); printf(“1st x=%dn”,x);void prt( ) int x=5; printf(“3th x=%dn”,x);x=1作用域x=1作用域x=3作用域x=5作用域/*函数声明*/*函数定义*/语言程序设计实例3: 分析程序的执行结果,讨论局部static变量的特性#includevoid main() void increment( ); increment(); increment(); increment();void increment(

33、) int x=0; x+; printf(“%d ”,x);运行结果:运行结果:#include void main() void increment( ); increment(); increment(); increment();void increment( ) static int x=0; x+; printf(“%d ”,x); static变量编译时赋初值,只赋初值一次语言程序设计实例4: 分析程序的执行结果,讨论用extern扩展变量的作用域#include int main() void gx(),gy(); extern int x,y; printf(x=%d y=%

34、dn,x,y); y=246; gx(); gy(); return 0;void gx() extern int x,y; x=135; printf(x=%d y=%dn,x,y);int x,y;void gy() printf(x=%d y=%dn,x,y);/* 外部变量声明*/*外部变量声明*/* 外部变量定义 */* 函数声明 */结论: 外部变量定义不同于外部变量声明: 定义只有一次,声明可以有多次;extern不用于外部变量定义 外部变量定义时若未初始化,系统会自动设为0或0语言程序设计实例5: 讨论其他文件中的外部变量和外部static变量int global;extern float x;int main() int local; extern int global;static int number;int func2() float x;static int number;int func3() extern int global; file1.cfile2.cfile3.c分析: 变量global、local、x、number的作用域? global在file1.c中定义,在file1.c、file2.c、file3.c中均可用 local在file

温馨提示

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

评论

0/150

提交评论