




已阅读5页,还剩42页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章函数,第1章信息技术与计算机,C语言程序设计,第2/47页,教学目标、要求,了解:函数的定义函数的声明函数的调用(嵌套调用、递归调用)形式参数、实际参数和参数的传递局部变量和全局变量变量的存储类别(自动、静态、寄存器、外部)变量的作用域和生存期,第3/47页,6.1问题的提出与程序示例,计算机高级语言中的函数实际上是一个能完成某一独立功能的子程序,即程序模块。程序设计人员将大而复杂的程序分解为若干相对独立而功能单一的小程序块(函数)来进行编写,并通过在各个函数之间进行调用,来实现总体上的功能。设计C程序的过程,就是编写函数的过程,我们至少要编写一个main()函数。执行C程序,就是执行相应的main()函数,如果在执行过程中遇到其它函数,则调用其它函数,调用完后,返回到刚才调用函数的下一条语句继续执行,而其它函数也只有在执行main()函数的过程中被调用时才会执行。,第4/47页,程序示例,#includevoidmain()inta,b,c;scanf(%d,%d,intmax(intx,inty)intz;if(xy)z=x;elsez=y;return(z);,intmax(intx,inty);,函数声明,函数调用,函数定义,第5/47页,6.2函数基础,函数定义就是定义函数所能实现的功能,即告诉编译系统函数所做的工作。函数声明即函数原型,就是告诉编译系统函数的名称、类型和形式参数表的构成。函数的调用在C语言中除main()由系统自动调用外,其它函数都是由main()直接或间接调用的。,函数定义好之后,就可以通过调用的方式使用这个函数。如果函数定义在前,调用此函数在后,这种调用是合法的;但是如果函数定义在后,而调用此函数在前,就会产生编译错误。为使函数的调用不受函数定义位置的影响,可以在调用函数之前进行函数的声明。,函数的调用过程分3步:1.参数传递;2.函数体的执行;3.返回。在一个函数体内允许有一个或多个return语句,一旦执行到其中的某一个return语句时,直接返回调用位置继续往下执行。,第6/47页,6.2函数基础,形式参数是变量程序在编译时,并不为形参分配内存单元,只有此函数被调用时,形参才临时占用存储空间,并从调用函数中相应实参获得值;当调用结束后,形参所占的存储单元有被释放。实际参数是表达式(常量、变量或表达式)与函数定义中的形参一一对应,即个数相等、次序一致且对应的数据类型相同或相容。函数从用户使用角度上看,可分为标准函数(库函数)和用户定义函数。,第7/47页,案例回放,第8/47页,案例对比,voidmain()intmax(intx,inty);/*函数说明,可以省略*/inta,b,c;scanf(%d,%d,/*使程序暂停,按任一键继续*/,#include/*定义一个函数max()*/intmax(intx,inty)intz;if(xy)z=x;elsez=y;return(z);,第9/47页,6.3函数的定义,类型说明符函数名(形式参数表)声明部分;语句;,省略类型说明符,C编译系统确认函数返回int数值;类型说明符为void,函数无返回值;省略形式参数表列,此函数为无参函数。函数不能嵌套定义,即所有函数都是平行的,定义函数时是相互独立的,没有从属关系,但是函数可以相互调用。,6.3.1函数定义的形式,说明:,第10/47页,6.3函数的定义,6.3.2函数的返回值,函数的返回值是通过函数中的return语句获得的,一个函数只能返回一个值,但是函数中可以有一个以上的return语句。函数值的类型,在定义函数时指定(缺省值为int类型,不返回值为void类型)。如果函数值定义类型与return语句返回的表达式值类型不一致,以定义类型为准。如果被调用函数中没有return语句,函数返回一个不确定的值。,第11/47页,6.4函数调用,函数语句函数名(实参表列);如:printf(“max=%d”,c);函数表达式函数为表达式的一部分如:c=2*max(a,b);函数参数函数的调用作为另一个函数的实参如:m=max(a,max(b,c);,函数调用一般形式,函数名(实际参数表);,函数调用的语法格式,第12/47页,6.4函数调用,函数的嵌套调用在调用一个函数的过程中,又调用了另一个函数。其关系如图所示。,嵌套调用,第13/47页,案例,一、写出下列程序的运行结果1.#includefun(inta,intb)if(ab)return(a);elsereturn(b);voidmain()intx=3,y=8,z=6,r;r=fun(fun(x,y),x*z);printf(%dn,r);,结果:18,第14/47页,案例,2.#includeintfun(intx,inty)return(y-x)*x;voidmain()inta=3,b=4,c=5,d;d=fun(fun(a,b),fun(a,c);printf(%dn,d);,结果:9,第15/47页,6.5函数说明,如果使用库函数,一般应在文件开头用#include命令将被调库函数所需的相关的信息“包含”到本源程序文件中。如果使用用户自定义函数,而且该函数与调用它的函数在同一个文件中,一般应在主调函数中对被调函数作声明(用函数的原型声明)。,第16/47页,6.5函数说明,如果被调用函数的定义出现在主调函数之前,可以不作声明。如果在所有函数定义之前(在函数外部)已作了函数声明,则各主调函数不必对被调函数作声明。,charletter(char,char);/*函数声明*/floatf(float,float);/*函数声明*/inti(float,float);/*函数声明*/voidmain()charletter(charc1,charc2)floatf(floatx,floaty)inti(floatj,floatk),第17/47页,6.6参数传递,回顾1.定义函数时,形式参数不占内存单元,只能函数发生调用时,形参才被分配内存单元,而调用结束后,形参所占的内存单元被释放。2.实参可以是常量、变量和表达式(值一定是确定的)。3.定义函数时,需指定形参的类型。4.形参和实参的类型相同或赋值兼容。,6.6.1形参和实参,参数传递即虚实结合,调用函数将实际参数的信息传递给被调用函数的形式参数,使形式参数具有确切的含义。C语言规定,实参变量对形参变量的数据传递是单向传递,即值传递,(在内存中,实参单元和形参单元占用不同的内存单元)。,第18/47页,6.6.2基本数据类型的形参,当形参的数据类型为基本数据类型时,参数传递方式为值传递,被调用函数本身不对实参进行操作,即使形参的值在函数中发生了变化,实参的值也完全不会影响,仍为调用前的值,这种传递方式减少了调用函数与被调用函数之间的数据依赖。,例如:输入a,b两个整数,用函数实现按大小顺序输出。,#includevoidswap(intx,inty)inttemp;temp=x;x=y;y=temp;voidmain()inta,b;scanf(%d,%d,第19/47页,6.6.3形参的数据类型是指针类型,程序中定义的变量,在编译时给变量分配内存单元,内存中的每一个字节的编号,称为地址,而内存单元中存放的内容称为数据。如:inti=3,j=5,k;k=i+j;这种按变量名存取变量值的方式称为“直接访问”方式。也可以采用“间接访问”方式,即将变量i的地址存放到另一个变量中,这种用来存放另一个变量地址的变量称为指针变量。指针变量的值是指针即地址。,指针数据类型,第20/47页,指针变量的定义,格式:数据类型*变量名;说明:*表示变量名是指针变量。例如:inti,*p;,2122H2123H,第21/47页,指针运算符,int*p1,*p2;a=100;b=10;p1=,第22/47页,6.6参数传递,指针变量作函数参数时,是将一个变量的地址传送到另一个函数中。是值传递。可以实现被调函数对指针所指变量的修改。即通过传递指针变量的值,调用函数和被调用函数可以操作相同的存储单元。,6.6.3形参的数据类型是指针类型,第23/47页,案例,例如:输入a,b两个整数,用函数实现按大小顺序输出。,#includevoidswap(int*p1,int*p2)inttemp;temp=*p1;*p1=*p2;*p2=temp;,voidmain()int*pt1,*pt2,a,b;scanf(%d,%d,第24/47页,5,9,图示,5,9,在swap()函数中,第25/47页,案例,例如:输入a,b两个整数,用函数实现按大小顺序输出。,#includevoidswap(int*p1,int*p2)int*p;p=p1;p1=p2;p2=p;,voidmain()int*pt1,*pt2,a,b;scanf(%d,%d,第26/47页,交换指针变量p1和p2的值,而不是变量a和b的值。,图示,pt2,pt1,第27/47页,6.7递归调用,函数的递归调用是指,一个函数在它的函数体内,直接或间接地调用它自身。,1.语言在递归调用中,调用函数又是被调用函数,执行递归函数将反复调用其自身。每调用一次就进入新的一层。2.为了防止递归调用无终止地进行,必须在函数内有终止递归调用的手段。常用的办法是加条件判断,满足某种条件后就不再作递归调用,然后逐层返回。,递归调用,几点说明,第28/47页,案例,1.用递归法计算n!。1n=0,1n(n-1)!n1,n!=,floatfac(intn)floatf;if(ny?x:y;return(z);,结果:13,第37/47页,案例,2.求ab和am的值。,/*file1.c*/#includeintA;voidmain()intpower(int);intb=3,c,d,m;scanf(%d,%d,/*file2.c*/externA;power(intn)inti,y=1;for(i=1;i=n;i+)y=A*y;return(y);,第38/47页,6.8.2静态变量,静态变量可以分为内部静态变量和外部静态变量。静态变量函数调用结束后不释放内存单元,保留其值。定义格式内部静态变量在函数体或分程序内定义,且在本函数体或分程序内有效(即用static声明的局部变量)。外部静态变量在函数体外定义,且在本源程序文件内有效(即用static声明的全部变量)。定义而不初始化,则其值为0。如果初始化,则赋初值操作是在编译时进行的,且只赋值一次。,static数据类型变量表;,第39/47页,案例,#includef(inta)autointb=0;staticintc=3;/*内部静态变量*/b+;c+;return(a+b+c);voidmain()inta=2,i;for(i=0;i3;i+)printf(%d,f(a);,结果:789,第40/47页,6.8.3寄存器变量,一般情况下,变量的值存放在内存中,对于频繁使用的变量可以将其值存到CPU中的寄存器中,以提高执行的速度。定义格式寄存器变量的实现与硬件配置有关。只有很少的变量可以保存在寄存器中。register说明只适用于自动变量和函数的形参。,register数据类型变量表;,第41/47页,总结,C语言中的每个变量和函数都有两个属性:数据类型数据的存储类别变量声明的一般格式存储类别类型说明符变量表;存储类别为auto、register、static和extern缺省值为auto,第42/47页,案例,#includeintfac(intn)registerinti,f=1;for(i=1;i=n;i+)f=f*i;return(f);voidmain()inti;for(i=1;i=5;i+)printf(%d!=%dn,i,fac(i);,例如:求n!,第43/47页,补充题,1.以下程序的功能是计算函数的值,请选择填空。F(x,y)=(x+y)/(x-y)+(z+y)/(z-y),#includefloatf(float,float);voidmain()floatx,y,z,sum;scanf(%f%f%f,结果:x+y,x-yz+y,z-y,floatf(floata,floatb)floatvalue;value=a/b;return(value);,第44/47页,#includesub(intk,intn)inta1,a2;a2=;a1=;if(k%3=0,补充题,2.以下程序是选出能被3整除且至少有一位是5的两位数,打印出所有这样的数,请填空。,voidmain()intn=0,k,m;for(k=10;k100;k+)m=sub(k,n);if(m!=-1)n=m;printf(nn=%d,n);,结果:k/10k-a2*10,第45/47页,补充题,3.有以下程序,输出结果是什么?,#includeintabc(int
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 南京林业大学《乳品微生物学》2024-2025学年第一学期期末试卷
- 安徽交通职业技术学院《建筑画表现技法》2024-2025学年第一学期期末试卷
- 静脉穿刺置管术护理
- 湖南商务职业技术学院《图形界面编程》2024-2025学年第一学期期末试卷
- 绵阳城市学院《煤田地质与勘探》2024-2025学年第一学期期末试卷
- 宁波大学科学技术学院《建筑节能》2024-2025学年第一学期期末试卷
- 沧州幼儿师范高等专科学校《马克思主义经典著作》2024-2025学年第一学期期末试卷
- 德阳科贸职业学院《体育与健康课程教材研究》2024-2025学年第一学期期末试卷
- 皖西卫生职业学院《园艺植物育种学》2024-2025学年第一学期期末试卷
- 安徽艺术学院《羽毛球教学与实践二》2024-2025学年第一学期期末试卷
- 中建总公司《项目管理手册》2024年修订版最终稿印刷版
- 2024-2025学年湖南省雅礼中学高三1月综合自主测试历史试题
- 2025版成人心肺复苏流程指南
- 教育护士竞聘课件
- 《儿科安全用药》课件
- 【0110】2024年年度泉州市场分析正式版
- 学校国庆节快闪活动方案
- 临建施工组织方案
- 2025胸腔穿刺:操作步骤与技巧
- 湖南省社保知识培训课件
- 脑钠肽在心衰围手术期中的应用-曲秀芬
评论
0/150
提交评论