收藏 分销(赏)

第7章应用函数编制程序教学课件.pptx

上传人:w****g 文档编号:13127240 上传时间:2026-01-23 格式:PPTX 页数:49 大小:18.53MB 下载积分:8 金币
下载 相关 举报
第7章应用函数编制程序教学课件.pptx_第1页
第1页 / 共49页
第7章应用函数编制程序教学课件.pptx_第2页
第2页 / 共49页


点击查看更多>>
资源描述
Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,11/7/2009,#,第七章,应用函数编制程序,第一节,函数的引入,模块化程序设计,基本思想:将一个大的程序按,功能分割成一些小模块,特点:,各模块相对独立、功能单一、结构清晰、接口简单,控制了程序设计的复杂性,提高元件的可靠性,缩短开发周期,避免程序开发的重复劳动,易于维护和功能扩充,开发方法:,自上向下,逐步分解,分而治之,第六章函数,6.1,概述,模块化程序设计,基本思想:将一个大的程序按功能分割成一些小模块,特点:,各模块相对独立、功能单一、结构清晰、接口简单,控制了程序设计的复杂性,提高元件的可靠性,缩短开发周期,避免程序开发的重复劳动,易于维护和功能扩充,开发方法:,自上向下,逐步分解,分而治之,C是模块化程序设计语言,C程序,源程序文件1,源程序文件i,源程序文件n,预编译命令,函数1,函数n,说明部分,执行部分,C程序结构,C是,函数式,语言,必须有且只能有一个名为,main,的主函数,C程序的执行总是,从main函数开始,在main中结束,函数,不能嵌套定义,可以嵌套调用,函数分类,从用户角度,标准函数(库函数):由系统提供,用户自定义函数,从函数形式,无参函数,有参函数,使用,库函数,应注意:,1、函数功能,2、函数参数的数目和顺序,及各参数意义和类型,3、函数返回值意义和类型,4、需要使用的包含文件,Ch7_201.c,第二节,函数的定义,一、函数定义的一般形式,函数类型函数名(函数参数类型1函数参数名1,函数参数类型n,函数参数名n),声明部分,函数头,执行部分,函数体,一个函数(定义)由函数头(函数首部)和函数体,两部分组成。,函数头(函数首部):说明函数类型、函数名及参数。,函数类型:函数返回值的类型,可以是基本数据类,型也可以是构造类型。如果省略默认为,int,如果不返回值,定义为void类型。,函数名:给函数取的名字,以后用这个名字调用。,函数名由用户命名,命名规则同标识符。,参数表:函数名后面是参数表。无参函数没有参数,传递,但“()”号不能省略,这是格式,的规定。参数表说明参数的类型和形式参,数的名称,各个形式参数用“,”分隔。,函数体:函数首部下面用一对括起来的部分。,函数体一般包括声明部分、执行部分。,声明部分:在这部分定义本函数所使用的,变量和进行有关声明(如函数,声明)。,执行部分:程序段,由若干条语句组成命,令序列(可以在其中调用其它,函数)。,注意:,函数不能单独运行,函数可以被主函数或,其它函数调用,也可以调用其它函数,但是不,能调用主函数。,例如:下面定义了一个名为max的函数。,intmax(x,y),/*函数头部,说明函数返回值为整型,,有两个参数x,y*/,intx,y;,/*函数头部,说明函数参数的类型*/,intz;,/*以下为函数体,z为函数体中的局部变量*/,z=xy?x:y;,return(z);,【例7.1】输入三个整数,求三个整数,中的最大值并打印出来。,/*不使用子函数*/,main(),intn1,n2,n3,max;,scanf(%d%d%d,if(n1n2)max=n1;,elsemax=n2;,if(n3max)max=n3;,printf(max=%dn,max);,/*使用子函数*/,intmaxnumber(intx,inty,intz),intm;,if(xy)m=x;,elsem=y;,if(zm)m=z;,return(m);,main(),intn1,n2,n3,max;,scanf(%d%d%d,max=maxnumber(n1,n2,n3);/*函数调用*/,printf(max=%d,max);,二、函数的参数和返回值,1、形式参数与实际参数,(1)形式参数(简称形参):函数定义时设定,的参数。,(2)实际参数(简称实参):调用函数时所使,用的实际的参数。,例比较两个数并输出大者,main(),inta,b,c;,scanf(%d,%d,c=max(a,b);,printf(Maxis%d,c);,c=max(a,b);,(main函数),实参,max(intx,inty)(max函数),intz;,max(intx,inty),intz;,z=xy?x:y;,return(z);,形参,z=xy?x:y;,return(z);,注意:,形参在函数未调用时,并不占内存中的存储,单元。只有在发生函数调用时,函数中的形,参才被分配内存单元。在调用结束后,形参,所占的内存单元被释放。,实参可以是常量、变量或表达式,要求它们,有确定的值。,在被定义的函数中,必须指定形参的类型,,实参与形参的类型应一致。,(3)参数的传递,在调用函数时,主调函数和被调函数之间,有数据的传递实参传递给形参。,具体的传递方式有两种:,值传递方式(传值):将实参单向传递给形参,的一种方式。,地址传递方式(传址):将实参地址单向传递,给形参的一种方式。,“传值”与“传址”的区别,“传值”、“传址”只是传递的数据类型不同,(传值一般的数值,传址地址)。,系统分配给实参、形参的内存单元是不同的。,两种参数传递方式中,实参可以是变量、常,量、表达式;形参一般是变量,要求两者类,型相同或赋值兼容。,2、函数的返回值,(1)return语句的格式,return(表达式);,或:return表达式;,或:return;,return语句的用途:,(1)用于结束函数的执行并返回到调用者;,(2)用来向调用者传递一个返回值。该语,句对非void函数适用。,(2)函数值的类型,如:intmax(x,y),/*函数返回值为整型*/,charletter(c1,c2),/*函数返回值为字符型*/,doublemin(x,y),/*函数返回值为双精度型*/,说明,函数的类型就是返回值的类型,return语句,中表达式的类型应该与函数类型一致。如果,不一致,以函数类型为准(赋值转化)。,函数类型省略,C语言默认函数返回值为int型。,如果被调函数中没有return语句,则函数带,回一个不确定值。若明确表示“不带回值”,,则可以用“void”定义“无类型”(或称,“空类型”)。,第三节,函数的调用,一、函数调用的一般方法,函数调用的一般形式:,函数名(实参表列);,说明:,无参函数调用没有参数,但是“()”不,能省略,有参函数若包含多个参数,各参数用,“,”分隔,实参参数个数与形参参数个数相,同,类型一致或赋值兼容。,函数调用的三种形式,1、以单独语句形式调用(注意后面要加一个分,号,构成语句)。以语句形式调用的函数可,以有返回值,也可以没有返回值。,2、在表达式中调用(后面没有分号)。在表,达式中的函数调用必须有返回值。,3、作为函数的参数调用。,【例7.2】读下列程序写出结果。,printstar(),printf(*n);,printd(),printf($n);,main(),printstar();,printd();,printstar();,二、函数的声明,1、函数定义的位置与函数声明的关系,(1)可以在调用它的函数之前;,(2)可以在调用它的函数之后;,(3)在其它的源程序模块中。,(4)函数定义位置在前,函数调用在后,不必,声明,编译程序产生正确的调用格式。,(5)函数定义在调用它的函数之后或者函数在,其它源程序模块中,且函数类型不是整型,这时,为了使编译程序产生正确的调用格,式,可以在函数使用前对函数进行声明。,这样不管函数在什么位置,编译程序都能,产生正确的调用格式。,2、函数声明的格式,函数类型函数名(参数类型,参数类型);,说明:,C语言的库函数就是位于其它模块的函数,为,了正确调用,C编译系统提供了相应的.h文件。.h,文件内许多都是函数声明,当源程序要使用库函数,时,就应当包含相应的头文件。,#include,文件包含编译预处理命令,longsum(inta,intb);,longfactorial(intn);,函数类型说明,main(),intn1,n2;,longa;,longsum(inta,intb);,scanf(%d,%d,a=,sum(n1,n2);,printf(a=%1d,a);,longfactorial(intn),longrtn=1;,inti;,for(i=1;i=n;i+),rtn*=i;,return(rtn);,实参,函数调用,函数定义,longsum(,inta,intb,),形参,longfactorial(intn);,longc1,c2;,c1=,factorial(a);,c2=,factorial(b);,return(c1+c2);,函数调用,函数返回值,第四节,函数的嵌套调用与递归调用,一、函数嵌套调用,一个函数在使用过程中调用另外一个,函数,而被调用的函数又调用其它函数,,这种情况称为函数的嵌套调用。,嵌套调用,C规定:函数定义不可嵌套,但可以嵌套调用函数,main(),a函数,b函数,调用函数a,调用函数b,结束,【例7.3】写两个函数,分别求两个整数的最大公,约数和最小公倍数,用主函数调用这两,个函数,并输出结果。,程序如下所示:,intgcd(a,b)/*求最大公约数展转相除法*/,inta,b;,intr,t;,if(ab),t=a;a=b;b=t;,r=a%b;,while(r!=0),a=b;,b=r;,r=a%b;,return(b);,intlcm(a,b)/*求最小公倍数*/,inta,b;,intr;,r=gcd(a,b);,return(a*b/r);,main(),intx,y;,scanf(%d,%d,printf(%dn,gcd(x,y);,printf(%dn,lcm(x,y);,二、函数的递归调用,1、函数递归调用的定义,函数在调用另一个函数的过程中直接或,间接地调用该函数自身,前者称为直接递归,调用,后者称为间接递归调用。,函数f1()在运行过程中调用它本身,,这种方式的函数调用就是直接递归调用;函,数f1()在运行过程中调用函数f2(),函,数f2()在运行过程中又调用f1(),这种方,式的函数调用就是间接递归调用。,2、使用递归调用解决问题的方法,(1)原有的问题能够分解为一个新问题,而新问,题又用到了原有的解法,这就出现了递归。,(2)按照这个原则分解下去,每次出现的新问题,是原有问题的简化的子问题。,(3)最终分解出来的新问题是一个已知解的问题。,3、递归调用的过程(两个阶段),递推阶段:将原问题不断地分解为新的子问题,,逐渐从未知的向已知的方向推测,最,终达到已知的条件,即递归结束条件,,这时递推阶段结束。,回归阶段:从已知条件出发,按照“递推”的逆,过程,逐一求值回归,最终到达“递,推”的开始处,结束回归阶段,完成,递归调用。,【例7.4】用递归法求n!,1(n=0,1),n!=n*(n-1)!n=其它,递归公式:n!=,程序如下:,floatfac(n)/*计算n!*/,intn;,floatf;,if(n0)printf(n0)z=1;,elseif(x0)z=-1;,elsez=0;,return(z);,main(),floata;,scanf(%f,printf(%d,y(a);,【例7.6】应用函数求5!+16!+27!,程序如下:,main(),floatjiec();/*被调函数说明*/,floata,b,c;,a=jiec(5);,b=jiec(16);,c=jiec(27);,printf(5!+16!+27!=%en,a+b+c);,floatjiec(int,n)/*求任意数n的阶乘的函数*/,floaty=1;,inti;,for(i=1;i=n;i+),y=y*i;,return(y);,例求学生的平均成绩,形参用数组定义,intstu,#include,floataverage(,int,stu10,intn),floataverage(intstu10,intn);,voidmain(),intscore10,i;,inti;,floatav,total=0;,for(i=0;in;i+),floatav;,printf(Input10scores:n);,for(i=0;i10;i+),total+=stui;,av=total/n;,returnav;,scanf(%d,av=,average(,score,10);,printf(Averageis:%.2f,av);,score,stu,0,1,2,12,23,56,实参用数组名,.,.,.,.,9,88,#includemath.h,intprime(int,x)/*,【,判断任意一个数,例7.8】任读,x是否是素数,若是素数返回数值,20个数,找出其中的素数,,1,否则返回数值0*/,inti;,并求素数的和。要求用函数实现,if(x=1)return(0);,for(i=2;i=sqrt(x);i+),在主程序中完成输入输出。,return(1);,if(x%2=0)return(0);,intsum(d,n)/*对n个数求和函数*/,intd,n;,inti,s=0;,for(i=0;in;i+),s=s+di;,return(s);,main(),inta20,b20,i,j=0;,for(i=0;i20;i+)/*输入数据*/,scanf(%d,/*判断每一个数ai是否是素数,若是素数,存储在数组b中*/,for(i=0;i20;i+),if(prime(ai)/*函数调用*/,bj=ai;j+;,/*输出存放素数的数组b*/,for(i=0;i%cn,getone,putone);,voidhanoi(n,one,two,three),intn;,charone,two,three;,if(n=1)move(one,three);,else,hanoi(n-1,one,three,two);,move(one,three);,hanoi(n-1,two,one,three);,main(),intm;,printf(Inputthenumberofdisks:);,scanf(%d,printf(Thestepstomoving%3ddisks:n,m);,hanoi(m,A,B,C);,第六节,局部变量与全局变量,一、变量的作用域,1、局部变量:是指在一定范围内有效的变量。,C语言中,以下各位置定义的变量均属于局部变量。,(1)在函数体内定义的变量,在本函数范围内有效,,作用域局限于函数体内。,(2)在复合语句内定义的变量,在本复合语句范围,内有效,作用域局限于复合语句内。,(3)有参函数的形式参数也是局部变量,只在其所,在的函数范围内有效。,2、全局变量:在函数之外定义的变量。,全局变量作用域:从定义全局变量的位置起到本源,程序结束为止。,在引用全局变量时如果使用“extern”声明全,局变量,可以扩大全局变量的作用域。例如,扩大,到整个源文件(模块),对于多源文件(模块)可,以扩大到其它源文件(模块)。在定义全局变量时,如果使用修饰关键词static,表示此全局变量作用,域仅限于本源文件(模块)。,二、变量的存储类别,1、变量的分类,从空间上分为局部变量、全局变量。,从变量存在的时间的长短(即变量生存期)来划,分,可以分为:动态存储变量、静态存储变量。,(1)静态存储变量:程序运行期间分配固定的存,储空间,存放全局变量。,(2)动态存储变量:根据需要动态分配存储空间,,存放函数形参变量;局部变,量(未加static说明的);,函数调用时的现场保护和返,回地址等。,2、变量的存储方式,自动(局部变量)(auto),动态存储方式,寄存器(局部变量)(register),静态(局部变量)(static),静态存储方式,静态全局变量(全局变量全部是静,态的,不必用static修饰),动态存储方式,在程序运行期间根据需要为相关的变量动态分配,存储空间的方式。C语言中,变量的动态存储方式主,要有自动型存储方式和寄存器型存储方式。,自动型存储方式(auto),auto型存储方式是C语言默认的局部变量的存储,方式,也是局部变量最常使用的存储方式。,寄存器型存储方式(register),register型存储方式是C语言使用较少的一种局,部变量的存储方式。该方式将局部变量存储在CPU的,寄存器中,寄存器比内存操作要快很多,所以可以,将一些需要反复操作的局部变量存放在寄存器中。,静态存储方式,静态存储方式:在程序编译时就给相关的变量分配,固定的存储空间(在程序运行的整,个期间内都不变)的存储方式。C,语言中,使用静态存储方式的主要,有静态存储的局部变量和全局变量。,说明:,静态局部变量的存储空间是在程序编译时由系,统分配的,且在程序运行的整个期间都固定不变。,该类变量在其函数调用结束后仍然可以保留变量值。,下次调用该函数,静态局部变量中仍保留上次调用,结束时的值。,3、存储类别小结,(1)从作用域角度分,自动变量即动态局部变量(离开函数,值就消失),静态局部变量(离开函数,值仍保留),寄存器变量(离开函数,值就消失),(形式参数可以定义为自动变量或寄存器变量),局部变量,全部变量,静态外部变量(只限本文件引用),外部变量(即非静态的,允许其他文件引用),(2)从变量存在的时间分,动态存储:自动变量、寄存器变量、形式参数,静态存储:静态局部变量、静态外部变量、外部变量,(3)变量值存放的位置分,内存中的静态存储区:静态局部变量、静态外部变量、,外部变量,内存中的动态存储区:自动变量和形式参数,寄存器:寄存器变量,4、内部函数和外部函数,根据函数能否被其它源文件调用,将函数,分为内部函数和外部函数。,内部函数定义:,static类型标识符,函数名(形参表),外部函数定义:,extern类型标识符,5、内部函数和外部函数小结,(1)局部变量默认为auto型;,(2)register类型变量个数受限,且不能为long,double,float型;,(3)局部static变量具有全局寿命和局部可见性;,(4)局部static变量具有可继承性;,(5)extern不是变量定义,在引用全局变量时如果,使用“extern”声明全局变量,可以扩大全,局变量的作用域。例如,扩大到整个源文件,(模块),对于多源文件(模块)可以扩大,到其它源文件(模块)。,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服