一个b程序b由多个模块b文件b组成

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第八章函数一、概述一个程序由多个模块(文件)组成,每个模块(文件)又由很多小的功能模块(函数)组成,而且这些功能模块(函数)可能在很多文件模块中都要使用。因此,使用函数可以减少重复劳动语句函数1……函数n文件1……函数1……函数n文件n程序二、说明1、C程序=多个源文件,便于分别编写、编译、提高效率。2、一个源程序文件=多个函数。以源文件为单位进行编译。3、在多个函数中,有且仅有一个main函数,程序从main开始执行。4、所有函数都是平等的,可以相互调用,但是不能嵌套定义5、函数=标准函数+用户函数6、函数=有参函数+无参函数3、定义函数(1)1、无参函数Typef_Name(){函数内部变量声明……}如:IntAdd(){intx=2,y=3,z;z=x+y;returnz;}3、定义函数(2)2、有参函数Typef_Name(形参变量类型表){函数内部变量声明……}如:intAdd(intx,inty){intz;z=x+y;returnz;}形参:在定义函数的时候,它的值是未知的,也就是说它只是形式上存在,并不在内存中占用空间。如x,y4、形参的传统声明形式Typef_Name(形参变量表)形参变量类型声明{函数内部变量声明……}如:intAdd(x,y)intx,y;{intz;z=x+y;Returnz;}5、函数参数在调用函数时,主调函数与被调函数之间存在数据传递关系:实参从主调函数传给被调函数对应的形参,函数值从被调函数传回到主调函数对应的函数名处。注意:1、形参只在进行函数调用的时候才自动分配内存空间(必须有明确的类型),函数调用结束后自动释放所占内存空间2、实参在任何时候都必须有实际的值,可以是常量或常量表达式3、实参与形参的类型应该相同或能赋值兼容4、实参到形参是单向值传递,只能从实参传到形参,形参的改变不会引起实参的改变。6、函数返回值1、函数的返回值一般是通过return语句带回1)return;——结束被调函数,返回到主调函数,但是不传递回任何可用的值。(void)2)return(表达式);——结束被调函数,返回到主调函数,并将表达式的值带回到主调函数。3)return表达式;——同22、返回值的类型1)可以是任何合法的类型2)函数值的类型与返回值的类型不一致,以函数的类型为准。3)如果函数类型为int,可以不写。4)为了明确表示不带回值,则函数类型为void(空类型)7、举例main(){floatx,y;intc;scanf(%f,%f,&x,&y);c=max(x,y);printf(Maxis%d\n,c);return;}intmax(floatx,floaty){if(xy)returnx;elsereturn(y);}max(float,float);main(){floatx,y;intc;scanf(%f,%f,&x,&y);c=max(x,y);printf(Maxis%d\n,c);return;}max(floatx,floaty){if(xy)returnx;elsereturn(y);}8、函数原型声明1、作用:提前告诉系统,程序中有这样一个函数2、方法:在main函数之前,用函数声明语句3、形式:Typef_Name(形参类型表);一般只写类型,不需要变量名。如果函数类型type为int,则可以不进行原型声明(最好都写)9、函数调用定义了子函数,而且对子函数进行原型声明后,就可以调用子函数了。子函数与主函数的位置可以任意排放。调用形式:1、如果函数类型为void(对应return;),用函数调用语句:f_Name(实参表);2、否则(对应return;),将函数调用放在表达式中,或作为函数的参数。如:d=max(a,max(b,c)/2;10、函数的嵌套(相互)调用因为子函数之间是平等的,因此子函数之间可以相互调用。main(){f1();}f1(){f2();}f2(){f1();}11、举例(8_6)用弦截法求f(x)=x3-5x2+16x-80=0的根x1x2xx1、if(f(x1)*f(x2)=0)方程有根2、直线段x1x2与x轴相交于x3、if(f(x1)*f(x)=0)根在x1与x之间,x2=x,否则,根在x与x2之间,x1=x4、重复2、3,直到f(x)无限接近0,即可求出x12、函数的递归调用递归调用自己调用自己f1(){f1();}13、举例(8_7)求n!n!=n*(n-1)!(n-1)!=(n-1)*(n-2)!……1!=1*0!0!=1n!=fact(n)=n*fact(n-1)=n*(n-1)*fact(n-2)……14、数组作为函数参数1、数组元素作为函数参数数组元素相当于与一个普通变量,因此数组元素作为函数参数与变量作为函数参数完全一样。见例题8_8(比较两个数组的大小)15、数组作为函数参数2、数组名作为函数参数1)数组名表示函数的起始地址,是常量2)数组名作为函数参数是双向传递,实参的改变引起形参的改变,形参的改变也会引起实参的改变。3)数组名作为函数参数,要求实参、形参都是数组,而且类型应该一致4)可以省略形参第一维的长度,经常使用一个变量来传递。5)数组名作为函数参数,形参数组和实参数组在同一个内存单元。见例题8_9(比较两个数组的大小)16、局部变量IntF1(intx,inty){intz;x,y,z只在f1中有效……}Intf2(inta,intb){intc;a,b,c只在f2中有效……}Voidmain(){intm,n;m,n只在main中有效……}17、全局变量Intx,y;x,y在它下面的所有程序中有效Intf1(inta,intb){intc;a,b,c只在f1中有效(x,y有效)……}Floatz;z在它下面的所有程序中有效Intf2(intc,intd){inte;c,d,e只在f2中有效(x,y,z有效)……}全局变量长期占有内存通过全局变量,让一个函数得到多个结果尽量不用全局变量(例题8_10)18、变量的类别1、自动变量auto变量使用结束后自动释放内存空间一般变量都是auto类型2、静态变量static(例题8_11)变量使用结束后不释放内存空间,保留原值3、寄存器变量register将使用频繁的变量放在寄存器中。不能定义太多加快程序的运行19、外部变量外部变量(全局变量)——在函数外部定义的变量如果外部变量前面的函数要引用该外部变量,可以用关键字extern声明例题8_12当多个文件组成一个程序,而文件之间要用到同一个变量的时候:只在一个文件中定义外部变量,在其它需要的文件中用extern声明这个变量。例题8_13,8_13_220、外部函数内部函数——一个函数只能被本文件调用,在定义和声明的时候加上关键字static,作用是多个文件中的同名函数不相互干扰(例题8_14)外部函数——可以被其他文件调用的函数,定义是加上关键字extern,在其他文件中用extern声明该函数。(例题8_15)21多文件程序的运行步骤:1、分别编写各个文件2、建立项目文件——不包含语句,只包含组成程序的文件名(包含路径)3、工程文件存盘,扩展名必须为prj4、运行工程文件另外,可以直接使用文件包含

1 / 23
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功