Megoldáshoz:
1. lépés: a fájl típusa
Egy kis „elmélet”
A feladatban szekvenciális input- , ill. szekvenciális outputfájl típus kettőséről van szó.
Ennek a típuspárnak karakteralapú esetét jelenti a vizsgált szövegfájl (Text ) típusa.
E típus az alábbi műveleteket tartalmazza. De fontos ismerni egy kulcsfogalmat, a fájlmutató ét:
rámutat az „aktuális” elemre,
arra az elemre, amelyet olvasni vagy írni lehet (a fájl típusától függően).
További típus-specifikus jellemző, hogy a feldolgozás során bármely elem csak egyszer lesz aktuális,
a következő értelemben:
a rá vonatkozó művelet végrehajtása után automatikusan a következő válik aktuálissá .
Műveletek
Input
Output
ElejéreÁll (f)
Uf: f olvasásra lesz nyitva,
és első eleme lesz az aktuális.
Üres (f)
Uf: f üres lesz,
és írásra lesz nyitva; az első elemét teszi aktuálissá.
Olvas (f,e)
Ef: f olvasásra nyitott fájl.
Uf: e-be beolvassa f aktuális elemét, és a következő elemét teszi aktuálissá.
Ír (f,e)
Ef: f írásra vagy hozzáírásra nyitott fájl.
Uf: e-t f aktuális elemébe írja, és a következő elemét teszi aktuálissá.
Vége-e (f)
Ef: f olvasásra nyitott fájl.
Uf: Igaz, ha f „utolsó utáni eleme” az aktuális.
VégéreÁll(f)
Uf: f (a végére írásra) hozzáírásra lesz nyitva, azaz
f „utolsó utáni eleme” az aktuális.
+1 Text -szintű művelet
Másolat (f,fKi)
Ef: f olvasásra nyitott, fKi (üres) írásra nyitott fájl.
Uf: f elemeit átmásolja az fKi-be.
Közbevetett kérdések és feladat:
Kérdés1 :
Mely műveletek tekintendők „nyitó” műveleteknek?
(Azaz amely végrehajtása után válik értelmessé a feldolgozás.)
Feladat : A fenti táblázatban összefoglalt műveleteket implementálja egy Pascal unitban!
Ha nagyon nincs ideje ...
... egy lehetséges megvalósítást talál a
Text_Unit.pas nevű unitomban.
Ha erre fanyalodik, mindenképpen nézze át, értelmezze a unitot!
Kérdés2 :
Mik a fájl -típusok specialitásai, amelyek miatt újra kell gondolni a programozási tételek tömbökre alapozott algoritmusait?
Súgás...
nem állandó a fájlok elemszám a (akár 0 is lehet);
a mérete akkora is lehet, hogy nem gondolhatunk arra, hogy legelőször beolvassuk egy tömbbe,
s így teremtjük meg a tételalkalmazás „olcsó” lehetőségét;
nem indexelhető , csak az ún. aktuális elem mel lehet manipulálni;
az aktuális elem kijelölése csak szekvenciálisan lehetséges;
az aktuális elemhez csak egyszer lehet hozzáférni ;
a feldolgozás az végjel ig („utolsó utáni elemig”) tarthat (túlolvasás esetén hiba következik be),
viszont a fájlvégéhez érés lekérdezhető.
2. lépés: technikai megvalósítás
„Köteles”, kísérő Pascal műveletek
Mielőtt a fenti valamelyik nyitó műveletet végrehajtaná, szükséges a Text -et
a fizikai fájlhoz rendelni.
Ezt az Assign(f,fN) Pascal művelettel teheti meg, ahol
f:Text a későbbiekben használandó fájl memóriabeli párja (az ún. fájlváltozó ),
fN:String a fájl fizikai nevét tartalmazza
(esetleg a teljes útvonallal együtt).
Szintén „technikai” dolog, hogy egy fájllal kapcsolatos tevékenység végleges befejezését jelezni kell.
Erre szolgál a Pascal Close(f) művelete. (Az f:Text a lezárandó fájl.)
Ezt követően a fájlt csak a fenti nyitó „szertartással” (Assign nal + a fenti nyitó műveletek valamelyikével) lehet újra használatba venni!
Például egy kurzus ("nevek.txt" nevű) fájl megnyitása olvasásra:
Assign(kurzus,"nevek.txt"); ElejereAll(f); utasításokkal történik.
Persze a fájlt (pontosabban a fájlváltozót) korábban deklarálni kellett:
Var kurzus:Text ; .
Adatfájlok gyártásához
Rendelkezésre áll egy –többek közt– adatfájl-feltöltést támogató unit:
Text_Gen_Unit.pas .
Ebben az alábbi műveletek vannak megvalósítva:
FajlGeneralas (Const fN:String; Const db:Integer):Boolean ,
WriteFajl (Const fN:String; Const cim:String) ,
FajlTorles (Const fN:String) .
A paraméterezésből is látszik, hogy maguk gondoskodnak az érintett fájl megfelelő megnyitásáról és lezárásól.
Tehát mielőtt használnánk ezeket: a létező, érintett fájlt le kell zárni, illetőleg ha az érintett fájlt utána szeretnénk használni, azt –e rutinok használata után– meg kell (újra) nyitni.
Ezek kipróblását végzi a „nyúlfarknyi”
TextProba.pas
program.
Viszont kell hozzás a
Randnev.inc inklúd-állomány, valamint a
Text_Nyitasok_Unit.pas unit.
Vissza a feladathoz!
Készítsen olyan eljárásokat vagy függvényeket, amelyek valamely programozási tétel algoritmusára építenek!
Ezek Text -ekben kapják, ill. állítják elő a sorozatokat.
A sorozatokra alkalmazható műveleteket a fenti táblázat ból veheti.
Minimálisan az alábbi tételeket vegye számításba:
Eldöntés(f:Text,t:TTulFv):Logikai
Keresés(f:Text,t:TTulFv):TKeresett ,
ahol TKeresett=Rekord(vanE:Logikai,melyik:TElem)
Megszámolás(f:Text,t:TTulFv)
MaximumKiválasztás(f:Text,r:TRendFv):TLeg ,
ahol TLeg=Rekord(legelem:TElem; sorsz:Egész)
Kiválogatás(f:Text,t:TTulFv):Text
Egyesítés(f1,f2:Text):Text
„Transzformálja” a tételek jól ismert algoritmusait, írja le a fájlos algoritmusokat!
Próbáljon átírási szabályt adni: Algoritmustömb →Algoritmusfájl !
Kiinduló pont lehet a tételek algoritmusaihoz...
Az előadás anyaga .
Ne feledje a korábbi gyakorlat(ok)on tanultakat, külösen a függvény-típus ról hallottakat!
Örülnék, ha látnám az alábbiakat a programokban:
Type
TTulFv=Function (Const x:TElem):Boolean; //Tulajdonság-függvények típusa
TRendFv=Function (Const x,y:TElem):Boolean; //Rendezés-függvények típusa
Minden letölthetőt egyben is megkap: TetelekFajlra_Gyakorlatra.zip .
Tanács: induljon ki a „tételek listára” gyakorlaton készített programból.
Értelemszerűen a sorozat-típusok megváltoznak, és az egyes tételek algoritmusai is.
De a keret, a tulajdonság-függvények, rendezési relációk ugyanazok maradhatnak, hiszen a sorozatok alaptípusa ugyanaz (String ).