1 / 24

Pascal 程序设计

Pascal 程序设计.  函数与过程 靖江市第一中学 侯亚楠. 复习:求两个自然数 M 和 N 的最大公约数。. 若自然数 a 既是 M 和约数,又是 N 的约数,则称 a 为 M 和 N 的公约数,其中最大的称为最大公约数。. 为了求得最大公约数,可以从最大可能的数(如 M 或 N )向下寻找,找到的第一个公约数即是最大公约数。. 求两个自然数 M 和 N 的最大公约数。. Begin Readln(m,n); a := N+1; Repeat a := a-1; Until (M mod a=0) and (N mod a=0);

baxter
Download Presentation

Pascal 程序设计

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Pascal 程序设计  函数与过程 靖江市第一中学 侯亚楠

  2. 复习:求两个自然数M和N的最大公约数。 • 若自然数a既是M和约数,又是N的约数,则称a为M和N的公约数,其中最大的称为最大公约数。 为了求得最大公约数,可以从最大可能的数(如M或N)向下寻找,找到的第一个公约数即是最大公约数。

  3. 求两个自然数M和N的最大公约数。 Begin Readln(m,n); • a := N+1; • Repeat • a := a-1; • Until (M mod a=0) and (N mod a=0); • writeln(a); • Readln; • End.

  4. 用递推法算求自然数A,B的最大公约数。 • 解:求最大公约数的方法有许多种,若用欧几里德发明的辗转相除方法如下: • ①定义求X除以Y的余数的过程; • ②如果余数不为0,则让X=Y,Y=余数,重复步骤①,即调用过程; • ③如果余数为0,则终止调用过程; • ④输出此时的Y值。

  5. 用递推法算求自然数A,B的最大公约数。 Var t,r,m,n:integer; • Begin readln(m,n); if m<n then begin t:=m;m:=n;n:=t; end; r:=m mod n; while r<>0 do begin m:=n;n:=r;r:=m mod n end; writeln(n ); End.

  6. 编程找出由键盘任意输入五个整数中的最大整数。 解:设输入的五个整数为n1、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中最大的值并返回。

  7. 自定义函数的一般格式为: • function 函数名(形式参数表): 类型;{函数首部} • 局部变量说明部分; • begin • 语句系列; {函数体 } • end;

  8. 定义函数:两个数取大值 • Var n1,n2,n3,n4,n5,t1 : integer; • Function max(x1,x2 : integer) : integer; • Begin • If x1>x2 then Max := x1 Else Max := x2; • End;

  9. 调用函数 • 函数的结果是一个具体的值,在函数体中必须将所得到的运算结果赋给函数名;主程序通过调用函数得到函数的运算结果。调用函数的一般格式为: • 函数名 (实在参数表) • 调用函数时,函数名后面圆括号内的参数必须有确定的值, 称为实在参数。调用时即把这些实际值传送给函数形参表中的相应形参变量。 函数不是单独的语句, 只能作为运算赋值或出现在表达式中。

  10. Begin • Write(‘Input 5 numbers : ‘); • 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(‘Max number : ‘,t1); • End.

  11. 自定义函数通常被设计成求一个函数值,一个函数只能得到一个运算结果。自定义函数通常被设计成求一个函数值,一个函数只能得到一个运算结果。 • 若要设计成能得到若干个运算结果,或完成一系列处理过程,就需要自定义“过程”来实现。 • 例:输入三个数,按从小到大的顺序输出,三次比较需要写三次数据交换的程序,可将交换定义为过程。

  12. 自定义过程的一般格式如下: • Procedure 过程名 (形式参数表);{过程首部} • 局部变量说明部分; • begin • 语句部分;{过程体部分} • end;

  13. 自定义过程(交换变量) • Var a,b,c: integer; • Procedure Swap (var x,y: integer); {自定义交换两个变量值的过程 } • Var t : integer; • Begin {过程体} • t:=x; x:=y; y:=t {交换两个变量的值 • end;

  14. 调用过程 • Begin {主程序} • Write('input a,b,c='); • Readln(a,b,c); • if a>b then swap (a,b); {调用自定义过程} • if a>c then swap (a,c); • if b>c fhen swap (b,c); • Writeln (a:6, b:6, c:6); • Readln • End.

  15. 子程序的递归调用 • Pascal程序中过程和函数可以直接自己调用自己或者间接调用自己,这种调用称为递归调用。 递归调用一种解决方案,一种是逻辑思想,将一个大工作分为逐渐减小的小工作,比如说从前有一座山,山上有一座庙,庙里有一个老和尚正在给小和尚讲故事,故事里说,从前有一座山,山上有一座庙,庙里有一个老和尚正在给小和尚讲故事,故事里的故事是说……。

  16. 求 n! • 要求3!,我们必须先求出2!,要求2!,必须先求1!,要求1!,就必须先求0!,而0!=1,所以1!=0!*1=1,再进而求2!,3!。 当N>0时,N!=N*(N-1)!,因此,求N!的问题化成了求N*(N-1)!的问题,而求(N-1)!的问题又与求N!的解法相同,只不过是求阶乘的对象的值减去了1,当N的值递减到0时,N!=1,从而结束以上过程,求得了N!的解。

  17. 递归求 n! • var n,t:longint; function fac(n:longint):longint; begin if n=1 then fac:=1 else fac:=n*fac(n-1); end; begin readln(n); t:=fac(n); writeln('n!=',t); end.

  18. 斐波拉契数列 • 13世纪初,欧洲最好的数学家是斐波拉契;他写了一本叫做《算盘书》的著作,是当时欧洲最好的数学书。书中有许多有趣的数学题,其中最有趣的是下面这个题目: •    “如果一对兔子每月能生1对小兔子,而每对小兔在它出生后的第3个月裏,又能开始生1对小兔子,假定在不发生死亡的情况下,由1对初生的兔子开始,1年后能繁殖成多少对兔子?” • 斐波拉契把推算得到的头几个数摆成一串:1,1,2,3,5,8…… 从第3个数起,后面的每个数都是它前面那两个数的和。 从第3个数起,每个数与它后面那个数的比值,都很接近于0.618,正好与大名鼎鼎的“黄金分割律”相吻合。

  19. 斐波拉契数列 • 递推关系, • f(1)=1 • f(2)=1 • f(n)=f(n-1)+f(n-2), n>=2 • {f(n)}即为斐波拉契数列。

  20. Var n,i:integer; function f(n:integer):integer; begin if (n=0) or (n=1) then f:=1 else f:=f(n-1)+f(n-2); end; begin readln(n); for I:=0 to n do begin write(f(I):5) end; writeln End.

  21. 斐波拉契数列蕴含宇宙奥妙

  22. 递归调用时必须符合以下三个条件: • (1)可将一个问题转化为一个新的问题,而新问题的解决方法仍与原问题的解法相同,只不过所处理的对象有所不同而已,即它们只是有规律的递增或递减。 • (2)可以通过转化过程使问题回到对原问题的求解。 • (3)必须要有一个明确的结束递归的条件,否则递归会无止境地进行下去。

  23. 课堂总结 • 函数返回一个值 • 过程返回N个值或一系列过程处理 • 递归算法的本质就是自己调用自己,用调用自己的方法去处理问题 思考:用递归算求自然数A,B的最大公约数

  24. 用递归算求自然数A,B的最大公约数。 • Var a,b,d: integer; • Procedure Gdd(x, y: integer);{过程}     •   begin        • if x mod y =0 then d :=y         • else Gdd(y, x mod y) {递归调用过程}      • end; • begin      • write(’input a, b=’); readln(a, b); •    Gdd(a, b); • writeln(’(’, a, ’,’, b, ’)=’, d ); • readln    • end.

More Related