Kezdőoldal » Számítástechnika » Programozás » Tudna segíteni valaki?

Tudna segíteni valaki?

Figyelt kérdés

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 bell) Ł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!


2016. nov. 11. 23:40
1 2
 11/16 anonim ***** válasza:
#10 Két kommentet olvass vissza, legyél oly szíves.
2016. nov. 12. 16:22
Hasznos számodra ez a válasz?
 12/16 tabaki ***** válasza:
Ja, csak annyit szabad?
2016. nov. 12. 16:50
Hasznos számodra ez a válasz?
 13/16 anonim ***** válasza:
... unatkozol talán, hogy kötekedhetnéked van?
2016. nov. 12. 16:52
Hasznos számodra ez a válasz?
 14/16 tabaki ***** válasza:

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;

2016. nov. 12. 22:32
Hasznos számodra ez a válasz?
 15/16 tabaki ***** válasza:
Az, hogy egy helyett az összes tömbváltozót átírja a program, nem egészen érthető baklövés, a találat kezelése viszont szerintem a continue szerepének meg nem értéséből adódik. Ez a feltétel teljesülése esetén elhagyná a ciklusmagban utána következő részt, és a ciklus csak az előtte levőket ismételgetné. A programban viszont nincsenek a continue után következő utasítások, tehát a K-ciklus pontosan ugyanúgy fut le, mintha az ott se volna.
2016. nov. 12. 22:44
Hasznos számodra ez a válasz?
 16/16 SimkoL ***** válasza:

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

2016. nov. 12. 23:08
Hasznos számodra ez a válasz?
1 2

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

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!