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"~

