Az alábbiakban egy vázlatot szeretnék adni, ez alapján próbálja meg megírni a programot. Feladat: Szimulálja a "Nagy Könyv" két fordulóját: Az első fordulóban bármilyen könyvet lehet javasolni. A forduló eredményét, vagyis azt, hogy melyik könyvre hányan szavaztak, rögzítse egy fájlban. A második fordulóban már csak ezekre a könyvekre lehet szavazni. Ennek eredményét egy másik fájlban rögzítse. Mindkét forduló addig tart, amíg van szavazó, és mindkét fordulóban igény szerint meg lehessen kérdezni az aktuális állást. A második forduló után állapítsa meg, hogy összesen hány ember vett részt a játékban (hányan szavaztak), hány könyv került be a játékba, melyik lett a legnépszerűbb könyv. 1. Alaposan olvassa át a feladatot, döntse el, milyen adatszerkezet lenne a legjobb. javaslat: konyv(Cim,Szavazatszám) Ekkor evvel a következőket kell tenni: a/ a szavazások során módosítani b/ hány ember vett részt: a szavazatszámok összege c/ hány könyv került be: a cimek darabszáma d/ legnépszerűbb: a szavazatszámok maximuma. 2. A "főprogram" (start) felépítése: Az első és második forduló sorrendje kötött, ezért először meg kell hívni az első fordulót, majd ez után a másodikat (vagyis ezeket NEM írhatja menüpontokba). Ha evvel is végzett, jöhet a statisztika. 3. Első forduló: Itt azt kell figyelni, hogy tart-e még a szavazás. Legegyszerűbb, ha egy ciklust szervez, abban megkérdezi, hogy tart-e a szavazás, ha igen-nel válaszolunk, akkor folytatja a ciklust, ha nem-mel, akkor kilép belőle. A ciklusban pedig meghívja a szavazást. Maga a szavazás ennyi: Megkérdezzük, hogy melyik könyvre akar szavazni (természetesen most elég egyetlen kisbetűs szó). Ezt beolvassa, megvizsgálja, hogy szerepel-e már az adatok között. Ha igen, akkor a szereplő adat szavazatszámát növelje meg eggyel, ha nem, akkor egyszerűen szúrja be az új adatot az adatbázisba. Az, hogy szerepel-e a Nev, ennyi: konyv(Nev,Sz) (Sz helyett elég lenne aláhúzás is, annak eldöntésére, hogy létezik-e, de mivel ha létezik, növelni akarja az Sz értékét, ezért szerencsésebb már most lekérdezni.) 4. Második forduló: Ez majdnem ugyanaz, mint az első, annyi a különbség, hogy a szavazásnál, ha nem szerepel a beolvasott név a korábbi adatok között, akkor nem szúrja be új adatként, hanem kiírja, hogy nincs ilyen. 5. Statisztika: Ha akarja, ezt menüvel is megoldhatja. (Nem igazán indokolt, de annyi az előnye, hogy ha valamelyik nem működik, attól még a többit ki tudja próbálni, egyébként ha egy eljárás hibás, akkor az utána meghívott eljárást már nem tudja kipróbálni. Pontosabban: ki tudja próbálni, de csak önálló szabályként, vagyis úgy, hogy közvetlenül a szabályt hívja.) a/ hány ember vett részt: annyi, ahány szavazatszám van, vagyis a szavazatszámok össszege. Lehetőségek: I. ír egy ciklust, amelyben közvetlenül számolja az adatbázis alapján - megoldható, szerintem kicsit nehézkes. II. Induláskor - akár a start elején - létrehoz egy letszam(0) adatot (assert-tel :)), és létrehoz egy ciklust, amelyben elővesz egy konyv adatot, lekéri belőle a szavazatszámot, (a "lekéri" csak ennyit jelent: konyv(_,SZ),), evvel növeli a letszam aktuális értékét, majd a ciklus végén kiiratja a letszam akkor aktuális értékét. A ciklus fail-lal is szervezhető. III. Egy findall-lal kigyűjti a konyv adatból a szavazatszámok listáját, majd egy eljárást ír a lista elemeinek összegzésére, vagy használja a beépített összegző eljárást. Ami engem illet, én nem választanám az első megoldást. A második, harmadikat egyforma nehézségűnek érzem, ha saját maga írja meg a findall utáni számolást, de legegyszerűbbnek a findall + beépített összegzést tartom. b/ hány könyv került be: annyi, ahány adat van az adatbázisban. A lehetőségek ugyanazok, mint az előbb, csak 1-gyel kell növelni az értéket, nem a szavazatszámmal. A III. változat még tovább egyszerűsíthető: a findall után a length eljárással is meg lehet határozni a lista hosszát. c/ legnépszerűbb könyv: a szavazatszámok maximuma. Lehetőségek: I. Közvetlenül az adatbázis elemeire ír egy max-kereső eljárást, lehetőleg úgy, hogy a legnagyobb értéket határozza meg, majd kiíratja az ehhez tartozó könyvcímet. Ne feledkezzen el a holtversenyről! Ha nem megy önállóan, nézze át az órai feladatokat, ill. a mintapéldák között is vannak ilyenek. II. Egy findall-lal kigyűjti a darabszámokat egy listába, majd meghatározza a lista legnagyobb elemét. Ez egy számérték lesz, tehát még nem tudjuk, melyik könyvről van szó. Ezt pedig úgy lehet meghatározni, hogy ha M a maximális szavazatszám, akkor kiíratja a hozzá tartozó könyvcímeket, azaz: az konyv(Cim,M) -hez tartozó címeket. Ehhez elég, ha egy forall-ban iratja ki az osszes konyv(Cim,M) esetén a Cim-eket. (és előtte egy szövegben, hogy ezek-és-ezek az áruk érték el a maximális darabszámot, ennyit.) 6. További lépés: Szándékosan hagytam a végére még egy feladatot: a fájlbaírást. Nem mintha ez nehéz lenne, hanem azért, hogy lássa, a program e nélkül is működik. Ha kipróbálta, és tényleg működik, akkor még bővítse a fájlba írásokkal is. Egyszer az első fordulóból való kilépéskor kell kiiratni, egyszer pedig a másodikból való kilépéskor. Mindkét esetben ugyanazt kell csinálnia, csak arra ügyeljen, hogy különböző fájlneveket használjon. Mindkét esetben a konyv(Cim,Szavazatszam) adatokat kell kiiratni. A legegyszerűbb, ha a fájl megnyitása után egy egyszerű listing-et használ, majd lezárja a fájlt. 7. További - feladaton kívüli javítás: Nincs benne a feladatban, de szépít rajta, ha a a második forduló elején (vagy akár közben is a szavazások során) kiiratja az aktuális könyvcímeket. Úgy gondolom, hogy az eddigi szavazatszámokat nem illene, mert az befolyásolja a szavazót. Arra is figyeljen - különösen, hogy ha az adatfájlban is adatbázisként tárolja az adatokat, hogy a programfutás elején takarítsa ki a memóriát (retractall...), illetve ne feledkezzen meg a dynamic deklarációról. Remélem, ezek alapján működőképes programot tud létrehozni. Jó munkát!!