RECORD.
Some useful hints!
board[1] := "--B-B-";
board[2] := "W-BW--";
board[3] := "W-W--B";
board[4] := "--B--W";
board[5] := "WW---B";
board[6] := "B--B-W";
We wensen een toren van 2.5m te bouwen door het opstapelen van kubussen. De onderste kubus heeft een ribbe van 1m, de volgende kubussen zijn telkens 2/3 kleiner. opgelet: als je 1m als CARDINAL schrijft, in centimeters bvb, dan geeft 2/3*... problemen, immers wordt 2/3 = 0.666 afgerond tot 0 (is immers een cardinal) Stapel de kubussen opeen tot je toren net hoger is dan 2.5m. Stokeer alle kubussen in een datastruktuur, waarbij je van elke kubus de lengte van de ribbe bijhoudt en de hoogte tot de grond (de eerste staat op de grond, de hoogte is dus 0m, de tweede staat op 1m). Hoeveel kubussen heb je nodig? Teken de kubussen mbv de Vierkant procedure (zet x = een constante). Neem 2.5m = schermgrootte = 500pixels => 1m = 200 pixels.
CONST SIZE=10;2. Gebruik de gegeven Arrow procedure om de snelheidsvectoren te tekenen. Deze procedure staan in onze StandardLib, deze vind je op de Modula-2 technology pagina. Download de .def en .mod file naar de folder met je eigen module. Dan kan je simpelweg procedures importeren van StandardLib:
a[1].x := 200; a[1].y := 300; a[1].g := 10; a[1].vx := 5; a[1].vy := 4;
a[2].x := 123; a[2].y := 456; a[2].g := 20; a[2].vx := 2; a[2].vy := -2;
a[3].x := 512; a[3].y := 500; a[3].g := 30; a[3].vx := -3; a[3].vy := -1;
a[4].x := 123; a[4].y := 50; a[4].g := 25; a[4].vx := 3; a[4].vy := 0;
a[5].x := 432; a[5].y := 300; a[5].g := 15; a[5].vx := -3; a[5].vy := 1;
a[6].x := 234; a[6].y := 670; a[6].g := 12; a[6].vx := 2; a[6].vy := -3 ;
FROM StandardLib IMPORT Arrow;Uitleg over de werking van libraries (en hoe er zelf te maken) vind je onder de Modula-2 documentatie: XDS manual
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.
VAR
teachers: ARRAY[1..NBR_TEACHERS] OF RECORD
id:
CARDINAL;
name:
ARRAY[1..MAX_NAME_SIZE] OF CHAR;
END;
courses: ARRAY[1..NBR_COURSES] OF RECORD
id:
CARDINAL;
name:
ARRAY[1..MAX_NAME_SIZE] OF CHAR;
teacherID:
CARDINAL;
duration:
CARDINAL; (* in hours *)
isTheory:
BOOLEAN; (* if FALSE: it is a practicum course *)
END;
studentGroups: ARRAY[1..NBR_GROUPS] OF RECORD
id:
CARDINAL;
nbrStudents:
CARDINAL;
nbrCourses:
CARDINAL; (* nbr of courses of the group *)
courseIDs:
ARRAY[1..NBR_COURSES] OF CARDINAL; (* courses of the group
*)
END;
te, co, gr, coID: CARDINAL;
n1, n2, n4, n5: CARDINAL;
n3 : REAL;
BEGIN
(*
arrays of records are filled
here ...
*)
n1 := 0; n2 := 0; n3 := 0.0; n4 := 0, n5 := 0;
FOR te = 1 TO NBR_TEACHERS DO
FOR co = 1 TO NBR_COURSES DO
IF courses[co].teacherID = te THEN
IF
courses[co].isTheory THEN
INC(n1);
n2 := n2
+ courses[co].duration;
FOR gr := 1
TO NBR_GROUPS DO
FOR coID = 1 TO studentGroups[gr].nbrCourses DO
IF
studentGroups[gr].courseIDS[coID] = co THEN
n3
:= n3 + VAL(REAL, studentGroups[gr].nbrStudents) *
TIME_THEORY_EXAM_PER_STUDENT;
END;
END;
END;
ELSE (* practicum *)
FOR gr := 1
TO NBR_GROUPS DO
FOR coID = 1 TO studentGroups[gr].nbrCourses DO
IF
studentGroups[gr].courseIDS[coID] = co THEN
INC(n4);
n5
:= n5 + courses[co].duration;
END;
END;
END;
END;
END;
END;
WrStr("Load of teacher
");WrStr(teachers[te].name);WrStr(" is:");WrLn;
WrStr("... is ");WrCard(n1,0);WrLn;
WrStr("... is ");WrCard(n2,0);WrStr("
hours");WrLn;
WrStr("... is ");WrReal(n3,4, 0);WrStr("
hours");WrLn;
WrStr("... is ");WrCard(n4,0);WrLn;
WrStr("... is ");WrCard(n5,0);WrStr("
hours");WrLn;
END;
END T2.