| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- MODULE Showcase8;
- // Complete tour at v3-step3.4: CONSTs, subranges, arrays (flat +
- // nested + copies), strings, sets, records, WITH (nested),
- // REALs, all control flow. Expected ExitCode: 170.
- CONST K = 10;
- TYPE Score = [0..20];
- TYPE Vec = ARRAY [0..4] OF INTEGER;
- TYPE Mat = ARRAY [0..1, 0..2] OF INTEGER;
- TYPE Small = SET OF [0..7];
- TYPE Point = RECORD x, y : INTEGER END;
- TYPE Rect = RECORD org, ext : Point; tags : ARRAY [0..1] OF INTEGER END;
- VAR ExitCode, i, sum : INTEGER;
- VAR sc : Score;
- VAR v : Vec;
- VAR m : Mat;
- VAR s : Small;
- VAR r : REAL;
- VAR t : ARRAY [0..2] OF CHAR;
- VAR rc : Rect;
- BEGIN
- (* 0+10+20+30+40 = 100 *)
- sum := 0;
- FOR i := 0 TO 4 DO v[i] := i * K; sum := sum + v[i] END;
- m[0, 0] := 1; m[0, 1] := 2; m[0, 2] := 3;
- m[1, 0] := 4; m[1, 1] := 5; m[1, 2] := 6;
- (* +6 = 106 *)
- sum := sum + m[1, 2];
- (* {1,3,5}+{3,4}; 4 IN -> +1 = 107 *)
- s := {1, 3, 5} + {3, 4};
- IF 4 IN s THEN sum := sum + 1 END;
- (* "abc"; t[1] = 'b' -> +2 = 109 *)
- t := "abc";
- IF t[1] = 'b' THEN sum := sum + 2 END;
- (* rc.org = (20, 22) -> +42 = 151 *)
- rc.org.x := 20;
- WITH rc DO
- WITH org DO
- y := x + 2
- END
- END;
- sum := sum + rc.org.x + rc.org.y;
- (* subrange -> +7 = 158 *)
- sc := 7;
- sum := sum + sc;
- (* 158/2+0.5 = 79.5 > 79 -> +10 = 168 *)
- r := sum;
- r := r / 2.0 + 0.5;
- IF r > 79.0 THEN sum := sum + 10 END;
- (* 168 MOD 5 = 3 -> +1 = 169 *)
- CASE sum MOD 5 OF
- 0..1 : sum := sum + 100
- | 2..3 : sum := sum + 1
- ELSE sum := sum + 1000
- END;
- (* down to 165 *)
- WHILE sum > 165 DO sum := sum - 1 END;
- (* up to 167 *)
- REPEAT sum := sum + 1 UNTIL sum >= 167;
- (* up to 170 *)
- LOOP
- IF sum >= 170 THEN EXIT END;
- sum := sum + 1
- END;
- ExitCode := sum
- END Showcase8.
|