Solutions TOPIC D: Procedures & Types

Contents :

Procedures, types .

Exercises :


T1: SumDivisibleBy

Exercise

S1

Exercise

S2

Exercise

S3

MODULE S3;
<* WOFF + *> <* NOOPTIMIZE + *>
    FROM IO IMPORT RdChar, WrChar, WrStr, RdStr, WrLn, RdLn, RdCard, WrCard, RdInt, WrInt, RdReal, WrReal, WrFixReal, RdBool, WrBool, RdKey,KeyPressed;
    FROM Graph IMPORT Init, Line, Rectangle, Circle, Ellipse, Disc, _clrBLACK, _clrBLUE, _clrGREEN, _clrCYAN, _clrRED, _clrMAGENTA;
    FROM Graph IMPORT _clrBROWN, _clrWHITE, _clrGRAY, _clrLIGHTBLUE, _clrLIGHTGREEN, _clrLIGHTCYAN, _clrLIGHTRED, _clrLIGHTMAGENTA, _clrLIGHTYELLOW, _clrBRIGHTWHITE;


    VAR c: CHAR;
        y, S: CARDINAL;
BEGIN
    WrLn;
  IF NOT Init(1, 1 , 600, 600) THEN
    WrStr("Sorry, graphics doesn't work");WrLn;
    RETURN;
  END;

  Line(0, 400, 600, 400,  _clrBLUE); (* de grond *)
  Line(200, 150, 400, 150,  _clrBLUE); (* 2.5 meter *)
  y := 400;
(* beginpositie, de 'grond' waarop je de eerste kubus tekent *)
  S := 100; (* groote van eerste kubus, is 1 m*)


  WrStr("Press any key to finish the program");WrLn;
  c := RdKey(); RdLn;
END S3.


Exercise


S5

MODULE S5;
<* NOOPTIMIZE + *>  (* voor de Debugger *)
<* WOFF + *> (* geen warnings *)
FROM RealMath IMPORT power, arctan, pi, cos, sin, sqrt;
FROM JJ3D IMPORT StartMy3DWorld, DrawEverything, ClearScreen, WaitUntilQPressed, Delay, WrStr, WrCard, WrInt, WrReal, WrBool, WrLn;
FROM JJ3D IMPORT Plot, Line, ThickLine, PlotText, Triangle, RectangleXY, RectangleYZ, RectangleXZ, Polygon, Cube, Block, Cilinder, Arrow3D;
FROM JJ3D IMPORT RgbColor, Lighter, Darker, RED, GREEN, BLUE, CYAN, MAGENTA, GRAY, BROWN;
FROM JJ3D IMPORT BLACK, BRIGHTWHITE, WHITE, LIGHTRED, LIGHTGREEN, LIGHTBLUE, LIGHTCYAN, LIGHTMAGENTA, LIGHTYELLOW;

CONST
  HOEK = 30;
  AANTAL = 360/HOEK;

VAR
  x_real, y_real, radialen: REAL;
  i, x, y : INTEGER;
BEGIN
  StartMy3DWorld("Mijn 3D-wereld") ;
   
  FOR i := 0 TO AANTAL-1 DO
    radialen := VAL(REAL, i * HOEK) * pi / 180.0; (* converteer hoek naar REAL en naar radialen *)
    x_real := sin(radialen); (* HIER MOET JE DE JUISTE COORDINATEN BEREKENEN!! *)
    y_real := cos(radialen);
 
    x := VAL(INTEGER, x_real); (* omzetting terug naar integers *)
    y := VAL(INTEGER, y_real);

    WrStr("(");WrReal(x_real, 2);WrStr(", ");WrReal(y_real, 2);WrStr(") ");

  END; (* FOR *)
    WrLn;
   


       
  WaitUntilQPressed();

END S5.
Exercise

H3

MODULE H3;
<* WOFF + *> <* NOOPTIMIZE + *>
FROM IO IMPORT WrStr, WrLn, RdCard, WrCard, RdInt, WrInt, RdKey, RdLn, WrFixReal, KeyPressed;
FROM Graph IMPORT Init, Line, Ellipse, Disc, Circle, Rectangle, _clrBLACK, _clrBLUE, _clrGREEN, _clrCYAN, _clrRED, _clrMAGENTA;
FROM RealMath IMPORT cos, sin, pi;
FROM Lib IMPORT Delay; (* Wait n milliseconds *)

CONST SCREEN_SIZE = 600;

