| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270 |
- Listing:
- 1 MODULE Showcase;
- 2
- 3 (* Tour of everything M2c + mcint can do so far (steps 1-6):
- 4 scalars, control flow, procedures, composites, sets,
- 5 pointers, strings, open arrays, I/O and a local MODULE. *)
- 6
- 7 MODULE Stats
- 8
- 9 EXPORT count, Bump, Limit;
- 10
- 11 VAR
- 12 count : INTEGER;
- 13
- 14 CONST
- 15 Limit = 100;
- 16
- 17 PROCEDURE Bump;
- 18 BEGIN
- 19 count := count + 1
- 20 END Bump;
- 21
- 22 END Stats;
- 23
- 24 TYPE
- 25 Color = (Red, Green, Blue);
- 26 Inner = RECORD u, v : INTEGER END;
- 27 Pair = RECORD a : INTEGER; b : Inner END;
- 28 Node = RECORD val : INTEGER; next : POINTER TO Node END;
- 29 PNode = POINTER TO Node;
- 30
- 31 VAR
- 32 total, x, y, i, f, w, k : INTEGER;
- 33 flag : BOOLEAN;
- 34 ch : CHAR;
- 35 col : Color;
- 36 r : REAL;
- 37 a, b : ARRAY [1 .. 5] OF INTEGER;
- 38 m1, m2, m3 : ARRAY [1 .. 2], [1 .. 2] OF INTEGER;
- 39 rec : Pair;
- 40 s1, s2, u, n, d : SET OF [0 .. 15];
- 41 head, spare : PNode;
- 42 s, t, s1c : ARRAY [1 .. 10] OF CHAR;
- 43 ExitCode : INTEGER;
- 44
- 45 PROCEDURE Double(x : INTEGER) : INTEGER;
- 46 BEGIN
- 47 RETURN x * 2
- 48 END Double;
- 49
- 50 PROCEDURE Incr(VAR x : INTEGER);
- 51 BEGIN
- 52 x := x + 1
- 53 END Incr;
- 54
- 55 PROCEDURE Fact(n : INTEGER) : INTEGER;
- 56 BEGIN
- 57 IF n <= 1 THEN RETURN 1 ELSE RETURN n * Fact(n - 1) END
- 58 END Fact;
- 59
- 60 PROCEDURE IsEven(n : INTEGER) : BOOLEAN;
- 61 FORWARD;
- 62
- 63 PROCEDURE IsOdd(n : INTEGER) : BOOLEAN;
- 64 BEGIN
- 65 IF n = 0 THEN RETURN FALSE ELSE RETURN IsEven(n - 1) END
- 66 END IsOdd;
- 67
- 68 PROCEDURE IsEven(n : INTEGER) : BOOLEAN;
- 69 BEGIN
- 70 IF n = 0 THEN RETURN TRUE ELSE RETURN IsOdd(n - 1) END
- 71 END IsEven;
- 72
- 73 PROCEDURE Outer : INTEGER;
- 74 PROCEDURE Inner : INTEGER;
- 75 BEGIN
- 76 RETURN 6
- 77 END Inner;
- 78 BEGIN
- 79 RETURN Inner() + 1
- 80 END Outer;
- 81
- 82 PROCEDURE SumOpen(x : ARRAY OF INTEGER) : INTEGER;
- 83 VAR i, s : INTEGER;
- 84 BEGIN
- 85 s := 0;
- 86 FOR i := 0 TO HIGH(x) DO
- 87 s := s + x[i]
- 88 END;
- 89 RETURN s
- 90 END SumOpen;
- 91
- 92 PROCEDURE Append(v : INTEGER);
- 93 VAR q, r : PNode;
- 94 BEGIN
- 95 NEW(q);
- 96 q^.val := v;
- 97 q^.next := NIL;
- 98 IF head = NIL THEN
- 99 head := q
- 100 ELSE
- 101 r := head;
- 102 WHILE r^.next # NIL DO
- 103 r := r^.next
- 104 END;
- 105 r^.next := q
- 106 END
- 107 END Append;
- 108
- 109 PROCEDURE ListSum(p : PNode) : INTEGER;
- 110 BEGIN
- 111 IF p = NIL THEN
- 112 RETURN 0
- 113 ELSE
- 114 RETURN p^.val + ListSum(p^.next)
- 115 END
- 116 END ListSum;
- 117
- 118 BEGIN
- 119 total := 0;
- 120 WriteString("tour");
- 121 Stats.count := 0;
- 122 Stats.Bump();
- 123 Stats.Bump();
- 124 Stats.Bump();
- 125 total := total + Stats.count;
- 126 IF Stats.Limit = 100 THEN
- 127 total := total + 1
- 128 END;
- 129 x := 6 * 7 - 2;
- 130 total := total + x DIV 10;
- 131 y := x MOD 7;
- 132 total := total + y;
- 133 r := 3.5 + 2.25;
- 134 IF (r > 5.0) AND (r < 6.0) THEN
- 135 total := total + 2
- 136 END;
- 137 ch := "A";
- 138 IF ch = "A" THEN
- 139 total := total + 1
- 140 END;
- 141 IF ch < "B" THEN
- 142 total := total + 1
- 143 END;
- 144 flag := (x > y) AND (y > 0);
- 145 IF flag THEN
- 146 total := total + 1
- 147 END;
- 148 flag := NOT flag OR FALSE;
- 149 IF ~flag THEN
- 150 total := total + 1
- 151 END;
- 152 col := Green;
- 153 CASE col OF
- 154 Red : total := total + 0 |
- 155 Green : total := total + 3 |
- 156 Blue : total := total + 5
- 157 END;
- 158 k := 2;
- 159 CASE k OF
- 160 1 : total := total + 0 |
- 161 2 : total := total + 4
- 162 ELSE
- 163 total := total + 0
- 164 END;
- 165 i := 0; w := 0;
- 166 WHILE i < 4 DO
- 167 i := i + 1;
- 168 w := w + i
- 169 END;
- 170 total := total + w DIV 5;
- 171 i := 0;
- 172 REPEAT
- 173 i := i + 1
- 174 UNTIL i >= 3;
- 175 total := total + i;
- 176 i := 0;
- 177 LOOP
- 178 i := i + 1;
- 179 IF i = 3 THEN
- 180 EXIT
- 181 END
- 182 END;
- 183 total := total + i;
- 184 f := 0;
- 185 FOR i := 1 TO 5 DO
- 186 f := f + i
- 187 END;
- 188 total := total + f MOD 10;
- 189 IF x > 100 THEN
- 190 total := total + 0
- 191 ELSIF x > 10 THEN
- 192 total := total + 2
- 193 ELSE
- 194 total := total + 0
- 195 END;
- 196 total := total + Double(21) DIV 10;
- 197 Incr(x);
- 198 total := total + x MOD 10;
- 199 total := total + Fact(5) DIV 100;
- 200 IF IsEven(10) THEN
- 201 total := total + 1
- 202 END;
- 203 total := total + Outer();
- 204 a[1] := 5; a[2] := 4; a[3] := 3; a[4] := 2; a[5] := 1;
- 205 b := a;
- 206 total := total + b[1];
- 207 total := total + HIGH(a);
- 208 total := total + SumOpen(a);
- 209 m1[1,1] := 1; m1[1,2] := 2; m1[2,1] := 3; m1[2,2] := 4;
- 210 m2[1,1] := 5; m2[1,2] := 6; m2[2,1] := 7; m2[2,2] := 8;
- 211 m3[1,1] := m1[1,1]*m2[1,1] + m1[1,2]*m2[2,1];
- 212 m3[1,2] := m1[1,1]*m2[1,2] + m1[1,2]*m2[2,2];
- 213 m3[2,1] := m1[2,1]*m2[1,1] + m1[2,2]*m2[2,1];
- 214 m3[2,2] := m1[2,1]*m2[1,2] + m1[2,2]*m2[2,2];
- 215 total := total + (m3[1,1] + m3[2,2]) MOD 20;
- 216 rec.a := 1;
- 217 rec.b.u := 10;
- 218 rec.b.v := 20;
- 219 WITH rec DO
- 220 a := a + 1;
- 221 WITH b DO
- 222 u := u + 2;
- 223 v := v + 3
- 224 END
- 225 END;
- 226 total := total + rec.a + rec.b.u + rec.b.v;
- 227 s1 := {1 .. 5};
- 228 s2 := {4 .. 8};
- 229 u := s1 + s2;
- 230 n := s1 * s2;
- 231 d := s1 - s2;
- 232 IF (1 IN u) AND (5 IN n) AND (2 IN d) THEN
- 233 total := total + 5
- 234 END;
- 235 IF u = u THEN
- 236 total := total + 1
- 237 END;
- 238 head := NIL;
- 239 Append(4);
- 240 Append(7);
- 241 Append(9);
- 242 total := total + ListSum(head);
- 243 NEW(spare);
- 244 DISPOSE(spare);
- 245 s := "ok";
- 246 t := "ok";
- 247 IF s = t THEN
- 248 total := total + 2
- 249 END;
- 250 WriteString(s);
- 251 t := "abc";
- 252 IF t # s THEN
- 253 total := total + 1
- 254 END;
- 255 IF s > t THEN
- 256 total := total + 1
- 257 END;
- 258 s1c := "okx";
- 259 IF s1c > s THEN
- 260 total := total + 1
- 261 END;
- 262 WriteInt(total);
- 263 ExitCode := total
- 264 END Showcase.
- 0 errors
|