Értsd meg a feladatot!
Mint minden más esetben, itt is az első teendő, hogy olvassuk végig a feladat teljes szövegét! Ez alapján tudjuk eldönteni, hogy a bemenő adatok milyen módon állnak majd rendelkezésre, milyen kimenő adatokat kell előállítanunk, és a kettő között milyen belső adatszerkezetben legcélszerűbb az adatokat ábrázolni.
A feladat szövege alapján kiderül, hogy az adatok zöme egy szövegfájlban található, melynek mérete, szerkezete pontosan ismert, illetve az egyik részfeladatban nekünk is kell egy hasonló szerkezetű szövegfájlt előállítanunk. Emellett van billentyűzetről beolvasás (input) és képernyőre kiíratás (output) is.
A főprogram szerkezete
Átolvasás után az is látszik, hogy a feladat több, egymástól többé-kevésbé független részfeladatból áll: ebben az esetben ezek száma éppen kilenc). Ez az érettségi feladatsorok esetében általában is így szokott lenni. Ilyen esetben tanácsolható, hogy a programunk szerkezetét ennyi, egymástól független eljárásból (alprogramból) alakítsuk ki, melyeket a főprogram egymás után meghív. Ilyen módon a főprogramból egyszerűen megjegyzésekkel (kommentekkel) kivehetjük az éppen nem kívánt részeket.
Ez a módszer lehetővé teszi, hogy a rendelkezésre álló viszonylag rövid idő alatt, a feladatrészek egymástól függetlenül legyenek fejleszthetők. Az elkészült, már jól működő részfeladatokat ne kelljen újra és újra lefuttatni, illetve az esetleges hibás részek ne akadályozzák a többi részfeladat sikeres futását. Egy ilyen, paraméterek nélküli, eljárás váza gyorsan létrehozható, és másolással gyorsan multiplikálható is.
Procedure Feladat_x;
{ide jön a deklarációs rész}
Begin {Feladat_x}
WriteLn('x. részfeladat.');
{ide jön az utasításrész}
End; {Feadat_x}
Belső adatszerkezet
Lássuk tehát a belső adatszerkezetet!
A feladatban lottószámokat kell feldolgoznunk. Van, amikor egyheti húzás 5 számát, van, hogy egy teljes év (51 illetve 52 hét) számait. A heti lottószámok tipikusan halmaz adatszerkezetet kívánnak meg, hiszen közömbös a számok sorrendje. Csak az számít, hogy kihúzták azt az adott héten vagy sem. A halmaz elemeinek rendezett bejárása is könnyen megoldható Free Pascalban. Ezért a heti lottószámok belső ábrázolására a halmazt választjuk.
Az éves adatok egy külső fájlban vannak. Azért, hogy ne kelljen majd több részfeladatban ismételten végigolvasni az inputfájlt, elég legyen csak egyszer, az éves lottószámok elhelyezhetők egy 52 elemű tömbben, melynek elemei ezek a halmazok.
Megjegyzés: Egy fájl adatainak tömbbe másolása általában nem javallott, de semmiképpen sem „elegáns” megoldás, mivel a tömb statikus, a fájl viszont dinamikus adatszerkezet. Emiatt méretbeli ütközések léphetnek fel. Most viszont a feladat szövegéből egyértelműen kiderül az input adatok szerkezete és pontos darabszáma, ami lehetővé teszi ezt az egyszerűsítést. A Free Pascal egyébként támogatja a dinamikus adatszerkezeteket, így akár tömböt is létre lehet hozni változtatható méretben, vagy akár dinamikus listában is elhelyezhetnénk az adatainkat, de ez itt „ágyúval verébre lövés” lenne.
Hogy némi rugalmasság mégis maradjon az adatszerkezetünkben, nevesített konstansokkal jelöljük a főbb számadatokat, melyek az „5 a 90-ből” lottóhúzás jellemzői. Ezek átírásával a programunk gyorsan átalakítható más, hasonló sorsjáték adatainak feldolgozására.
Ezek alapján a főprogramban a következő deklarációkat alkalmazzuk:
Const
A = 1; B = 90; // a legkisebb ill. a legnagyobb lottószám
Db = 5; // egy héten húzott számok darabszáma
Hetek = 52; // összes hetek száma
Type
TLottoSzam = A .. B;
THuzas = Set Of TLottoSzam;
THetek = 1..Hetek;
TLottoEv = Array [THetek] Of THuzas;
Var
Fin, Fout : Text; // input ill. output fájl
LottoEv : TLottoEv; // a lottószámok éves tömbje
Huzas : THuzas; // egy húzás számainak halmaza
Het : THetek; // egy hét sorszáma (indexváltozó)
Lsz : TLottoSzam; // egy lottószám (munkaváltozó)
Kezdeti értékadás és beolvasás fájlból
Nagyobb programok esetében általában hasznos, ha az összetett adatstruktúráinknak megadjuk a kezdőértékét. A Free Pascalban van a változóknak alapértelmezett értéke, általában 0 vagy üres érték, de erre nem illik számítani. A kívánt kezdeti érték, sok esetben el is tér ettől. Ezt a kezdetiérték beállítást végzi el a legelső eljárás (Kezdeti_ertek).
A (Tombfeltoltes_filebol) eljárás az input fájl beolvasásával több részfeladatnak szolgáltatja a kiinduló adatokat. Ezt a két eljárást a főprogram elején kell meghívnunk, a másodikat legkésőbb a 3. részfeladat előtt. A program futtatása közben ügyeljünk arra, hogy a hivatkozott külső fájl (lottosz.dat) a megfelelő elérési úton legyen! Ez célszerűen ugyan az a mappa, ahova a forrásfájlt is mentettük. Ellenőrizzük a FILE/CHANGE DIR… menüpontot!
Megjegyzés: Az input fájl végigolvasása közben nem használjuk ki azt a tényt, hogy abban pontosan 51 sor van és soronként pontosan 5 darab szám. Sorvégéig, illetve a fájl végéig tart a beolvasás. A sorok pontos számát csak a tömbméretben használjuk fel.