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

上传人:小飞机 文档编号:6513078 上传时间:2023-11-08 格式:PPT 页数:40 大小:374KB
返回 下载 相关 举报
NOIP初赛资料-过程和函数.ppt_第1页
第1页 / 共40页
NOIP初赛资料-过程和函数.ppt_第2页
第2页 / 共40页
NOIP初赛资料-过程和函数.ppt_第3页
第3页 / 共40页
NOIP初赛资料-过程和函数.ppt_第4页
第4页 / 共40页
NOIP初赛资料-过程和函数.ppt_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《NOIP初赛资料-过程和函数.ppt》由会员分享,可在线阅读,更多相关《NOIP初赛资料-过程和函数.ppt(40页珍藏版)》请在三一办公上搜索。

1、过程与函数,过程和函数,程 序 的基本结构,顺序结构,选择结构,循环结构,过程和函数,说明:程序中可以只有主程序而没有子程序,但不能没有主程序,也就是说不能单独执行子程序。,程序设计的基本思想:,自顶向下、逐步求精,程序的模块化,标准函数有:,标准函数的调用,X:=abs(-10);Y:=sqrt(81);Z:=round(35.9);,abs(x)/sqrt(x)/round(x),例1-1:编程求12221002 的和,PROGRAM sum(input,output);VAR i:integer;s:longint;BEGIN,s:=0;,for i:=1 to 100 do,s:=s+

2、sqr(i);,writeln(s=,s);,END.,例1_2:编程求1!2!3!10!的和。,fac(i),一、函数的定义及调用,Function 函数名(形参表):函数类型;局部变量说明;begin 语句1;;函数名:=表达式;end;,函数首部,函数体,将函数值传递给函数名,函数的类型,在表达式中调用:函数名(实参),如:x=Abs(n)abs为函数名,n为实参,函数类型为integer or real,注意:自定义函数先定义后使用。,函数值通过函数名传送回调用程序。,例1-2 编写一个求n!的函数fac.,function fac(n:integer):longint;var k:i

3、nteger;t:longint;begin t:=1;for k:=2 to n do t:=t*k;fac:=t;end;endfac,函数说明,函数首部,局部变量说明,形式参数,函数执行部分,将函数值传递到函数名中,函数的结果类型,注意:,1、使用函数前应先说明。,3、形参就是函数的自变量,其初值来源于主程序的调用,只有在程序的执行过程中调用了函数,形参才能得到具体的值并参与运算,得到函数值。注意:形参表类似于变量说明,但只能使用类型标识符,且不能直接使用类型。形参可缺省。,4、函数的类型也就是函数值的类型,函数值将通过函数名传送回调用程序。,5、函数体内所用的类型、常量、变量等只在本函

4、数内有效,退出函数体后,分配的存储单元被释放。这些量与函数体外的同名变量无关。,6、在函数体中至少有一条将函数值传给函数名的赋值语句。,2、函数首部以保留字function开头,函数名由用户自定义的一个标识符,用来存放最终函数值。,begin S:=fac(3)+fac(5)+fac(7);Writeln(s=,s)End.,例7-1 编写一个求n!的函数fac.,function fac(n:integer):longint;var k:integer;t:longint;begin t:=1;for k:=2 to n do t:=t*k;fac:=t;end;endfac,函数说明,函数

5、首部,局部变量说明,形式参数,函数执行部分,将函数值传递到函数名中,Program ex1-2a(input,output);var s:longint;,主程序,函数调用出现在表达式中,若求3!+5!+7!的值,如何修改程序?,调用函数时注意:,1、自定义函数中的形参,不是实际存在的变量,故又称为虚拟变量,它们并不占用内存单元,只是在调用函数时,才临时开辟相应的内存单元,存放实在参数的值,如fac(3)中的3。它是在调用函数时的所用的自变量。形参实质上是实参的一个“替身”。在调用函数时,实参将值赋给形参,因此实参的个数、类型应与形参一一对应,并且要有确定的值。,2、函数调用步骤是:首先在调用

