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.
Alapvető szövegműveletek: interface , ppu , obj (fordítás: fpc v2.6.4.).
Á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 ×S →L
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 programok at kell írni! Valamilyen Szövegfájl ból valamilyen Szövegfájl t 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:
A kimeneti (lapozott) fájl sorai megegyeznek a bemeneti fájl soraival,
azaz nem kell a sorhosszt figyelni.
Egy lapra meghatározott számú (=maxSDb ) sor férhet ki.
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ömb ben (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:
a sor elején és végén fölösleges minden szóköz;
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
⇒
ø
ø 5 a bcdeFFFø 6 G H
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 futam ok 3-karakteres szerkezetét a következő színekkel tettük könnyebben értelmezhetővé:
a speciális nyitó ø jel kezdi;
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;
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 .