Pascal's triangle: Difference between revisions

Content added Content deleted
No edit summary
Line 1,232: Line 1,232:
</lang>
</lang>


=={{header|Component Pascal}}==
{{Works with|BlackBox Component Builder}}
<lang oberon2>
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 GenPascalTriangleFor*(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);
DEC(p); (* adjust p to work with arrays starting at 0 index *)
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 GenPascalTriangleFor;


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 := GenPascalTriangleFor(s.int);
Show(exp)
END;
s.Scan
END
END Do;

END PascalTriangle.
</lang>
<pre>Execute: ^Q PascalTriangle.Do 1 2 3 4 5 6 7 8 9 10 11 12~</pre>
{{out}}
<pre>
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
1 10 45 120 210 252 210 120 45 10 1
1 11 55 165 330 462 462 330 165 55 11 1
</pre>
=={{header|D}}==
=={{header|D}}==
===Less functional Version===
===Less functional Version===