Het is dus gelukt, het is af
(op nen trap of 2 na in specifieke situaties die op te lossen zijn door nen If of 2, maar kheb nu geen zin om te zoeken, ik kan men tijd nuttiger besteden
)
De code komt nog wel opt forum, tzou stom zijn om ze niet te delen.
Ik ga me nu bezighouden met een andere opdracht maar er viel me iets op.
Bij praktisch elke opdracht staat voor ongeveer 2 bonuspunten als extra opdracht je output sorteren. (Je lijst sorteren dus).
Ik ga dit proberen moest ik echt nog veel tijd over hebben (maar tis twijfelachtig), iemand hier tips voor? of dingen die handig zijn om weten?
Greets
Fris
Bedankt al voor alle hulp
(PS: Moest er iemand zich geroepen voelen omda te maken, desnoods gwn verderwerken me mijn code, be my guest :p)
dan stuurk men lijstmodule desnoods ook nog wel door, maar kneem hier nu al enorm veel plaats in door die code
Code: Select all
MODULE CD;
IMPORT
OutExt, OOlijstEx, In;
TYPE
CD = POINTER TO CDinfo; (*Dit record stelt een lege cd voor, tracks wijst anar een lsijt van nummers, deze is voor iedere cd anders *)
CDinfo =
RECORD (OOlijstEx.NodeDesc);
groep : ARRAY 35 OF CHAR;
titel : ARRAY 50 OF CHAR;
ID : INTEGER;
tracks : Tracklist;
END;
Tracklist = POINTER TO Trackinfo; (*Tracklist, letterlijk een lijst van nummers, ieder nummer is een node in de lijst*)
Trackinfo =
RECORD(OOlijstEx.NodeDesc);
naam : String;
lengte : LONGINT;
END;
String = ARRAY 50 OF CHAR;
VAR
c,t : OOlijstEx.Lijst;
n, test: OOlijstEx.Node;
cd : CD;
track : Tracklist;
id: INTEGER;
PROCEDURE Start*();
BEGIN
NEW(c);
c.Initialiseer;
OutExt.String("De lijst is geinitialiseerd.");
OutExt.Ln;
id := 1;
END Start;
PROCEDURE Add*();
(*Voegt een CD toe aan de lijst van cd's :
Leest de gegevens van de cd in, maakt dan een nieuwe tracklijst aan, voegt per titel en lengte een node toe aan deze lisjt
*)
VAR
tnaam : String;
tlengte : LONGINT;
BEGIN
In.Open;
NEW(cd);
In.String(cd.groep);
OutExt.String("groep ingelezen");
OutExt.Ln;
In.String(cd.titel);
OutExt.String("cdtitel ingelezen");
OutExt.Ln;
OutExt.String(cd.titel);
OutExt.String(" van ");
OutExt.String(cd.groep);
OutExt.Ln;
cd.ID := id;
NEW(t);
t.Initialiseer;
REPEAT
In.String(tnaam);
In.LongInt(tlengte);
IF (In.Done) THEN
NEW(track);
track.naam := tnaam;
track.lengte := tlengte;
t.VoegToeAchter(track);
END;
UNTIL ~In.Done;
c.VoegToeAchter(cd);
INC(id);
cd.tracks := track;
END Add;
PROCEDURE (n : CD) NodeInfo();
BEGIN
OutExt.String("CD Titel: ");
OutExt.String(n.titel);
OutExt.String(" Met ID: ");
OutExt.Int(n.ID, 0);
OutExt.Ln;
END NodeInfo;
PROCEDURE (n: Tracklist) NodeInfo();
BEGIN
OutExt.String("Titel: ");
OutExt.String(n.naam);
OutExt.String(" en duurt ");
OutExt.Int(n.lengte,0);
OutExt.String(" Seconden");
OutExt.Ln;
END NodeInfo;
PROCEDURE PrintNode(n : OOlijstEx.Node);
BEGIN
n.NodeInfo();
END PrintNode;
PROCEDURE List*();
(*Drukt een ijst van alle opgegeven cd's met hun respectievelijke ID's af *)
BEGIN
OutExt.String("Druk lijst met CD's af: ");
OutExt.Ln;
OutExt.String("--------------------------------------");
OutExt.Ln;
c.SomOp(PrintNode);
OutExt.String("--------------------------------------");
OutExt.Ln;
END List;
PROCEDURE Tracks*();
VAR
i : INTEGER;
temp : OOlijstEx.Node;
(*Zoekt naar cd met opgegeven ID en drukt er dan alle tracks van af *)
BEGIN
In.Open;
REPEAT
In.Int(i);
IF In.Done THEN
c.ZoekEerste;
test := c.GetHuidige();
IF (test IS CD) THEN
WHILE( test(CD).ID # i) & ( c.code # 3) DO
c.Zoekvolgende();
test := c.GetHuidige();
END;
END;
IF (c.code = 3) THEN
OutExt.String("Element met opgegeven ID niet aanwezig");
OutExt.Ln;
END;
temp := test(CD).tracks;
OutExt.String("Tracks aanwezig op cd ");
OutExt.String(test(CD).titel);
OutExt.Ln;
OutExt.String("Titel: ");
OutExt.String(test(CD).tracks.naam);
OutExt.String(" met lengte: ");
OutExt.Int(temp(Tracklist).lengte, 0);
OutExt.Ln;
REPEAT
temp := temp.OverloopNodesAV();
IF (temp # NIL) THEN
IF temp IS Tracklist THEN
OutExt.String("Titel: ");
OutExt.String(temp(Tracklist).naam);
OutExt.String(" met lengte: ");
OutExt.Int(temp(Tracklist).lengte, 0);
OutExt.Ln;
END;
END;
UNTIL temp = NIL;
END;
UNTIL ~In.Done;
END Tracks;
PROCEDURE VerwijderID*();
VAR
n : OOlijstEx.Node;
i : INTEGER;
BEGIN
In.Open;
REPEAT
In.Int(i);
IF In.Done THEN
c.ZoekEerste;
n := c.GetHuidige();
IF (n IS CD) THEN
WHILE( n(CD).ID # i) & ( c.code # 3) DO
c.Zoekvolgende();
n := c.GetHuidige();
END;
END;
IF (c.code = 3) THEN
OutExt.String("Element met opgegeven id niet aanwezig");
OutExt.Ln;
END;
IF c.code = 0 THEN
c.Verwijder;
END;
END;
UNTIL ~In.Done;
END VerwijderID;
PROCEDURE VerwijderArtiest*();
VAR
n: OOlijstEx.Node;
s : String;
BEGIN
In.Open;
REPEAT
In.String(s);
IF In.Done THEN
c.ZoekEerste;
n := c.GetHuidige();
IF (n IS CD )THEN
WHILE( n(CD).groep # s) & (c.code # 3) DO
c.Zoekvolgende;
n := c.GetHuidige();
END;
END;
IF (c.code = 3) THEN
OutExt.String("Element met opgegeven id niet aanwezig");
OutExt.Ln;
END;
OutExt.String("Element gevonden in de ljst van cd's");
OutExt.Ln;
IF (c.code = 0) THEN
c.Verwijder;
END;
END;
UNTIL ~In.Done;
END VerwijderArtiest;
BEGIN
OutExt.Open;
OutExt.Clear;
END CD.
De lijstmodule is quasi identiek aan die van Arickx, enkel beetje vernederlandst en 1 procedure extra om nodes via hunne pointer van achter naar voor te kunne aflopen. (nodig voor men Procedure Tracks)
moest iemand er vragen over hebben, val maar lastig