Ha az egér-kurzor ilyen:, akkor a szövegrész „kinyitható”; az aláhúzott szövegre kattintva annak leírását megjelenítheti!
Ugrás ide:
„Globális” feladat…
1. lépés: a fájl típusa
2. lépés: technikai megvalósítás
Házi feladatok

Programozási tételek fájlokra

Gyakorlat

Feladat:

Építsünk föl nevekből szövegfájlokat (Text)! Ezekre fogalmazzunk meg tételeken alapuló feladatokat, algoritmizáljuk, majd kódoljuk Pascalban őket!

Ilyen feladatokra gondolhat (remélem, Önnek merészebb a fantáziája):

  1. Van-e olyan személy, akinek a neve hosszabb, mint 15 jel?
  2. Ki az utolsó névsorszerint?
  3. Válogassuk ki a „Péter” keresztnevűeket!

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:




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” (Assignnal + 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:

  1. FajlGeneralas(Const fN:String; Const db:Integer):Boolean,
  2. WriteFajl(Const fN:String; Const cim:String),
  3. 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ázatból veheti.
Minimálisan az alábbi tételeket vegye számításba:

  1. Eldöntés(f:Text,t:TTulFv):Logikai
  2. Keresés(f:Text,t:TTulFv):TKeresett,
    ahol TKeresett=Rekord(vanE:Logikai,melyik:TElem)
  3. Megszámolás(f:Text,t:TTulFv)
  4. MaximumKiválasztás(f:Text,r:TRendFv):TLeg,
    ahol TLeg=Rekord(legelem:TElem; sorsz:Egész)
  5. Kiválogatás(f:Text,t:TTulFv):Text
  6. 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ípusró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).

Házi feladatok
  1. A gyakorlaton elkezdett program kibővítése az alábbi tételekkel:
    • Rendezés: az f1 fájlból az f2 fájlba rendez.
      (Ehhez lásd: prezentációt, 20-32.o.!)
    • Összefuttatás.
  2. Módosítsa a fájlról fentebb kialakított (szokásos) elképzelést az alábbiak szerint.
    Legyen két új művelet:
    • KövetkezőreÁll(f) – az f aktuális eleme a következő lesz; mind input, mind output esetben;
    • ElemÉrték(f,e) – e-be teszi az f aktuális elemének értékét;
    • ElemMódosít(f,e) – e értékét teszi az f aktuális elemébe.
      Gondolni kell a nem korrekt használatra is: pl. a többszörös KövetkezőreÁll művelethasználat következtében nem definiáltan maradt elemek esetére!
    Az utóbbi két művelet mindaddig ugyanarra az elemre vonatkozik, amíg a KövetkezőreÁll műveletettel az aktuális elem mutatóját odébb nem állítjuk.
    Természetesen nincs szükség a(z)
    • Olvas,
    • Ír
    műveletre.
    A feladat második részében az 1. feladatban készült programot alakítsa át a fájltípus efajta értelmezéséhez!


Szlávi Péter