Kezdőoldal » Számítástechnika » Programozás » Pascal-ban szeretnék olyan...

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)

Figyelt kérdés

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.



2014. máj. 10. 19:12
 1/3 anonim ***** válasza:

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

2014. máj. 10. 19:42
Hasznos számodra ez a válasz?
 2/3 zsomkovacs ***** válasza:

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.

2014. máj. 10. 19:43
Hasznos számodra ez a válasz?
 3/3 anonim ***** válasza:
lottó programra keress, 10000x itt van a gyik-en
2014. máj. 10. 19:43
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!