Tentamen 1e kan ingenieur-architekten
11 januari 2002
Opgave
Definieer een type boom met de eigenschappen hoogte, dikte, x en y, deze gaan we gebruiken om een boom te tekenen met behulp van een rechthoek en een ellips:
De Modula-2 rechthoek procedure is als volgt gedefinieerd:
    PROCEDURE Rectangle (x0, y0, x1, y1 :CARDINAL; Color :CARDINAL; Fill :BOOLEAN);
met x0,y0 de coordinaten van de linkerbovenhoek en x1, y1 de coordinaten van de rechterbenedenhoek.

De Modula-2 ellips procedure is als volgt gedefinieerd:
    PROCEDURE Ellipse ( x0,y0:CARDINAL;   -- center
                    a,b  :CARDINAL;   -- semi-axes
                    c    :CARDINAL;   -- color
                    fill :BOOLEAN );  -- whether filled

Start met dit programmaskelet (deze staat ook hier Bomen.mod):
<* WOFF + *>
MODULE Bomen;
  FROM IO IMPORT RdChar, WrChar, WrStr, RdStr, WrLn, RdKey, RdLn, RdCard, WrCard, RdInt, WrInt, RdReal, WrReal;
  FROM Graph IMPORT Init, Rectangle, Ellipse;
  FROM Graph IMPORT _clrBROWN, _clrWHITE, _clrGRAY, _clrLIGHTBLUE, _clrGREEN;

  CONST AANTAL = 10;
  TYPE
 (* 1. maak type BoomRc *)

  PROCEDURE TekenBoom(boom: BoomRc);
  BEGIN
  (* 1 teken de gegeven boom *)
  END TekenBoom;

  (* 4 bereken boomvolume procedure *)

  VAR
   x:CHAR;
   boom: BoomRc;
   i, j: CARDINAL;
BEGIN
  IF NOT Init(1, 1, 600, 600) THEN
    WrStr("Sorry, graphics doesn't work");WrLn;
    RETURN;
  END;

  (* 2 teken een boom in het midden van het scherm *)
  boom.dikte := 30;

  (* 3 teken een bos met een dubbele lus *)
 

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

Gevraagd:

  1. Definieer het type BoomRc en schrijf de TekenBoom procedure die een boom tekent, kleur de rechthoek (_clrBROWN) bruin en de ellips groen (_clrGREEN)
  2. Teken een boom (dikte 30, hoogte 100) in het midden van het scherm (x=300, y=350), dan bekom je dit:
  3. Teken een heel bos van 10 bomen op 10 bomen, telkens met 50 eenheden tussen. De dikte van de bomen is 5 en de hoogte 20. Gebruik de gegeven constante AANTAL in je oplossing voor het aantal rijen en kolommen.
  4. Maak een procedure die het volume van een boom berekent en als volgt naar het scherm schrijft:
    1. Boom: volume hout = 50 en volume groen = 20
    Bereken het volume hout als dikte/2*dikte/2*3*hoogte/2 (3 is een afgeronde Pi)
    Bereken het volume groen als a*a*b (grove benadering)
    Roep deze procedure dan op telkens als je een boom tekent.
  5. Extra vraag: verander bovenstaande procedure zodat deze het volume teruggeeft. Bereken dan in het hoofdprogramma het totaal volume hout van alle getekenden bomen.