[Prog]Wat te maken voor practicum

Forum van 1ste Bachelor Informatica.

Moderator: Praesidium

User avatar
Fristi
WOZ
Posts: 4565

[Prog]Wat te maken voor practicum

Post#1 » Tue Dec 18, 2007 11:45 pm

Hej
In de tuyeaux staat dat we voor het practicumexamen het beste een lijst module maken (OO), die dan afzonderlijk werkt van het type waar me moete werken enzo..

Nu dit is op zich geen probleem, je kan idd als basis de module van Prof Arickx gebruiken.

Nu ik was eens door het forum aant bladeren en kben een paar oplossingen tegengekomen van vorige opdrachten (die in de tuyeaux staan).

Geeneen van de oplossingen die ik heb zien staan was OO

Is het dan wel nuttig om bovenstaande lisjtmodule te maken?

Ale, ik ken mezelf, als ik tijd heb lukken de meeste dingen me wel maar gezien het tegen de tijd is ga ik niet beginnen klooien aan dingen waark ni 100% mee vertrouwd ben dus wss gaak OO laten vallen (ook alst optioneel is voor extra punten, of tmoest echt goe gaan in vakantie, maar das onder zwaar voorbehoud)

Bovenop voorgaande vraag: zijn er zo nog dingen die nuttig zijn om zeker mee te hebben/ te maken?

aan de medeeerstejaars: wa gaat gelle maken / meepakken?

cya
Fris

User avatar
Shinta
WOZ
Posts: 1122

Post#2 » Wed Dec 19, 2007 12:11 am

Hey,

In de oplossingen die wij hebben gemaakt hebben wij inderdaad niet het juiste OO idioom gebruikt. Dit omdat we, zoals jij nu, niet zo vertrouwd waren met hoe alles nu precies moest. Ik zal hier even een oplossing volgens het OO paradigma zetten om te illustreren hoe je bijvoorbeeld een CD-collectie kunt implementeren.

Je hebt een OOList die elementen van het type Node bevatten. In deze lijst kan je: elementen toevoegen op het einde van de lijst of op een bepaalde positie, elementen verwijderen op een bepaalde positie en de lengte van de lijst opvragen.
Test dit goed want dit is je basis en dit kan je allemaal thuis maken.
We hebben echter geen Nodes (die leeg en nutteloos? zijn), maar wel CD's. Daarom maak je een subklasse van de Node (zoals IntNode maar dan met CD's), wat eigenlijk een Node is met datavelden auteur, album, titel, ... . Nu kun je deze CD's net als Nodes toevoegen, verwijderen en opvragen uit je lijst! Zonder je lijst aan te passen. Nu is er echter het probleem dat je bijvoorbeeld geen CD's kunt verwijderen van een bepaalde Artiest met de standaardfunctionaliteit. Nee inderdaad, maar het is wel veel eenvoudiger om dit uit te voeren, om dit bijvoorbeeld te doen voer je het volgende uit (excuseer voor de syntactische fouten, oberon is lang geleden)

Code: Select all

FOR index:= 0 TO (list->length() - 1) DO
CD cdAtPosIndex := (CD)list->getNodeAtPosition(index); (* We casten onze gewone lijstnode naar de subklasse ervan; namelijk CD*)
IF (cdAtPosIndex->getAuthor = "Jimmy Hendrickx") THEN
list->removeNodeAtPosition(index);
index = index - 1; (* Doordat je het element hebt verwijderd moet je 1 positie teruggaan omdat je anders de daaropvolgende node overslaat *)
END
END
Dit is (hoop ik) veel gemakkelijker dan te liggen prutsen met pointers op zo'n korte tijd! En je hebt eeuwen tijd om die lijst klasse fatsoenlijk te maken en zo het bovenstaande voorbeeld vooraf uit te werken.

P.S. Schiet me niet dood als er niets van lijsten gevraagd wordt, kleine kans toe maar toch..
Remember remember the fifth of November
Gunpowder, treason and plot.
I see no reason why gunpowder, treason
Should ever be forgot...

User avatar
Robbe
WOZ
Posts: 2161
Contact:

Post#3 » Wed Dec 19, 2007 12:30 am

het is duidelijk da gij C++ aan het programmeren zijt geweest :P

-> = ^
= = :=
casting gebeurt door var(type) ipv andersom :P

declaratie gaat ni overal


...


maar het opzet was mij alleszins duidelijk :)


(voor de mensen die het niet doorhadden)

Code: Select all

FOR index := 0 TO (list^.length() -1) DO
cdAtPositionIndex := list(CD)^.getNodeAtPosition(index);
IF (cdAtPositionIndex^.getAuthor() = "Jimmy Hendrickx") THEN
list^.removeNodeAtPosition(index);
index := index - 1;
END;
END;
ik betwijfel wel dat de toekenning met een typeguard erin gaat lukken, maar dat is snel getest en eventueel opgelost door de typeguard te gegbruiken bij de IF-test ;)
"I'm not afraid of falling, I'm afraid of landing" -- Sam
How To Ask Questions The Smart Way

