[Programmeren] Practica : Velden van records

Forum van 1ste Bachelor Informatica.

Moderator: Praesidium

User avatar
Sebastiaan
Posts: 1184

[Programmeren] Practica : Velden van records

Post#1 » Fri Jan 04, 2008 4:21 pm

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

Pieter Belmans
Posts: 593
Contact:

Post#2 » Fri Jan 04, 2008 4:26 pm

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...

User avatar
Robbe
WOZ
Posts: 2161
Contact:

Re: [Programmeren] Practica : Velden van records

Post#3 » Fri Jan 04, 2008 4:35 pm

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?
"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
Sebastiaan
Posts: 1184

Re: [Programmeren] Practica : Velden van records

Post#4 » Fri Jan 04, 2008 4:41 pm

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.

User avatar
Norfolk
WOZ
Posts: 780
Contact:

Post#5 » Fri Jan 04, 2008 4:48 pm

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

User avatar
cG`
Posts: 75

Post#6 » Fri Jan 04, 2008 5:37 pm

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
[i]"Everything should be made as simple as possible, but not simpler."[/i] - Albert Einstein

User avatar
Robbe
WOZ
Posts: 2161
Contact:

Post#7 » Fri Jan 04, 2008 5:42 pm

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)
"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
cG`
Posts: 75

Post#8 » Fri Jan 04, 2008 5:43 pm

of dat zou zoekType = 3 kunnen zijn :D
[i]"Everything should be made as simple as possible, but not simpler."[/i] - Albert Einstein

User avatar
racekakje
WOZ
Posts: 740

Post#9 » Fri Jan 04, 2008 5:48 pm

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

User avatar
cG`
Posts: 75

Post#10 » Fri Jan 04, 2008 5:53 pm

Mijn eerste idee was ook om een proceduretype te gebruiken, maar dat gaat denk ik niet aangezien de 2 zoekprocedures verschillende parameters hebben.
[i]"Everything should be made as simple as possible, but not simpler."[/i] - Albert Einstein

User avatar
racekakje
WOZ
Posts: 740

Post#11 » Fri Jan 04, 2008 5:56 pm

Ik weetet, maar daarom dat jij bij stringSearch ook een integer moet meegeven, alhoewel die niet gebruikt wordt..
idem voor intSearch

User avatar
Norfolk
WOZ
Posts: 780
Contact:

Post#12 » Fri Jan 04, 2008 6:10 pm

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

joeri
Posts: 41

Post#13 » Sat Jan 05, 2008 8:40 pm

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.

Return to “1ste Bachelor”

Who is online

Users browsing this forum: No registered users and 6 guests