C语言,6函数教程课件_第1页
C语言,6函数教程课件_第2页
C语言,6函数教程课件_第3页
C语言,6函数教程课件_第4页
C语言,6函数教程课件_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

,第6章模块化程序设计,函数,20.05.2020,1,6.1函数的概念,C程序结构,C程序结构如图所示1.一个C程序可以分为若干个函数2.每个程序有且只有一个主函数(main),其他都是子函数3.子函数可以相互调用,但主函数不能被调用4.一个C源程序由一个或多个文件构成,每个文件就是一个编译单位,2,PPT学习交流,说明:1.一个C程序的执行从主函数(main)开始,调用其他函数后仍回到main主函数结束.2.每个子函数都是平行的,任何子函数都不从属于其他函数3.从用户角度,函数可以分为:标准函数,即库函数用户自定义函数4.从函数形式可以分为:无参函数:printstar()有参函数:printf(“hello”),#includevoidprintStar()printf(“*n”);voidprintMessage()printf(“Hello,world.n”);printStar();voidmain()printStar();printMessage();,3,PPT学习交流,函数定义的一般形式,函数定义的一般形式:类型说明函数名(形式参数说明)函数体形式参数说明方法:数据类型变量名,类型变量名,无参数函数定义形式:类型说明函数名()函数体,voidprintHello()printf(“hello!n”);,有参数函数定义形式:类型说明函数名(形式参数说明)函数体,intsum(intx,inty)intz;z=x+y;return(z);,4,PPT学习交流,函数体一般情况下,函数体有两部分组成:局部变量说明语句;局部变量说明:函数体内的变量.其有效范围仅在本函数体内起作用,离开本函数无意义.,intsum(intx,inty)intz;/局部变量定义z=x+y;return(z);,5,PPT学习交流,函数的参数和函数的值,一个程序由若干个函数组成,各函数调用时经常要传递一些数据,即调用函数把数据传递给被调用函数,经过被调用函数处理后,得到一个确定的结果,在返回调用函数时,将结果带回调用函数.,#includeintmax(intx,inty)intz;z=(xy)?x:y;return(z);voidmain()inta,b,c;scanf(“%d%d”,主函数,子函数,.c=max(a,b);.,intmax(intx,inty).return(z);,各函数之间数据往来通过参数传递和返回语句实现,6,PPT学习交流,函数参数:用于函数间数据的传递形式参数:定义函数时给出的参数实际参数:调用函数时给出的参数,#includeintmax(intx,inty)intz;z=(xy)?x:y;return(z);voidmain()inta,b,c;scanf(“%d%d”,对于函数max有两个形式参数x,y形式参数x和y只在max函数中使用,a,b是主函数中定义的变量,当main函数调用max函数时.a,b成为max的实际参数调用时,实际参数的值赋给形参进行处理,例:max接受到两个值:89max返回89,一、形式参数和实际参数,7,PPT学习交流,#includeintmax(intx,inty)intz;z=(xy)?x:y;return(z);voidmain()inta,b,c;scanf(“%d%d”,说明:1.定义函数时,必须说明形参的类型,形参只能是变量(包括数组).不能是常量或表达式,2.函数被调用之前,形参和子函数中的变量不占内存,调用结束返回,形参所占的内存被收回.,3.实参可以是常量、变量或表达式.因为传递过来的是具体数值.,4.实参和形参类型必须一致(或可以安全转换).,5.C语言中,实参和形参传递的是”按值传递”,即单向传递,只与参数相对位置有关,而与变量名无关,intb,inta,intc;c=(ab)?a:b;return(c);,13,20,main-a,main-b,max-a,max-b,13,20,8,PPT学习交流,#includeintsum(inta,intb)a=a+b;b=a+b;return(a);voidmain()inta=1,b=3,c;c=sum(a,b);printf(“sumof%d,%dis%dn”,a,b,c);,阅读下面程序,写出运行结果,函数被调用之前,形参和子函数中的变量不占内存,调用结束返回,形参所占的内存被收回.,实参和形参传递的是”值传递”,即单向传递,只与参数相对位置有关,而与变量名无关,sumof1,3is4,9,PPT学习交流,二、函数返回值,#includeintmax(intx,inty)intz;z=(xy)?x:y;return(z);voidmain()inta,b,c;scanf(“%d%d”,函数值也就是函数的返回值,是一个具体确定的值.,函数使用return语句返回值。,一个函数内可以有多个return语句,执行到任何return语句,函数都将立即返回到调用函数,if(xy)return(x);elsereturn(y);,return后面的()可以省略,可以返回一个表达式,先求解表达式的值,再返回.,intmax(intx,inty)returnxy?x:y;,1.返回函数值的方法,10,PPT学习交流,#includeintmax(intx,inty)intz;z=(xy)?x:y;return(z);voidmain()inta,b,c;scanf(“%d%d”,2.函数值的类型,函数的类型即函数值的类型.例如,函数max是int型,函数的返回值也是int型.,省略了类型说明的函数就是int型.,return中表达式的值一般和函数类型相同.,如果不一致,则需要进行类型转换.以函数类型为准.,11,PPT学习交流,3.不需要返回的函数,如果函数中没有return,认为是一个过程,可以使用类型void.,如果一个函数被声明void类型,就不允许再引用它的返回值。只能单纯调用它。,#includevoidprintStar()printf(“*n”);voidprintMessage()printf(“Hello,world.n”);printStar();voidmain()printStar();printMessage();,12,PPT学习交流,函数的调用,一、函数调用一般形式,一般形式:函数名(实参列表),说明:如果调用无参函数,实参表列可以忽略,但括号不能省.,实参个数和形参个数相同.,实参和形参类型一一对应,必要时会进行类型转换.,注意:不同系统中,实参的计算顺序不同.一般认为从右到左计算和赋值.一般在调用函数前计算出实参的值,例1读程序,写出结果#includeintf(inta,intb)intc;if(ab)c=1;elseif(a=b)c=0;elsec=-1;returnc;voidmain()inti=2,p;p=f(i,+i);printf(“%d”,p);,13,PPT学习交流,二、函数调用方式,1、函数语句形式为:函数(实参表列);,例如:printMessage();printf(“%d”,p);,说明:这种方式不要求函数带返回值,函数只执行一定操作.,2、函数表达式函数的返回值参与运算,例如:m=max(a,b);m=3*max(a,b);printf(“%d”,max(a,b);,说明:这种方式的函数不能用于void类型,14,PPT学习交流,三、函数调用的执行过程,从右到左的顺序,计算实参中各表达式值.,按照位置,将实参的值一一传递给形参.,执行被调用函数.,当遇到return(表达式)语句时,计算表达式的值并返回主调函数.,X=-0.600000,iabs(x)=1.000000,15,PPT学习交流,四、函数的原形,在程序中调用函数需满足以下条件:被调用函数必须存在,且必须遵循“先定义后使用”的原则,如果被调用函数的定义在主调函数之后,可以在调用之前给出原形说明.,原形说明:类型说明函数名(参数类型,参数类型),16,PPT学习交流,函数的嵌套调用,嵌套调用是指在一个函数的函数体中又调用了其他函数.,程序执行过程:,第一层第二层第三层main()printStar()printStar();printfMessage()printMessage();printStar();printStar();,结束,#includevoidprintStar()printf(“*n”);voidprintMessage()printf(“Hello,world.n”);printStar();voidmain()printStar();printMessage();,17,PPT学习交流,例3编程求,分析:重复三次不同的阶乘运算,只是每次的值不同.,将求阶乘的过程编程一个函数fac,以不同的参数值来调用fac,#include#includefloatfac(intk);floatt=1.0;inti;for(i=2;i1时,当n=0时,当n!=1时,19,PPT学习交流,函数的递归调用是指在调用一个函数时又直接或间接调用函数本身.,直接调用,间接调用,递归调用必须引入一个循环条件控制递归结束,否则进入死循环.,20,PPT学习交流,例4有5个人坐在一起,问第5个人多少岁?答:比第4个人大2岁;第4个人说他比第三个人大2岁;第3个人比第2个人大2岁,第2个人比第1个人大2岁.而第1个人有10岁.问第5个人多少岁?,21,PPT学习交流,函数调用过程,#includeintage(intn)intc;if(n=1)c=10;elsec=age(n-1)+2;returnc;voidmain()printf(“%d“,age(5);,22,PPT学习交流,例5用递归调用求n!阶乘(n=0),使用循环做:floatfac(intn)floatf=1;if(n=0)for(i=2;i1)f=fac(n-1)*n;elseif(n=0|n=1)f=1;elsef=-1;returnf;voidmain()intn;floaty;printf(“inputaintegernumber:”);scanf(“%d”,23,PPT学习交流,根据变量的作用域不同,可分为局部变量和全局变量两种。1变量的作用域变量的作用域:变量起作用的范围。局部变量:在函数内部或某个控制块的内部定义的变量。局部变量的作用域:函数内部。作用:增强了函数模块的独立性。全局变量:在函数外面定义的变量称为全局变量。全局变量的作用域:从该变量定义的位置开始,直到源文件结束。作用:在同一文件中,所有函数都可以引用全局变量。增强了各函数间数据的联系。,6.2变量的作用域,24,PPT学习交流,局部变量和全局变量的作用域如图所示:,25,PPT学习交流,阅读程序【例6-4】的程序,了解变量作用域。请注意区分局部变量和全局变量的作用域。程序:example6_4.c,26,PPT学习交流,变量的存储类别,一、变量的动态存储和静态存储,全局变量和局部变量变量的作用域,静态存储和动态存储变量的存储类别:生存期,内存中供用户使用的空间有:代码区静态存储区:编译时分配空间动态存储区:执行时分配空间,变量或函数的属性:,27,PPT学习交流,二、局部变量的存储类别,1、自动类别存储在动态存储区,用auto说明,如:intfunc1(inta)autointb,c=3;,形参a,变量b,c都是自动变量,调用函数时,系统给它们分配存储空间,函数调用结束时,自动释放空间.,通常auto可以省略,28,PPT学习交流,2、局部静态变量占用静态存储,用static说明,说明:局部静态变量,属于静态存储类别,在程序执行的整个过程中,都不释放存储空间.,局部静态变量在编译时赋值,仅赋值一次.,如果定义局部静态变量没有赋初值,系统会自动赋初值.,局部静态变量,只有在定义它的函数内被引用(它存在,但不被其他函数引用),如果f不定义成static是什么结果?,f=1;j=1;fac(1):f=f*n=1*1=1;输出1!=1;j=2;fac(2):f=f*n=1*2=2;输出2!=2;j=3;fac(3):f=f*n=2*3=6;输出3!=6;j=4;fac(4):f=f*n=6*4=24;输出4!=24;,29,PPT学习交流,3、寄存器变量存储在寄存器中,用register说明,说明:计算机的寄存器个数有限.,寄存器变量对寄存器占有是动态的,有的系统对寄存器变量转化为自动变量处理,而有的系统会自动设置寄存器变量.,30,PPT学习交流,三、全局变量的存储类别,全局变量都存放在静态的存储区。用static关键字声明的全局变量,只能在本文件内使用。没有用static关键字的全局变量可以在别的文件中使用extern关键字声明为外部变量,并在该文件中作为全局变量使用。,尽量少使用全局变量,/*a.c*/intmax;voidcalcMax(inta,intn)./*main.c*/externintmax;voidmain().printf(“%d”,max);.,/*a.c*/staticintmax;voidcalcMax(inta,intn)./*main.c*/externintmax;voidmain().printf(“%d”,max);.,错!max未定义,错!不能引用max,31,PPT学习交流,四、存储类别小结,1、变量的定义方法存储类别数据类型变量名,2、变量的划分,按作用域划分:,按生存期,按变量的存放位置,32,PPT学习交流,自定义的函数有两种:内部函数和外部函数。1内部函数若函数的存储类型为static型,则称其为内部函数(内部函数又称为静态函数),它表示在由多个源文件组成的同一个程序中,该函数只能在其所在的文件中使用,在其他文件中不可使用。内部函数的声明形式:static();例如:staticintStatistic();2外部函数若函数的存储类型定义为extern型,则称其为外部函数,它表示该函数能被其他源文件调用。函数的默认存储类型为extern型。,6.3内部函数与外部函数,33,PPT学习交流,外部函数的应用示例。下面的程序由3个文件组成:、example6_6.c。在、中分别定义了两个外部函数;在example6_6.c中可以分别调用这两个函数。,1/*外部函数定义*/externintadd(intm,intn)return(m+n);,2/*外部函数定义*/externintmod(inta,intb)return(a%b);,34,PPT学习交流,3example6_6.c#includeexternintmod(inta,intb);/*外部函数声明*/externintadd(intm,intn);/*外部函数声明*/main()intx,y,result1,result2,result;printf(Pleaseenterxandy:n);scanf(%d%d,35,PPT学习交流,关于程序的几点说明(1)在程序、中的函数定义可以不需要extern加以说明,默认为外部函数。(2)在example6_6.c中对外部函数的声明也可以不用extern加以说明,默认为外部函数。(3)由多个源文件组成一个程序时,main()函数只能出现在一个源文件中。(4)由多个源文件组成一个程序时,有3种连接方式:将各源文件分别编译成目标文件,得到多个目标文件(.obj后缀),然后用连接命令把多个.obj文件连接起来。,36,PPT学习交流,建立项目文件(.prj后缀或.dsw后缀),具体操作可参阅各种C语言集成开发环境说明。使用文件包含命令。请参阅本章6.6节。(5)如果将或中的extern改成static,则主程序在编译时无法通过。(6)在程序或中,也可以互相调用其外部函数。,Turboc的连接接命令为tlink例如:tlinkexample6_6.obj+结果:生成一个example6_6.exe文件。,37,PPT学习交流,6.4编译预处理,作用:在对源程序编译之前做一些处理,生成扩展C源程序种类宏定义#define文件包含#include条件编译#if-#else-#endif等格式:“#”开头占单独书写行语句尾不加分号,38,PPT学习交流,如#defineYES1#defineNO0if(x=YES)printf(“correct!n”);elseif(x=NO)printf(“error!n”);展开后:if(x=1)printf(“correct!n”);elseif(x=0)printf(“error!n”);,1宏定义不带参数宏定义一般形式#define宏名(标识符)宏体(字符串)功能:用指定标识符(宏名)代替字符序列(宏体),宏展开:预编译时,用宏体来替换宏名-不作语法检查,如#defineYES1#defineNO0#definePI3.1415926#defineOUTprintf(“Hello,World”);,说明:1.定义位置:任意(一般在函数外面)2.作用域:从定义命令到文件结束3.#undef可终止宏名作用域格式:#undef宏名,5.宏定义可嵌套,不能递归,例#defineMAXMAX+10(),4.引号中的内容与宏名相同也不置换,例#definePI3.14159printf(“2*PI=%fn”,PI*2);宏展开:printf(“2*PI=%fn”,3.14159*2);,6.宏定义中使用必要的括号(),例#defineWIDTH80#defineLENGTHWIDTH+40var=LENGTH*2;宏展开:var=WIDTH+40*2var=80+40*2,7.只是简单替代,标识符不占内存空间,8.一般宏名使用大写字母形式.,39,PPT学习交流,带参数宏定义一般形式:#define宏名(参数表)宏体,例#defineS(r)PI*r*r相当于定义了不带参宏S,代表字符串“(r)PI*r*r”,说明:1.宏展开:不仅宏体替换,还要进行形参替换2.宏体及各形参外一般应加括号()3.宏名与参数之间不能有空格,例#defineS(a,b)a*b.area=S(3,2);宏展开:area=3*2;,不能加空格,例#definePOWER(x)x*xx=4;y=6;z=POWER(x+y);宏展开:z=x+y*x+y;一般写成:#definePOWER(x)(x)*(x)宏展开:z=(x+y)*(x+y);,40,PPT学习交流,41,PPT学习交流,5.带参的宏与函数区别,42,PPT学习交流,2文件包含功能:一个源文件可将另一个源文件的内容全部包含进来一般形式:#include“文件名”或#include,处理过程:预编译时,用被包含文件的内容取代该预处理命令,再对“包含”后的文件作一个源文件编译,直接按标准目录搜索(存放C的库函数头文件)“”先在当前目录搜索,再搜索标准目录可指定路径,43,PPT学习交流,被包含文件内容源文件(*.c)头文件(*.h),宏定义数据结构定义函数说明等,文件包含可嵌套,44,PPT学习交流,例文件包含举例,45,PPT学习交流,3条件编译概念:在某个条件成立的情况下才对某一部分进行编译。三种格式:,格式二形式:作用:如果标识符没有被#define命令定义过,则对程序段1进行编译,否则对程序段2进行编译,格式三形式:作用:如果指定的常量表达式1值为真(非零),则对程序段1进行编译,否则如果指定的常量表达式2值为真(非零),则对程序段2进行编译,否则对程序段n进行编译,格式一形式:作用:如果标识符已经被#define命令定义过,则对程序段1进行编译,否则对

温馨提示

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

评论

0/150

提交评论