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!
Szövegfeldolgozás – gyakorlat

Lapozott listázás, szűrés, tömörítés

Emlékeztető

Szövegtípusok

Az alábbi dokumentumok összefoglalják azon fogalmakat, műveleteket, amelyeket ismerni kell a téma feldolgozásához. Egyben letölthetővé tettük azokat a unitokat, amelyeket beépíthet a programjaiba.

  1. Alapvető szövegműveletek: interface, ppu, obj (fordítás: fpc v2.6.4.).
  2. Általános Szöveg fogalmai és műveletei: interface, ppu, obj (fordítás: fpc v2.6.4.).

Az utóbbihoz kiegészítésül

A szövegtípusokat „tartalmazás” alapján a következő hierarchiába rendeztük:

 Szó ⊂ Sor ⊂ Lap ⊂ Dokumentum

ami azt fejezi ki, hogy a sornak része a szó, a lapnak része a sor, a dokumetumnak része a lap.
A „részének lenni” reláció (⊂) definíciója:

 Def:
  ⊂:S×SL
  s⊂S ⇔ ∃i∈[1..Hossz(S)-Hossz(s)+1]:∀j∈[1..Hossz(s)]: sj=Si+j-1

A hierarchia adott szintjén levő szövegben két eggyel alacsonyabb szintűt valamilyen legalább egy-elemű, „odaillő” elválasztójelek sorozata választja el:

 Sor:=SzóElválasztóJel*+(Szó+SzóElválasztóJel+)* ∪ 
      ∪ SzóElválasztóJel*+(Szó+SzóElválasztóJel+)*+Szó
  ahol 
 x+:=x+x*  [azaz legalább egy x]
 z:=x  y ⇔ z:=x ∨ z:=y  [azaz a z eleget tesz vagy az x vagy az y szabálynak]
Mondjon néhány példát a definíciót kielégítő sorra!
 sor1='EzEgySor'
 sor2='Ez egy sor'
 sor3='  ez     is    egy  sor  '
 sor4='  '
 sor5='' [üres sor]
 Lap:=SorElválasztóJel*+(Sor+SorElválasztóJel+)*+Sor≡
     ≡(Sor+SorElválasztóJel+)*+Sor
Mondjon néhány példát a definíciót kielégítő lapra!
 lap1='EzEgySor'+SorVégjel
 lap2='Ez egy sor'+SorVégjel+'következő sor'+SorVégjel
 lap3='Ez egy sor'+SorVégjel+'következő sor'
 lap4=SorVégjel
 lap5='' [üres lap=üres sort SorVégJel nélkül]
 Dokumentum:=LapElválasztóJel*+(Lap+LapElválasztóJel+)*+Lap≡
            ≡(Lap+LapElválasztóJel+)*+Lap
Mondjon néhány példát a definíciót kielégítő dokumentumra!
 doku1=lap+LapVégjel
 doku2=lap1+LapVégjel+lap2+LapVégjel
 doku3=lap1+LapVégjel+lap2
 doku4=LapVégjel
 doku5='' [üres dokumentum=üres lapot LapVégJel nélkül]


Az elkövetkezőkben fájl-konverziós programokat kell írni! Valamilyen Szövegfájlból valamilyen Szövegfájlt kell gyártani.
Ezek outputjának képernyőre listázásához kap kész programokat! Bár meg is írhatja! :)


1. feladat

Lapozott listázás

Egy fN Szövegfájl lapozott fájllá konvertálása, ami a következőket jelenti:

  1. A kimeneti (lapozott) fájl sorai megegyeznek a bemeneti fájl soraival, azaz nem kell a sorhosszt figyelni.
  2. Egy lapra meghatározott számú (=maxSDb) sor férhet ki.
  3. A bemeneti fájlban (is) lehetnek direkt lapozást előíró sorok. Ilyen sorban csak a "#12" 3-hosszúságú szöveg van. Ekkor ez a sor az adott lap utolsó sora.

Tehát a konverziós programnak a feladata a Szövegfájl megfelelő karaktereinél a 12-es kódú jel elhelyezése.
Egy ilyen kódú karakter-konstans Pascalban –ahogy a fenti interface-ben láttuk– így deklarálható:

 Const
   LapVegJel=#12; 

A kimenet

A kimeneti fájl neve: fN+'.page' legyen!

Egy példa

Példa
 1. sor: a példában legyen a maxSDb 5!
 2. sor: azaz ennyi sor férjen el egy lapon!
 A következő sor egy "direkt" lapdobás:
 #12
 Ez a sor már a 2. lapon kell megjelenjen.
 Tehát ez a 2. lap 2. sora.
 Ez a 2. lap 3. sora.
 Ez a 2. lap 4. sora.
 Ez a 2. lap 5. sora.
 Ez sor nem fér a 2. lapra, így a 3. lap 1. sora lesz.
 
 1. sor: a példában legyen a maxSDb 5!
 2. sor: azaz ennyi sor férjen el egy lapon!
 A következő sor egy "direkt" lapdobás:
 ¶
 Ez a sor már a 2. lapon kell megjelenjen.
 Tehát ez a 2. lap 2. sora.
 Ez a 2. lap 3. sora.
 Ez a 2. lap 4. sora.
 Ez a 2. lap 5. sora.
 
 Ez sor nem fér a 2. lapra, így a 3. lap 1. sora lesz.
