All Source For modula3 |
Ackermann's Function |
MODULE Main;
IMPORT Fmt, Scan, Params, Wr, Stdio;
PROCEDURE Ack(M, N: INTEGER): INTEGER =
BEGIN
IF M = 0 THEN
RETURN N+1;
ELSE
IF N = 0 THEN
RETURN Ack(M-1, 1);
ELSE
RETURN Ack(M-1, Ack(M, N-1));
END;
END;
END Ack;
VAR N: INTEGER;
BEGIN
IF Params.Count > 0 THEN
N := Scan.Int(Params.Get(1));
ELSE
N := 1;
END;
Wr.PutText (Stdio.stdout, "Ack(3," & Fmt.Int(N) & "): " & Fmt.Int(Ack(3, N)));
Wr.Close (Stdio.stdout);
END Main.
|
Fibonacci Numbers |
MODULE Main;
IMPORT Fmt, Scan, Params, Wr, Stdio;
PROCEDURE fib(n: INTEGER): INTEGER =
BEGIN
IF n < 2 THEN
RETURN 1;
ELSE
RETURN fib(n-2) + fib(n-1);
END
END fib;
VAR N: INTEGER;
BEGIN
IF Params.Count > 0 THEN
N := Scan.Int(Params.Get(1));
ELSE
N := 1;
END;
Wr.PutText (Stdio.stdout, Fmt.Int(fib(N)));
Wr.Close (Stdio.stdout);
END Main.
|
Hello World |
MODULE Main;
IMPORT Wr, Stdio;
BEGIN
Wr.PutText (Stdio.stdout, "hello world\n");
Wr.Close (Stdio.stdout);
END Main.
|
Nested Loops |
MODULE Main;
IMPORT Fmt, Scan, Params, Wr, Stdio;
VAR N, a, b, c, d, e, f, x: INTEGER;
BEGIN
IF Params.Count > 0 THEN
N := Scan.Int(Params.Get(1));
ELSE
N := 1;
END;
x := 0;
FOR a := 1 TO N DO
FOR b := 1 TO N DO
FOR c := 1 TO N DO
FOR d := 1 TO N DO
FOR e := 1 TO N DO
FOR f := 1 TO N DO
INC(x);
END;
END;
END;
END;
END;
END;
Wr.PutText (Stdio.stdout, Fmt.Int(x));
Wr.Close (Stdio.stdout);
END Main.
|
Random Number Generator |
MODULE Main;
IMPORT Fmt, Scan, Params, Wr, Stdio;
CONST
IM = 139968;
IA = 3877;
IC = 29573;
PROCEDURE gen_random(n: REAL): REAL =
BEGIN
last := (last * IA + IC) MOD IM;
RETURN n * FLOAT(last) / FLOAT(IM);
END gen_random;
VAR last: INTEGER := 42;
VAR
n: INTEGER;
i: INTEGER;
result: REAL;
BEGIN
IF Params.Count > 0 THEN
n := Scan.Int(Params.Get(1));
ELSE
n := 1;
END;
FOR i := 1 TO n DO
result := gen_random(100.0);
END;
Wr.PutText (Stdio.stdout, Fmt.Real(result, prec:=9));
Wr.Close (Stdio.stdout);
END Main.
|