TOPIC E: Records

Contents :

  RECORD.

Exercises :


D1: Som van Complexe getallen.

Bekijk het programma van hier:   .
  en berekent de som van c1 & c2 met een derde variabele.

D2 types: Definieer een nieuw type ComplexRc, gebruik dit om c1, c2 en c3 te declareren.


S1: Complex Product.

Start met D2: .
  1. Maak een procedure dat een complex getal print (gebruik het type ComplexRc) en vervang de code die c1, c2 & c3 print.
  2. Maak een procedure die 2 complexe getallen vermenigvuldigt. Bereken het product van c1 en c2.

S2: Lopend Manneke.

Start met de code van  .
Gegeven is het record LedemaatRc die een been van het manneke voorstelt, ook de procedure om deze te tekenen is gegeven.
Gevraagd:
  1. Teken een manneke met 2 benen gedefinieerd door 2 ledemaat records
  2. Zet deze code dan in een procedure en definieer een record dat zo'n manneke voorstelt (eigenschappen: positie, grootte, hoek van benen, kleur)
  3. Teken dan het manneke en laat het zich vooruit lopen door de benen 'correct' te bewegen.
  4. Zorg dat het manneke links weer verschijnt als het rechts van het scherm verdwijnt
  5. Zorg dat je de snelheid van het manneke kan regelen:
  6. Als het manneke aan het einde van het scherm komt, moet hij terugkeren. Gebruik hiervoor de naarLinks boolean die de richting van de voetjes aangeeft.
  7. Het programma moet stoppen als je op 'x' duwt.
Uitbreidingen: teken er bewegende armpjes bij, ...


S3: Flight Simulator.

Start met deze code. Gegeven zijn 2 record types en 2 procedures.
Dit document legt uit hoe je op een simpele manier een 3D-landschap tekent. De formules van de laatste pagina vertellen hoe je 3D-coordinaten omzet naar een 2D-punt op je scherm.
  1. Schrijf een procedure die de omzetting van een 3D punt naar 2D punt berekent.
  2. Maak een procedure die om de 100 pixels een lijn tekent tot aan de horizon (zie linkse figuur). Gebruik de gegeven Line2 procedure. Deze zorgt ervoor dat je programma niet crasht als je buiten het scherm tekent.
  3. Maak een procedure die een rechtopstaande rechthoek tekent met gegeven het middelpunt van de bovenste zijde, de breedte en de kleur. Gebruik de gegeven Rectangle2 procedure.
  4. Teken met deze procedure enkele rechthoeken (zie rechtse figuur).
  5. Zorg ervoor dat je door het nu gedefinieerd landschap kunt 'vliegen'. Dat je vooruit, naar links, naar rechts en naar boven en beneden kunt bewegen met de toetsen. Dit doe je door de coördinaten van het zichtspunt (dx, dy, dz) af te trekken van het 3D punt (de parameter) in je omreken procedure. Definieer dit punt als een globale variabele (helemaal bovenaan). Zorg ervoor dat het programma stopt als je op 'q' drukt.
  6. Vlieg tegen een bepaalde snelheid die de gebruiker kan aanpassen (versnellen of vertragen).
  7. Optioneel: Om er een flight simulator van te maken, kan je als volgt te werk gaan. Voeg deze code op de juiste plaats toe.





H1: FiguurTekenaar.

Gegeven zijn procedures om de volgende figuren te tekenen: cirkel, ellips, vierkant, ster en driehoek.
Maak een programma die figuren tekent door aan de gebruiker te vragen welke figuur hij wilt, met welke kleur en deze figuur dan op een willekeurige positie tekent met een willekeurige grootte.
Een procedure om een willekeurig getal te genereren is ook gegeven.
 
  1. Copieer deze code en bestudeer de gegeven procedures.
  2. Definieer een figuur-type met de volgende eigenschappen: figuurtype, middelpunt, grootte en kleur.
  3. Vraag de gebruiker welke figuur hij wilt en met welke kleur, vul de waarde in een figuur-variabele.
  4. Maak een TekenFiguur procedure die deze figuur tekent: een procedure die een figuur (zoals in punt 2 gedefinieerd) als input neemt.
  5. Genereer dan random waarden voor middelpunt en grootte, en teken de figuur.
  6. Zet bovenstaande in een lus: teken figuren tot de gebruiker 0 intikt voor de kleur.



H2: Zwaartepunt

Start with this code.
The type for a point is defines as:
        TYPE PointRc = RECORD
                        x, y: REAL;
                       END;
  1. Define the variable arr which can contain 10 points (punten) in a two-dimensional space, thus use the given type PointRc.
  2. Make a procedure that plots an array of points, an array of arbitrary (willekeurige) size (use an open array!).
  3. Make a procedure that calculate the centre of gravity (zwaartepunt) cg and returns a record for this.
  4. Calculate for each point the distance to the centre of gravity, add this to the datastructure! Print out all the 10 calculated distances.
  5. Use this procedure that calculates the average distance of 1 point to an (open) array of points. Use this to calculate the average distance of the 10 points to the center of gravity. Draw a circle to indicate this average distance.
  6. Mark the points that are further away from the calculated average distance to the centre of gravity. Add this property to the datastructure. Print this points in red.

T1: Output

MODULE T1;
<* NOOPTIMIZE + *>    
FROM IO IMPORT RdChar, WrChar, WrStr, RdStr, WrLn, RdCard, WrCard, RdInt, WrInt, RdReal, WrReal, RdBool, WrBool;

    CONST
       MIN = 2;
       MAX = 3;          (* constants *)

    TYPE Rc = RECORD
                 a, b: INTEGER;
              END;
         Ar = ARRAY[MIN..MAX] OF INTEGER;

    PROCEDURE Proc1(a, b, c: INTEGER): BOOLEAN;
      VAR toReturn: BOOLEAN;
    BEGIN
      a := a + b + 1;
      IF a > c THEN
        toReturn := TRUE;
      ELSE
        toReturn := FALSE;
      END;
      RETURN toReturn;
    END Proc1;

    PROCEDURE Proc2(a, b, c: INTEGER): INTEGER;
      VAR toReturn: INTEGER;
    BEGIN
      IF c > b THEN
        toReturn := (a + b) ;
      ELSE
        toReturn := (a + c) ;
      END;
      RETURN toReturn;
    END Proc2;

    PROCEDURE WrRc(c: Rc);
    BEGIN
      WrStr("field a = ");WrInt(c.a,0);WrLn;
      WrStr("field b = ");WrInt(c.b,0);WrLn;
    END WrRc;
    PROCEDURE WrAr(c: ARRAY OF INTEGER);
    (* procedure that prints the array *)
      VAR i: CARDINAL;
    BEGIN
      FOR i := 0 TO HIGH(c) DO
        WrStr("El ");WrCard(i,0);WrStr(" = ");WrInt(c[i],0);WrLn;
      END;
    END WrAr;

    VAR c:Rc;            (* variable-declarations *)
        d:Ar;
BEGIN
    WrLn;
    c.a := 1;
    c.b := 2;
    d[2] := 3;
    d[3] := 4;

    WHILE Proc1(c.b, d[2], c.a) DO
      c.a := Proc2(d[2], d[3], c.b);
      DEC( d[2]);   (* definition of Decrement: DEC(n); is similar as n := n - 1; *)
      DEC( d[3]);
    END;
    WrRc(c);
    WrAr(d);
END T1.