Kezdőoldal » Számítástechnika » Programozás » Hol a hiba (Pascal, forráskód...

Hol a hiba (Pascal, forráskód lent)?

Figyelt kérdés

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.



2015. jan. 24. 19:58
 1/8 coopper ***** válasza:
100%

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.

2015. jan. 24. 21:10
Hasznos számodra ez a válasz?
 2/8 A kérdező kommentje:

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.

2015. jan. 24. 21:24
 3/8 coopper ***** válasza:
100%

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.

2015. jan. 24. 21:35
Hasznos számodra ez a válasz?
 4/8 tabaki ***** válasza:
100%

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

2015. jan. 25. 00:05
Hasznos számodra ez a válasz?
 5/8 tabaki ***** válasza:
Aha, azt hiszem dereng a halmaztömb értelme, csak nem volt tiszta a halmazok megvalósítása. Gondolom, így kisebb helyen megoldod.
2015. jan. 25. 01:44
Hasznos számodra ez a válasz?
 6/8 SimkoL ***** válasza:
100%

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.

2015. jan. 25. 03:02
Hasznos számodra ez a válasz?
 7/8 A kérdező kommentje:

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.

2015. jan. 25. 17:20
 8/8 SimkoL ***** válasza:

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.

2015. jan. 25. 18:25
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!