Page 1 of 1

[Programmeren] Practica : Velden van records

Posted: Fri Jan 04, 2008 4:21 pm
by Sebastiaan
Ik heb een vraag over het verschil in 2 procedures. Dus ik heb een procedure SearchGetal en SearchString, de ene gaat een node zoeken volgens getal en de ander volgens string veld.

Het enige waar die 2 procedures in verschillen is die voorwaarde.

eerste proc: WHILE (temp(GemengdPointer)^.getal # getal) DO

2e procedure: WHILE (temp(GemengdPointer)^.string # string) DO

Dus het enige wat er verschilt zijn de velden, hoe kan ik dit het beste oplossen?

Alvast Thx

Posted: Fri Jan 04, 2008 4:26 pm
by Pieter Belmans
Moest er zoiets bestaan als een eval() zou het makkelijk zijn (maar ook _über_ranzig).

Wat je eventueel wel zou kunnen doen, is met een ARRAY OF SYSTEM.BYTE (of whatever de naamgeving is voor dat ene type in SYSTEM dat compatibel is met alles) als parameter aan te nemen, dan te kijken welk type de elementen van die array zijn, en vervolgens de juiste zoekmethode toepassen. Nog steeds ranzig weliswaar :P. Ik vrees dat Oberon niet tot iets mooier in staat is...

Re: [Programmeren] Practica : Velden van records

Posted: Fri Jan 04, 2008 4:35 pm
by Robbe
Sebastiaan wrote:Ik heb een vraag over het verschil in 2 procedures. Dus ik heb een procedure SearchGetal en SearchString, de ene gaat een node zoeken volgens getal en de ander volgens string veld.

Het enige waar die 2 procedures in verschillen is die voorwaarde.

eerste proc: WHILE (temp(GemengdPointer)^.getal # getal) DO

2e procedure: WHILE (temp(GemengdPointer)^.string # string) DO

Dus het enige wat er verschilt zijn de velden, hoe kan ik dit het beste oplossen?

Alvast Thx
Copy/paste en de namen veranderen. Gaat het hier om 2 verschillende search-procedures over eenzelfde type object?

Re: [Programmeren] Practica : Velden van records

Posted: Fri Jan 04, 2008 4:41 pm
by Sebastiaan
Robbe wrote:
Sebastiaan wrote:Ik heb een vraag over het verschil in 2 procedures. Dus ik heb een procedure SearchGetal en SearchString, de ene gaat een node zoeken volgens getal en de ander volgens string veld.

Het enige waar die 2 procedures in verschillen is die voorwaarde.

eerste proc: WHILE (temp(GemengdPointer)^.getal # getal) DO

2e procedure: WHILE (temp(GemengdPointer)^.string # string) DO

Dus het enige wat er verschilt zijn de velden, hoe kan ik dit het beste oplossen?

Alvast Thx
Copy/paste en de namen veranderen. Gaat het hier om 2 verschillende search-procedures over eenzelfde type object?
Het object hier is een Lijst met nodes (die een string bevatten en een integer) en nu heb ik voor alletwee de velden een search functie, searchgetal en searchstring, maar aangezien dat dat identieke functies zijn en alleen verschillen in het veld waar op ze zoeken en of het een getal of een string is. Dacht ik dat je dat misschien in een sort functie kon gieten met als extra een argument mee te geven.

Posted: Fri Jan 04, 2008 4:48 pm
by Norfolk
kan je geen functie meegeven die een boolean weergeeft. Zo kan je aan de functie die de while bevat, een functie (laten we die even a() noemen) meegeven die de conditie van de while speelt. Aan a() geef je dan de node mee. Zo kan je in de body van a() checken op datgene je wilt :)

Posted: Fri Jan 04, 2008 5:37 pm
by cG`
En waarom zou je de ene keer willen zoeken op een string en de andere keer op een getal?
Anyhow om het enigzins noobish op te lossen:

PROCEDURE (lijst: LIST) Search(keyInt: INTEGER; keyStr: ARRAY OF CHAR);

Indien je wilt zoeken op nummer geef je voor key_str "" mee (als dit kan in Oberon ben niet 100% zeker is even geleden :)) Indien je wil zoeken op string geef je als key_int bv -1 mee. Dan kan je natuurlijk niet op -1 zoeken, als je dat nog eens wil oplossen:

PROCEDURE (lijst: LIST) Search(keyInt: INTEGER; keyStr: ARRAY OF CHAR; zoekType: INTEGER);

als zoekType = 1 -> zoeken op int
als zoekType = 2 -> zoeken op string

Posted: Fri Jan 04, 2008 5:42 pm
by Robbe
cG` wrote:En waarom zou je de ene keer willen zoeken op een string en de andere keer op een getal?
Anyhow om het enigzins noobish op te lossen:

PROCEDURE (lijst: LIST) Search(keyInt: INTEGER; keyStr: ARRAY OF CHAR);

Indien je wilt zoeken op nummer geef je voor key_str "" mee (als dit kan in Oberon ben niet 100% zeker is even geleden :)) Indien je wil zoeken op string geef je als key_int bv -1 mee. Dan kan je natuurlijk niet op -1 zoeken, als je dat nog eens wil oplossen:

PROCEDURE (lijst: LIST) Search(keyInt: INTEGER; keyStr: ARRAY OF CHAR; zoekType: INTEGER);

als zoekType = 1 -> zoeken op int
als zoekType = 2 -> zoeken op string
\
ik zou van zoekType een SET maken, dan kan je eventueel nog op beide zoeken ;) (zelfde string, verschillende key)

Posted: Fri Jan 04, 2008 5:43 pm
by cG`
of dat zou zoekType = 3 kunnen zijn :D

Posted: Fri Jan 04, 2008 5:48 pm
by racekakje
Ik zou gewoon twee aparte procedures maken..

Maar je zou evt het volgende doen:

TYPE
Same = PROCEDURE (n: NodePointer; i : INTEGER; s : String) : BOOLEAN

PROCEDURE intSearch (n: NodePointer; i : INTEGER; s: String) : BOOLEAN
IF n^.int = i THEN
RETURN TRUE
ELSE
RETURN FALSE

PROCEDURE stringSearch (n: NodePointer; i: INTEGER; s: String) : BOOLEAN
IF n^.string = s THEN
RETURN TRUE
ELSE
RETURN FALSE


PROCEDURE Search (S : Search; n : NodePointer; i: INTEGER; s:String)
WHILE S(n,i,s) DO
...


En als ge dan "racekakje" wil zoeken,
dan doede gewoon Search(stringSearch, n, 0(maakt eigenlijk niet uit welk getal hier staat, alst maar nen integer is), racekakje).

Posted: Fri Jan 04, 2008 5:53 pm
by cG`
Mijn eerste idee was ook om een proceduretype te gebruiken, maar dat gaat denk ik niet aangezien de 2 zoekprocedures verschillende parameters hebben.

Posted: Fri Jan 04, 2008 5:56 pm
by racekakje
Ik weetet, maar daarom dat jij bij stringSearch ook een integer moet meegeven, alhoewel die niet gebruikt wordt..
idem voor intSearch

Posted: Fri Jan 04, 2008 6:10 pm
by Norfolk
cG` wrote:Mijn eerste idee was ook om een proceduretype te gebruiken, maar dat gaat denk ik niet aangezien de 2 zoekprocedures verschillende parameters hebben.
Je kan een klasse maken die zowel een integer kan opslaan als een string. Ipv dat je

TYPE
Same = PROCEDURE (n: NodePointer; i : INTEGER; s : String) : BOOLEAN

Kan je dan

TYPE
Same = PROCEDURE (n: NodePointer; crit : SearchCriteria) : BOOLEAN

met SearchCriteria een klasse die dus zowel een string als een integer kan bijhouden. Je kan daar dan 6 procedures in maken: setString, getString, setInteger, getInteger, isInteger, isString. De twee laatste laten je toe om te controleren of nu de integer of de string gezet is ;)

Posted: Sat Jan 05, 2008 8:40 pm
by joeri
Het is overkill als je het voor de rest niet gaat gebruiken, maar wat je ook kan doen is een object meegeven waar je de conditie mee bepaalt, je while loop ziet er dan ongeveer zo uit:

Code: Select all

WHILE (condition.IsTrue(GemengdPointer)) DO 
Dat object condition is dan van een klasse met procedure IsTrue(node: Node) (ik neem toch aan dat GemengdPointer van een type zoals Node is), daar kun je dan aan inheritance doen om allerlei mogelijke condities te implementeren.

Nadeel: Veel werk, weinig opbrengst als het maar dient om 2 functies samen te brengen
Voordeel: Je kan allerlei condities implementeren, zoals even getallen vinden, of priemgetallen. Je kan die klassen eventueel ook hergebruiken.

In programmeertalen die blocks of closures hebben, is het zeer simpel om nieuwe condities te bedenken, zonder daarvoor iedere keer een andere klasse te moeten implementeren, in Oberon is dat denk ik niet mogelijk.