Tudna segíteni valaki?
Pascalban íródott lottószám generátorról van szó.
Forráskódja:
PROGRAM lottoszamok;
USES Crt;
CONST MAX=7; {A T t”mb maxim lis elemsz ma.}
VAR szam, meddig, me, n : byte;
i, j, k : byte; {Ciklusv ltoz˘k.}
T : array[1..MAX] of byte; {Gener lt sz mokat t rol˘ t”mb (soronk‚nt Łjraˇrja a t”mb elemeit).}
BEGIN
ClrScr; {K‚perny‹t”rl‚s.}
RANDOMIZE; {V‚letlensz m-gener l s el‹k‚szˇt‚se.}
Writeln('Melyik lottoval szeretne jatszani: '); Readln(me); {Lott˘ fajt j nak bek‚r‚se.}
While (me<5) OR (me>7) DO {Kapott ‚rt‚k vizsg lata.}
Begin
Write('Rossz adat, kerem ujra: '); Readln(me); {Hib s adat eset‚n Łjra bek‚r‚s.}
End;
CASE me OF {Helyes adat eset‚n vizsg lat, ‚s a gener land˘ sz mok intervallum nak be llˇt sa minden esetben.}
5: meddig:=90;
6: meddig:=45;
7: meddig:=35;
End;
Writeln('H ny szelvenyt jatszol: '); Readln(n); {Szelv‚nyek sz m nak megad sa, nincs megadott maximum.}
Write('Lotto szamok: '); Writeln;
FOR i:=1 TO n DO
Begin
FOR j:=1 TO me DO
Begin
szam:=Random(meddig)+1; {Sz m v ltoz˘ban a gener lt ‚rt‚k elt rol sa.}
FOR k:=1 TO j DO {T t”mb tj r sa egyez‚st keresve.}
Begin
IF (T[k]<>szam) THEN T[k]:=szam {K‚t azonos elem eset‚n (egy szelv‚nyen bell) Łjrakezd‚s, az ‚rt‚ket nem t roljuk.}
ELSE continue;
End;
Write(T[j]:4); {Szelv‚ny elemeinek kiˇr sa egym s ut n.}
End;
Writeln; {Kocsivissza minden szelv‚ny ut n.}
End;
Writeln('Nyomjon egy gombot a bez r shoz...');
ReadKey; {Gombnyom sra v r s, azt n bez r s.}
END.
A kommentből szerintem világosan kiderül, hogy mit csinálna, de valami szemantikai hiba miatt mégsem szűri ki a soronkénti ( /szelvényenkénti ) ismétlődést.
Előre is köszönöm a segítséget!















Na jó, beszéljünk inkább másról. Átírtam Kérdező programjának problémás részletét, hogy a képernyőn is követni lehessen, mit csinál valójában a tömbjével. Most minden szám húzásakor megjeleníti a tömb egész tartalmát, egy-egy szelvény tippjei pedig a sorok végére eső oszlopban jelennek meg.
Előzetes megjegyzéseim:
Szerintem nem csak illetlenség, hogyha nem inicializáljuk a tömböt szelvényenként, hanem az előző szelvényből benne maradt hulladékszámok is befolyásolnák a valószínűséget (már amennyiben működne a program), ezért igenis minden szelvény kezdetén nullázom a tömböt, de ez a sor akár ki is kommentezhető.
Most arról, hogy miért működésképtelen az egész. Amikor a K-ciklussal végigmegyünk az eddigi értékeken, két lehetőség adódik vagy találunk a generálttal megegyező számot, vagy sem. Ha a program nem talál ilyet, arra a helyre beírja a generált számot, utána TOVÁBBLÉP, és ha az sem egyezik meg, oda is beírja, egészen a K-ciklus végéig. A folytatásban megint két eset lehetséges. Tételezzük fel, hogy a generált szám eltér az előzőtől. Mivel minden eddigi tömbelem ugyanazt az eltérő számot tartalmazza, az újabb ciklus azokba lelkiismeretesen beírja, majd még a végére is odabiggyeszti az új számot. Ennek megfelelően, ha a véletlen szeszélye megint az eggyel előző számot dobja ki, az nem fog egyezést találni, mivel minden addigi tömbelem az újat tartalmazza -- ezeket szép sorban felül is írja saját magával, és megbecsült, elfogadható értékként jön ki a kalandból. Hátra van még az a lehetőség, hogy a generált szám megegyezik az előzővel. A fentiekből kitűnik, hogy ez tulajdonképpen az EGYETLEN esély arra, hogy a program egyezést találjon. Mit tesz ilyenkor? Nem írja be az értéket, hanem -- az adott helyen tökéletesen értelmetlen continue utasítás után -- megint csak továbblép K következő értékére, és ÚJRA PRÓBÁLKOZIK, egészen az előző ciklus végéig, utána végre talál egy helyet, ahová beírhatja magát, és elégedetten, érvényes értékként zárja a bulit. Az átírt programrész az említett próbálkozásokat felkiáltójelek kiírásával jelzi:
for i := 1 to szelvenySzam do
begin
for k := 1 to tipus do tippek[k] := 0;
for j := 1 TO tipus do
begin
szam := Random(meddig) + 1;
Write('Szam =', szam:3, ' ');
{tippek tömb átjárása egyezést keresve.}
for k := 1 to j do
if (tippek[k] <> szam) then
tippek[k] := szam
else
begin
Write('!');
continue;
end;
for k := 1 to tipus do Write(tippek[k]:4);
Write(' tippek[', j, '] =', tippek[j]:3);
WriteLn;
end;
WriteLn;
end;










program lotto;
{$APPTYPE CONSOLE}
uses SysUtils;
const lottotipus = 90;
var szamok : array [1..lottotipus] of Boolean;
szam, i, meddig : Byte;
begin
Randomize;
for i := Low(szamok) to High(szamok) do szamok[i] := False;
i := 1;
case lottotipus of
35 : meddig := 7;
45 : meddig := 6;
90 : meddig := 5;
end;
while i <= meddig do
begin
szam := Random(High(szamok)) + 1 ;
if not szamok[szam] then
begin
WriteLn(szam);
Inc(i);
szamok[szam] := True;
end;
end;
ReadLn;
end.
Lehet még csűrni, csavarni dinamikus tömbbel, akármivel....
További kérdések:
Minden jog fenntartva © 2025, 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!