Ik heb wel overal ook mogelijkheden om ranked in te voegen enz. bijgevoegd (dacht dat dat misschien ooit wel handig kan zijn )
Is dan ook net iets langer...
UPDATE: Ik heb zonet de tweede oefening ook af gemaakt en toegevoegd.
Stack.Mod
Code: Select all
(*
Doel: Besisoperaties uitvoeren op een stack.
Auteur: Nick De Frangh
Datum: 21-11-2005
*)
IMPORT
OutExt;
TYPE
STACK* = POINTER TO Lijst;
Lijst* =
RECORD
getal : REAL;
next: STACK;
END;
PROCEDURE New* (n: REAL): STACK;
(*
Omschrijving : Maakt een nieuwe Stack aan met als eerste element 'n'
Parameters :
n : getal dat in de eerste node zal ingevuld worden
Returntype : STACK
Algorithm : -
*)
VAR
Stack: STACK;
BEGIN
NEW(Stack);
Stack^.getal := n;
Stack^.next := NIL;
RETURN(Stack);
END New;
PROCEDURE Empty* (VAR Stack: STACK);
(*
Omschrijving : Maakt een gegeven Stack leeg
Parameters :
Stack : De Stack die mee gegeven wordt om leeg te maken
Returntype : -
Algorithm : -
*)
BEGIN
Stack := NIL;
END Empty;
PROCEDURE AddFirst* (n: REAL; VAR Stack: STACK);
(*
Omschrijving : Een element op de eerste plaats van de Stack toevoegen
Parameters :
n : getal dat in een node op de eerste plaats gezet zal worden
Stack : De Stack die meegegeven wordt
Returntype : -
Algorithm : -
*)
VAR
Temp: STACK;
BEGIN
Temp := New(n);
Temp^.next := Stack;
Stack := Temp;
END AddFirst;
PROCEDURE AddRank* (n: REAL; r: INTEGER; VAR Stack: STACK);
(*
Omschrijving : Een element op een willekeurige plaats in de Stack toevoegen
Parameters :
n : getal dat in een een willekeurige plaats invoegd zal worden in de Stack
Stack : De Stack die meegegeven wordt
Returntype : -
Algorithm : -
*)
VAR
Temp1, Temp2: STACK;
BEGIN
Temp1 := New(n);
Temp2 := Stack;
WHILE (Temp2^.next # NIL) & ((r-2) > 0) DO
Temp2 := Temp2^.next;
DEC(r);
END;
Temp1^.next := Temp2^.next^.next;
Temp2^.next := Temp1
END AddRank;
PROCEDURE AddLast* (n: REAL; VAR Stack: STACK);
(*
Omschrijving : Een element op de laatste plaats van de Stack toevoegen
Parameters :
n : getal dat in een node op de laatste plaats gezet zal worden
Stack : De Stack die meegegeven wordt
Returntype : -
Algorithm : -
*)
VAR
Temp1, Temp2: STACK;
BEGIN
Temp1 := New(n);
IF Stack = NIL THEN
Stack := Temp1;
ELSE
Temp2 := Stack;
WHILE Temp2^.next # NIL DO
Temp2 := Temp2^.next;
END;
Temp1^.next := Temp2^.next;
Temp2^.next := Temp1;
END;
END AddLast;
PROCEDURE Print* (Stack: STACK);
(*
Omschrijving : De waardes van de meegegeven stack uitprinten
Parameters :
Stack : De Stack die meegegeven wordt en uitgeprint zal worden
Returntype : -
Algorithm : -
*)
BEGIN
IF Stack = NIL THEN
OutExt.String("De stack is leeg.");
OutExt.Ln;
OutExt.Ln;
ELSE
OutExt.String("De Stack bevat volgende getallen:");
OutExt.Ln;
OutExt.String("---------------------------------");
OutExt.Ln;
REPEAT
OutExt.RealFix(Stack^.getal, 3, 2);
OutExt.Ln;
Stack := Stack^.next;
UNTIL Stack = NIL;
OutExt.Ln;
END;
END Print;
PROCEDURE DelFirst* (VAR Stack: STACK);
(*
Omschrijving : De eerste Node van een stack Deleten
Parameters :
Stack : De Stack die meegegeven wordt
Returntype : -
Algorithm : -
*)
BEGIN
IF Stack = NIL THEN
HALT(60)
END;
Stack := Stack^.next;
END DelFirst;
PROCEDURE DelRank* (n: INTEGER; VAR Stack: STACK);
(*
Omschrijving : Een node op een willekeurige plaats van de Stack deleten
Parameters :
n : getal dat de plaats aangeeft van de node die verwijderd moet worden
Stack : De Stack die meegegeven wordt
Returntype : -
Algorithm : -
*)
VAR
Temp1, Temp2: STACK;
BEGIN
IF Stack = NIL THEN
HALT(60)
END;
Temp1 := Stack;
WHILE (Temp1^.next # NIL) & ((n - 2) > 0) DO
Temp1 := Temp1^.next;
DEC(n);
END;
Temp2 := Temp1^.next^.next;
Temp1^.next := Temp2;
END DelRank;
PROCEDURE DelLast (VAR Stack: STACK);
(*
Omschrijving : De laatste node van een stack verwijderen
Parameters :
Stack : De Stack die meegegeven wordt
Returntype : -
Algorithm : -
*)
VAR
Temp: STACK;
BEGIN
IF Stack = NIL THEN
HALT(60)
END;
Temp := Stack;
WHILE Temp^.next^.next # NIL DO
Temp := Temp^.next;
END;
Temp^.next := NIL;
END DelLast;
PROCEDURE GetFirst* (Stack: STACK): REAL;
(*
Omschrijving : De eerste node van de Stack oproepen
Parameters :
Stack : De Stack die meegegeven wordt
Returntype : REAL
Algorithm : -
*)
BEGIN
RETURN(Stack^.getal);
END GetFirst;
PROCEDURE GetRank* (n: INTEGER; Stack: STACK): REAL;
(*
Omschrijving : Een willekeurige node van de stack oproepen
Parameters :
n : getal dat aangeeft welke node opgeroepen zal worden
Stack : De Stack die meegegeven wordt
Returntype : REAL
Algorithm : -
*)
VAR
Temp: STACK;
BEGIN
Temp := Stack;
WHILE (Temp^.next # NIL) & (n > 1) DO
Temp := Temp^.next;
DEC(n);
END;
RETURN(Temp^.getal);
END GetRank;
PROCEDURE GetLast* (Stack: STACK): REAL;
(*
Omschrijving : De laatste node van de Stack oproepen
Parameters :
Stack : De Stack die meegegeven wordt
Returntype : REAL
Algorithm : -
*)
VAR
Temp: STACK;
BEGIN
Temp := Stack;
WHILE Temp^.next # NIL DO
Temp := Temp^.next;
END;
RETURN(Temp^.getal);
END GetLast;
PROCEDURE CheckEmpty* (Stack: STACK): BOOLEAN;
(*
Omschrijving : Controleren of een Stack al dan niet leeg is
Parameters :
Stack : De Stack die meegegeven wordt
Returntype : BOOLEAN
Algorithm : -
*)
BEGIN
IF Stack = NIL THEN
RETURN (TRUE);
ELSE
RETURN (FALSE);
END;
END CheckEmpty;
PROCEDURE Test*;
(*
Omschrijving : Alle procedures testen
Parameters : -
Returntype : -
Algorithm : -
*)
VAR
Node: STACK;
n: REAL;
Test: BOOLEAN;
BEGIN
OutExt.String("Ik maak een nieuwe Stack aan met het element 5");
OutExt.Ln;
Node := New(5);
Print(Node);
OutExt.String("Ik voeg het element 3 toe aan de Stack");
OutExt.Ln;
AddLast(3, Node);
Print(Node);
OutExt.String("Ik maak de stack terug leeg");
OutExt.Ln;
Empty(Node);
Print(Node);
OutExt.String("Check of de Stack leeg is");
OutExt.Ln;
Test := CheckEmpty(Node);
IF Test = TRUE THEN
OutExt.String("De Stack is leeg");
ELSE
OutExt.String("De Stack bevat nog elementen");
END;
OutExt.Ln;
OutExt.Ln;
OutExt.String("Ik voeg de elementen 2, 6, 9, 13, 5, 1 en 7 toe aan de Stack");
OutExt.Ln;
AddLast(2,Node);
AddLast(6,Node);
AddLast(9,Node);
AddLast(13,Node);
AddLast(5,Node);
AddLast(1,Node);
AddLast(7,Node);
Print(Node);
OutExt.String("Ik voeg Het element 4.2 toe als eerste element");
OutExt.Ln;
AddFirst(4.2, Node);
Print(Node);
OutExt.String("Ik voeg Het element 2.6 toe als 4de element");
OutExt.Ln;
AddRank(2.6, 4, Node);
Print(Node);
OutExt.String("Ik roep het eerste element van de stack op");
OutExt.Ln;
n := GetFirst(Node);
OutExt.RealFix(n, 3, 2);
OutExt.Ln;
OutExt.Ln;
OutExt.String("Ik verwijder het derde element van de Stack");
OutExt.Ln;
DelRank(3, Node);
Print(Node);
OutExt.String("Ik verwijder het eerste element van de Stack");
OutExt.Ln;
DelFirst(Node);
Print(Node);
OutExt.String("Ik verwijder het laatste element van de Stack");
OutExt.Ln;
DelLast(Node);
Print(Node);
OutExt.String("Ik roep het 3de element van de Stack op");
OutExt.Ln;
n := GetRank(3, Node);
OutExt.RealFix (n, 3, 2);
Print(Node);
OutExt.Ln;
OutExt.Ln;
OutExt.String("Ik roep het laatste element van de Stack op");
OutExt.Ln;
n := GetLast(Node);
OutExt.RealFix (n, 3, 2);
Print(Node);
OutExt.Ln;
OutExt.Ln;
OutExt.String("Check of de Stack leeg is");
OutExt.Ln;
Test := CheckEmpty(Node);
IF Test = TRUE THEN
OutExt.String("De Stack is leeg");
ELSE
OutExt.String("De Stack bevat nog elementen");
END;
END Test;
BEGIN
OutExt.Open();
OutExt.Clear;
END Stack.
Code: Select all
(*
Author: Nick De Frangh
Date: 17-11-05
*)
Builder.Compile \ws
OutExt.Mod
Stack.Mod
~
Builder.Compile \f*
System.Free
Stack.Mod
OutExt.Mod
~
OutExt.Clear
Stack.Test
Code: Select all
MODULE Adresboek;
IMPORT
OutExt, In, Strings, Files;
TYPE
NAAM = ARRAY 30 OF CHAR;
TEL = ARRAY 10 OF CHAR;
GSM = ARRAY 11 OF CHAR;
ADRSLIST* = POINTER TO Persoon;
Persoon* =
RECORD
prev: ADRSLIST;
naam: NAAM;
tel: TEL;
gsm: GSM;
next: ADRSLIST;
END;
PROCEDURE New* (n: NAAM; t: TEL; g: GSM): ADRSLIST;
(*
Omschrijving : Begin een nieuwe adressenlijst met als eerste entry 'n', 't' en 'g'
Parameters :
n: De naam van de persoon
t: Telefoonnummer van de persoon
g: GSM nummer van de persoon
Returntype : ADRSLIST
Algoritme : -
*)
VAR
First: ADRSLIST;
BEGIN
NEW(First);
First^.prev := First;
First^.naam := n;
First^.tel := t;
First^.gsm := g;
First^.next := First;
RETURN(First);
END New;
PROCEDURE Empty* (VAR Lijst: ADRSLIST);
(*
Omschrijving : Een adressenlijst leeg maken
Parameters :
Lijst: De mee gegeven lijst
Returntype : -
Algoritme : -
*)
BEGIN
WHILE (Lijst^.prev # NIL) DO
Lijst^.prev := NIL;
Lijst := Lijst^.next;
END;
Lijst := NIL;
END Empty;
PROCEDURE Add* (n: NAAM; t: TEL; g: GSM; VAR Lijst: ADRSLIST);
(*
Omschrijving : Een contactpersoon toevoegen aan een adressenlijst
Parameters :
n: De naam van de persoon
t: Telefoonnummer van de persoon
g: GSM nummer van de persoon
Lijst: De mee gegeven lijst
Returntype : -
Algoritme : -
*)
VAR
Persoon, Temp1, Temp2: ADRSLIST;
BEGIN
Persoon := New(n, t, g);
Temp1 := Lijst;
IF (Temp1^.next = Temp1) THEN
Temp1^.next := Persoon;
Temp1^.prev := Persoon;
Persoon^.prev := Temp1;
Persoon^.next := Temp1;
ELSE
Temp2 := Lijst;
WHILE (Temp1^.next # Temp2) DO
Temp1 := Temp1^.next;
END;
Temp1^.next := Persoon;
Persoon^.prev := Temp1;
Persoon^.next := Temp2;
Temp2^.prev := Persoon;
END;
END Add;
PROCEDURE Delete* (VAR Lijst: ADRSLIST; Node: ADRSLIST);
VAR
Temp: ADRSLIST;
BEGIN
Temp := Lijst;
WHILE (Temp^.next # Node) DO
Temp := Temp^.next;
END;
Temp^.next^.next^.prev := Node^.prev;
Temp^.next := Node^.next;
END Delete;
PROCEDURE Print* (Lijst: ADRSLIST);
VAR
Temp: ADRSLIST;
c: INTEGER;
BEGIN
Temp := Lijst;
IF Lijst = NIL THEN
OutExt.Color(1);
OutExt.String("De Lijst is leeg");
ELSE
OutExt.Color(11);
OutExt.String("Naam: ");
OutExt.String("Tel: ");
OutExt.String("Gsm:");
OutExt.Ln;
OutExt.Color(7);
OutExt.String("----------------------------- ");
OutExt.String("--------- ");
OutExt.String("----------");
OutExt.Ln;
OutExt.Color(3);
REPEAT
OutExt.String(Lijst^.naam);
c := 0;
REPEAT
OutExt.String(" ");
INC(c);
UNTIL (32 - Strings.Length(Lijst^.naam) - c = 0);
OutExt.String(Lijst^.tel);
OutExt.String(" ");
OutExt.String(Lijst^.gsm);
OutExt.Ln;
Lijst := Lijst^.next;
UNTIL (Lijst = Temp);
END;
OutExt.Color(15);
END Print;
PROCEDURE DelNaam(VAR Lijst: ADRSLIST; n: NAAM);
VAR
Temp: ADRSLIST;
BEGIN
Temp := Lijst;
REPEAT
IF (Temp^.naam = n) THEN
Delete(Lijst, Temp);
END;
Temp := Temp^.next;
UNTIL Temp = Lijst;
END DelNaam;
PROCEDURE GetNaam(Lijst: ADRSLIST; n: NAAM): ADRSLIST;
VAR
Temp: ADRSLIST;
Done: BOOLEAN;
Naam: ADRSLIST;
BEGIN
Temp := Lijst;
Done := FALSE;
REPEAT
IF (Temp^.naam = n) THEN
NEW(Naam);
Naam^.prev := Naam;
Naam^.next := Naam;
Naam^.naam := Temp^.naam;
Naam^.tel := Temp^.tel;
Naam^.gsm := Temp^.gsm;
Done := TRUE;
ELSE
Temp := Temp^.next;
END;
UNTIL (Temp = Lijst) OR (Done);
RETURN(Naam);
END GetNaam;
PROCEDURE GetLength(Lijst: ADRSLIST; naam1, naam2: NAAM): INTEGER;
VAR
Temp, TempL, TempR: ADRSLIST;
c1, c2: INTEGER;
Start: BOOLEAN;
BEGIN
c1 := 0;
c2 := 0;
Start := FALSE;
Temp := Lijst;
REPEAT
IF (Temp^.naam = naam1) THEN
Start := TRUE
ELSE
Temp := Temp^.next;
END;
UNTIL (Temp = Lijst) OR (Start);
IF Start THEN
TempL := Temp;
TempR := Temp;
WHILE (TempL^.naam # naam2) DO
TempL := TempL^.prev;
INC(c1);
END;
WHILE (TempR^.naam # naam2) DO
TempR := TempR^.next;
INC(c2);
END;
IF (c1 < c2) THEN
RETURN(c1);
ELSE
RETURN(c2);
END;
END;
RETURN(0);
END GetLength;
PROCEDURE Save(Lijst: ADRSLIST; bestandsnaam: ARRAY OF CHAR);
VAR
bestand: Files.File;
bestandLoper: Files.Rider;
First: ADRSLIST;
BEGIN
First := Lijst;
bestand := Files.New(bestandsnaam);
Files.Set(bestandLoper, bestand, 0);
REPEAT
Files.WriteString (bestandLoper, First^.naam);
Files.WriteString (bestandLoper, First^.tel);
Files.WriteString (bestandLoper, First^.gsm);
First := First^.next;
UNTIL First = Lijst;
Files.Register(bestand);
OutExt.Int(Files.Length(bestand), 0);
OutExt.String(" bytes weggeschreven.");
OutExt.Ln();
END Save;
PROCEDURE Open(bestandsnaam: ARRAY OF CHAR): ADRSLIST;
VAR
bestand: Files.File;
bestandLoper: Files.Rider;
Lijst: ADRSLIST;
Naam: NAAM;
Tel: TEL;
Gsm: GSM;
BEGIN
bestand := Files.Old(bestandsnaam);
IF (bestand # NIL) THEN
Files.Set(bestandLoper, bestand, 0);
Files.ReadString(bestandLoper, Naam);
Files.ReadString(bestandLoper, Tel);
Files.ReadString(bestandLoper, Gsm);
WHILE (~bestandLoper.eof) DO
IF (Lijst = NIL) THEN
Lijst := New(Naam, Tel, Gsm);
ELSE
Add(Naam, Tel, Gsm, Lijst);
END;
Files.ReadString(bestandLoper, Naam);
Files.ReadString(bestandLoper, Tel);
Files.ReadString(bestandLoper, Gsm);
END;
Files.Close(bestand);
RETURN(Lijst);
ELSE
OutExt.String("bestand niet gevonden.");
OutExt.Ln();
END;
END Open;
PROCEDURE Test*;
VAR
Lijst, Temp: ADRSLIST;
Naam: NAAM;
Tel: TEL;
Gsm: GSM;
n: INTEGER;
BEGIN
In.Open();
OutExt.String("Ik maak een nieuwe Lijst aan met de eerst ingelezen naam");
OutExt.Ln;
OutExt.String("-----------------------------");
OutExt.Ln;
In.String(Naam);
In.String(Tel);
In.String(Gsm);
Lijst := New(Naam, Tel, Gsm);
Print(Lijst);
OutExt.Ln;
OutExt.Ln;
OutExt.Ln;
OutExt.String("Ik Voeg alle volgende namen die ingelezen zullen worden toe");
OutExt.Ln;
OutExt.String("-----------------------------");
OutExt.Ln;
In.String(Naam);
In.String(Tel);
In.String(Gsm);
WHILE In.Done DO
Add(Naam, Tel, Gsm, Lijst);
In.String(Naam);
In.String(Tel);
In.String(Gsm);
END;
Print(Lijst);
OutExt.Ln;
OutExt.Ln;
OutExt.Ln;
OutExt.String("Ik verwijdere alle contactpersonen met de naam Joske");
OutExt.Ln;
OutExt.String("-----------------------------");
OutExt.Ln;
DelNaam(Lijst, "Joske");
Print(Lijst);
OutExt.Ln;
OutExt.Ln;
OutExt.Ln;
OutExt.String("Ik zoek de korste afstand tussen de namen 'Nick' en 'Jones'");
OutExt.Ln;
OutExt.String("-----------------------------");
OutExt.Ln;
n := GetLength(Lijst, "Nick", "Jones");
OutExt.Int(n, 3);
OutExt.Ln;
OutExt.Ln;
OutExt.Ln;
OutExt.String("Ik zoek het telefoon- en gsm nummer van Jefke");
OutExt.Ln;
OutExt.String("-----------------------------");
OutExt.Ln;
Temp := GetNaam(Lijst, "Jefke");
Print(Temp);
OutExt.Ln;
OutExt.Ln;
OutExt.Ln;
OutExt.String("Ik sla het adresboek op in adrs.txt");
OutExt.Ln;
OutExt.String("-----------------------------");
OutExt.Ln;
Save(Lijst, "adrs.txt");
OutExt.Ln;
OutExt.Ln;
OutExt.Ln;
OutExt.String("Ik maak de lijst volledig leeg");
OutExt.Ln;
OutExt.String("-----------------------------");
OutExt.Ln;
Empty(Lijst);
Print(Lijst);
OutExt.Ln;
OutExt.Ln;
OutExt.Ln;
OutExt.String("Ik open het opgeslagen bestand adrs.txt");
OutExt.Ln;
OutExt.String("-----------------------------");
OutExt.Ln;
Lijst := Open("adrs.txt");
Print(Lijst);
OutExt.Ln;
OutExt.Ln;
OutExt.Ln;
END Test;
BEGIN
OutExt.Open();
OutExt.Clear();
END Adresboek.
Code: Select all
(*
Author: Nick De Frangh
Date: 17-11-05
*)
Builder.Compile \ws
OutExt.Mod
Adresboek.Mod
~
Builder.Compile \f*
System.Free
Adresboek.Mod
OutExt.Mod
~
OutExt.Clear
Adresboek.Test
"Joske" "129865845" "0123456789"
"Joske" "129865845" "0123456789"
"Joske" "129865845" "0123456789"
"Mark" "034499193" "2684597683"~