Zingen? UKA-n dat ook!

User avatar
Shinta
WOZ
Posts: 1122

Post#4 » Wed Dec 19, 2007 12:39 pm

Ah ja das waar, das me hoedjes :p. Stom ;).
Remember remember the fifth of November
Gunpowder, treason and plot.
I see no reason why gunpowder, treason
Should ever be forgot...

User avatar
Fristi
WOZ
Posts: 4565

Post#5 » Wed Dec 19, 2007 6:07 pm

Hehe, thanks a lot

Kheb gisteren nog is naar Tuyeaux gekeken en er nog is over nagedacht en het lijkt me idd wel wa simpeler te doen met OO dus ik ga er tijd voor maken om dit toch nog probere deftig erin te krigjen, tis nu ni onoverkomelijk :-)

greets Fris

User avatar
Nynek
WOZ
Posts: 1160
Contact:

Re: [Prog]Wat te maken voor practicum

Post#6 » Wed Dec 19, 2007 8:26 pm

Fristi wrote: aan de medeeerstejaars: wa gaat gelle maken / meepakken?

cya
Fris
ik ga die slides en cursus van BB halen,mee op mijne stick zetten,en daarnaast zowat elke Oberonmodule die ik kan vinden ;)

Teun
Posts: 216

Post#7 » Sat Dec 22, 2007 5:37 pm

Tip, zie dat je zeker een lijstmodule hebt die je vlot kan uitbreiden. Die ga je sowieso nodig hebben.

verder vond ik het practicumexamen nu niet echt moeilijk. Wel erg stressvol. Zzeker als je op het laatste nog wat foutjes vindt :?

User avatar
Fristi
WOZ
Posts: 4565

Post#8 » Sun Dec 23, 2007 4:25 pm

Hej
ik ben begonnen met men lijstmodule oo te maken, dit is vrij goed gelukt.
Dan heb ik de opdracht met de CD's uit de tuyeaux eens proberen maken.

Alles lukte min of meer tot op een bepaald ogenblik, ik zit nogal vast.

Kga eerst zo me nuitleg doen, in dien nodig of handiger post ik later men code wel is.

Het zit als volgt:
ik heb 2 records :

Code: Select all


CD = POINTER TO CDinfo;
CDinfo =
RECORD (OOlijstEx.NodeDesc);
groep : ARRAY 35 OF CHAR;
titel : ARRAY 50 OF CHAR;
ID : INTEGER;
tracks : Tracklist;
END;

Tracklist = POINTER TO Trackinfo;
Trackinfo =
RECORD(OOlijstEx.NodeDesc);
naam : ARRAY 50 OF CHAR;
lengte : LONGINT;
END;
Dit omdat de tracks die op een cd staan ook een lijst zijn, ieder nummer is dus een node. Zodoende krijg ik een lijst in een lijst.

Nu is een deel van de opdracht van een specifieke cd de tracklist afdrukken.

Hier knelt het schoentje.

Bij het toevoegen van een element maak ik hier een node van voeg ik dit toe aan de lisjt van cd's en dan per cd maak ik een lijst aan met tracks.

Ik kan men "bovenste" lijst aflopen tot als ik aan de goede cd zit, maar nu moet ik van die cd specifiek de tracklist afdruken maar ik weet niet hoe.

ik heb in men geheugen nog wel de laatste ingelezen tracklist staan maar daar ben ik natuurlijk niets mee, ik moet als het ware dus van lijst veranderen.

Het enige wat ik heb is het element tracks uit node CD dat wijst naar het laatste element van de tracklist op die specifieke cd. Het probleem is dat ik men lijst daar niet kan naar laten wijzen.

Hoop dat ik het een beetje duidelijk genoeg heb uitgelegd
alvast bedankt
Fris

User avatar
Fristi
WOZ
Posts: 4565

Post#9 » Sun Dec 23, 2007 5:03 pm

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;
(*Zoekt naar cd met opgegeven ID en drukt er dan alle tracks van af *)

BEGIN
In.Open;
In.Int(i);

c.ZoekEerste;
test := c.GetHuidige();

