NOIP初赛资料-过程和函数.ppt

上传人:za****8 文档编号:12667463 上传时间:2020-05-13 格式:PPT 页数:40 大小:389.01KB
返回 下载 相关 举报
NOIP初赛资料-过程和函数.ppt_第1页
第1页 / 共40页
NOIP初赛资料-过程和函数.ppt_第2页
第2页 / 共40页
NOIP初赛资料-过程和函数.ppt_第3页
第3页 / 共40页
点击查看更多>>
资源描述
过程与函数,过程和函数,程序的基本结构,顺序结构,选择结构,循环结构,过程和函数,说明:程序中可以只有主程序而没有子程序,但不能没有主程序,也就是说不能单独执行子程序。,程序设计的基本思想:,自顶向下、逐步求精,程序的模块化,标准函数有:,标准函数的调用,X:=abs(-10);Y:=sqrt(81);Z:=round(35.9);,abs(x)/sqrt(x)/round(x),例1-1:编程求12221002的和,PROGRAMsum(input,output);VARi:integer;s:longint;BEGIN,s:=0;,fori:=1to100do,s:=s+sqr(i);,writeln(s=,s);,END.,例1_2:编程求1!2!3!10!的和。,fac(i),一、函数的定义及调用,Function函数名(形参表):函数类型;局部变量说明;begin语句1;;函数名:=表达式;end;,函数首部,函数体,将函数值传递给函数名,函数的类型,在表达式中调用:函数名(实参),如:x=Abs(n)abs为函数名,n为实参,函数类型为integerorreal,注意:自定义函数先定义后使用。,函数值通过函数名传送回调用程序。,例1-2编写一个求n!的函数fac.,functionfac(n:integer):longint;vark:integer;t:longint;begint:=1;fork:=2tondot:=t*k;fac:=t;end;endfac,函数说明,函数首部,局部变量说明,形式参数,函数执行部分,将函数值传递到函数名中,函数的结果类型,注意:,1、使用函数前应先说明。,3、形参就是函数的自变量,其初值来源于主程序的调用,只有在程序的执行过程中调用了函数,形参才能得到具体的值并参与运算,得到函数值。注意:形参表类似于变量说明,但只能使用类型标识符,且不能直接使用类型。形参可缺省。,4、函数的类型也就是函数值的类型,函数值将通过函数名传送回调用程序。,5、函数体内所用的类型、常量、变量等只在本函数内有效,退出函数体后,分配的存储单元被释放。这些量与函数体外的同名变量无关。,6、在函数体中至少有一条将函数值传给函数名的赋值语句。,2、函数首部以保留字function开头,函数名由用户自定义的一个标识符,用来存放最终函数值。,beginS:=fac(3)+fac(5)+fac(7);Writeln(s=,s)End.,例7-1编写一个求n!的函数fac.,functionfac(n:integer):longint;vark:integer;t:longint;begint:=1;fork:=2tondot:=t*k;fac:=t;end;endfac,函数说明,函数首部,局部变量说明,形式参数,函数执行部分,将函数值传递到函数名中,Programex1-2a(input,output);vars:longint;,主程序,函数调用出现在表达式中,若求3!+5!+7!的值,如何修改程序?,调用函数时注意:,1、自定义函数中的形参,不是实际存在的变量,故又称为虚拟变量,它们并不占用内存单元,只是在调用函数时,才临时开辟相应的内存单元,存放实在参数的值,如fac(3)中的3。它是在调用函数时的所用的自变量。形参实质上是实参的一个“替身”。在调用函数时,实参将值赋给形参,因此实参的个数、类型应与形参一一对应,并且要有确定的值。,2、函数调用步骤是:首先在调用程序中计算实参的值,传送给对应的形参,接着执行函数体,最后将函数值返回给调用程序。,3、函数的定义是静态的,若定义后未被调用,则该函数永远不会被执行。,例1-3计算如图所示的多边形面积。,functionarea(a,b,c:real):real;varp:real;beginp:=(a+b+c)/2;area:=sqrt(p*(p-a)*(p-b)*(p-c);end;,a,b,c为三角形的边长,p为半周长,即p=(a+b+c)/2,Programex1-2(input,output);varb1,b2,b3,b4,b5,b6,b7,s:real;,Beginreadln(b1,b2,b3,b4,b5,b6,b7);s:=area(b1,b5,b6)+area(b2,b6,b7)+area(b3,b4,b7);writeln(s=,s:10:3);End.,函数首部,三个形式参数,函数area结果类型为实型,给函数名area赋值,调用函数,分析:,2、过程定义及调用,标准过程有:,标准过程调用:,read/readln/write/writeln,Read(a,b,c);,自定义过程的格式:,Procedure过程名(形参表);局部变量说明;begin语句1;语句2;end;,过程首部,过程体,将例1-2中n!用过程fa来定义。,Procedurefa(n:integer);vark:integer;begint:=1;fork:=2tondot:=t*k;end;,t在主程序中说明,为全程量。,n!的结果是如何回传给主程序的?,是通过t带回主程序的。,注意:,、过程体内所用的类型、常量、变量只在本过程内有效,退出过程体后,该单元被释放。,、不能给过程名赋值,过程名不能代表任何数据。,思考:n!的结果存放在哪里?,练习:1-3-b定义一个求三角形面积的过程area。,Procedurearea(a,b,c:real;varm:real);varp:real;beginp:=(a+b+c)/2;m:=sqrt(p*(p-a)*(p-b)*(p-c);end;,a、b、c、m四个参数,a、b、c为值参,参数m前面有var,是变参。该过程被调用后,由变参m将结果传回调用程序。,过程调用:,过程名:实在参数表;,例:用过程编写程序求如图所示的五边形面积。,Programlx1-1(input,output);varb1,b2,b3,b4,b5,b6,b7,s,sum,real;,三角形的面积通过变参s传回主程序。,begin,Procedurearea(a,b,c:real;vars:real);varp:real;beginp:=(a+b+c)/2;s:=sqrt(p*(p-a)*(p-b)*(p-c);end;,readln(b1,b2,b3,b4,b5,b6,b7);,end.,sum:=0;,area(b1,b5,b6,s);,sum:=sum+s;,area(b2,b6,b7,s);,sum:=sum+s;,area(b3,b4,b7,s);,sum:=sum+s;,writeln(sum=,sum:10:3);,函数调用出现在表达式中,函数值是通过函数名传回调用程序,操作,完成一系列的数据处理,或与计算无关的各种操作,往往求一个函数值,结果类型,无,函数有类型,最终要将函数值传送给函数名。,调用方式,由独立的过程调用语句来完成,返回值的方法,通过变参将运算的结果传给调用程序,过程和函数的主要区别:,例1-4设计一个过程将数组中的元素从小到大排列。,将数组作为参数。,typeatype=array1.10ofinteger;vara:atype;I:integer;proceduresort(varp:atype);varI,j,k:integer;beginforI:=1to9doforj:=I+1to10doifpIpjthenbegink:=pI;pI:=pj;pj:=k;endend;beginforI:=1to10doread(aI);sort(a);forI:=1to10dowrite(aI,)end.,例1-4设计一个过程将数组中的元素从小到大排列。,将数组作为参数。,typeatype=array1.10ofinteger;vara:atype;I:integer;proceduresort(varp:atype);varI,j,k:integer;beginforI:=1to9doforj:=I+1to10doifpIpjthenbegink:=pI;pI:=pj;pj:=k;endend;beginforI:=1to10doread(aI);sort(a);forI:=1to10dowrite(aI,)end.,注意:当函数或过程的形式参数为数组类型时,相应的实在参数必须是一致的数组类型。当形参为数组类型时,在TP中必须用类型名进行定义,而在FP中是可以这样定义的:,Proceduresort(varp:array1.10ofinteger);,3、变量及其作用域,Programex1-5(input,output);varm:integer;proceduretest1;beginm:=100;end;beginm:=5;writeln(m=,m);test1;writeln(m=,m);end.,例1-5a读程序写结果。,结果为:,m=5,m=100,全程量的作用域有两种情况:,1、在全程变量和局部变量不同名时,其作用域是整个程序。,2、在全程变量和局部变量同名时,全程变量的作用域不包含同名局部变量的作用域。,m为全程变量。,例1-5b读程序写结果。,Programex1-5b(input,output);varm:integer;proceduretest2;varm:integer;beginm:=100;end;beginm:=5;writeln(m=,m);test2;writeln(m=,m);end.,结果为:,m=5,m=5,M是局部量,结果被屏蔽,它不影响到全程量m的值。,全局变量:在主程序中被说明作用域:整个程序;局部变量:在子程序中被说明作用域:主程序及其下级的程序。全程量的作用域分两种情况:当全程量和局部量不同名时,其作用域是整个程序。当全程量和局部量同名时,全程量的作用域不包含局部量的作用域。当局部变量所在子程序被调用时,局部变量才被分配有效的存储单元;当返回调用程序时,局部变量所占的存储单元就被释放。,练一练:,Programex1-2(input,output);varx,y:integer;procedurechange;varx:integer;beginx:=2;y:=2;writeln(x,y);end;beginx:=1;y:=1;writeln(x,y);change;writeln(x,y);end.,结果为:,1212,4、参数的传递,参数,形参,实参,值形参,变形参,Functionfac(x,y:integer):real;,procdurefac(varx,y:integer);,a:=fac(5,6);,值参类似于局部变量,仅为过程和函数的执行提供初值而不影响调用时实际参数的值。,对变参操作实际上就是对实参本身的操作。,Programex1-6-1(input,output);vara:integer;proceduresum(b:integer);beginb:=b+10;writeln(b=,b);end;begina:=10;sum(a);writeln(a=,a);end.,运行结果为:,b=20a=10,Programex1-6-2(input,output);vara:integer;proceduresum(varb:integer);beginb:=b+10;writeln(b=,b);end;begina:=10;sum(a);writeln(a=,a);end.,运行结果为:,b=20a=20,值参,变参,Programlx1-2-1(input,output);varx,n:integer;procedurechan(x:integer;vary:integer);beginx:=x+5;y:=y+5;writeln(x=,x,y=,y);end;beginx:=10;n:=10;writeln(x=,x,n=,n);chan(x,n);writeln(x=,x,n=,n);end.,结果为:,X=10n=10X=15y=15X=10n=15,练一练,读下列程序体会子程序的功能:,Programlx_1_2a(input,output);varx,y:integer;procedureswap1;vart:integer;begint:=x;x:=y;y:=t;end;beginx:=10;y:=20;writeln(x=,x,y=:6,y);swap1;writeln(x=,x,y=:6:y)End.,Programlx_1_2b(input,output);varx,y:integer;procedureswap1(varx,y:integer);vart:integer;begint:=x;x:=y;y:=t;end;beginx:=10;y:=20;writeln(x=,x,y=:6,y);swap1(x,y);writeln(x=,x,y=:6:y)End.,值参与变参的区别:,1、传值:为值参分配存储单元,过程体内对值参的操作不影响实参的值。一旦过程体执行结束后,系统将收回值参所占用的存储单元,值参的值也就不再存在。,2、变参是传地址:变参所占用的存储单元中存放的是实参的地址,因此对变参的操作就是对实参的操作。一旦过程体执行完毕,系统将收回变参所占用的存储单元,但运算结果已保留在对应的实参中。,形参种类不同决定了实参的单、双向传递。值参实现单向传递,仅将过程外部的值传递给过程,故称为输入参数,它所对应的实在参数可以是常量、变量或表达式;变参实现的是双向传递,除了将过程外部的值传递给过程外,更重要的是它能将过程中变化的形参值带出来,故又称为输出参数,其对应的实参必须是变量。,指出程序中的全程变量、局部变量、值参、变参,并写出程序运行后的输出结果。,Programlx(input,output);vara,b,c:integer;Proceduresuan(varx:integer;y:integer);varm,n:integer;beginm:=x*y;x:=x+1;y:=y+10;n:=x+y;writeln(x=,x,y=:4,y,m=:4,m,n=:4,n)end;begina:=3;b:=3;suan(a,b);suan(a,b);suan(a,b)end.,全程变量a,b,c局部变量m,n,值参:y变参:x,结果:x=4y=13m=9n=17,x=5y=13m=12n=18,x=6y=13m=15n=19,练习:,6、子程序的嵌套,一个函数或过程可能要求调用另一个函数或过程,这种调用称为函数或过程的嵌套。,1、嵌套,n!=n*(n-1)*2*1用fac函数实现。组合用cnm函数实现。被调用的函数写在调用它的函数前面。,Programex1-7(input,output);vars:real;functionfac(k:integer):real;varI,fa:integer;beginfa:=1;forI:=2tokdofa:=fa*I;fac:=faend;,Functioncnm(n,m:integer):real;begincnm:=fac(n)/(fac(m)*fac(n-m);end;Begins:=cnm(6,3)+cnm(9,5);writeln(s=,s:6:0);End.,求n!函数,求组合函数,调用fac函数,调用cnm函数,主程序,程序的执行过程:,主程序,函数cnm,1开始,2调用cnm(6,3),函数fac,3调用fac(6),4返回,5调用fac(3),6返回,7用fac(6-3),8返回,9返回,继续执行主程序,Functioncnm(n,m:integer):real;functionfac(k:integer):real;varI,fa:integer;beginfa:=1;forI:=2tokdofa:=fa*I;fac:=faend;begincnm:=fac(n)/(fac(m)*fac(n-m);end;,Functionfac(k:integer):real;varI,fa:integer;beginfa:=1;forI:=2tokdofa:=fa*I;fac:=faend;Functioncnm(n,m:integer):real;begincnm:=fac(n)/(fac(m)*fac(n-m);end;,提前引用子程序:,在程序中并列的过程或函数需要相互调用。,Procedureb;forward;Procedurea(p:real;varq:real);beginb;end;Procedureb;begina(x,y);end;,把需要提前引用的过程或函数的首部放置在前面,并加上保留字forward;,说明:,functionfac(k:integer):real;forward;functioncnm(n,m:integer):real;begincnm:=fac(n)/(fac(m)*fac(n-m);end;functionfac(k:integer):real;varI,fa:integer;beginfa:=1;forI:=2tokdofa:=fa*I;fac:=faend;,例1-8数组归并问题:数组a,b均已从小到大排好序,各数组内无相同元素。现将a,b合并为数组c,要求数组c也是从小到大排好序(有相同元素时只保留一个)。,问题分析:(1)如果数组a、b的值如下:,a:2561017m=5b:14520n=4则合并后,c:12456101720k=8m、n、k表示数组元素的个数,设m=10,n=10。,(2)在程序中,I,j,k控制a,b,c的下标。设计过程du完成a,b数组的赋值。(3)设计过程copy完成在c数组中插入指定的元素:copy(x:arrtype;vary:arrtype;varI,j:integer);其中x为值参,I,j,y为变参,假设相应的实参为copy(a,c,4,3),则表示待插入的元素是a3,而当前c数组的最后一个有值的元素是c4,因此过程体完成的工作是将a3的值赋给c5。,综合应用:,programex1-8(input,output);typeatype=array1.20ofinteger;vara,b,c:atype;I,j,k,m,n:integer;proceduredu(vard:atype;h:integer);varp:integer;beginforp:=1tohdoread(dp);end;procedurecopy(x:atype;vary:atype;varI,j:integer);beginI:=I+1;yI:=xj;j:=j+1;end;beginreadln(m,n);write(a:);du(a,m);write(b:);du(b,n);I:=1;j:=1;k:=0;,while(Ibjthencopy(b,c,k,j);ifaI=bjthenbegincopy(a,c,k,I);j:=j+1;end;end;whileI=mdocopy(a,c,k,I);whilej6)and(n=0)and(ch=9)dobegink:=k+1;intk:=ord(ch)-ord(0);(?)read(ch)end;readln;ifknthen(?)fori:=kdownto1dobeginintn+i-k:=inti;inti:=0;end;end;,Constn=100;Typearrtype=array1.nofinteger;Vara,b:arrtype;g,s:integer;,Procedureadd(vara:arrtype;b:arrtype);vark:integer;Beging:=0;fork:=ndownto1dobegins:=ak+bk+g;(?)ak:=smod10;g:=sdiv10;end;,Procedureoutdata(a:arrtype;);vark:integer;Begink:=1;whileak=0dok:=k+1;whilek=ndobeginwrite(ak);k:=k+1;end;writeln;end;,Beginfors:=1tondobeginas:=0;bs:=0;end;readdata(a);readdata(b);add(a,b);outdata(a);End.,练习:,1、求正整数A和B之间的完全数(AB).完全数是指它的小于该数本身的因子之和等于它本身,如6123,6即是一个完全数。2、编写一个程序,它将输入到一维数组中的任意10个数按升序排列,再从终端读入一个待查找的数x,查找出x在数组中的位置。要求排序由过程实现,查找由函数实现。3、哥德巴赫猜想:将一个奇数拆分成三个素数之和。样例:输入:9输出:9=3+3+34、高精度处理:要求处理两个高精度的减法及多位高精度与一位数的乘法。,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!