(* x,y zijn de coordinaten van het begin van de ledemaat, het aanhechtingspunt aan het lijf *)
PROCEDURE TekenLedemaat(x,y, lengte, lengteVoet: CARDINAL; hoek: INTEGER; kleur: CARDINAL; naarLinks: BOOLEAN);
  VAR hoek_rad, x2, y2, x3, y3: REAL;
BEGIN
  hoek_rad := VAL(REAL, hoek) * pi / 180.0;
  x2 := VAL(REAL, x) + VAL(REAL, lengte) * sin(hoek_rad);
  y2 := VAL(REAL, y) + VAL(REAL, lengte) * cos(hoek_rad);
  Line(x, y, VAL(CARDINAL, x2), VAL(CARDINAL, y2), kleur);
  IF lengteVoet > 0 THEN
    IF naarLinks THEN
        x3 := x2 - VAL(REAL, lengteVoet) * cos(hoek_rad);
        y3 := y2 + VAL(REAL, lengteVoet) * sin(hoek_rad);
    ELSE
        x3 := x2 + VAL(REAL, lengteVoet) * cos(hoek_rad);
        y3 := y2 - VAL(REAL, lengteVoet) * sin(hoek_rad);
    END;
    Line(VAL(CARDINAL, x2), VAL(CARDINAL, y2), VAL(CARDINAL, x3), VAL(CARDINAL, y3), kleur);
  END;
END TekenLedemaat;

(*********************************************************************************)
  VAR c: CHAR;

BEGIN
  WrLn;
  IF NOT Init(1, 1 , SCREEN_SIZE, SCREEN_SIZE) THEN
     WrStr("Sorry, graphics doesn't work");WrLn;
     RETURN;
    END;

  TekenLedemaat(100, 100, 100, 20, -60, _clrRED, FALSE);

  WrStr("Press any key to finish the program");
  c := RdKey();
  WrLn; RdLn;

END H3.

Exercise

X1

