PASCAL-函数教程练习.ppt

上传人:小飞机 文档编号:6513736 上传时间:2023-11-08 格式:PPT 页数:22 大小:238.49KB
返回 下载 相关 举报
PASCAL-函数教程练习.ppt_第1页
第1页 / 共22页
PASCAL-函数教程练习.ppt_第2页
第2页 / 共22页
PASCAL-函数教程练习.ppt_第3页
第3页 / 共22页
PASCAL-函数教程练习.ppt_第4页
第4页 / 共22页
PASCAL-函数教程练习.ppt_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《PASCAL-函数教程练习.ppt》由会员分享,可在线阅读,更多相关《PASCAL-函数教程练习.ppt(22页珍藏版)》请在三一办公上搜索。

1、Pascal程序设计基础,第四章 过程与函数,子程序是什么,在程序设计中,我们会发现一些程序段在程序的不同地方反复出现,此时可以将这些程序段作为相对独立的整体,用一个标识符给他起一个名字,凡是程序中出现该程序段的地方,只要简单地写上其标识符即可。这样的程序段,我们称之为子程序。Pascal中的子程序有两种形式:函数和过程。,函数,之前我们接触了pascal中提供的标准函数,如abs(),sqrt(),inc()等等,这些函数为我们编写程序提供了很大的方便。但是这些函数知识常用的函数,编程的时候需要自定义一些函数。,例4.1编程找出由键盘任意输入五个整数中的最大整数。解:设输入的五个整数为n1、

2、n2、n3、n4、n5,为了便于处理,引入一个中间变量t1,按如下步骤处理:令t1=n1;将t1与n2比较,将两者中较大的数放入t1;将t1与n3比较,将两者中较大的数放入t1;将t1与n4比较,将两者中较大的数放入t1;将t1与n5比较,将两者中较大的数放入t1;经过以上5步处理后,t1即为5个数中最大者。从上面规划的步骤看来,从步骤到步骤需处理的目标是相同的,因此我们可以设计一段子程序Max(x1,x2),以找出x1和x2中最大的值并返回。,ProgramExp41;Varn1,n2,n3,n4,n5,t1:integer;Functionmax(x1,x2:integer):intege

3、r;BeginIfx1x2thenMax:=x1ElseMax:=x2;End;BeginWrite(Input5numbers:);Readln(n1,n2,n3,n4,n5);T1:=n1;T1:=Max(t1,n2);T1:=Max(t1,n3);T1:=Max(t1,n4);T1:=Max(t1,n5);Writeln(Maxnumber:,t1);End.,从上例看出,引入函数实际上是将一个复杂的问题划分成若干个易于处理的子问题,将编程化简的一种有效办法,而化简的方法是多种多样的,如前面已经做过求三个数中的最大数,所以可定义一个专门求三个数中最大数的函数(Max)。第一次用这个函数求

4、出n1,n2,n3三个数中的最大数t1;第二次调用这个函数求出t1与n4,n5三个数中的最大数,也就是前三个数的最大数(已在t1中)和后面二个数再求一次,就得到五个数的最大数。因此,需要两次使用“求三个数中的最大数”,步骤如下:调用函数Max(n1,n2,n3),求出n1,n2,n3中的最大者t1;调用函数Max(t1,n4,n5),求出t1,n4,n5中的最大者t2;输出最大数t2。,ProgramExp41se;Varn1,n2,n3,n4,n5,t1:integer;functionMax(x1,x2,x3:integer):integer;自定义函数MaxVarXX:integer;函

5、数内部变量说明begin函数体ifX1X2thenXX:X1elseXX:X2;ifX3XXthenXX:X3;Max:XXend;Begin主程序Write(Input5numb:);Readln(n1,n2,n3,n4,n5);输入五个数t1:Max(n1,n2,n3);用函数求n1,n2,n3的最大数t1:Max(n4,n5,t1);用函数求n4,n5,t1的最大数Writeln(MaxNumber:,t1);ReadlnEnd.,格式,自定义函数的一般格式为:function函数名(形式参数表):类型;函数首部局部变量说明部分;begin语句系列;函数体end;函数中的形式参数接受调用

