[课件资料]第4章函数_第1页
[课件资料]第4章函数_第2页
[课件资料]第4章函数_第3页
[课件资料]第4章函数_第4页
[课件资料]第4章函数_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

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

文档简介

1,第4章函数,2,教学目标,了解函数的分类掌握函数的声明和定义规范掌握函数的形式参数和实际参数的定义和用法掌握函数返回值的大小和类型掌握函数的调用方法和参数传递了解函数的嵌套调用掌握函数的递归调用及其程序规范了解变量存储类型的基本概念掌握局部变量与全局变量的概念,3,问题引导,问题1:输入4个整数,求它们的最大值.问题2:输入4个正整数,求它们的最大公约数问题3:输入一个正整数,判断该数是否为绝对素数(所谓绝对素数就是这个数本身是素数,它的反位数也是素数),4,#includeintmain()inta,b,c,d,m;scanf(%d%d%d%d,#includeintgcd(int,int);intmain()inta,b,c,d,m;scanf(%d%d%d%d,5,C是模块化程序设计语言,C程序结构,C是函数式语言必须有且只能有一个名为main的主函数C程序的执行总是从main函数开始,在main中结束函数不能嵌套定义,可以嵌套调用,4.1函数概述,6,函数分类函数定义的角度上分库函数用户自定义函数返回值情况来分有返回值函数无返回值函数函数参数的传递来分有参数函数无参数函数,7,4.2函数的声明和定义,函数的类型说明告诉编译器它返回什么类型的数据不同的数据有不同的长度和内部表示,函数的声明形式函数返回值类型说明符函数名(形式参数列表);,8,函数的定义形式函数返回值类型说明符函数名(形式参数列表)函数内部变量声明函数操作语句序列,求四个整数的最大值,#includeintmain()inta,b,c,d,m;scanf(%d%d%d%d,9,#includeintmax(int,int);intmain()inta,b,c,d,m;scanf(%d%d%d%d,10,例4.1:求两个整数的最大值的函数定义,intmax(intx,inty)intz;if(xy)z=x;elsez=y;returnz;,11,说明函数返回值类型说明符是C语言合法的数据类型说明符。函数名是合法的C语言标识符函数参数列表包含函数参数的类型说明和参数名称多个函数参数之间用逗号分开如果没有函数参数列表,函数名后面的圆括号不能省略。,12,4.3函数的参数和函数的返回值,函数的形式参数函数的定义中使用的参数叫做形式参数,简称形参在整个函数体内都可以使用,离开该函数则不能使用形参只能是变量,形参变量只有在被调用时才分配内存单元形参只有在函数内部有效,函数调用结束返回主调函数后则不能再使用该形参变量,intmax(intx,inty)intz;if(xy)z=x;elsez=y;returnz;,13,函数的实际参数主调函数中对应予形式参数的量称为实际参数,简称实参实参可以是常量、变量、表达式、函数进行函数调用时,实参必须具有确定的值实参和形参在数量上、类型上、顺序上应严格保持一致,否则会发生“类型不匹配”的错误。,14,#includeintmax(intx,inty);/*函数声明*/intmain()inta,b,m;scanf(%d%d,intmax(intx,inty)intz;if(xy)z=x;elsez=y;returnz;,15,实际参数仅仅是将值复制给形式参数,这是一个单向值传递过程,16,例4.3:用函数实现两个整数的交换,#includevoidswap(intx,inty);intmain()inta,b;scanf(%d%d,voidswap(intx,inty)intt;t=x;x=y;y=t;printf(调用函数内部:n);printf(x=%d,y=%dn,x,y);,从键盘上输入1020回车,调用函数之前:a=10,b=20调用函数内部:x=20,y=10调用函数之后:a=10,b=20,17,18,函数的返回值形式:return表达式;或return(表达式);功能:计算表达式的值,并返回给主调函数,函数返回值的类型由定义函数是的类型决定函数中允许有多个return语句,但每次只能有一个return语句被执行函数定义时,如果函数的类型为void,则该函数没有返回值,19,4.5函数的调用,函数调用的一般形式:函数名(实际参数列表)对于无参数函数调用时,则没有实际参数列表。实际参数表中的参数可以是变量、常量和表达式等。实际参数之间用逗号分隔实参的求值顺序是不确定的,不同的编译器略有不同,max(a,b)fun()max(max(a,b),c)f(i,i+),20,函数调用规范,21,函数调用方式作为表达式的一部分:c=2*max(a,b)作为C语言语句:max(a,b);作为函数参数:max(max(a,b),c),22,例4.5:函数调用方形式,求三个整数的最大公约数,#include#includeintgcd(intx,inty);intmain()inta,b,c,g;scanf(%d%d%d,intgcd(intx,inty)/*函数定义*/intr;dor=x%y;x=y;y=r;while(r!=0);returnx;,输入4328回车最大公约数是:4,23,例4.6:求2100之间的所有素数,#include#includeintisprime(intn);intmain()inti;for(i=2;i=100;i+)if(isprime(i)printf(%4d,i);return0;,intisprime(intn)intk;for(k=2;k2)1,1,2,3,5,8,13,21,34,65,99,longfib(intn)returnn%cn,n,from,to);,voidhanoi(unsignedintn,charfrom,chartemp,charto)if(n=1)moveplate(n,from,to);elsehanoi(n-1,from,to,temp);/*n-1个圆盘从A以C为中转移到B上*/moveplate(n,from,to);/*将圆盘n从A移到C上*/hanoi(n-1,temp,from,to);/*将n-1个圆盘从B上以A为中转移到C上*/,38,hanio(3,a,b,c);hanio(2,a,c,b);moveone(a,c);hanio(2,c,b,a);,hanio(2,a,c,b)hanio(1,a,b,c);moveone(a,b);hanio(1,b,c,a);,hanio(1,a,b,c)moveone(a,c);,hanio(1,b,c,a)moveone(c,b);,hanio(2,c,b,a)hanio(1,c,a,b);moveone(b,c);hanio(1,a,b,c);,hanio(1,c,a,b)moveone(b,a);,hanio(1,a,b,c)moveone(a,c);,函数调用本质(栈),39,40,#includelongintfac(int);intmain()intn;longinty;scanf(%d,main()调用fac(1)前,41,main()调用fac(1)后,fac(1)调用fac(0),fac(0)返回前,42,fac(1)返回前,main()返回前,43,4.6局部变量和全局变量,局部变量:在函数内作定义说明的变量。其作用域仅限于函数内部,离开该函数后就不能再使用,intf1(intx)inty,z;,intf2(inta)intb,c;,intmain()intm,n;,主函数main中定义的变量只能在主函数中使用。形参变量属于被调函数的局部变量,实参函数属于主调函数的局部变量。允许在不同的函数中使用相同的变量名,但它们代表不同的对象,占用不同的存储单元在复合语句中也可以定义变量,但其作用域只能在复合语句内。,44,#includevoidfun();intmain()inta=1,x=2;doubley=5.0;printf(main函数中变量的值:n);printf(a=%d,x=%d,y=%lfn,a,x,y);fun();return0;voidfun()inta=2,x=3;doubley=10.5;printf(fun函数中变量的值:n);printf(a=%d,x=%d,y=%lfn,a,x,y);,main函数中变量的值:a=1,x=2,y=5.000000fun函数中变量的值:a=2,x=3,y=10.500000,45,全局变量:在函数外部定义的变量。不属于某一个函数,它属于一个源程序文件。其作用域是从定义变量的位置开始到本源文件结束,intx,y;/*外部变量*/intmain()/*主函数*/doublea,b;/*外部变量*/intf1()/*函数f1*/voidf2()/*函数f2*/,46,全局变量是为了增加函数间数据联系渠道全局变量和局部变量同名时,在函数中把全局变量暂时隐藏起来,而局部变量起作用,#includevoidsub();inta,b;intmain()a=3;b=4;printf(全局变量:a=%d,b=%dn,a,b);sub();inta=1,b=2;printf(main:a=%d,b=%dn,a,b);return0;,voidsub()inta,b;a=6;b=7;printf(sub:a=%d,b=%dn,a,b);,全局变量:a=3,b=4sub:a=6,b=7main:a=1,b=2,47,4.7变量的存储类型,存储区域,48,动态存储与静态存储,动态存储程序在运行期间根据需要分配存储空间函数的形式参数、局部变量、函数调用时的现场保护和返回地址静态存储程序在运行期间由系统分配固定的存储空间全局变量、局部变量初始化在程序编译时进行,49,auto变量,定义:动态分配存储方式分配存储空间,其数据存储在动态存储区域形式参数、函数内部定义的变量定义格式:auto数据类型变量名列表;,autointx,y;,intfun(intx)autointy,z;,50,static变量,静态局部变量:数据存储在静态存储空间不能被其它函数使用当再次进入该函数时,将保存上次的结果。静态全程变量:在定义它的源文件中可见在其它源文件中不可见的变量,51,静态全程变量与全局变量的区别全局变量可以再说明为外部变量(extern),被其它源文件使用静态全程变量却不能再被说明为外部的,只能被所在的源文件使用,52,#includeintfun(int,int);intmain()intx=5,y=3,s,j;for(j=0;jb?a:b;,58,外部函数:函数定义的前面加上extern关键字而说明的函数,extern类型标识符函数名(形参列表),59,#includeexternintmultiply(int,int);externintsum(int,int);intmain()inta,b;intresult;scanf(%d,%d,externintmultiply(inta,intb)intc;c=a*b;returnc;,externintsum(inta,intb)intc;c=a+b;returnc;,exter.c,file1.c,file2.c,60,4.9综合应用,例4.16:如果一个正整数是素数,它的反位数也是素数,这称这样的数为绝对素数,61,/*求反序数的函数定义*/unsignedintrev(unsignedinty)unsignedintz=0;while(y!=0)z=z*10+y%10;y=y/10;returnz;,/*判断素数的函数定义*/intprime(unsignedintx)inti,k;k=sqrt(x);for(i=2;ik)return1;,62,#include#includeintprime(unsignedint);unsignedintrev(unsignedint);intmain()unsignedintn,m;scanf(%u,63,例4.17:求两个正整数的最小公倍数,#include#includeintgcd(intx,inty);/*最大公约数函数原型声明*/inthcd(intx,inty,intz);/*最小公倍数函数原型声明*/intmain()inta,b,g,h;scanf(%d%d,64,intgcd(intx,inty)intr;dor=x%y;x=y;y=r;while(r!=0);returnx;,inthcd(intx,inty,intz)return(x*y/z);,输入812回车两个整数的最小公倍数数是:24,65,例4.18:求数列之和,#include#includedoublefsum(intn);/*函数原型声明*/intmain()intn;scanf(%d,doublefsum(intn)inti,j,sign=1;doubleterm,s=0.0;for(i=1;i4,52,3-8,97,8-2,31,2-7,8,初始状态:第1步:第2步:第3步:第4步:第5步:,递归程序,voidmove(intk)if(k=4)printf(4,5-

温馨提示

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

评论

0/150

提交评论