72 lines
1.1 KiB
Plaintext
72 lines
1.1 KiB
Plaintext
MODULE PascalTriangle;
|
|
IMPORT StdLog, DevCommanders, TextMappers;
|
|
|
|
TYPE
|
|
Expansion* = POINTER TO ARRAY OF LONGINT;
|
|
|
|
PROCEDURE Show*(e: Expansion);
|
|
VAR
|
|
i: INTEGER;
|
|
BEGIN
|
|
i := 0;
|
|
WHILE (i < LEN(e)) & (e[i] # 0) DO
|
|
StdLog.Int(e[i]);
|
|
INC(i)
|
|
END;
|
|
StdLog.Ln
|
|
END Show;
|
|
|
|
PROCEDURE GenFor*(p: LONGINT): Expansion;
|
|
VAR
|
|
expA,expB: Expansion;
|
|
i,j: LONGINT;
|
|
|
|
PROCEDURE Swap(VAR x,y: Expansion);
|
|
VAR
|
|
swap: Expansion;
|
|
BEGIN
|
|
swap := x; x := y; y := swap
|
|
END Swap;
|
|
|
|
BEGIN
|
|
ASSERT(p >= 0);
|
|
NEW(expA,p + 2);NEW(expB,p + 2);
|
|
FOR i := 0 TO p DO
|
|
IF i = 0 THEN expA[0] := 1
|
|
ELSE
|
|
FOR j := 0 TO i DO
|
|
IF j = 0 THEN
|
|
expB[j] := expA[j]
|
|
ELSE
|
|
expB[j] := expA[j - 1] + expA[j]
|
|
END
|
|
END;
|
|
Swap(expA,expB)
|
|
END;
|
|
END;
|
|
expB := NIL; (* for the GC *)
|
|
RETURN expA
|
|
END GenFor;
|
|
|
|
|
|
PROCEDURE Do*;
|
|
VAR
|
|
s: TextMappers.Scanner;
|
|
exp: Expansion;
|
|
BEGIN
|
|
s.ConnectTo(DevCommanders.par.text);
|
|
s.SetPos(DevCommanders.par.beg);
|
|
s.Scan;
|
|
WHILE (~s.rider.eot) DO
|
|
IF (s.type = TextMappers.char) & (s.char = '~') THEN
|
|
RETURN
|
|
ELSIF (s.type = TextMappers.int) THEN
|
|
exp := GenFor(s.int);
|
|
Show(exp)
|
|
END;
|
|
s.Scan
|
|
END
|
|
END Do;
|
|
|
|
END PascalTriangle.
|