
Festival.Mod
Code: Select all
MODULE Festival;
(*
Doel: Bijhouden wat en hoeveel een aantal vrienden op een festival hebben gedronken of nog van drank bijhebben.
Auteur: Nick De Frangh
Datum: 23-01-06
*)
IMPORT
OutExt, In, Files;
TYPE
Naam = ARRAY 25 OF CHAR;
Personen = POINTER TO PersonenDescr;
PersonenDescr =
RECORD
naam : Naam;
aantal : INTEGER;
drank : Flessen;
gedronken : Flessen;
next : Personen;
END;
Flessen = POINTER TO FlessenDescr;
FlessenDescr =
RECORD
soort : Naam;
aantal : INTEGER;
next : Flessen;
END;
VAR
aanwezigen : Personen;
PROCEDURE Error(msg : ARRAY OF CHAR);
(*
Omschrijving : Alle errors uitprinten
Parameters :
msg : De error boodschap die wordt mee gegeven
Returntype : -
Algoritme : -
*)
BEGIN
OutExt.Color(1);
OutExt.String(msg);
OutExt.Ln;
OutExt.Color(15);
END Error;
PROCEDURE Initialize*;
(*
Omschrijving : Het programma initializeren, alles op 0 zetten
Parameters : -
Returntype : -
Algoritme : -
*)
BEGIN
IF (aanwezigen = NIL) THEN
NEW(aanwezigen);
END;
aanwezigen^.next := NIL;
aanwezigen^.naam := "";
aanwezigen^.aantal := 0;
aanwezigen^.drank := NIL;
aanwezigen^.gedronken := NIL;
END Initialize;
PROCEDURE Arrive*;
(*
Omschrijving : Iemand op het festival laten toekomen
Parameters : -
Returntype : -
Algoritme : -
*)
VAR
currentpersoon, temp : Personen;
tempnaam, tempdranknaam : Naam;
tempaantal : INTEGER;
tempdrank, currentdrank : Flessen;
BEGIN
currentpersoon := aanwezigen;
In.Open();
In.String(tempnaam);
IF In.Done THEN
WHILE (currentpersoon^.next # NIL) & (currentpersoon^.naam # tempnaam) DO
currentpersoon := currentpersoon^.next;
END;
IF (currentpersoon^.naam # tempnaam) THEN
IF (currentpersoon^.naam # "") THEN
NEW(temp);
currentpersoon^.next := temp;
currentpersoon := currentpersoon^.next;
END;
currentpersoon^.naam := tempnaam;
currentpersoon^.aantal := 0;
currentpersoon^.gedronken := NIL;
In.String(tempdranknaam);
In.Int(tempaantal);
WHILE In.Done DO
NEW(tempdrank);
tempdrank^.soort := tempdranknaam;
tempdrank^.aantal := tempaantal;
tempdrank^.next := NIL;
IF (currentdrank = NIL) THEN
currentdrank := tempdrank;
currentpersoon^.drank := currentdrank;
ELSE
currentdrank^.next := tempdrank;
currentdrank := currentdrank^.next;
END;
In.String(tempdranknaam);
In.Int(tempaantal);
END;
OutExt.String(currentpersoon^.naam);
OutExt.String(" is aangekomen op het festival");
OutExt.Ln;
ELSE
Error("ERROR (Arrive): Deze persoon is al op het festival");
END;
ELSE
Error("ERROR (Arrive): Je hebt geen naam ingegeven");
END;
END Arrive;
PROCEDURE Drink*;
(*
Omschrijving : Iedereen een slok laten nemen van de drank die ze het minst lang in hun bezit hebben
Parameters : -
Returntype : -
Algoritme : -
*)
VAR
currentpersoon : Personen;
currentdrank, currentgedronken, tempgedronken : Flessen;
BEGIN
IF (aanwezigen^.naam = "") THEN
Error("ERROR (Drink): Er is nog niemand op het festival.");
ELSE
currentpersoon := aanwezigen;
REPEAT
currentdrank := currentpersoon^.drank;
IF (currentdrank # NIL) THEN
DEC(currentdrank^.aantal);
IF (currentpersoon^.gedronken = NIL) THEN
NEW(tempgedronken);
tempgedronken^.soort := currentdrank^.soort;
tempgedronken^.aantal := 1;
tempgedronken^.next := NIL;
currentpersoon^.gedronken := tempgedronken;
ELSE
currentgedronken := currentpersoon^.gedronken;
WHILE (currentgedronken^.next # NIL) & (currentgedronken^.soort # currentdrank^.soort) DO
currentgedronken := currentgedronken^.next;
END;
IF (currentgedronken^.soort = currentdrank^.soort) THEN
INC(currentgedronken^.aantal);
ELSE
NEW(tempgedronken);
tempgedronken^.soort := currentdrank^.soort;
tempgedronken^.aantal := 1;
tempgedronken^.next := NIL;
currentgedronken^.next := tempgedronken;
END;
END;
IF (currentdrank^.aantal = 0) THEN
OutExt.String(currentpersoon^.naam);
OutExt.String(" zijn fles ");
OutExt.String(currentdrank^.soort);
OutExt.String(" is leeg.");
OutExt.Ln;
IF (currentdrank^.next # NIL) THEN
currentpersoon^.drank := currentdrank^.next;
ELSE
currentpersoon^.drank := NIL;
END;
END;
INC(currentpersoon^.aantal);
END;
currentpersoon := currentpersoon^.next
UNTIL (currentpersoon = NIL);
END;
END Drink;
PROCEDURE Pass*;
(*
Omschrijving : Een fles laten doorgeven van de eerste naar de tweede mee gegeven persoon
Parameters : -
Returntype : -
Algoritme : -
*)
VAR
donor, ontvanger : Personen;
donornaam, ontvangernaam : Naam;
donordrank, ontvangerdrank : Flessen;
BEGIN
In.Open();
In.String(donornaam);
In.String(ontvangernaam);
IF In.Done THEN
donor := aanwezigen;
WHILE (donor^.naam # donornaam) & (donor^.next # NIL) DO
donor := donor^.next;
END;
ontvanger := aanwezigen;
WHILE (ontvanger^.naam # ontvangernaam) & (ontvanger # NIL) DO
ontvanger := ontvanger^.next;
END;
IF (donor = NIL) THEN
Error("ERROR (Pass): De donor is niet gevonden.");
ELSIF (ontvanger = NIL) THEN
Error("ERROR (Pass): De ontvanger is niet gevonden.");
ELSE
donordrank := donor^.drank;
IF (donordrank # NIL) THEN
IF (donordrank^.next = NIL) THEN
IF (ontvanger^.drank = NIL) THEN
ontvanger^.drank := donor^.drank;
donor^.drank := NIL;
ELSE
ontvangerdrank := ontvanger^.drank;
WHILE (ontvangerdrank^.next # NIL) DO
ontvangerdrank := ontvangerdrank^.next;
END;
ontvangerdrank^.next := donor^.drank;
donor^.drank := NIL;
END;
ELSE
WHILE (donordrank^.next^.next # NIL) DO
donordrank := donordrank^.next;
END;
ontvangerdrank := ontvanger^.drank;
IF (ontvangerdrank = NIL) THEN
ontvanger^.drank := donordrank^.next;
donordrank^.next := NIL;
ELSE
WHILE (ontvangerdrank^.next # NIL) DO
ontvangerdrank := ontvangerdrank^.next;
END;
ontvangerdrank^.next := donordrank^.next;
donordrank^.next := NIL;
END;
END;
END;
END;
ELSE
Error("ERROR (Pass): Er is mis met de input.");
END;
END Pass;
PROCEDURE Part*;
(*
Omschrijving : Iemand verlaat het festival en neemt al zijn flessen mee
Parameters : -
Returntype : -
Algoritme : -
*)
VAR
tempnaam : Naam;
temppersoon : Personen;
BEGIN
In.Open();
In.String(tempnaam);
IF In.Done THEN
temppersoon := aanwezigen;
IF (temppersoon^.naam = tempnaam) THEN
OutExt.String(temppersoon^.naam);
OutExt.String(" heeft het festival verlaten");
OutExt.Ln;
IF (temppersoon^.next = NIL) THEN
Initialize;
ELSE
aanwezigen := temppersoon^.next;
END;
ELSE
WHILE (temppersoon^.next^.naam # tempnaam) & (temppersoon # NIL) DO
temppersoon := temppersoon^.next;
END;
IF (temppersoon # NIL) THEN
OutExt.String(temppersoon^.next^.naam);
OutExt.String(" heeft het festival verlaten");
OutExt.Ln;
temppersoon^.next := temppersoon^.next^.next;
ELSE
Error("ERROR (Part): Deze persoon was niet aanwezig op het festival");
END;
END;
ELSE
Error("ERROR (Part): Je hebt geen naam ingegeven");
END;
END Part;
PROCEDURE Print*;
(*
Omschrijving : De huidige status uitprinten van wie wat gedronken heeft en nog over heeft
Parameters : -
Returntype : -
Algoritme : -
*)
VAR
currentpersoon, temppersoon : Personen;
currentdrank, currentgedronken, tempdrank : Flessen;
check : BOOLEAN;
BEGIN
currentpersoon := aanwezigen;
IF (currentpersoon^.naam = "") THEN
OutExt.String("Er is niemand aanwezig op het festival");
OutExt.Ln;
ELSE
OutExt.String("De huidige aanwezigen zijn:");
OutExt.Ln;
WHILE (currentpersoon # NIL) & (currentpersoon^.naam # "") DO
OutExt.String(" ");
OutExt.String(currentpersoon^.naam);
OutExt.String(":");
OutExt.Ln;
OutExt.String(" Huidige consumptie : ");
OutExt.Int(currentpersoon^.aantal, 0);
IF (currentpersoon^.aantal = 1) THEN
OutExt.String(" slok van volgende fles:");
ELSE
OutExt.String(" slokken van volgende fles(en):");
END;
OutExt.Ln;
currentgedronken := currentpersoon^.gedronken;
WHILE (currentgedronken # NIL) DO
OutExt.String(" ");
OutExt.Int(currentgedronken^.aantal, 0);
IF (currentgedronken^.aantal = 1) THEN
OutExt.String(" slok ");
ELSE
OutExt.String(" slokken ");
END;
OutExt.String(currentgedronken^.soort);
check := FALSE;
temppersoon := aanwezigen;
WHILE (temppersoon # NIL) & (~check) DO
tempdrank := temppersoon^.drank;
WHILE (tempdrank # NIL) & (tempdrank^.soort # currentgedronken^.soort) DO
tempdrank := tempdrank^.next;
END;
IF (tempdrank # NIL) & (tempdrank^.soort = currentgedronken^.soort) THEN
check := TRUE;
OutExt.String(" (");
OutExt.String(temppersoon^.naam);
OutExt.String(" heeft nu de fles met nog ");
OutExt.Int(tempdrank^.aantal, 0);
IF (tempdrank^.aantal = 1) THEN
OutExt.String(" slok er in)");
ELSE
OutExt.String(" slokken er in)");
END;
END;
IF (temppersoon^.next = NIL) THEN
temppersoon := NIL;
ELSE
temppersoon := temppersoon^.next;
END;
END;
IF (~check) THEN
OutExt.String(" (Deze fles is nu leeg)");
END;
OutExt.Ln;
currentgedronken := currentgedronken^.next;
END;
OutExt.String(" Huidig bezit:");
OutExt.Ln;
IF (currentpersoon^.drank = NIL) THEN
OutExt.String(" Geen flessen in zijn bezit");
OutExt.Ln;
ELSE
currentdrank := currentpersoon^.drank;
WHILE (currentdrank # NIL) DO
OutExt.String(" ");
OutExt.String(currentdrank^.soort);
OutExt.String(" -> ");
OutExt.Int(currentdrank^.aantal, 0);
IF (currentdrank^.aantal = 1) THEN
OutExt.String(" Slok");
ELSE
OutExt.String(" Slokken");
END;
OutExt.Ln;
currentdrank := currentdrank^.next;
END;
END;
IF (currentpersoon^.next = NIL) THEN
currentpersoon := NIL;
ELSE
currentpersoon := currentpersoon^.next;
END;
END;
END;
END Print;
PROCEDURE Save*;
(*
Omschrijving : De huidige gegevens worden opgeslagen
Parameters : -
Returntype : -
Algoritme : -
*)
VAR
bestand: Files.File;
bestandLoper: Files.Rider;
currentpersoon: Personen;
tempdrank : Flessen;
bestandsnaam : Naam;
BEGIN
In.Open();
In.String(bestandsnaam);
IF In.Done THEN
currentpersoon := aanwezigen;
bestand := Files.New(bestandsnaam);
Files.Set(bestandLoper, bestand, 0);
WHILE (currentpersoon # NIL) DO
Files.WriteString (bestandLoper, currentpersoon^.naam);
Files.WriteInt (bestandLoper, currentpersoon^.aantal);
tempdrank := currentpersoon^.drank;
WHILE (tempdrank # NIL) DO
Files.WriteString (bestandLoper, tempdrank^.soort);
Files.WriteInt (bestandLoper, tempdrank^.aantal);
tempdrank := tempdrank^.next;
END;
Files.WriteString (bestandLoper, "!!");
tempdrank := currentpersoon^.gedronken;
WHILE (tempdrank # NIL) DO
Files.WriteString (bestandLoper, tempdrank^.soort);
Files.WriteInt (bestandLoper, tempdrank^.aantal);
tempdrank := tempdrank^.next;
END;
Files.WriteString (bestandLoper, "!!");
currentpersoon := currentpersoon^.next;
END;
Files.Register(bestand);
OutExt.String("De huidige gegevens zijn opgeslagen onder volgende naam: ");
OutExt.String(bestandsnaam);
OutExt.Ln();
ELSE
Error("ERROR (Save): Je hebt geen bestandsnaam ingegeven");
END;
END Save;
PROCEDURE Load*;
(*
Omschrijving : Laad gegevens uit een bestand
Parameters : -
Returntype : -
Algoritme : -
*)
VAR
bestand: Files.File;
bestandLoper: Files.Rider;
currentpersoon: Personen;
bestandsnaam : Naam;
tempsoort : Naam;
temppersoon : Personen;
tempdrank, currentdrank : Flessen;
BEGIN
In.Open();
In.String(bestandsnaam);
IF In.Done THEN
bestand := Files.Old(bestandsnaam);
Files.Set(bestandLoper, bestand, 0);
aanwezigen := NIL;
IF (bestand # NIL) THEN
WHILE (~bestandLoper.eof) DO
IF (aanwezigen = NIL) THEN
NEW(aanwezigen);
Files.ReadString (bestandLoper, aanwezigen^.naam);
Files.ReadInt (bestandLoper, aanwezigen^.aantal);
aanwezigen^.next := NIL;
aanwezigen^.drank := NIL;
aanwezigen^.gedronken := NIL;
currentpersoon := aanwezigen;
ELSE
NEW(temppersoon);
Files.ReadString (bestandLoper, temppersoon^.naam);
Files.ReadInt (bestandLoper, temppersoon^.aantal);
currentpersoon^.next := temppersoon;
currentpersoon := currentpersoon^.next;
END;
Files.ReadString (bestandLoper, tempsoort);
WHILE (tempsoort # "!!") & (~bestandLoper.eof) DO
NEW(tempdrank);
tempdrank^.soort := tempsoort;
Files.ReadInt (bestandLoper, tempdrank^.aantal);
IF (currentpersoon^.drank = NIL) THEN
currentpersoon^.drank := tempdrank;
currentdrank := currentpersoon^.drank;
ELSE
currentdrank^.next := tempdrank;
currentdrank := currentdrank^.next;
END;
Files.ReadString (bestandLoper, tempsoort);
END;
Files.ReadString (bestandLoper, tempsoort);
WHILE (tempsoort # "!!") & (~bestandLoper.eof) DO
NEW(tempdrank);
tempdrank^.soort := tempsoort;
Files.ReadInt (bestandLoper, tempdrank^.aantal);
IF (currentpersoon^.gedronken = NIL) THEN
currentpersoon^.gedronken := tempdrank;
currentdrank := currentpersoon^.gedronken;
ELSE
currentdrank^.next := tempdrank;
currentdrank := currentdrank^.next;
END;
Files.ReadString (bestandLoper, tempsoort);
END;
END;
Files.Close(bestand);
OutExt.String("Het bestand is geladen.");
OutExt.Ln;
ELSE
Error("ERROR (Load): Bestand niet gevonden");
END;
END;
END Load;
BEGIN
Initialize();
OutExt.Open();
END Festival.
Code: Select all
Festival.Tool
(*
Auteur: Nick De Frangh
Date: 23-01-06
*)
Builder.Compile \ws
OutExt.Mod
Festival.Mod
~
Builder.Compile \f*
System.Free
Festival.Mod
OutExt.Mod
~
Festival.Initialize~
Festival.Arrive "Wouter" "Appelsap" 10 "Bessensap" 2 "Citroensap" 1~
Festival.Arrive "Peter" "Passievruchtensap" 3 "Water" 1 "Wijn" 1~
Festival.Arrive "Kurt"~
Festival.Drink~
Festival.Print~
Festival.Drink~
Festival.Pass "Wouter" "Kurt"
Festival.Drink~
Festival.Print~
Festival.Part "Wouter"~
Festival.Part "Kurt"~
Festival.Arrive "Gunther" "Druivensap" 2~
Festival.Drink~
Festival.Print~
Festival.Save "Festival.Sav"~
Festival.Load "Festival.Sav"~
De laatste en degene voor op te slaan en te laden.