6、程序中计算实参的值,传送给对应的形参,接着执行函数体,最后将函数值返回给调用程序。,3、函数的定义是静态的,若定义后未被调用,则该函数永远不会被执行。,例1-3 计算如图所示的多边形面积。,function area(a,b,c:real):real;var p:real;begin p:=(a+b+c)/2;area:=sqrt(p*(p-a)*(p-b)*(p-c);end;,a,b,c为三角形的边长,p为半周长,即p=(a+b+c)/2,Program ex1-2(input,output);var b1,b2,b3,b4,b5,b6,b7,s:real;,Begin readln(b1

7、,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来定义。,Procedure fa(n:i

8、nteger);var k:integer;begin t:=1;for k:=2 to n do t:=t*k;end;,t 在主程序中说明,为全程量。,n!的结果是如何回传给主程序的?,是通过t带回主程序的。,注意:,、过程体内所用的类型、常量、变量只在本过程内有效,退出过程体后,该单元被释放。,、不能给过程名赋值,过程名不能代表任何数据。,思考:n!的结果存放在哪里?,练习:1-3-b 定义一个求三角形面积的过程area。,Procedure area(a,b,c:real;var m:real);var p:real;begin p:=(a+b+c)/2;m:=sqrt(p*(p-a)

9、*(p-b)*(p-c);end;,a、b、c、m四个参数,a、b、c为值参,参数m前面有var,是变参。该过程被调用后,由变参m将结果传回调用程序。,过程调用:,过程名:实在参数表;,例:用过程编写程序求如图所示的五边形面积。,Program lx1-1(input,output);var b1,b2,b3,b4,b5,b6,b7,s,sum,real;,三角形的面积通过变参s传回主程序。,begin,Procedure area(a,b,c:real;var s:real);var p:real;begin p:=(a+b+c)/2;s:=sqrt(p*(p-a)*(p-b)*(p-c);

10、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);,函数调用出现在表达式中,函数值是通过函数名传回调用程序,操作,完成一系列的数据处理,或与计算无关的各种操作,往往求一个函数值,结果类型,无,函数有类型,最终要将函数值传送给函数名。,调用方式,由独立的过程调用语句来完成,返回值的方法,通过变参将运算的结果传给调用程序,过程和函

11、数的主要区别:,例1-4 设计一个过程将数组中的元素从小到大排列。,将数组作为参数。,type atype=array1.10 of integer;var a:atype;I:integer;procedure sort(var p:atype);var I,j,k:integer;begin for I:=1 to 9 do for j:=I+1 to 10 do if pIpj then begin k:=pI;pI:=pj;pj:=k;end end;begin for I:=1 to 10 do read(aI);sort(a);for I:=1 to 10 do write(aI,

12、)end.,例1-4 设计一个过程将数组中的元素从小到大排列。,将数组作为参数。,type atype=array1.10 of integer;var a:atype;I:integer;procedure sort(var p:atype);var I,j,k:integer;begin for I:=1 to 9 do for j:=I+1 to 10 do if pIpj then begin k:=pI;pI:=pj;pj:=k;end end;begin for I:=1 to 10 do read(aI);sort(a);for I:=1 to 10 do write(aI,)e

13、nd.,注意:当函数或过程的形式参数为数组类型时,相应的实在参数必须是一致的数组类型。当形参为数组类型时,在TP中必须用类型名进行定义,而在FP中是可以这样定义的:,Procedure sort(var p:array1.10 of integer);,3、变量及其作用域,Program ex1-5(input,output);var m:integer;procedure test1;begin m:=100;end;begin m:=5;writeln(m=,m);test1;writeln(m=,m);end.,例1-5 a读程序写结果。,结果为:,m=5,m=100,全程量的作用域有两

14、种情况:,1、在全程变量和局部变量不同名时,其作用域是整个程序。,2、在全程变量和局部变量同名时,全程变量的作用域不包含同名局部变量的作用域。,m为全程变量。,例1-5b 读程序写结果。,Program ex1-5b(input,output);var m:integer;procedure test2;var m:integer;begin m:=100;end;begin m:=5;writeln(m=,m);test2;writeln(m=,m);end.,结果为:,m=5,m=5,M是局部量,结果被屏蔽,它不影响到全程量m的值。,全局变量:在主程序中被说明 作用域:整个程序;局部变量:

15、在子程序中被说明 作用域:主程序及其下级的程序。全程量的作用域分两种情况:当全程量和局部量不同名时,其作用域是整个程序。当全程量和局部量同名时,全程量的作用域不包含局部量的作用域。当局部变量所在子程序被调用时,局部变量才被分配有效的存储单元;当返回调用程序时,局部变量所占的存储单元就被释放。,练一练:,Program ex1-2(input,output);var x,y:integer;procedure change;var x:integer;begin x:=2;y:=2;writeln(x,y);end;begin x:=1;y:=1;writeln(x,y);change;writ

16、eln(x,y);end.,结果为:,121 2,4、参数的传递,参数,形参,实参,值形参,变形参,Function fac(x,y:integer):real;,procdure fac(var x,y:integer);,a:=fac(5,6);,值参类似于局部变量,仅为过程和函数的执行提供初值而不影响调用时实际参数的值。,对变参操作实际上就是对实参本身的操作。,Program ex1-6-1(input,output);var a:integer;procedure sum(b:integer);begin b:=b+10;writeln(b=,b);end;begin a:=10;su

17、m(a);writeln(a=,a);end.,运行结果为:,b=20a=10,Program ex1-6-2(input,output);var a:integer;procedure sum(var b:integer);begin b:=b+10;writeln(b=,b);end;begin a:=10;sum(a);writeln(a=,a);end.,运行结果为:,b=20a=20,值参,变参,Program lx1-2-1(input,output);var x,n:integer;procedure chan(x:integer;var y:integer);begin x:=

18、x+5;y:=y+5;writeln(x=,x,y=,y);end;begin x:=10;n:=10;writeln(x=,x,n=,n);chan(x,n);writeln(x=,x,n=,n);end.,结果为:,X=10 n=10X=15 y=15X=10 n=15,练一练,读下列程序体会子程序的功能:,Program lx_1_2a(input,output);var x,y:integer;procedure swap1;var t:integer;begin t:=x;x:=y;y:=t;end;begin x:=10;y:=20;writeln(x=,x,y=:6,y);swa

19、p1;writeln(x=,x,y=:6:y)End.,Program lx_1_2b(input,output);var x,y:integer;procedure swap1(var x,y:integer);var t:integer;begin t:=x;x:=y;y:=t;end;begin x:=10;y:=20;writeln(x=,x,y=:6,y);swap1(x,y);writeln(x=,x,y=:6:y)End.,值参与变参的区别:,1、传值:为值参分配存储单元,过程体内对值参的操作不影响实参的值。一旦过程体执行结束后,系统将收回值参所占用的存储单元,值参的值也就不再存

20、在。,2、变参是传地址:变参所占用的存储单元中存放的是实参的地址,因此对变参的操作就是对实参的操作。一旦过程体执行完毕,系统将收回变参所占用的存储单元,但运算结果已保留在对应的实参中。,形参种类不同决定了实参的单、双向传递。值参实现单向传递,仅将过程外部的值传递给过程,故称为输入参数,它所对应的实在参数可以是常量、变量或表达式;变参实现的是双向传递,除了将过程外部的值传递给过程外,更重要的是它能将过程中变化的形参值带出来,故又称为输出参数,其对应的实参必须是变量。,指出程序中的全程变量、局部变量、值参、变参,并写出程序运行后的输出结果。,Program lx(input,output);var

21、 a,b,c:integer;Procedure suan(var x:integer;y:integer);var m,n:integer;begin m:=x*y;x:=x+1;y:=y+10;n:=x+y;writeln(x=,x,y=:4,y,m=:4,m,n=:4,n)end;begin a:=3;b:=3;suan(a,b);suan(a,b);suan(a,b)end.,全程变量 a,b,c局部变量 m,n,值参:y变参:x,结果:x=4 y=13 m=9 n=17,x=5 y=13 m=12 n=18,x=6 y=13 m=15 n=19,练习:,6、子程序的嵌套,一个函数或过

22、程可能要求调用另一个函数或过程,这种调用称为函数或过程的嵌套。,1、嵌套,n!=n*(n-1)*2*1 用fac函数实现。组合用cnm函数实现。被调用的函数写在调用它的函数前面。,Program ex1-7(input,output);var s:real;function fac(k:integer):real;var I,fa:integer;begin fa:=1;for I:=2 to k do fa:=fa*I;fac:=fa end;,Function cnm(n,m:integer):real;begin cnm:=fac(n)/(fac(m)*fac(n-m);end;Begi

23、n s:=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返回,继续执行主程序,Function cnm(n,m:integer):real;function fac(k:integer):real;var I,fa:integer;begin fa:=1;for I:=2 to k do fa:=fa*I;fac:=fa en

24、d;begin cnm:=fac(n)/(fac(m)*fac(n-m);end;,Function fac(k:integer):real;var I,fa:integer;begin fa:=1;for I:=2 to k do fa:=fa*I;fac:=fa end;Function cnm(n,m:integer):real;begin cnm:=fac(n)/(fac(m)*fac(n-m);end;,提前引用子程序:,在程序中并列的过程或函数需要相互调用。,Procedure b;forward;Procedure a(p:real;var q:real);begin b;end

25、;Procedure b;begin a(x,y);end;,把需要提前引用的过程或函数的首部放置在前面,并加上保留字forward;,说明:,function fac(k:integer):real;forward;function cnm(n,m:integer):real;begin cnm:=fac(n)/(fac(m)*fac(n-m);end;function fac(k:integer):real;var I,fa:integer;begin fa:=1;for I:=2 to k do fa:=fa*I;fac:=fa end;,例1-8数组归并问题:数组a,b均已从小到大排好

26、序,各数组内无相同元素。现将a,b合并为数组c,要求数组c也是从小到大排好序(有相同元素时只保留一个)。,问题分析:(1)如果数组a、b的值如下:,a:2 5 6 10 17 m=5b:1 4 5 20 n=4则合并后,c:1 2 4 5 6 10 17 20 k=8m、n、k表示数组元素的个数,设m=10,n=10。,(2)在程序中,I,j,k控制a,b,c的下标。设计过程du完成a,b数组的赋值。(3)设计过程copy完成在c数组中插入指定的元素:copy(x:arrtype;var y:arrtype;var I,j:integer);其中x为值参,I,j,y为变参,假设相应的实参为co

27、py(a,c,4,3),则表示待插入的元素是a3,而当前c数组的最后一个有值的元素是c4,因此过程体完成的工作是将a3的值赋给c5。,综合应用:,program ex1-8(input,output);type atype=array1.20 of integer;var a,b,c:atype;I,j,k,m,n:integer;procedure du(var d:atype;h:integer);var p:integer;begin for p:=1 to h do read(dp);end;procedure copy(x:atype;var y:atype;var I,j:inte

28、ger);begin I:=I+1;yI:=xj;j:=j+1;end;begin readln(m,n);write(a:);du(a,m);write(b:);du(b,n);I:=1;j:=1;k:=0;,while(Ibj then copy(b,c,k,j);if aI=bj then begin copy(a,c,k,I);j:=j+1;end;end;while I=m do copy(a,c,k,I);while j=n do copy(b,c,k,j);write(c:);for I:=1 to k do write(cI,)end.,例1-9 对6-1000内的偶数验证哥德

29、巴赫猜想:任何一个大于6的偶数总可以分解为两个奇数之和。,分析:哥德巴赫猜想是一个古老而著名的数学难题,它的理论证明十分复杂。在这里我们用计算机对有限范围内的数加以验证,即任意输入一个大于6的偶数,若能拆分成两个素数,则认为该猜想成立。,解题的关键是判素数。假设定义函数pan(x),用来判断x是否为素数。若x为素数,则函数pan值为1,若不是素数则pan值为0。,Program ex1_9(input,output);var n,m:integer;,Function pan(x:integer):integer;var f,k:integer;begin f:=1;for k:=2 to t

30、runc(sqrt(x)do if x mod k=0 then f:=0;pan:=f end;,begin repeat write(n=);readln(n);until(n6)and(n1000)and(n mod 2=0);for m:=2 to n div 2 do if pan(m)+pan(n-m)=2 then writeln(n,=,m,+,n-m);end.,例1_10多精度处理。,问题描述设有两个多字节的数,将这两个数作加法处理。,a,b:array1.n of 0.9;即:,分析:(1)多精度数的表示:,用一维数组存放多精度数,每一个数组元素存放一位数字,其个位放在最

31、后一个元素。用数组int1.n表示多精度数,通过键盘读入一串0-9组成的数字,放入数组int中;,(2)求和,用g表示进位,初始值为0;,(3)多精度的输出.,Procedure readdata(var int:arrtype);var ch:char;i,k:integer;Begin read(ch);k:=0;while(ch=0)and(ch=9)do begin k:=k+1;intk:=ord(ch)-ord(0);(?)read(ch)end;readln;if kn then(?)for i:=k downto 1 do begin intn+i-k:=inti;inti:=

32、0;end;end;,Const n=100;Type arrtype=array1.n of integer;Var a,b:arrtype;g,s:integer;,Procedure add(var a:arrtype;b:arrtype);var k:integer;Begin g:=0;for k:=n downto 1 do begin s:=ak+bk+g;(?)ak:=s mod 10;g:=s div 10;end;,Procedure outdata(a:arrtype;);var k:integer;Begin k:=1;while ak=0 do k:=k+1;whil

33、e k=n do begin write(ak);k:=k+1;end;writeln;end;,Begin for s:=1 to n do begin as:=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、高精度处理:要求处理两个高精度的减法及多位高精度与一位数的乘法。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号