Mi a hiba a programban?
Lottozó programot szeretnék csinálni , ahol előszór bekér 5 számot és ha nem kisebb 1-nél, de nem is nagyobb 90-nél akkor generáljon le magától 90-ig számokat
program valami;
var a,b,c:integer;
begin
for b:= 1 to 5 do
begin
a:=0;
repeat
writeln(b, '. szám:');
readln(a);
if a < 1 then write('Írj be nagyobb számot')
else if a > 90 then write('Írj be kisebb számot')
else
for c:= 1 to 5 do
Begin
until
randomize;
a:=random(89)+1;
writeln(a);
end;
end.
és ha lehetséges a végén kiírja, hogy szám jó és ebből hány van jó helyen
Attól függetlenül, hogy a programod még mindig működésképtelen, nagyot léptél előre egy nap alatt, különösen, hogy a tanácsokat megszívlelve nekiestél a tömböknek. Láthatólag még nem egészen érted, de ha így haladsz, holnapra menni fog. Néhány megjegyzés:
1. Tervezd meg papíron, hogy hogyan működik a program. Persze, némi tapasztalat után egy ilyen egyszerű feladatot fejben is átlátsz, de most még nem. Nem muszáj folyamatábrát rajzolnod, de átláthatóbb emberi nyelven írd le magadnak a lépéseket, amelyeket majd pascalban le akarsz kódolni.
2. Gondold át, hogy ténylegesen mire van szükséged. A lottószelvény 90 mezőből áll, ez igaz -- de következik ebből, hogy egy kilencven elemű tömb kell? Ha ténylegesen szimulálnád a kitöltést (a 90 elem kiválasztott öt elemében jeleznéd, hogy beikszelted-e vagy sem), akkor igen, viszont igen/nem lehetőségekhez miért kéne integerekből álló tömb? De te nem ezt csinálod, hanem létrehozol egy 90 elemű tömböt, és csak az első öt elemét használod. Ennek mi értelme van? Ha átgondolod, akkor nyilvánvaló, hogy a tiedhez hasonló megoldásban két 5 elemű számcsoportot kell kezelned: A játékos tippjeit, meg a gép által generált véletlenszámokat. Erre legalkalmasabbnak két 5 elemű vektor (alias egydimenziós tömb), vagy egyetlen 2*5 elemű kétdimenziós tömb tűnik. Utóbbit addig ne erőltesd, amíg a tömbkezelést nem érted egészen.
3. Az ne zavarjon, hogy nem tudsz egyszerre mindent megoldani. Próbáld meg, hogy a programnak csak egy része működjön, de az teljesen. Például foglalkozz először csak azzal, hogy a tippek beolvasása legyen tökéletes, utána ellenőrzésként írasd ki a kapott értékeket. Ez a kiíratás a végleges programban nem lesz benne, de addig is ellenőrizheted vele, hogy a beolvasott értékek tényleg azok-e, amelyeknek lenniük kell.
4. Alaposan gondold át a feltételeket, ne csak azokkal foglalkozz, amelyek kiütik a szemed. Gondosan ellenőrzöd, hogy a szám a megfelelő értéktartományban van-e, ezzel vélhetőleg már a tökélyt reméled megközelíteni. De mi van akkor, ha én mind az öt számnak beírom mondjuk a hatvanhármat? Az engedélyezett tartományban van, tehát a programod boldogan elfogadja, jaj, de jó, kapott öt hibátlan tippet. Vagy -- amit számbeolvasással nem tudsz orvosolni, ezért tedd el későbbre -- mi van, ha tippként beírom, hogy "ló"?
5. Továbbra sem hiszed el, hogy elég egyszer randomizálni, nem kell minden véletlenszám előtt? Pedig így van.
6. Mi a fenének van az egész egy nagy repeat...until ciklusba rakva, és ha már van, minek a végére egy tökéletesen értelmetlen kilépési feltétel?
Bármi is b[l] aktuális értéke, arra igaz lesz, hogy vagy nagyobb, mint egy, vagy kisebb, mint 90. Egytől végtelenig, vagy mínusz végtelentől kilencvenig -- szerinted melyik szám nincs benne?
7. a:=random(90)+90; Mi ez a marhaság, amellyel beállítod, hogy A értéke csakis 90 és 180 közé eshessen? Egyrészt eddig azt hittem, csak 1..90 közötti számokat lehet kihúzni, másrészt így gondoskodsz arról, hogy csakis egyetlen találat lehet, ha a játékos 90-et tippel, és a vakvéletlen is azt hozza ki.
8. A kiírásoknál tegyél szóközt a számok elé.
9. Be vagy oltva értelmes változónevek ellen? Jó, a ciklusszámlálásban megvan a hagyománya mondjuk az I és C elnevezéseknek (index, counter), de egyébként miért nem használsz mondjuk TIPP, VELETLEN, SZAMLALO vagy efféle neveket, hogy két hét múlva is megértsd, mi mire való?
Egyelőre ennyi. Szerintem egyelőre bontsd apró részekre a feladatot, és próbáld darabonként megoldani. Ez később is gyümölcsözni fog, amikor már eljárásokra, függvényekre tagolod a programjaidat.
"kivéve ami az untilban van"
Én ezt nem értem. Egyszer megemlítettem, hogy az until "feltétele" értelmetlen, mert minden esetben kilép. Másodszor megerősítettem ugyanezt. Erre most -- miközben egyáltalán nem világos a számomra, mit akarsz törölni -- arról értesítesz, hogy ezt a garantáltan működésképtelen dolgot mindenképpen meg akarod őrizni...
Akkor még egyszer: Nem jöttem rá, mit akarsz az egész repeat...until ciklussal, de a feltétele NEM FELTÉTEL. A program minden esetben ki fog lépni a ciklusból. Ez az első dolog, amit ki kéne dobnod és mással helyettesítened, nemhogy foggal-körömmel ragaszkodnod hozzá.
Mellesleg: Te nem olvastad el, amit írtam? Csak, mert semmiféle összefüggést nem látok a több órás munkával megfogalmazott (és néhány perc alatt elolvasható) szövegem, meg a te reakcióid között. Semmiféle indítványt nem tettem b[l] vagy egyéb törlésére.
-- Béluska, ugorj már le a boltba, hozzál ötér' túrót!
-- De ha pirosra festem a mókust, összeragad a szőre.
Ez milyen párbeszéd? És továbbra is érvényes, hogy ne vaktában törölj fölöslegesnek sejdített részeket, és szúrj be reményteljesnek ítélt sorokat, hanem okoskodd ki előre, hogy mit kell csinálnia a programnak. Nemlétező javaslataimra talált ellenérvek helyett sokkal szívesebben látnék egy pontokba szedett listát a teendőkről.
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!