showcase8.mod 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. MODULE Showcase8;
  2. // Complete tour at v3-step3.4: CONSTs, subranges, arrays (flat +
  3. // nested + copies), strings, sets, records, WITH (nested),
  4. // REALs, all control flow. Expected ExitCode: 170.
  5. CONST K = 10;
  6. TYPE Score = [0..20];
  7. TYPE Vec = ARRAY [0..4] OF INTEGER;
  8. TYPE Mat = ARRAY [0..1, 0..2] OF INTEGER;
  9. TYPE Small = SET OF [0..7];
  10. TYPE Point = RECORD x, y : INTEGER END;
  11. TYPE Rect = RECORD org, ext : Point; tags : ARRAY [0..1] OF INTEGER END;
  12. VAR ExitCode, i, sum : INTEGER;
  13. VAR sc : Score;
  14. VAR v : Vec;
  15. VAR m : Mat;
  16. VAR s : Small;
  17. VAR r : REAL;
  18. VAR t : ARRAY [0..2] OF CHAR;
  19. VAR rc : Rect;
  20. BEGIN
  21. (* 0+10+20+30+40 = 100 *)
  22. sum := 0;
  23. FOR i := 0 TO 4 DO v[i] := i * K; sum := sum + v[i] END;
  24. m[0, 0] := 1; m[0, 1] := 2; m[0, 2] := 3;
  25. m[1, 0] := 4; m[1, 1] := 5; m[1, 2] := 6;
  26. (* +6 = 106 *)
  27. sum := sum + m[1, 2];
  28. (* {1,3,5}+{3,4}; 4 IN -> +1 = 107 *)
  29. s := {1, 3, 5} + {3, 4};
  30. IF 4 IN s THEN sum := sum + 1 END;
  31. (* "abc"; t[1] = 'b' -> +2 = 109 *)
  32. t := "abc";
  33. IF t[1] = 'b' THEN sum := sum + 2 END;
  34. (* rc.org = (20, 22) -> +42 = 151 *)
  35. rc.org.x := 20;
  36. WITH rc DO
  37. WITH org DO
  38. y := x + 2
  39. END
  40. END;
  41. sum := sum + rc.org.x + rc.org.y;
  42. (* subrange -> +7 = 158 *)
  43. sc := 7;
  44. sum := sum + sc;
  45. (* 158/2+0.5 = 79.5 > 79 -> +10 = 168 *)
  46. r := sum;
  47. r := r / 2.0 + 0.5;
  48. IF r > 79.0 THEN sum := sum + 10 END;
  49. (* 168 MOD 5 = 3 -> +1 = 169 *)
  50. CASE sum MOD 5 OF
  51. 0..1 : sum := sum + 100
  52. | 2..3 : sum := sum + 1
  53. ELSE sum := sum + 1000
  54. END;
  55. (* down to 165 *)
  56. WHILE sum > 165 DO sum := sum - 1 END;
  57. (* up to 167 *)
  58. REPEAT sum := sum + 1 UNTIL sum >= 167;
  59. (* up to 170 *)
  60. LOOP
  61. IF sum >= 170 THEN EXIT END;
  62. sum := sum + 1
  63. END;
  64. ExitCode := sum
  65. END Showcase8.