fN fN+'.page'

Megjegyzés a példához:
Az eredményfájlban minden '#12' tartalmú sor helyett egy 12-es kódú karakter () kerül. Továbbá olyan sor után, amely az adott lap utolsó sora szintén egy 12-es kódú karakter () kerül, tehát ez a sor a bemeneti fájlban nem szerepelt.
Kipróbálhatja az én megoldásomat: exe, például a Proba szöveg fájllal.

Az eredmény ellenőrzéséhez

Az eredményfájlt „szemmel” ellenőrizheti, ha elindítja a keletkezett fájlra a LapozvaListaz.exe programot. Ez a program miközben a képernyőre kilistázza a fájl tartalmat, minden LapVégJel-nél várakozik, majd Enter lenyomására új lapot nyit, és folytatja a listázást.

2. feladat

Lapozott listázás maximált hosszú sorok esetén

Az előbbi feladat alábbi értelmű módosítása:

A lapozott fájl sorai legfeljebb maxSHossz karaktert tartalmazhatnak. Tehát a „túlfutó” szónál törni kell a sort!
Feltehető, hogy nincs maxSHossz-t meghaladó hosszúságú szó a szövegben.

Megoldási ötlet

A kiírást addig „vissza kell tartani”, amíg egy lap meg nem telik. A lap sorait tehát egy Szöveg elemű Tömbben (vagy Sor adatszerkezetben) kell tárolni, majd ha kell, egyben kiírni.
Ez az adatszerkezet lényegében egy TKépLap típusú változó. (L. a fenti interface-ben!)
Kipróbálhatja az én megoldásomat: exe az előbbi próba során keletkezett fájlra (például a Proba.page szöveg fájlra.

Az eredmény ellenőrzéséhez

Az eredményfájlt „szemmel” ellenőrizheti, ha elindítja a keletkezett fájlra a LapozvaListaz.exe programot. Ez a program miközben a képernyőre kilistázza a fájl tartalmat, minden LapVégJel-nél várakozik, majd Enter lenyomására új lapot nyit, és folytatja a listázást.

A megoldáshoz kiindulópont
     Az előző feladat megoldását letöltheti: pas.

3. feladat

Szóköz-szűrés

Az előbbi feladat alábbi értelmű bővítése.

A szöveg fájl fölösleges szóközeinek elhagyása, ami ezt jelentse:

  1. a sor elején és végén fölösleges minden szóköz;
  2. a sor belső szököz-intervallumait egyetlen szóközzel kell helyettesíteni.

A kimeneti fájl neve: fN+'.minsp' legyen!

Megoldási javaslat

Az előbbi programot módosítsa úgy, hogy e feladatot megoldja a fentiek szerint, majd a keletkezett fájlt beolvasva elvégzi rajta a lapokra tördelést is.

Az eredmény ellenőrzéséhez

A lapozott eredményfájlt „szemmel” ellenőrizheti, ha elindítja a keletkezett fájlra a LapozvaListaz.exe programot. Ez a program miközben a képernyőre kilistázza a fájl tartalmat, minden LapVégJel-nél várakozik, majd Enter lenyomására új lapot nyit, és folytatja a listázást.

A megoldáshoz kiindulópont
     Az előző feladat megoldását letöltheti: pas.

4. feladat

Futamhossz-kódolás

A szöveg fájlt a 'futamhossz-kódolás' módszerével kódolva kiírja egy új, kimeneti fájlba.
A kimeneti fájl neve: fN+'.fhk' legyen!

Egy példa

Példa
aaaaabcdeFFFGGGGGGH
ø
ø5abcdeFFFø6GH
fN fN+'.fhk'

Megjegyzés a példához:
Az eredményfájl 1. jele, ami most a jól láthatóság érdekében külön sorba került, annak a karakternek a kódja, amely minden futamot bevezető kód lesz a fájlban. Ez most a #0 kódú karakter: ø. A futamok 3-karakteres szerkezetét a következő színekkel tettük könnyebben értelmezhetővé:

  1. a speciális nyitó ø jel kezdi;
  2. majd a darabszám követi egy bájton, amelyet így jelöltünk: x, ahol x egy darabszám (≤255), de maga a jel egy darabszámmal megegyező kódú karakter;
  3. a futam 3. karaktere az ismétlődő jel: ?, ahol a '?' helyén egy karakter van.

Az eredmény ellenőrzéséhez

Világos, hogy a futamhossz-kódolással kapott fájlt speciális módon kell megjeleníteni, hiszen az egyes jeleket ókor-ókor eltérően kell értelmezni.
Az eredményfájlt „szemmel” ellenőrizheti, ha elindítja a keletkezett fájlra a FutamHosszKodoltFajltListaz.exe programot.

Kipróbálhatja az én megoldásomat: exe.



Házi feladatok
  1. Készítse el a lapokra tördelt (1.,2. és 3. feladatban keletkező) szöveges fájlt a képernyőre, lapozottan (azaz laphatároknál billentyűre várakozva) kilistázó programot!
  2. Készítse el a futamhossz-kódolt fhk-fájlt fájlba kicsomagoló programot, azaz a 4. feladat „inverzét”!


Szlávi Péter