6、函数时所传入的值,用来参与函数中的运算。,例4.2练4.1求任意输入的五个自然数的最大公约数。解:自定义一个专门求两自然数的最大公约数的函数GCD;调用自定义函数,第一次求前两个数的最大公约数;从第二次开始,用每次求得的最大公约数与下一个数再求两个数最大公约数,直到最后。本题共四次“求两个数的最大公约数”,设输入的五个自然数分别是a1,a2,a3,a4,a5,采用如下步骤:求a1,a2两个数的最大公约数存入a1;求a1,a3两个数的最大公约数存入a1;求a1,a4两个数的最大公约数存入a1;求a1,a5两个数的最大公约数存入a1;输出a1,此时的a1已是五个数的最大公约数。,ProgramEx

7、p42;Vara1,a2,a3,a4,a5:integder;functionGCD(x,y:integer):integer;自定义函数Varn:integer;beginWhilexmody0dobeginn:=x;x:=y;y:=nmodyend;GCD:=yend;蓝色部分使用辗转相除法,Begin主程序Write(input5Numper:);readln(a1,a2,a3,a4,a5);输入五个数Write(,a1,a2,a3,a4,a5,)=);a1:GCD(a1,a2);调用函数GCDa1:GCD(a1,a3);a1:GCD(a1,a4);a1:GCD(a1,a5);Write

8、ln(a1);readlnEnd.,函数小结,函数的结果是一个具体的值,在函数体中必须将所得到的运算结果赋给函数名;主程序通过调用函数得到函数的运算结果。调用函数的一般格式为:函数名(实在参数表)调用函数时,函数名后面圆括号内的参数必须有确定的值,称为实在参数。调用时即把这些实际值传送给函数形参表中的相应形参变量。函数不是单独的语句,只能作为运算赋值或出现在表达式中。,(自定义)过程,自定义函数通常被设计成求一个函数值,一个函数只能得到一个运算结果。若要设计成能得到若干个运算结果,或完成一系列处理,就需要自定义“过程”来实现。,例4.3把前面例2.2(输入三个不同的整数,按由小到大排序)改为下

9、面用自定义过程编写的Pascal程序:Programexp43;Vara,b,c:integer;ProcedureSwap(varx,y:integer);自定义交换两个变量值的过程Vart:integer;Begin过程体t:=x;x:=y;y:=t交换两个变量的值end;Begin主程序Write(inputa,b,c=);Readln(a,b,c);ifabthenswap(a,b);调用自定义过程ifacthenswap(a,c);ifbcfhenswap(b,c);Writeln(a:6,b:6,c:6);ReadlnEnd.,从作用来看,过程与函数是相似的,都能将复杂的问题划分成

10、一些目标明确的小问题来求解,只不过函数有值返回而过程则没有。自定义过程的一般格式如下:Procedure过程名(形式参数表);过程首部局部变量说明部分;begin语句部分;过程体部分end;,例4.4如果一个自然数除了1和本身,还有别的数能够整除它,这样的自然数就是合数。例如15,除了1和15,还有3和5能够整除,所以15是合数。14,15,16是三个连续的合数,试求连续十个最小的合数。解:从14,15,16三个连续合数中可看出,它们正好是两个相邻素数13和17之间的连续自然数,所以求连续合数问题可以转化为求有一定跨度的相邻两个素数的问题。因此,求连续十个最小的合数可用如下方法:从最小的素数开

