Hol a hiba (Pascal, forráskód lent)?
A létrehozott fájlban szépen megvannak az ötös sorok, de egy-két sorba (minden futtatásnál másikban) négy, vagy hat, vagy hét szám kerül. Egyszerűen nem értem.
program lotto;
uses crt;
type
szamok=1..90;
halmaz=set of szamok;
tomb=array[1..90] of szamok;
var
h:halmaz;
t:tomb;
sz:szamok;
g,k:integer;
f:text;
begin
randomize;
assign(f,'kaka2.txt');
rewrite(f);
g:=0;
for k:=1 to 51 do begin
repeat
sz:=random(90)+1;
if not (sz in h) then
begin
inc(g);
h:=h+[sz];
t[g]:=sz;
write(f,t[g]);
write(f,' ');
end;
until g mod 5=0;
h:=[];
writeln(f,' ');
end;
close(f);
readkey;
end.
Szia.
Milyen forditót használsz ?
És ezek a túl kevés vagy túl sok soronkénti szám nem mindig a 19-sortól kezdődően van ? (Tehát az első 18 sor mindig jó !?)
Valószinűleg az a gond, hogy futtatási hibát kapsz amikor a "g" értéke 91-re növekszik (18*5=90 - itt : t[g]:=sz; mivel t:tomb; és tomb=array[1..90] of szamok;) túl cimzel az indexen, gondolom ilyenkor már nem szabályosan megy a dolog és ezért lesz 5-nél kevesebb illetve 5-nél több adat egy sorban.
Ha a g:=0 sort beteszed a for és repeat közzé akkor ezt a hibát elkerülheted. (de akkor a 90 elemes tömb feleslegesnek tünik)
A másik dolog ha nem direkte ez volt a feladat, akkor szerintem egy kicsit túlkombináltad a halmazokkal meg a 90 elemes tömbökkel.
Egy 5 elemű számsorban max 4 elemű tömb kell annak megállapitására, hogy egy szám már ki lett-e választva vagy nem. Mivel a programban nem használod fel a 90 elemű tömböt csak sima tárolásra (ennek igy szerintem semmi értelme). Ha további falhasználásra miatt van igy akkor nem szóltam.
Sok sikert.
üdv.
Nagyon köszönöm!
Tényleg a tömb méretével volt a gond. A g változóra szükségem van, ezért azt nem nullázhattam le, de a tömb méretét megnöveltem 500-ra és így tökéletesen működik.
Szia.
Ha már igy csinálod akkor legalább legyenek köszönő viszonyban a számok : 51*5=255 tehát elég egy 255-ös tömb is
Üdv.
Én nem értek hozzá igazán, de első blikkre számomra a futtatás eredményétől függetlenül is vannak apró furcsaságok a programban:
Miért pont 51-sze fut le a ciklus, miért nem mondjuk kereken 50-szer? Persze, a te dolgod, lehet, hogy ez a kedvenc számod.
Miért nem lehetett a tömb egyszerűen byte típusú?
Mire jók a szép beszélő típusnevek, ha azután csupa betűjelet használsz változónévként, így a kódnak pont a lényeges része válik alig olvashatóvá? Fordítva érthető lenne: A típusokat egy helyen adod meg, nem oszt, nem szoroz, de jó, ha a változókról azonnal tudod, mit csinálnak.
Mivel nem tudom, a későbbiekben mire használod a tömböt, nem firtatom, miért nem kétdimenziós, de a részlet alapján nekem logikusabbnak tűnne.
Nézd meg ezt, ugyanazt csinálja mint a te kódod, csak picit másképp:
program Lotto;
const MEDDIG = 50;
var szamok : set of byte;
tomb : array of byte;
ujszam : byte;
g, k : integer;
f : text;
begin
SetLength(tomb, MEDDIG * 5);
szamok := [];
Randomize;
g := 0;
for k := 0 to MEDDIG do
begin
repeat
ujszam := Random(90) + 1;
if not (ujszam in szamok) then
begin
szamok := szamok + [ujszam];
tomb[g] := ujszam;
Inc(g);
end;
until g mod 5 = 0;
szamok := [];
end;
Assign(f, 'kaka2.txt');
ReWrite(f);
for k := 1 to Length(tomb) do
begin
Write(f, tomb[k - 1]:3);
if (k mod 5 = 0) and (k < Length(tomb)) then WriteLn(f);
end;
Close(f);
SetLength(tomb, 0);
ReadLn;
end.
Köszi az észrevételeket, a feladat egyébként az volt, hogy hozzuk létre egy teljes év lottószámainak listáját növekvő sorrendben kiíratva egy fájlba. Egyelőre még azon a szinten tartok, hogyha a feladat sikerül, akkor nem számít, hogy egyébként hogy néz ki a program, de azért köszönöm mindenkinek!
Itt van a nagy erőlködéssel elkészített végleges forráskód, ha érdekel valakit:
program lotto;
uses crt;
type
szamok=1..90;
halmaz=set of szamok;
tomb=array[1..500] of szamok;
var
h:halmaz;
t:tomb;
z:tomb;
sz:szamok;
g,k,a,c,r,u,e,x,seged, min:integer;
f,p:text;
begin
randomize;
assign(f,'kaka2.txt');
rewrite(f);
g:=0;
for k:=1 to 50 do begin
repeat
sz:=random(90)+1;
if not (sz in h) then
begin
inc(g);
h:=h+[sz];
t[g]:=sz;
write(f,t[g]);
write(f,' ');
end;
until g mod 5=0;
h:=[];
writeln(f,' ');
end;
close(f);
assign(f,'kaka2.txt');
reset(f);
assign(p,'kaka.txt');
rewrite(p);
for c:=1 to 50 do begin
e:=0;
for x:=1 to 5 do begin
repeat
inc(e);
read(f,z[e]);
until IOResult=0;
end;
for r:=1 to 4 do begin
min:=r;
for u:=(r+1) to 5 do begin
if z[u]<z[min] then min:=u;
end;
seged:=z[r];
z[r]:=z[min];
z[min]:=seged;
end;
for a:=1 to 5 do begin
write(p,z[a]);
write(p,' ');
end;
writeln(p,' ');
end;
close(f);
close(p);
readkey;
end.
Hát ha előre leírod mi a a feladat nem kínlódunk akkora tömbökkel :)
program Lotto;
const MEDDIG = 51;
var szamok : set of byte;
tomb : array[1..5] of byte;
ujszam, temp : byte;
g, k, i, j : integer;
f : text;
begin
Assign(f, 'kaka2.txt');
ReWrite(f);
szamok := [];
Randomize;
for k := 0 to MEDDIG do
begin
g := 1;
repeat
ujszam := Random(90) + 1;
if not (ujszam in szamok) then
begin
szamok := szamok + [ujszam];
tomb[g] := ujszam;
Inc(g);
end;
until g = 6;
szamok := [];
for i := 5 downto 1 do
begin
for j := 1 to i - 1 do
begin
if tomb[j] > tomb[j+1] then
begin
temp := tomb[j];
tomb[j] := tomb[j+1];
tomb[j+1] := temp;
end;
end;
end;
Write(f, k+1:2, '. hét:');
for i := 1 to 5 do Write(f, tomb[i]:3);
WriteLn(f);
end;
Close(f);
ReadLn;
end.
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!