MODULE X1;
<* NOOPTIMIZE + *>
  FROM IO IMPORT RdChar, WrChar, WrStr, RdStr, WrLn, RdKey, RdLn, RdCard, WrCard, RdInt, WrInt, RdReal, WrReal;
  FROM Lib IMPORT Delay;
  FROM Graph IMPORT Init, Rectangle, Circle, Disc, Plot;
  FROM Graph IMPORT _clrBLACK, _clrBLUE, _clrGREEN, _clrCYAN, _clrRED, _clrMAGENTA;
  FROM Graph IMPORT _clrBROWN, _clrWHITE, _clrGRAY, _clrLIGHTBLUE, _clrLIGHTGREEN;
  FROM Graph IMPORT _clrLIGHTCYAN, _clrLIGHTRED, _clrLIGHTMAGENTA, _clrLIGHTYELLOW, _clrBRIGHTWHITE;

  CONST BITMAP_SIZE = 32;
        SCREEN_SIZE = 700;

  TYPE BitmapAr = ARRAY [1..BITMAP_SIZE],[1..BITMAP_SIZE] OF CHAR;

  VAR
     gHunter, gEuro, gBackground: BitmapAr;
     gColorMap: ARRAY['a'..'z'] OF CARDINAL;

 PROCEDURE CreateBitmaps();
 BEGIN
 (* Init the color map *)
   gColorMap['a'] := _clrBLACK         ; (*    0*)
   gColorMap['b'] := _clrBLUE          ; (*    1*)
   gColorMap['c'] := _clrGREEN         ; (*    2*)
   gColorMap['d'] := _clrCYAN          ; (*    3*)
   gColorMap['e'] := _clrRED           ; (*    4*)
   gColorMap['f'] := _clrMAGENTA       ; (*    5*)
   gColorMap['g'] := _clrBROWN         ; (*    6*)
   gColorMap['h'] := _clrWHITE         ; (*    7*)
   gColorMap['i'] := _clrGRAY          ; (*    8*)
   gColorMap['j'] := _clrLIGHTBLUE     ; (*    9*)
   gColorMap['k'] := _clrLIGHTGREEN    ;(*    10*)
   gColorMap['l'] := _clrLIGHTCYAN     ;(*    11*)
   gColorMap['m'] := _clrLIGHTRED      ;(*    12*)
   gColorMap['n'] := _clrLIGHTMAGENTA  ;(*    13*)
   gColorMap['o'] := _clrLIGHTYELLOW   ;(*    14*)
   gColorMap['p'] := _clrBRIGHTWHITE   ;(*    15*)
   (* 'z' is used for the background color *)

   gHunter[1]:="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz";
   gHunter[2]:="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz";
   gHunter[3]:="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz";
   gHunter[4]:="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz";
   gHunter[5]:="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz";
   gHunter[6]:="zzzzzzzzzzzzzooooooozzzzzzzzzzzz";
   gHunter[7]:="zzzzzzzzzzzooooooooooozzzzzzzzzz";
   gHunter[8]:="zzzzzzzzzzoaaoooooooooozzzzzzzzz";
   gHunter[9]:="zzzzzzzzzoooaaaaoooooooozzzzzzzz";
   gHunter[10]:="zzzzzzzzoooooooaaaooooooozzzzzzz";
   gHunter[11]:="zzzzzzzooooooooooaaaoooooozzzzzz";
   gHunter[12]:="zzzzzzoooooooooooooaaaooooozzzzz";
   gHunter[13]:="zzzzzzooooooeaoooooaaaaoooozzzzz";
   gHunter[14]:="zzzzzooooooeeaaooooaaaaaaooozzzz";
   gHunter[15]:="zzzzzooooooaaaaooooaaaaaaaaazzzz";
   gHunter[16]:="zzzzzoooooooaaoooooaaaaooooazzzz";
   gHunter[17]:="zzzzzooooooooooooooooooooooozzzz";
   gHunter[18]:="zzzzzooooooooooooooooooooooozzzz";
   gHunter[19]:="zzzzzoooooooooooooooooeooooozzzz";
   gHunter[20]:="zzzzzoooooooooooooooioeooooozzzz";
   gHunter[21]:="zzzzzziiiiiiiipppppiiieggggggzzz";
   gHunter[22]:="zzzzeeiippppppiiiiiiieeggggggzzz";
   gHunter[23]:="zzzzzziiiiiiiiiiiiiiiieggggggzzz";
   gHunter[24]:="zzzzzzzzooooooooooooooeoozzzzzzz";
   gHunter[25]:="zzzzzzzzzooooooooooooooozzzzzzzz";
   gHunter[26]:="zzzzzzzzzzooooooooooooozzzzzzzzz";
   gHunter[27]:="zzzzzzzzzzzooooooooooozzzzzzzzzz";
   gHunter[28]:="zzzzzzzzzzzzzooooooozzzzzzzzzzzz";
   gHunter[29]:="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz";
   gHunter[30]:="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz";
   gHunter[31]:="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz";
   gHunter[32]:="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz";

   gEuro[1]:="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz";
   gEuro[2]:="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz";
   gEuro[3]:="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz";
   gEuro[4]:="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz";
   gEuro[5]:="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz";
   gEuro[6]:="zzzzzzzzzzzzzzooooooozzzzzzzzzzz";
   gEuro[7]:="zzzzzzzzzzzooooooooooooozzzzzzzz";
   gEuro[8]:="zzzzzzzzzzooooooooooooooozzzzzzz";
   gEuro[9]:="zzzzzzzzzooooozzzzzzzooooozzzzzz";
   gEuro[10]:="zzzzzzzooooozzzzzzzzzzzoooozzzzz";
   gEuro[11]:="zzzzzzzoooozzzzzzzzzzzzzoooozzzz";
   gEuro[12]:="zzzzzzoooozzzzzzzzzzzzzzoooozzzz";
   gEuro[13]:="zzzzzoooozzzzzzzzzzzzzzzzoooozzz";
   gEuro[14]:="zzzzzoooozzzzzzzzzzzaaaaaoooozzz";
   gEuro[15]:="zzzooooooooooooooooooaaaaaaaazzz";
   gEuro[16]:="zzooooooooooooooooooaaaaaaaaaazz";
   gEuro[17]:="zzzzooooozzzzzzzaaaaaazzzzaaaaaz";
   gEuro[18]:="zzzzooooozzzzzaaaaaaaaazzzzaaaaa";
   gEuro[19]:="zzzooooooooooooooooooazzzzzzzzzz";
   gEuro[20]:="zzoooooooooooooooooozzzzzzzzzzzz";
   gEuro[21]:="zzzzzooooozzaaaazzzzzzzzzzzzzaaa";
   gEuro[22]:="zzzzzzoooozaaaazzzzzzzzzzzzzaaaa";
   gEuro[23]:="zzzzzzoooooaaaaaaaaazzzzzzzaaaaz";
   gEuro[24]:="zzzzzzoooooaaaaaaaazzzzzooooaaaz";
   gEuro[25]:="zzzzzzzoooooaazzzzzzzzzoooooaazz";
   gEuro[26]:="zzzzzzzzoooooazzzzzzzzoooooaazzz";
   gEuro[27]:="zzzzzzzzzoooooazzzzzzooooooazzzz";
   gEuro[28]:="zzzzzzzzzzoooooooooooooooaazzzzz";
   gEuro[29]:="zzzzzzzzzzzooooooooooooazzzzzzzz";
   gEuro[30]:="zzzzzzzzzzzzzzooooooozzzzzzzzzzz";
   gEuro[31]:="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz";
   gEuro[32]:="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz";

   gBackground[1]:="cccfcccfcccfcccfcccfcccfcccfccfc";
   gBackground[2]:="cfcccfcccfcccfcccfcccfcccfccfccc";
   gBackground[3]:="ccfcccfcccfcccfcccfcccfcccfccfcc";
   gBackground[4]:="fcccfcccfcccfcccfcccfcccfccfcccc";
   gBackground[5]:="ccfcccfcccfcccfcccfcccfcccfccfcc";
   gBackground[6]:="cccfcccfcccfcccfcccfcccfcccfccfc";
   gBackground[7]:="ccfcccfcccfcccfcccfcccfcccfccfcc";
   gBackground[8]:="cfcccfcccfcccfcccfcccfcccfccfccc";
   gBackground[9]:="cccfcccfcccfcccfcccfcccfcccfccfc";
   gBackground[10]:="ccfcccfcccfcccfcccfcccfcccfccfcc";
   gBackground[11]:="fcccfcccfcccfcccfcccfcccfccfcccc";
   gBackground[12]:="ccfcccfcccfcccfcccfcccfcccfccfcc";
   gBackground[13]:="cccfcccfcccfcccfcccfcccfcccfccfc";
   gBackground[14]:="cfcccfcccfcccfcccfcccfcccfccfccc";
   gBackground[15]:="ccfcccfcccfcccfcccfcccfcccfccfcc";
   gBackground[16]:="fcccfcccfcccfcccfcccfcccfccfcccc";
   gBackground[17]:="ccfcccfcccfcccfcccfcccfcccfccfcc";
   gBackground[18]:="cccfcccfcccfcccfcccfcccfcccfccfc";
   gBackground[19]:="cfcccfcccfcccfcccfcccfcccfccfccc";
   gBackground[20]:="ccfcccfcccfcccfcccfcccfcccfccfcc";
   gBackground[21]:="cfcccfcccfcccfcccfcccfcccfccfccc";
   gBackground[22]:="ccfcccfcccfcccfcccfcccfcccfccfcc";
   gBackground[23]:="cfcccfcccfcccfcccfcccfcccfccfccc";
   gBackground[24]:="ccfcccfcccfcccfcccfcccfcccfccfcc";
   gBackground[25]:="cfcccfcccfcccfcccfcccfcccfccfccc";
   gBackground[26]:="ccfcccfcccfcccfcccfcccfcccfccfcc";
   gBackground[27]:="cfcccfcccfcccfcccfcccfcccfccfccc";
   gBackground[28]:="ccfcccfcccfcccfcccfcccfcccfccfcc";
   gBackground[29]:="cccfcccfcccfcccfcccfcccfcccfccfc";
   gBackground[30]:="ccfcccfcccfcccfcccfcccfcccfccfcc";
   gBackground[31]:="cccfcccfcccfcccfcccfcccfcccfccfc";
   gBackground[32]:="cfcccfcccfcccfcccfcccfcccfccfccc";

 END CreateBitmaps;

 PROCEDURE DrawBitmap(bitmap: BitmapAr);
 BEGIN
   (* ... *)
 END DrawBitmap;

 VAR
   c: CHAR;
BEGIN

  (* Initialise graphics. Coordinatesystem: (0,0) is the top left corner *)
  IF NOT Init(1, 1 , SCREEN_SIZE, SCREEN_SIZE) THEN
    WrStr("Sorry, graphics doesn't work");WrLn;
    RETURN;
  END;

   CreateBitmaps();
   DrawBitmap(gHunter);
 

  (* Show graphics until user presses a key *)
  WrStr("Press any key to finish the program");
  c := RdKey();
  WrLn; RdLn;
END X1.

Exercise