11、始,先确定第一个素数A;再确定与A相邻的后面那个素数B;(作为第二个素数);检查A,B的跨度是度否在10以上,如果跨度小于10,就把B作为新的第一个素数A,重复作步骤;如果A、B跨度大于或等于10,就打印A、B之间的连续10个自然数,即输出A+1,A+2,A+3,A+10。,Programexp44;vara,b,s,n:integer;yes:boolean;proceduresub(x:integer;varyy:boolean);过程:求x是否为素数vark,m:integer;用yy逻辑值转出begink:=trunc(sqrt(x);form:=3tokdoifodd(m)then

12、判断奇数的函数odd,布尔类型 ifxmodm=0thenyy:=false;end;begin主程序b:=3;repeata:=b;a为第一个素数repeatyes:=true;inc(b,2);b是a后面待求的素数sub(b,yes);调用SUB过程来确认b是否为素数ifyesthens:=b-a;如果b是素数,则求出跨度suntilyes;untils=10;forn:=a+1toa+10dowrite(n:6);writeln;readlnend.,程序中的过程SUB,用来确定b是否为素数。过程名后面圆括号内的变量是形式参数,简称为形参。过程SUB(x:integer;Varyy:bo

13、olean)中的x是值形参,而前面冠有Var的yy是变量形参。值形参只能从外界向过程传入信息,但不能传出信息;变量形参既能传入又能传出信息。本程序过程SUB中的x是由调用过程的实在参数b传入值,进行处理后,不需传出;而yy是把过程处理结果用逻辑值传出,供调用程序使用。试把例4.3程序中的过程SWAP(Varx,y:integer),将x,y前面的Var去掉,就变成了纯粹的值形参,就不能将过程所处理的结果传出去,也就无法得到处理后的结果,通过运行程序比较,可以非常明显地看到值形参和变量形参的区别。调用过程的格式为:过程名(实在参数表);调用过程名后面圆括号内的实在参数与定义过程的形参表必须相对应

14、,调用过程相当于一个独立语句,可单独使用。,例4.5练4.2将合数483的各位数字相加(4+8+3)=15,如果将483分解成质因数相乘:483=3*7*23,把这些质因数各位数字相加(3+7+2+3),其和也为15。即某合数的各位数字之和等于它所有质因数的各数字之和。求500以内具有上述特点的所有合数。解:设n为所要求的合数,让n在1500间循环做以下步骤;用t1,t2分别累计合数n及n的质因数的各位数字之和,初值均为0;调用过程SUB3进行非素数判定,以布尔变量yes的真假值判定是否,yes的初值为true,如果为(nottrue)非素数,就做步骤,;否则取新的n值,重复步骤;调用SUB1

15、,求n的各数字之和,传送给t1;调用SUB2,求n的各质因数,对于每个质因素都通过SUB1求它各位数字之和,将所有各质因数字传送给t2。如果t1=t2(各位数字之和等于它所有质因数的各数字之和),则输出此n。,programexp45;varn,t1,t2,tatol:integer;yes:boolean;proceduresub1(x:integer;vart:integer);过程:分离x的各位数字begin并求各位数字之和repeatt:=t+xmod10;x:=xdiv10;untilx=0end;,proceduresub2(x:integer;vart:integer);过程:分

16、解质因数varxx,tt:integer;beginxx:=2;whilex1doifxmodxx=0thenbegintt:=0;sub1(xx,tt);t:=t+tt;x:=xdivxxendelseinc(xx)end;,proceduresub3(x:integer;varyy:boolean);过程:判断x是否为素数vark,m:integer;begink:=trunc(sqrt(x);form:=2tokdoifxmodm=0thenyy:=false;end;,begin主程序forn:=1to500dobegint1:=0;t2:=0;yes:=true;sub3(n,yes

17、);调用过程是否素数ifnotyesthen如果非素数就beginsub1(n,t1);调用过程求n的各位数字之和sub2(n,t2);调用过程求n的各质因数的数字之和ift1=t2thenwrite(n:6);打印合格的合数endend;readlnend.,练4.3如果一个数从左边读和从右边读都是同一个数,就称为回文数。例如6886就是一个回文数,求出所有的既是回文数又是素数的三位数,并求这个数各个位数之和,如6886即6+8+8+6=28.解:可以把这个题目看成3个小步骤组成:判断n是否是回文数 过程?函数?判断n是否是素数 过程?函数?求n的各个位数之和 过程?函数?最后将3个小程序组

18、合起来就是完整的程序。,Program exam43;var i:integer;yes,ok:boolean;procedure sub1(n:integer;var yy:boolean);begin yy:=false;if(n div 100)=(n mod 10)then yy:=true;end;Procedure sub2(x:integer;var yy:boolean);var k,m:integer;begin yy:=true;k:=trunc(sqrt(x);for m:=2 to k do if x mod m=0 then yy:=false;end;,Function sub3(n:integer):integer;Var a,b,c:integer;begin a:=n div 100;b:=(n-a*100)div 10;c:=n mod 10;sub3:=a+b+c;end;Begin for i:=100 to 999 do begin sub1(i,yes);sub2(i,ok);if(yes=true)and(ok=true)then writeln(i:5,sub3(i):5)end;readln;End.,

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

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


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号