Pascal-ban szeretnék olyan algoritmust írni, ami véletlenszámokat generál és eltárolja egy tömbben, de ha a tömbben szerepel az adott szám, többet nem kerül bele, csak egyszer. Mi az alábbi megoldás hibája? (bővebben lent)
Tehát adott egy 0-10-ig terjedő intervallum és egy tömbben szeretnék véletlenszámokat generálni olyan módon, hogy a 0-10-ig eső számok mind belekerüljenek, de minden szám csak egyszer...
Az alábbi program valamilyen - általam ismeretlen okokból - ezt nem teljesíti.
Fura módon csak a legeslegelső szám van a tömbben és a végén amikor kiírja, a többi érték csupa nulla...
Mi a hiba?
uses crt;
var
tomb:array[0..10] of byte;
i,j,szam:byte;
l:boolean;
begin
randomize;
szam:=random(10);
tomb[0]:=szam;
i:=1;
repeat
szam:=random(10);
l:=false;
j:=0;
repeat
if tomb[j]=szam then l:=true;
inc(j);
until(j=10) or(l=true);
if l=false then
begin
tomb[i]:=szam;
inc(i);
end
else szam:=random(10);
until(l=true);
for i:=0 to 10 do
begin
writeln(tomb[i]);
end;
readln;
end.
Több hiba is van.
- 11 elemű a tömböd, a random(10) viszont 0 és 9 közötti számokat fog visszaadni (10 különböző érték)
- teljesen rossz a külső ciklus kilépési feltétele (nem tudom, hogy megmondjam-e a megoldást, vagy hagyjam, hogy gondolkozz rajta...:)
egyéb megjegyzések:
- ha már egy ciklusban végigmész a tömbön a feltöltésnél, ki is irathatnád benne ;)
- a lineáris keresést szebb lenne egy külön függvénybe bedobni, nem túl szép itt a ciklus belsejében egy másik ciklus.
- ilyen "beszédes" változónevekért nekem a kezemre csapott volna a tanárom anno...még a ciklusváltozók hagyján, de mi az az "l"?
- ha a cél egy 10 elemű tömb, amiben a számok véletlenszerűen vannak elhelyezve, akkor a fentinél sokkal hatékonyabb lenne először sorrendben feltölteni, majd egy ciklussal megkavarni a sorrendet, mert így a keresés miatt igen sokszor mászol végig a tömbödön...
- ha logikai értékre hivatkozol, akkor nem kell kiírni, hogy "unil l=true" vagy "l=false", elegánsabb és érthetőbb annyit írni, hogy "until l" vagy "until not l".
A külső ciklus kilépési feltétele garantáltan rossz, i=10 (vagy 11?) kéne, hogy legyen. A belső ciklusban pedig j=10 helyett j=i. Lehet, hogy van még más is, nem teszteltem.
A feladatnak egyébként lényegesen egyszerűbb implementációja, ha beleteszed a tömbbe a számokat sorban, majd mondjuk tízszer (több elemnél többször) kiválasztasz két véletlenszerű elemet és felcseréled őket.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!