IF (test IS CD) THEN
WHILE( test(CD).ID # i) & ( c.code # 3) DO
c.Zoekvolgende();
test := c.GetHuidige();
OutExt.String("Drukken ter controle de node af waar de loop zich bevind");
OutExt.Ln;
test.NodeInfo;
END;
END;

IF (c.code = 3) THEN
OutExt.String("Element met opgegeven ID niet aanwezig");
OutExt.Ln;

END Tracks;




BEGIN
OutExt.Open;
OutExt.Clear;
END CD.
Dit is mss duidelijker, dit is dus men code, alles werkt behalve PROCEDURE Tracks. Ik zit zonder ideeen :(

(noot: c is men lijst van cd's, t men lijst van tracks)

User avatar
filippeesje
Posts: 23

Post#10 » Sun Dec 23, 2007 5:04 pm

Die RECORD(xxx) is toch overerving he (Oberon zit al wat verder :p)

Uwen tracks zou toch gewoon naar het eerste element van uwe lijst moeten wijzen, anders zijt ge al hetgeen ervoor kwam kwijt als ge genen dubbel gelinkte hebt gemaakt?

Als die tracks naar het eerste element in uwe tacklijst wijst dan kunt ge gewoon ne nieuwe pointer maken die naar hetzelfde wijst als uwen tracks (= hoofd van uwe lijst), en die over uwe lijst laten itereren en de nodige info laten afprinten.

User avatar
Fristi
WOZ
Posts: 4565

Post#11 » Sun Dec 23, 2007 5:10 pm

jup das idd Overerving :P

tis nen dubbel gelinkte :P
(ni da het uitmaakt, ik na het evengoe naar men eerste element laten wijzen,)

Nu ik heb da idee ook al gehad ze, gwn heel men lijst laten aflopen en dan per element afdrukken maar dan zat ikmet het volgende dilemma:

ik importeer men lijst module en om die te laten overlopen zou ik de elementen volgende en vorige van men basisrecord moeten exporteren.

Tkan zijn dat ik hir fout ben en in men uitwerking daarnet een fout heb gemaakt, goed mogelijk.

Maar wat da overlopen betreft, da zouk dan moeten doen in men lijstmodule? of gewoon in men CD module ?

nuja, alvast bedankt, kga dan nog wa verder in die richting zoeken :)

Edit:
Probleem opgelost :-)
Het was idd met de lijst af te lopen, khad da al is geprobeerd maar wa foutjes gemaakt, plots zag ik het licht :P

User avatar
Shinta
WOZ
Posts: 1122

Post#12 » Sun Dec 23, 2007 6:13 pm

Je kan dat overlopen simuleren door zo'n for-lus zoals ik in het begin heb uitgelegd he. Je houdt de lengte bij van je lijst en je vraagt dan een element op dat op positie i staat binnen die lijst. Die getNodeAtPosition(i) methode zal dan intern i-1 keer de next pointer volgen, aangenomen dat je vanaf de head begint. Je kunt idd in je TrackList een operatie "gotoNext()" toevoegen dat naar het volgende element gaat.
Remember remember the fifth of November
Gunpowder, treason and plot.
I see no reason why gunpowder, treason
Should ever be forgot...

User avatar
Fristi
WOZ
Posts: 4565

Post#13 » Sun Dec 23, 2007 7:06 pm

ah ja, mja, zo had het idd ook gegaan ja

Ik heb het opgelost door in men lijstmodule een kleine extra procedure te schrijven die telkens de volgende node geeft.

Dus begint bv. met node a , dan geet die procedure a + 1 terug

In men cd module dan met een repeat die procedure opgeroepen en dan elke keer als een node terugkeerde de gegevens afgedrukt.

User avatar
Fristi
WOZ
Posts: 4565

Post#14 » Sun Dec 23, 2007 9:56 pm

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 :P

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 :)

User avatar
ccat
Posts: 29

Post#15 » Thu Dec 27, 2007 4:36 pm

Shinta wrote:Je kan dat overlopen simuleren door zo'n for-lus zoals ik in het begin heb uitgelegd he. Je houdt de lengte bij van je lijst en je vraagt dan een element op dat op positie i staat binnen die lijst. Die getNodeAtPosition(i) methode zal dan intern i-1 keer de next pointer volgen, aangenomen dat je vanaf de head begint. Je kunt idd in je TrackList een operatie "gotoNext()" toevoegen dat naar het volgende element gaat.
mmm~ ja, je kan dat doen maar in principe wordt dat na een tijdje (grote lijsten) redelijk onoptimaal vrees'k omdat je iedere keer i keer - 1 moet doorlopen... en dat is eigenlijk een for lus genest in een andere for lus, iets wat we liever ni als't echt anders kan denk ik hé ;)
Dus ik persoonlijk zou dat wel proberen te vermijden als het kan. Want als je alles kan doen door de lijst één keer af te lopen is dat echt wel veel optimaler dan dat je voor ieder element in je lijst iedere keer je lijst meot aflopen tot dat element. Maar allee... zo belangrijk is het misschien nu niet veronderstel ik maar kom :d
anarchy in the cellophane.
supernintendo girl rules!!!!

Return to “1ste Bachelor”

Who is online

Users browsing this forum: No registered users and 6 guests

cron