Ebben a leckében a szöveg típust definiáljuk, majd erre és a tömb, már ismert fogalmára építve néhány gyakori feladatfajtát mutatunk be, a probléma felvetéssel és a megoldással.
{esszé}
Próbáljon kézzel fogható magyarázatot adni arra, hogy az a karakter miért kisebb, mint a b. Meg tudná magyarázni azt, hogy a számítógép, amiben minden számként van tárolva, hogyan állapítja meg két jel sorrendjét?
{/esszé}
A korábbi leckékhez hasonlóan ezt a típust is a definiálás és a felhasználás szintaktikai, szemantikai tudnivalóinak a megadásával mutatjuk be.
Annak ellenére, hogy egy nyilvánvalóan összetett típusról van szó, nincs értelme strukturálásról beszélni, mivel ez teljesen kötött, alig ad valami szabadságot a programozónak; csak annyit, hogy jogában áll a maximális karakterszámot előre meghatározni:
Szövegtípus = Szöveg(MaxHossz).
MaxHossz-nyi karaktersorozatok halmaza (karaktertípus MaxHossz-szoros direktszorzata).
Hossz, + (egymásután írás), Balrész, Jobbrész, Jele (adottadik jele), Üres ("" = szövegkonstans).
Megjegyzés: Implementációnként eltérő műveletkészletet definiálnak.
<, ≤, ≥, > (alfabetikus rendezés), =, ≠.
(1) Az a szó van ábécében előbb, amelyik első különböző betűje előbb van;
(2) az ∅ üres szó (="") minden szónál előbb van.
Példák a rendezési axiómák alkalmazására:
minta | ⇐ | magyarázat (axióma) |
---|---|---|
"alfa"<"alma" | ⇐ | "f"<"m" (1) |
"alá"<"alfa" | ⇐ | "á"<"f" (1) |
"al"<"alma" | ⇐ | ∅<"ma" (2) |
"alfa">"al" | ⇐ | "fa">∅ (2) |
"alma" ≤"alma" | ⇐ | ∅≤∅ |
Az alábbi példában egy névsort rendezünk, amelyben felhasználjuk a > rendezési reláció előbbi értelmezését:
Típus Név = Szöveg(30)
Konstans UtolsóUtáni : Név="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
MaxDb : Egész=100
Változó névsor : Tömb[1..MaxDb: Név]
i,j,db,
elsőInd : Egész
...
[feltételezzük: a névsor[1..db] tömbelemek ki vannak töltve]
Ciklus i=1-től db-1-ig
első:=névsor[i]; elsőInd:=i
Ciklus j=i+1-től db-ig
Ha első>névsor[j] akkor első:=névsor[j]; elsőInd:=j
Ciklus vége
Csere(i,elsőInd)
Ciklus vége
...
Vegyük észre, hogy vannak a tömbök és a szövegek közt hasonlatosságok, de lényeges eltérések is! Mindkettő azonos típusú elemeket egyesít egyetlen – bár összetett – elemmé. Amíg a tömb esetében ez az elemtípus szabadon megválasztható, addig a szövegtípus esetében rögzített: karakter. Tehát a tömb valójában nem típus, hanem egy eszköz típusok gyártásához. Ezért helyesebb a tömböt egy ún. típuskonstrukciónak nevezni.
A tömb is a szöveg is indexelhető, így elemeik külön-külön elérhetők. A szövegeket azonban elemeinél nagyobb egységekben és kezelhetjük. Például valamekkora kezdő-, vagy végszeletét egyben is vizsgálhatjuk. (L. Balrész, Jobbrész műveleteket.)
Amíg a tömb létrejöttekor (statikus deklaráció esetén) fix méretű, addig a szöveg lényegéhez tartozik a méret dinamikus változása is, hiszen a fent definiált + művelettel (konkatenáció) az operandusainak össz hosszával megegyező hosszúságú szöveg keletkezik.
Érdemes tudatosítani a + művelet nem kommutativitását. Ezt szemléltethetjük az alábbi feladat kétféle megoldásával.
Fordítsunk meg egy szöveget!
Csak a lényeget, nem a precíz algoritmust adjuk meg. (Gyakorlásképpen a tisztelt olvasó oldja meg úgy is!) A fordított sorozat kezdetben legyen az üres szöveg. Ehhez jobbról illesszük az eredeti szöveg jeleit hátulról előrefelé haladva. Például: a körte szövegből a fordított szöveg alakulása lépésről-lépésre ez lesz: e, et, etr, etrö, etrök.
A második megoldásban balról illesztjük az eredeti szöveg jeleit (elölről haladva), tehát a félig kész elé. Ez esetben a készülő fordított szöveg állapotai ezek lesznek: k, ök, rök, trök, etrök.
Érdemes rápillantani az alábbi animációra, amelyben körüljárjuk a fentieket.
Meglepő, de nehézségeket rejt a rendezési reláció. A probléma forrása az, hogy az ún. alfabetikus rendezés lényege az, hogy a két összehasonlítandó szöveg azonos indexű jeleit vetjük össze, és az (1.-vel kezdve) elsőként eltérő jelpár határozza meg a sorrendet. Például alfa<alma, mert az f előbb van az ABC-ben, mint az m. Úgy is mondhatnánk: f<m, így világosan kiderül, hogy valójában visszavezetjük a karaktertípusnál értelmezett rendezési relációra.
Első probléma: a magyar nyelvben az ABC-ben vannak többjelű betűk is, jól meghatározott helyre illesztve, azaz a jelenkénti hasonlítás fals eredményre vezethet. Például: a csacsi és a cumi sorrendje: csacsi, cumi, mivel az összes cs-vel kezdődőt meg előzi bármely c-vel kezdődő szó.
A második probléma: a magyar nyelvben lévő ékezetes betűket az addigra már definiált karakterkészletekben a fölöslegesnek vélt jelek helyére illesztették, így a karakterek rendezési elvére addig alkalmazott az a jel van előbb, amelyik kódja kisebb elv nem működik. Például: az alá és az alul sorrendje alul < alá lesz, mert á > u, a helyes alá < alul helyett.
A C++ kódoláshoz figyelmébe ajánljuk a következő dokumentumot:
A megismert összetett adattípusaink (a tömb és a szöveg) már lehetővé teszik, hogy elidőzzünk általában is bizonyos jellegzetes feladatfajták elemzésén.
Figyelje meg az alábbi animációban: a feladat specifikációból hogyan alkotjuk meg a megoldás algoritmusát!
Az animáció bemutatja hogy hogyan használhatunk fel tömböket a feladatok megoldása során.
Az alábbi animációban érdekes, összetettebb feladatok alkalmazását láthatja a tömböknek.
Az animáció bemutatja hogy hogyan használhatunk fel tömböket a feladatok megoldása során.