|
@@ -0,0 +1,65 @@
|
|
|
|
|
+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.
|