Thread View: be.comp.programming
9 messages
9 total messages
Started by TRAX
Tue, 13 May 2003 18:41
een algoritme...
Author: TRAX
Date: Tue, 13 May 2003 18:41
Date: Tue, 13 May 2003 18:41
38 lines
2549 bytes
2549 bytes
sorry, sorry ik weet het, ik post nogal veel met vraag om hulp maar ik zit
er hier al twe uur op te zoeken, met breakpoints en alles en ik vind het
niet :(
de code:
for (int i=0; i<zijde; i++){
for (int j=0; i<zijde; j++){
getal=random(19);
if (controletabel[getal]>=2){
do{
getal=random(19);
}
while(controletabel[getal]>=2);
controletabel[getal]++;}
else{
controletabel[getal]++;
};
tabel[i][j]=getal;
};
};
het gaat om een tweedimensionale tabel, elk cel mag random een getal krijgen
tussen 0 en 18. Die getallen mogen twee keer gebruikt worden, daarom hou ik
een controletabel (alle elementen zijn initieel 0) bij die de cel van die
controletabel met het gekozen getal als index opvult. Als de waarde van die
controlecel groter is dan twee moet hij blijven randomizen tot hij een ander
getal genomen heeft.
Het probleem is: soms komen er in de controletabel waarden voor die groter
zijn dan 2 (mag dus niet), soms vult hij het verkeerde element van de
controleindex op
ziet iemand de fout. Wat mij ook opgevallen is tijdens het debuggen: de
eerste keer dat hij een getal random kiest, wordt de controletabel niet
opgevuld, dus kiest hij bijvoorbeeld 1, dan blijft controletabel[getal] dus
controletabel[1] op 0 staan.
het kan ook zijn dat iemand een beter algoritme heeft voor het probleem,
indien zo, zeg het maar.
--
stijn.verspeet@pandora[delete.this].be
Re: een algoritme...
Author: KLinZ
Date: Tue, 13 May 2003 19:41
Date: Tue, 13 May 2003 19:41
50 lines
2969 bytes
2969 bytes
TRAX wrote:
> sorry, sorry ik weet het, ik post nogal veel met vraag om hulp maar
> ik zit er hier al twe uur op te zoeken, met breakpoints en alles en
> ik vind het niet :(
> de code:
>
> for (int i=0; i<zijde; i++){
> for (int j=0; i<zijde; j++){
> getal=random(19);
> if (controletabel[getal]>=2){
> do{
> getal=random(19);
> }
> while(controletabel[getal]>=2);
> controletabel[getal]++;}
> else{
> controletabel[getal]++;
> };
> tabel[i][j]=getal;
> };
> };
>
Bedoel je niet? (fixed font)
for (int i=0; i<zijde; i++){
for (int j=0; j<zijde; j++){
^
> het gaat om een tweedimensionale tabel, elk cel mag random een getal
> krijgen tussen 0 en 18. Die getallen mogen twee keer gebruikt worden,
> daarom hou ik een controletabel (alle elementen zijn initieel 0) bij
> die de cel van die controletabel met het gekozen getal als index
> opvult. Als de waarde van die controlecel groter is dan twee moet hij
> blijven randomizen tot hij een ander getal genomen heeft.
> Het probleem is: soms komen er in de controletabel waarden voor die
> groter zijn dan 2 (mag dus niet), soms vult hij het verkeerde element
> van de controleindex op
> ziet iemand de fout. Wat mij ook opgevallen is tijdens het debuggen:
> de eerste keer dat hij een getal random kiest, wordt de controletabel
> niet opgevuld, dus kiest hij bijvoorbeeld 1, dan blijft
> controletabel[getal] dus controletabel[1] op 0 staan.
> het kan ook zijn dat iemand een beter algoritme heeft voor het
> probleem, indien zo, zeg het maar.
Een sneller algorithme is het array vullen met waarden van 0..18 (2 keer) en
deze dan random husselen.
--
www.zenobits.com
Re: een algoritme...
Author: TRAX
Date: Tue, 13 May 2003 20:10
Date: Tue, 13 May 2003 20:10
23 lines
1745 bytes
1745 bytes
Die fout had ik inderdaad gezien, ik heb er wat aan verder geprutst en nu
werkt het bijna:
for (int i=0; i<zijde; i++){
cout<<endl;
for(int j=0; j<zijde; j++){
getal=random(18);
if (controletabel[getal]==2){
while(controletabel[getal]==2)
getal=random(18);
controletabel[getal]++;
}
else
{controletabel[getal]++;}
tabel[i][j]=getal;
cout<<tabel[i][j]<<" ";
};
};
Het enige foutje dat er nog inzit is dat ik steeds bij elke run dezelfde
tabel krijg, helemaal niet random dus.
Re: een algoritme...
Author: TRAX
Date: Tue, 13 May 2003 20:15
Date: Tue, 13 May 2003 20:15
4 lines
1382 bytes
1382 bytes
al gevonden, never mind. Ik moest gewoon nog even randomize() voor de twee for lusjes zetten. toch bedankt!
Re: een algoritme...
Author: bomberboy
Date: Tue, 13 May 2003 20:15
Date: Tue, 13 May 2003 20:15
19 lines
1807 bytes
1807 bytes
TRAX schreef: > getal=random(18); [rest v/d code] > Het enige foutje dat er nog inzit is dat ik steeds bij elke run dezelfde > tabel krijg, helemaal niet random dus. Hoe werkt de random-functie die je gebruikt? Vaak is het argument bij een random-functie immers de seed. En aangezien je hier telkens hetzelfde resultaat uitkomt... Als je telkens dezelfde seed meegeeft kom je natuurlijk telkens hetzelfde resultaat uit. -- Bruno By trying, we can easily learn to endure adversity -- another man's, I mean. -- Mark Twain
Re: een algoritme...
Author: TRAX
Date: Tue, 13 May 2003 21:25
Date: Tue, 13 May 2003 21:25
19 lines
1900 bytes
1900 bytes
"bomberboy" <newsbomber@pandora.be> schreef in bericht news:pan.2003.05.13.20.15.27.481865@bomberboy.tk... > TRAX schreef: > > > > getal=random(18); > [rest v/d code] > > > Het enige foutje dat er nog inzit is dat ik steeds bij elke run dezelfde > > tabel krijg, helemaal niet random dus. > > Hoe werkt de random-functie die je gebruikt? > Vaak is het argument bij een random-functie immers de seed. En aangezien > je hier telkens hetzelfde resultaat uitkomt... Als je telkens dezelfde > seed meegeeft kom je natuurlijk telkens hetzelfde resultaat uit. > dunno, is standaard library functie
Re: een algoritme...
Author: Roel Schroeven
Date: Tue, 13 May 2003 22:01
Date: Tue, 13 May 2003 22:01
49 lines
2815 bytes
2815 bytes
TRAX wrote:
> sorry, sorry ik weet het, ik post nogal veel met vraag om hulp maar ik zit
> er hier al twe uur op te zoeken, met breakpoints en alles en ik vind het
> niet :(
> de code:
>
> for (int i=0; i<zijde; i++){
> for (int j=0; i<zijde; j++){
> getal=random(19);
> if (controletabel[getal]>=2){
> do{
> getal=random(19);
> }
> while(controletabel[getal]>=2);
> controletabel[getal]++;}
> else{
> controletabel[getal]++;
> };
> tabel[i][j]=getal;
> };
> };
Naast de opmerkingen van KLinZ: je kan die code wat simpeler schrijven,
waardoor ze overzichtelijker wordt (toch zeker in mijn ogen):
for (int i=0; i<zijde; i++) {
for (int j=0; j<zijde; j++) {
do {
getal=random(19);
} while (controletabel[getal] >= 2);
controletabel[getal]++;
tabel[i][j]=getal;
}
}
De while van een do ... while wordt dikwijls op dezelfde regel gezet als
de }, omdat do ... while veel minder voorkomt dan een gewone while; op
die manier is in een oogopslag gemakkelijker te zien dat de while bij de
lus er voor hoort.
De waarde in de controletabel ophogen deed je in beide takken van het
if-statement; als het toch in alle gevallen gebeurt, kan je het beter
buiten de if zetten.
En tenslotte, na een '}' die dient om een compound statement af te
sluiten moet je geen ';' zetten.
--
"Codito ergo sum"
Roel Schroeven
http://roelschroeven.net
Re: een algoritme...
Author: TRAX
Date: Wed, 14 May 2003 06:04
Date: Wed, 14 May 2003 06:04
71 lines
3774 bytes
3774 bytes
Roel Schroeven wrote:
> TRAX wrote:
>> sorry, sorry ik weet het, ik post nogal veel met vraag om hulp maar
>> ik zit er hier al twe uur op te zoeken, met breakpoints en alles en
>> ik vind het niet :(
>> de code:
>>
>> for (int i=0; i<zijde; i++){
>> for (int j=0; i<zijde; j++){
>> getal=random(19);
>> if (controletabel[getal]>=2){
>> do{
>> getal=random(19);
>> }
>> while(controletabel[getal]>=2);
>> controletabel[getal]++;}
>> else{
>> controletabel[getal]++;
>> };
>> tabel[i][j]=getal;
>> };
>> };
>
> Naast de opmerkingen van KLinZ: je kan die code wat simpeler
> schrijven, waardoor ze overzichtelijker wordt (toch zeker in mijn
> ogen):
>
> for (int i=0; i<zijde; i++) {
> for (int j=0; j<zijde; j++) {
> do {
> getal=random(19);
> } while (controletabel[getal] >= 2);
> controletabel[getal]++;
> tabel[i][j]=getal;
> }
> }
>
> De while van een do ... while wordt dikwijls op dezelfde regel gezet
> als
> de }, omdat do ... while veel minder voorkomt dan een gewone while; op
> die manier is in een oogopslag gemakkelijker te zien dat de while bij
> de lus er voor hoort.
> De waarde in de controletabel ophogen deed je in beide takken van het
> if-statement; als het toch in alle gevallen gebeurt, kan je het beter
> buiten de if zetten.
> En tenslotte, na een '}' die dient om een compound statement af te
> sluiten moet je geen ';' zetten.
Bedankt! Ziet er inderdaad frisser uit en werkt even goed. Nog een klein
vraagje waarvoor ik geen thread wil starten: Ik wil in mijn GUI een tabel
van TImages maken, en die displayen lukt perfect. Maar blijkbaar kan ik die
niet in een tweedimensionale tabel opslaan:
TImage *pictabel;
pictabel = new TImage[2, 4];
Daarom geeft hij de compliler error E2248 Die ik efkes opgezocht heb: E2248
Cannot find default constructor to initialize array element of type 'class'
Compiler error
When declaring an array of a class that has constructors, you must either
explicitly initialize every element of the array, or the class must have a
default constructor.
The compiler will define a default constructor for a class unless you have
defined any constructors for the class.
Wat wil dat allemaal zeggen? bestaat er geen default constructor in de
klasse TImage die een tweedimensionale array kan maken voor mij? Moet ik het
anders doen? Staat mijn declarartie verkeerd? (in een event handler, en
t'zou er ook moeten blijven staan, aangezien de grootte van de tabel kan
veranderen)
Re: een algoritme...
Author: Roel Schroeven
Date: Wed, 14 May 2003 07:37
Date: Wed, 14 May 2003 07:37
85 lines
4273 bytes
4273 bytes
TRAX wrote:
> Roel Schroeven wrote:
>
>>TRAX wrote:
>>
>>>sorry, sorry ik weet het, ik post nogal veel met vraag om hulp maar
>>>ik zit er hier al twe uur op te zoeken, met breakpoints en alles en
>>>ik vind het niet :(
>>>de code:
>>>
>>>for (int i=0; i<zijde; i++){
>>> for (int j=0; i<zijde; j++){
>>> getal=random(19);
>>> if (controletabel[getal]>=2){
>>> do{
>>> getal=random(19);
>>> }
>>> while(controletabel[getal]>=2);
>>> controletabel[getal]++;}
>>> else{
>>> controletabel[getal]++;
>>> };
>>> tabel[i][j]=getal;
>>> };
>>>};
>>
>>Naast de opmerkingen van KLinZ: je kan die code wat simpeler
>>schrijven, waardoor ze overzichtelijker wordt (toch zeker in mijn
>>ogen):
>>
>>for (int i=0; i<zijde; i++) {
>> for (int j=0; j<zijde; j++) {
>> do {
>> getal=random(19);
>> } while (controletabel[getal] >= 2);
>> controletabel[getal]++;
>> tabel[i][j]=getal;
>> }
>>}
>>
>>De while van een do ... while wordt dikwijls op dezelfde regel gezet
>>als
>>de }, omdat do ... while veel minder voorkomt dan een gewone while; op
>>die manier is in een oogopslag gemakkelijker te zien dat de while bij
>>de lus er voor hoort.
>>De waarde in de controletabel ophogen deed je in beide takken van het
>>if-statement; als het toch in alle gevallen gebeurt, kan je het beter
>>buiten de if zetten.
>>En tenslotte, na een '}' die dient om een compound statement af te
>>sluiten moet je geen ';' zetten.
>
>
> Bedankt! Ziet er inderdaad frisser uit en werkt even goed. Nog een klein
> vraagje waarvoor ik geen thread wil starten: Ik wil in mijn GUI een tabel
> van TImages maken, en die displayen lukt perfect. Maar blijkbaar kan ik die
> niet in een tweedimensionale tabel opslaan:
> TImage *pictabel;
> pictabel = new TImage[2, 4];
>
> Daarom geeft hij de compliler error E2248 Die ik efkes opgezocht heb: E2248
> Cannot find default constructor to initialize array element of type 'class'
> Compiler error
> When declaring an array of a class that has constructors, you must either
> explicitly initialize every element of the array, or the class must have a
> default constructor.
>
> The compiler will define a default constructor for a class unless you have
> defined any constructors for the class.
> Wat wil dat allemaal zeggen? bestaat er geen default constructor in de
> klasse TImage die een tweedimensionale array kan maken voor mij? Moet ik het
> anders doen? Staat mijn declarartie verkeerd? (in een event handler, en
> t'zou er ook moeten blijven staan, aangezien de grootte van de tabel kan
> veranderen)
Volgens de documentatie ziet de constructor van TImage er zo uit:
__fastcall virtual TImage(Classes::TComponent* AOwner);
Je moet dus elk element apart aanmaken, en de owner (= de form waarop de
image komt te staan) meegeven.
--
"Codito ergo sum"
Roel Schroeven
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads