6.1 

Valósítsuk meg a 'baloldali rész' szövegmanipulációs függvény
segítségével a többi ilyen típusú függvényt! Nevezetesen:

   - 'középső szelet' (I. jeltől J db karakter),
   - 'jobboldali rész' (utolsó X db karakter),
   - 'i. jel' .

(BASIC-analógia:
   - 'baloldali rész' = LEFT$ függvény,
   - 'középső szelet' = MID$ függvény,
   - 'jobboldali rész'= RIGHT$ függvény.)


 6.2 

Valósítsuk meg a 'középső szelet' szövegmanipulációs függvény
segítségével a többi ilyen típusú függvényt! Nevezetesen:

   - 'baloldali rész' (első X db karakter),
   - 'jobboldali rész' (utolsó X db  karakter),
   - 'i. jel' .

(BASIC-analógia:
   - 'baloldali rész' = LEFT$ függvény,
   - 'középső szelet' = MID$ függvény,
   - 'jobboldali rész'= RIGHT$ függvény.)


 6.3 

Írjunk olyan algoritmust és programot, amely  egy  közönséges
írógépet utánoz! Ez az írógép 'csak arra képes', hogy a  leü-
tött billentyűnek megfelelő karaktereket a képernyőre kiírja.
(Ügyelni kell arra, hogy csak látható jelű billentyűk  lenyo-
mására legyen érzékeny a program! Így  pl.  a  kurzor-mozgató
billentyűk, vagy egyéb, funkcióval rendelkező  billentyű  le-
nyomása legyen hatástalan!)


 6.4 

Fejlesszük tovább az előző feladatban megfogalmazott  'közön-
séges írógépet' szimuláló programot úgy, hogy a kiírt  szöveg
jelenkénti törlés lehetőségét is megadja: a  'DEL'  billentyű
lenyomásával az utolsó jeltől visszafelé (egyesével) törli  a
képernyőn látható jeleket!


 6.5 

Egy - pl. adatállományból beolvasott - szöveget kell a képer-
nyőn megjelenítenünk. Mivel ez akár több képernyőnyi  is  le-
het, ezért fel kell készülnünk a  szöveg  a  felhasználó  ol-
vasási sebességéhez igazódó kiírására. Programunk kiírási se-
bességét pl. a számjegy billentyűkkel vezérelheti a  felhasz-
náló. (A '0' esetén a megjelenítés függesztődjék föl, az  '1'
..'9' billentyűk 9 sebességi fokozatot jelentsenek.)


 6.6 

Egy új gyógyszer nevének olyannak kell lennie, hogy  az  bár-
mely forgalomban levő gyógyszer nevétől legalább két  betűvel
különbözzék. Adott a forgalomban  levő  gyógyszerek  listája.
Készítsünk egy programot, amely eldönti egy új  névről,  hogy
lehet-e ilyet adni a gyógyszernek!


 6.7 *

Egy új gyógyszer nevének olyannak kell lennie, hogy  az  bár-
mely forgalomban levő gyógyszer nevétől legalább két  betűvel
különbözzék. Adott a forgalomban  levő  gyógyszerek  listája.
Készítsünk egy programot, amely felsorolja  azon  gyógyszere-
ket, amelyeknek neve 'leginkább  összekeverhető'  az  övével,
azaz azt a tizet, amelynek neve legkevésbé tér el. Az  'elté-
résfüggvény' lehet az alábbiak valamelyike:

   a. az eltérő betűk száma,
   b. az eltérő betűk helyiértékének valamilyen függvénye.


 6.8 **

Írjunk olyan algoritmust és programot, mely egy egyszerű gra-
fikus nyelven beírt programot tud értelmezni és végrehajtani!
Legyen a nyelv a következőképpen definiálva:

   - utasítások:
      - 'le', 'fel', 'jobbra', 'balra'
        (egységnyit lép az adott irányba),
      - 'ne rajzolj', 'rajzolj'
        (fölemeli a 'ceruzát'  - azaz a mozgás nyoma nem lát-
        szódik -, illetve leteszi a 'ceruzát' - azaz a mozgás
        nyomot hagy),
      - 'vége'
        (a forrásprogram végét jelzi).
  - nyelvtani szabályok:
      - két utasítást egymastól SZ•KÖZ választ el,
      - ha egy helyváltoztató utasítás előtt SZÁM áll,  akkor
        az azt követő utasítást SZÁMszor kell végrehajtani!

(Hasonló - bár bonyolultabb - feladat szerepelt 1988. évi Ne-
mes Tihamér Országos Középiskolai Számítástechnikai  Tanulmá-
nyi Versenyen.)


 6.9 

Rendezzük sorba a magyar ABC betűi szerint az osztály tanuló-
inak neveit! Ügyeljünk arra, hogy a  nevekben  szerepelhetnek
ékezetes betűk is, és ezekre a < reláció  nem  a  magyar  ABC
szerinti sorrendet adja a számítógép! (Pl. elképzelhető, hogy
'BÉKÉSI'>'BOKOR'.) A nevekben csak nagybetűk szerepelhessenek
az egyszerűség kedvéért!


 6.10 

Adott az osztály névsora (ABC-sorrendben). Illesszük  be  egy
új tanulónak a nevét a névsorba!


 6.11 

Egy névsor érkezési sorrendben készült. Rendezzük úgy a neve-
ket, hogy e sorrend is megmaradjon! Ezt  egy  indexszel  való
kiegészitéssel érhetjük el, az index fejezze ki a  névsorbeli
helyét!


 6.12 

Az érettségi bizonyítvány kiosztására egyazon ünnepélyen  ke-
rül sor mind a négy 4. osztálynak.  Írjunk  programot,  amely
megkönnyíti az iskola igazgatójának a munkáját: a négy  (ren-
dezett vagy rendezetlen) osztálynévsorból egyetlen  rendezet-
tet készít!


 6.13 

Az érettségi banketten a lányok és fiúk tánccal  nyitják  meg
az ünnepséget. A rendezőknek sok fejtörést okozott, hogy  mi-
ként állítsák össze a párokat. (Szerencsére  ugyanannyi  lány
volt, mint fiú. Vita akörül forgott, hogy ki kivel lépjen  be
a táncterembe.) Végülis úgy döntöttek, hogy névsorba rendezik
külön-külön a lányokat és a fiúkat, majd a névsor  első  höl-
gyére bízzák, hogy egy kalapból kihúzza partnere nevét. A kö-
vetkező hölgy az előbbi fiút követővel áll párba, és így  to-
vább. A fiúnévsor utolsóját az első követi. Segítsünk  rajtuk
azzal, hogy a két rendezett listát elkészítjük az (egy rende-
zett) osztálynévsorból, sőt  a  kalapból  kihúzás  helyett  a
program egy véletlenszám generálásával  jelölje  ki  az  első
párt. Írja ki a párosítást a képernyőre! (A  szétválogatáshoz
rendelkezésünkre áll egy lány-, illetve egy fiúkeresztneveket
tartalmazó névgyűjtemény.)



   Sajátos 'logikájú' a LOGO nyelv  szövegkezelése,  s  mivel
egyben tipikus példája az ún. funkcionális  nyelveknek,  fon-
tosnak tartjuk az alfejezetben különönállóan összefoglalni  a
vele kapcsolatos ismereteket. (Bár előre kell  bocsátani,  az
itt felsorolt feladatok némelyike valamelyik későbbi  alfeje-
zetekbe jobban beleillene, az együtt  szerepeltetést  azonban
fontosabbnak éreztük.) A LOGO alábbi kulcsfogalmainak ismere-
tére építenek a feladatok:

   - LISTA, üres LISTA,
   - hierarchikus LISTA: fastruktúrájú szerkezet,
   - a szöveg mint speciális LISTA (betűk listája),
   - 'függvénytani' alaputasítások
     FIRST=első elem, BUTFIRST=első elem nélkül,  LAST=utolsó
     elem,BUTLAST=utolsó elem nélkül, FPUT=listához elsőként,
     LPUT=litához utolsóként,  COUNT=elemszám,  EMPTY?=üres?,
     LIST=listába fűzés,  LIST?=lista-e?,   MEMBER?=eleme-e?,
     SENTENCE=listaegyesítés, WORD?=szó?, OUTPUT=függvény ér-
     ték kilépés,
   - a rekurzív függvények globális szerkezete:
     to rekurzívfüggvény :paraméterek
      if üres? :paraméter then output ...
      ; nem üres esetben teendők, többnyire ilyesmi:
      output transzformáció rekurzívfüggvény csökkentett :pa-
      raméterek
     end
     Ennek megvilágítására álljon itt egy példa:
     to faktoriális :n
      if :n=0 then output 1
      output :n*faktoriális :n-1
     end


 6.14 

Válasszuk ki egy X szöveg  (vagy  általában:  bármely  elemek
listájának) I. elemét! A függvényt úgy írjuk meg,  hogy  fel-
használhatjuk az EMPTY?, a FIRST és a  BUTFIRST  függvényeket
(természetesen az OUTPUT utasításon kívül).


Megoldás:
   to elem :i :x ; az x lista i. eleme=az x szöveg i. betűje
     ; ha üres, akkor az i. eleme is 'üres'
     if empty? :x then output []
     ; ha az első eleme kell a listának,  akkor az  eredmény:
     első eleme(x)
     if :i=1 then output first :x
     ; különben az eredmény: az első nélkülinek az i-1. eleme
     output elem :i-1 butfirst :x
   end


 6.15 

Az előbbi feladatot oldjuk meg most  úgy,  hogy  a  FIRST  és
BUTFIRST függvények helyett a LAST, és a BUTLAST függvényeket
használjuk föl!


 6.16 

Írjuk meg a következő függvények LOGO  programját!  Zárójelek
között fölsoroljuk a felhasználható függvényeket.

   1. Egy X szöveg tartalmazza-e az E szöveget
      (EMPTY?, FIRST, BUTFIRST);
   2. Az X szöveg hossza, azaz a lista elemei száma
      (EMPTY?, BUTFIRST);
   3. Az X,Y szöveg konkatenációja (összefűzése);
      (EMPTY?, LAST, BUTLAST, LPUT);
   4. Az X szöveghez hozzáfűzi az E betűt;
      (EMPTY?, FIRST, BUTFIRST);
   5. Az X utolsó betűje;
      (EMPTY?, LAST, BUTLAST);
   6. Az X szöveg az utolsó betű nélkül;
      (EMPTY?, FIRST, BUTFIRST,FPUT);
   7. Az X rendezett szósorozatba az E szót beilleszti a  he-
      lyére;
   8. Az X szöveg az E szó nélkül;


 6.17 

Készítsünk táblázatot gépünk karakterkód és  karakter  megfe-
leltetéséről! (Vigyázzunk a kiírt képpel nem rendelkező, 'ha-
tással rendelkező' karakterek kiírására!)


 6.18 

Írjunk olyan algoritmust és programot,  mely  egy  beolvasott
szöveg betűinek ASCII kódját sorban kiírja! (Így  egy  szöveg
esetleg nem látható - rejtve maradt - jelei is láthatóvá vál-
nak.)


 6.19 

Tudjuk, hogy látható képpel rendelkező jeleink kódjai  32  és
126 között találhatók (tehát kisebbek 128-nál, azaz  7  biten
ábrázolhatók). Egészítsünk ki paritásbittel minden jelet  eb-
ben a kódintervallumban! (Azaz a legértékesebb  bit  elé  il-
lesszünk egy bitet, ami pl. páratlan számú 1-es bitet tartal-
mazó kóddá egészíti ki.) Írjunk táblázatot az így keletkezett
- esetleg megváltozott - kódokról! Pl. páratlan paritás  ese-
tén:

    *     *                    *              *
    * Jel * paritásbit nélküli * paritásbites *
    *     *       kód          *      kód     *
    *******************************************
    *  A  *        65          *      193     *
    *  B  *        66          *       66     *
    *  .  *        .           *       .      *



 6.20 

A beolvasott szöveget kell meghatározott hosszúságú blokkokra
bontva kiegészítenünk  egy  karakternyi  (bájtnyi)  ellenőrző
összeggel! A blokkhossz legyen 127 bájt. Az ellenőrző  összeg
kiszámítása többféleképpen történhet:

   1. adjuk össze a blokkhoz tartozó jelek kódjait,  majd ve-
      gyük a 256-tal való osztási maradékát; vagy
   2. 'kizáró VAGY' műveletet használjunk az előbbi összeadás
      helyett  (mivel  így  mindig egy bájtos a részeredmény,
      ezért nincs szükség a végén az osztási maradék képzésé-
      re).


 6.21 

Az előző feladatot azzal a feltételezéssel toldjuk meg,  hogy
a beolvasott szöveg jeleinek kódja nem haladja meg a  127-et;
a beolvasást követően először is egészítsük ki jelenként  pa-
ritás bittel (páratlan paritásúra), majd ezután blokkosítva a
megfelelő ellenőrző összeggel! Figyelem, az ellenőrző  összeg
is legyen paritáshelyes!


 6.22 **

Egy mérőberendezés a következő formátumú  egységekben  (blok-
kokban) rögzíti mérési eredményeit lyukszalagra:

 'start'+'óra'+'perc'+mérési értékek+ellenőrző összeg+'stop',

ahol az aposztrofok közöttiek egy valamilyen  speciális  kódú
jelet vagy jeleket reprezentálnak.

      'start' = 127,101,127 (három kötött bájt),
      'óra'   = 0..23 közötti értékű bájt,
      'perc'  = 0..59 közötti értékű bájt,
      'stop'  = 127,103,127 (három kötött bájt).

A mérési értékek 0-99 kódú jelek lehetnek. Az ellenőrző  ösz-
szeg kiszámítása a következőképpen történik: a blokkot alkotó
karakterek összege modulo 128 (azaz osztási  maradék  128-cal
osztva). Minden egyes adat (legyen az mérési adat  vagy  akár
speciális  jel)  legmagasabb  helyiértékű  bitje  paritásbit.
Ilyen blokkok alkotják a teljes mérési  sorozatot.  A  teljes
sorozat idő szerint rendezve kerül rögzítésre. A  lyukszalag-
lyukasztó berendezés - sajnos - gyakran követ el hibákat. Ír-
junk hibafelismerő, illetve hibajavító programot, ha  tudjuk,
hogy az alábbi hibalehetőségekre kell számítani:

   1. egy-egy jel eltorzulása  (föltehetjük,  hogy az időada-
      tok nem romolnak el!),
   2. a blokknak bármely jele torzulhat,
   3. a 2.-n túl ki is maradhatnak mérési értékek.


 6.23 

Az egész számok számjegyes (karakteres)  ábrázolásánál  tömö-
rebb ábrázolása a következő: minden számjegyhez 4 bitet  ren-
delünk, a '0'-hoz 0000-t, az '1'-hez 0001-t,  ...  a  '9'-hez
1001-t. Így egy bájt a szám két számjegyét képes tárolni. Ír-
junk programot, amely segítségével legfeljebb  6  számjegyből
álló (karakteres ábrázolású) számokat ilyen ún. BCD ábrázolá-
sú (3 bájtos) számokká alakítja (és viszont)! A negatív  szám
előjelét első 'számjegyként' az 1111-kód jelentse!


 6.24 *

Az előző feladatot egészítsük ki egy 'eljáráscsomaggal',  ami
lehetővé teszi (rögzített hosszúságú) BCD-alakú számokkal  az
alábbi műveletek elvégzését:

   - összeadás,
   - kivonás,
   - szorzás,
   - relációba állítás (<,>,=,...),
   - 0 értékű-e.


 6.25 

Tegyük meg a következő kiegészítést!  A  BCD-számokat,  azért
hogy tetszőleges hosszúságúakkal dolgozhassunk,  kiegészítjük
az első félbájtján a 'hosszúságával'.
Pl.:
     1234 -> 01000001 00100011 0100....
                4   1    2   3    4
                
hossz  BCD számjegyek

Hogyan módosulnak az előzőekben  megírt  programcsomag  egyes
eljárásai? Feltehetjük, hogy felesleges  (ún.  vezető)  0-kat
nem tartalmaznak a számok.


 6.26 *

Egy királyi család fiúági leszármazási fáját az alábbi (szek-
venciális) módon tároljuk:

  ( király ( gyermek1 (unoka1) (unoka2) ( gyermek2 (...) ) )

(Természetesen a családfa rekurzívan tovább  'mélyíthető'  -a
konkrét esetnek megfelelően.)

   1. Adjuk meg,  hogy hány generációt tartalmaz az így ábrá-
      zolt családfa!
   2. Keressük meg a királyi család  azon  tagját,  akinek  a
      legtöbb fiúgyermeke volt!
   3. Döntsük el a családfa alapján,  hogy volt-e  valaha  is
      Kázmér királynak Kázmér nevű gyermeke!
   4. Ellenőrízzük,  hogy az így  felírt  családfa  formailag
      (szintaktikusan) helyes-e!
   5. Adjuk meg, hogy hány tagú a királyi család!


 6.27 **

Készítsünk 'elektronikus  társalgási  zsebkönyvet',  amelyben
viszonylag kevés alapszóból és kifejezésből  felépített  kész
mondatok találhatók magyar és angol  nyelven,  szituációnként
csoportosítva. Találjunk ki olyan tárolási módot,  amely  ki-
használja, hogy az egyes szavak, szókapcsolatok  sokszor  is-
métlődhetnek! Készítsünk programot, amely - az általunk kita-
lált tömör tárolású szövegből - ki tud listázni egy  megadott
szituáció összes mondatát!

 6.28 *

Az előbbi feladatot átfogalmazhatjuk egy  valamilyen  tudomá-
nyos szakcikk esetére is, ahol - szempontunkból -  szintén  a
viszonylag szűk szókincs a lényeges. Tehát a feladat: készít-
sünk  egy szótárt, amely tartalmazza a cikk szakszavait és az
ezekből építkező szakkifejezéseit!  (Igyekeznünk  kell  minél
tömörebb ábrázolást találni!)


 6.29 

Készítsünk algoritmust, amely egy beolvasott  szövegben  meg-
számolja, hogy hány határozott névelő található!

A megoldáshoz feltesszük, hogy határozott  névelő  ('a'  vagy
'az') előtt is, mögött is szóköz található és hogy  a  szöveg
legfeljebb egy 'sornyi'. Így a megszámlálás tételt  kell  al-
kalmaznunk a ' a ', illetve a ' az ' jelsorozatra:

Program:                         10 REM C64 BASIC kód:
                                 15 PRINT "         Hata
                                 rozott nevelok"
 Be: szöveg [nem üres szöveg]    20 INPUT "Szoveg:";SZ$:
                                 .     IF SZ$="" THEN 20
 s:=0                            25 S=0
 Ciklus i=1-től hossz(szöveg)-ig 30 FOR I=1 TO LEN(SZ$)
   ne1:=i.jeltől 4 jel(szöveg)   35 : N1$=MID$(SZ$,I,4)
   ne2:=i.jeltől 5 jel(szöveg)   37 : N2$=MID$(SZ$,I,5)
   Ha ne1=' a ' vagy ne2=' az '  40 : IF N1$=" a " OR
     akkor s:=s+1                .     N2$=" az " THEN S=S+1
 Ciklus vége                     45 NEXT I
 Ki: s                           50 PRINT "A hatarozott nevel
                                 .     ok szama=";S
Program vége.                    55 STOP


 6.30 

Írjunk olyan algoritmust és programot,  amely  egy  szövegben
'hézagos mintát' tud keresni,  és  az  előfordulási  helyeket
megjelöli! ('Hézagos minta' alatt  azt  értjük,  ha  egy  fix
hosszúságú láncból csak néhány karaktert rögzítünk le, a töb-
bit valamilyen általunk meghatározott 'joker' karakterrel he-
lyettesítjük. Pl.: 'al$$fa' minta ráillene az  'almafa'  szö-
vegre. Most a $-jel a joker-karakter.) Oldjuk meg a feladatot
'átfedő' és 'nem átfedő' minták esetére is!


 6.31 

Írjunk programot, amely egy szövegben megszámolja a szavakat!
(Figyelem: 2 szó között nem biztos, hogy csak egy  db  szóköz
van! Azt feltehetjük, hogy az írásjeleket közvetlenül  megfe-
lelő szavak mögé írjuk és hogy nincs elválasztva egyetlen szó
sem!)


 6.32 

Készítsünk programot, amely megmondja,  hogy  egy  beolvasott
szövegben megtalálható-e egy másik hasonlóan megadott szöveg!


 6.33 

Adott egy osztály névsora, például  adatállományból  olvastuk
be. Döntsük el programmal, hogy rendezett-e névsor szerint!


 6.34 

Adott egy osztály névsora, például  adatállományból  olvastuk
be. Válogassuk ki a testvéreket (pontosabban: az azonos veze-
téknevű tanulókat)!


 6.35 

Írjunk programot, amely egy szövegről eldönti, hogy  hátulról
olvasva ugyanazt a szöveget kapjuk-e, mintha  elölről  olvas-
suk! (A szóközöket, továbbá a kis- és nagybetűk  különbözősé-
gét ne vegyük összehasonlításkor figyelembe!)
Pl.: 'Géza kék az ég' ugyanaz, mint 'gé za kék azéG'


 6.36 

Számoljuk meg, hogy az adott szöveget  hány  mondat  alkotja!
Figyeljünk arra, hogy a sorszámok is tartalmaznak pontot,  de
nem alkotnak önálló mondatot! Az esetleges rövidítéseket  le-
záró pontot a tényleges mondatvéget jelentő írásjeltől külön-
böztessük meg az alapján, hogy nagybetűvel kezdődik-e  a  kö-
vetkező szó vagy sem!


 6.37 

Írjunk programot, amely egy szövegben előforduló jelek  rela-
tív gyakoriságát megszámolja,  és a nem nulla  gyakoriságokat
kiírja a megfelelő jelekkel  együtt!  (Relatív  gyakoriságnak
nevezik az előfordulási szám és az összelemszám hányadosát.)


   Az elkövetkező 4 feladatban versek vizsgálatával foglalko-
zó programokat kell írni. Ehhez azonban szükséges némi előis-
meret. Ezek, csak felsorolásszinten, a következők:

   - magas, mély magánhangzók, szótagok,
   - zöngés, zöngétlen mássalhangzók,
   - hosszú, rövid szótagok,
   - ritmikai képletek (daktilus, jambus, ....),
   - rímképlet,
   - alliteráció.


 6.38 *

Készítsünk verselemző programot versek hangtani elemzésére! A
program legyen képes versek

   - beolvasására akár klaviatúráról, akár  adatállományból;
   - kiírására akár képernyőre, akár háttértárra;
   - magas és mély hangrendű szótagok  elhelyezkedésének  ki-
     jelzésére, versszakonkénti és a teljes versre  vonatkozó
     statisztika összesítésére;
   - zöngés és zöngétlen mássalhangzókra  előbbihez  hasonló
     elemzést adni  (zöngétlenek: c, cs, f, k, p, s,  sz,  t,
     ty; zöngések: b, d, dz, dzs, g, gy, h, j, l, ly,  m,  n,
     ny, r, v, z, zs)!


 6.39 *

Készítsünk verselemző programot versek hangtani elemzésére! A
program legyen képes versek

   - beolvasására akár klaviatúráról, akár  adatállományból;
   - kiírására akár képernyőre, akár háttértárra;
   - hosszú és rövid szótagok kijelzésére, versszakonkénti és
     a teljes versre vonatkozó statisztika elkészítésére;
   - legfontosabb, nevezetes ritmikai képletek  felismerésére
     (daktilus, jambus, trocheus...) jelölésére;
   - rímképletének megadására!


 6.40 *

Készítsünk verselemző programot versek gyakorisági  elemzésé-
re! A program legyen képes versek

   - beolvasására akár klaviatúráról, akár  adatállományból;
   - kiírására akár képernyőre, akár háttértárra;
   - alábbi statisztikai jellemzőinek meghatározására  soron-
     ként, versszakonként, illetve a teljes versre:
      - magán-/mássalhangzók gyakoriságarányának;
      - magas/mély magánhangzók gyakoriságának aránya;
      - zöngés/zöngétlen mássalhangzók gyakoriságaránya;
      - szótag- és szószám (csak soronként)!


 6.41 *

Készítsünk verselemző programot versek 'rímtani'  elemzésére!
A program legyen képes versek

   - beolvasására akár klaviatúráról, akár  adatállományból;
   - kiírására akár képernyőre, akár háttértárra;
   - alliteráció felismerésére,
   - rímképlet megadására  (nemcsak tisztarímek, hanem asszo-
     náncok esetén is)!


 6.42 

Készítsünk statisztikát az osztályban  előforduló  keresztne-
vekről; majd válasszuk ki ez alapján a két legdivatosabb  ke-
resztnevet!


 6.43 

A  közelmúlt  keresztnévdivatjának  változásait  mutassuk  ki
programmal! A program olvassa be az egyes évfolyamok végzőse-
inek (kereszt)nevét,  majd  állítson  össze  statisztikát  az
adott év keresztnéveloszlásáról, külön  kiemelve  közülük  az
akkori legdivatosabbat!


 6.44 

Válasszuk ki a beolvasott szövegből azt a leghosszabb részle-
tét, amely legalább kétszer ismétlődik!


 6.45 

Hasonlítsunk össze két szöveget; döntsük el, hogy azonos  be-
tűkből állnak-e!


 6.46 

Van-e a vizsgált szövegben olyan hárombetűs részlet,  amelyik
többsször fordul elő? Az ismétlődést kétféleképpen értve:

   1. az ismétlődő részletek nem 'átfedőek';
   2. az ismétlődő részleteknek lehetnek közös részeik.

Pl. a ''tralalala'' szövegben az ismétlődések száma:
   1. szerint 3,          2. szerint 2.
        (tra)ala              (tra)ala
               ala                   (l)
                 ala                  ala


 6.47 

Cseréljük ki a szöveg kisbetűit nagybetűs párjaikkal!


 6.48 

Írjunk olyan algoritmust és programot,  amely  egy  szövegben
minden szó első betűjét nagybetűvel írja! (Vigyázzunk  a  kü-
lönálló írásjelekre, számokra!)


 6.49 

Készítsünk programot, amely a szöveg  minden  magánhangzóját,
ha kell, ékezetesíti; azaz sorra véve a  magánhangzókat  meg-
kérdezi, hogy az átalakítást el kell-e végezni!  Az  ékezetes
betűk megfeleltetése legyen a következő:  á=a',  é=e',  í=i',
ó=o', ö=o:, ő=o'', ú=u', ü=u:, ű=u''! (A nagy ékezetes betűk-
kel hasonlóan bánjunk!)


 6.50 

Írjunk programot, amely egy szövegből, adott jelet,  jelsoro-
zatot kivesz és az ezt követő első betűt nagyra írja át!
(pl.: !ez is. !az is. -->  Ez is. Az is.)


 6.51 

Szeretnénk egy szöveg értelmét mások elől 'eltitkolni', ezért
kitaláltuk a következő  titkosírási  szabályt:  minden  jelet
kicserélünk az ASCII kódban rákövetkező  karakterre,  és  így
tároljuk, vagy jelenítjük meg. (Ha olyan karaktert  kell  át-
alakítani, melynek nincs 'értelmes' rákövetkezője, akkor  he-
lyette írjuk a legelső karaktert!) Tervezzünk  olyan  progra-
mot, mely elvégzi a megfelelő átalakítást, és kiírja  az  így
kapott szöveget!


 6.52 

Készítsünk programot, amely egy, az előző  feladatban  megfo-
galmazott titkosítási szabály  szerint  átalakított  szöveget
egy bizonyos szó - a felhasználói kulcs, az ún. jelszó - beí-
rása után visszaalakítja az eredeti szövegre!


 6.53 

Titkosítsunk egy szöveget adott szabály szerint!  A  szabályt
úgy írjuk le, hogy minden egyes  betűhöz  megadjuk  a  kódolt
párját!


 6.54 

Írjuk meg az előbb megadott módon titkosított  szöveget  meg-
fejtő programot!


 6.55 

Írjunk algoritmust és programot, amely egy szöveget úgy  tit-
kosít, hogy egy megfelelő helyeken kilyukasztott  négyzetrács
felhasználásával lehessen elolvasni. A program -  igény  sze-
rint esetleg - a visszaalakítást is tudja elvégezni!

 Pl.   a szöveg:         a kulcs:

        1234567890        1234567890
     1 !Eltöm a fö!    1 !o o o o o !
     2 !ld, elmorz!    2 !          !
     3 !sol a teng!    3 !o o o o o !
     4 !er. Azt mo!    4 !          !
     5 !ndják, hog!    5 !o o o o o !
     6 !y meghalok!    6 !          !
     7 !, de annyi!    7 !o o o o o !
     8 ! mindenfél!    8 !          !
     9 !ét hall az!    9 !o o o o o !
     0 ! ember ...!    0 !          !







     a kódolt szöveg:
        Etmafslatnnjk o,d nyé ala
        lö  öo  egdá,hg eanithl z
        ....
        ....


 6.56 

Írjunk programot, amely egy szöveg szavait  alfabetikus  sor-
rendben írja vissza!


 6.57 

Készítsünk algoritmust és programot, mely tetszőleges  szöveg
típusú változóban tárolt számot átalakít normálalakba! A szám
normálalakja alatt értsük a következőt:

   mantissza E karakterisztika ,

ahol a mantissza 0 vagy 0.1 és 1 (balról zárt, jobbról  nyílt
intervallum) közötti tizedestört (esetleges előjellel); a ka-
rakterisztika pedig előjeles egész szám!


 6.58 

Alakítsunk át tetszőleges normálalakban felírt számot fixpon-
tos tizedestört alakba! A szám fixpontos alakja:

   egészrész . tizedesrész ,

ahol az egészrész is, a tizedesrész is számjegyek sorozata.


 6.59 

Alakítsunk át egy hexadecimális számot decimális  számmá!  (A
hexadecimális  szám:  ....H,   ahol   a   pont   helyén   egy
hexadecimális számjegy, azaz 0, 1,...,  A,  B,  C,  D,  E,  F
lehet.)


 6.60 

Konvertáljunk egy decimális számot hexadecimális számmá!


 6.61 

Alakítsunk át egy hexadecimális számot bináris számmá! (A bi-
náris számot írjuk a következőképpen: ........B, és a  pontok
helyén 0 vagy 1 lehet.)


 6.62 

Írjunk olyan algoritmust és programot, amely egy bináris szá-
mot átír hexadecimális számmá!


 6.63 

Alakítsunk át egy  tetszőleges számrendszerben felírt tetsző-
leges számot egy adott másik  számrendszerbe!  (10-nél  maga-
sabb alap esetén a számjegyeket az  ABC  betűiből  vegyük,  a
gyakorlatnak megfelelően!)


 6.64 

Írjunk programot, amely egy  helyiértékenként  változó  alapú
számrendszerbeli számot átkonvertál decimálissá.

Pl. a helyiértékekhez tartozó alapok  (balról, a magas helyi-
    értékek felől kezdve):
      6 5 4 3 2
    és ebben egy szám:
      1 2 3 2 1 1
    decimális megfelelője:
     1*6*5*4*3*2+2*5*4*3*2+3*4*3*2+2*3*2+1*1+1=
     =720+240+72+12+1+1=1046


 6.65 

Írjuk ki a beolvasott szöveget úgy, hogy a szövegben  szerep-
lő TAB karakterek helyett megfelelő számú SZ•KÖZ szerepeljen!
A TABok jelentése: a kiírást az aktuális pozíciót követő  un.
tabulációs pozíciónál kell folytatni! A tabulációs pozíciók:

   - rögzített távolságra (pl. 10 karakternyire) követik egy-
     mást,
   - tetszőleges, de rögzített (paraméterként beolvasott) he-
     lyeken vannak (pl. 10.-en, 18.-on, 30.-on).


 6.66 

Adott egy szöveg, amelynek szavait esetleg több SZ•KÖZ karak-
ter választhatja el. Helyettesítsük  -  a  szöveg  rövidítése
céljából - ott, ahol lehet TAB karakterekkel! (A TAB karakte-
rek jelentését lásd az előző feladat szövegében!)


 6.67 

Írjunk olyan algoritmust és programot, amely egy szöveg  sza-
vait adott hozzárendelési szabály szerint kódjaikra cseréli!
Pl.:
   a szöveg = 'alma az almafa alatt',
   a szabály= 'al'->'A', 'fa'->'B',
   az átalakított szöveg = 'Ama az AmaB Aatt'.


 6.68 

Tömörítsünk egy szöveget  úgy,  hogy  a  szavakat  elválasztó
'többlet' szóközöket (a 2.-t, a 3.-at, ...) elhagyjuk!


 6.69 

Tömörítsünk egy szöveget úgy, hogy az egymás utáni N db  szó-
közt %N-re cseréljük ki! Ahol N a szóközök számával megegyező
kódú karaktert jelöl, ha 255-nél több szóközt kell  helyette-
síteni, akkor megfelelő számú %N karakterpárral oldjuk meg!


 6.70 

Írjunk olyan algoritmust és programot, amely  egy  tömörített
szöveget normálalakban tud képernyőre írni! (A tömörítést úgy
végeztük, hogy az egymásutáni N db szóközt %N-re cseréltük.)


 6.71 *

A nagy mennyiségű - de speciális - szöveg gazdaságos  tárolá-
sát végezhetjük el úgy, hogy a benne szereplő jeleket  'átde-
finiálva' folytonos és  kis  kódtartományba  transzformáljuk.
Például, ha csak nagybetűkből és egy-két speciális elválasztó
jelből - mondjuk: szóközből, pontból, vesszőből - áll a  szö-
veg, akkor megfeleltetjük nekik a 0-31 közötti kódokat;  ele-
gendő minden egyes jelnek 5 bit. Így bájtokat  'összeragaszt-
va' a teljes szöveget 5/8-ára csökkenthetjük. (Pl. ilyen elvű
az ún. telex-kód).
Írjunk programot, ami elvégzi ezt a tömörítést, illetve a tö-
mör szöveg kifejtését!


 6.72 **

Az előző tömörítés ötletét továbbfejlesztjük:  automatizáljuk
a kódolási szabályok felállítását. A program feladata, hogy a
szöveg alkotta különböző jelek számát és  féleségét  megadja;
majd meghatározza, hogy hány bit kell ezek folyamatos kódolá-
sához. Felállítja az eredeti  'kód-tömör  kód'  hozzárendelés
szabályait, és elvégzi a tömörítést. Ne felejtse el a program
a tömörített szöveg elé illeszteni a szabályokat  is,  hiszen
ez alapján lehetséges majd  a  visszaalakítás!  A  tömörített
szöveg célszerű formátuma:

   n + b + ek + tk + ... + ek + tk + tömör szöveg ,
           +-----+   ...   +-----+
              1.              n.

ahol n =a szabályok száma,
     b =a tömörített kód bitszélessége,
     ek=az eredeti kód,
     tk=a tömörített kód.


(Megjegyzés: bizonyos információk elhagyhatók a fenti tömörí-
tett szövegből!)


   A következő feladatok számokkal végzett nagypontosságú mű-
veletek elvégzését célozzák  (un.  string-aritmetika).  Közös
gondolatuk, hogy a számokat mint számjegyek (karakterek)  so-
rozataként képzelik el, amelyeken a szokásos 'manuális' algo-
ritmussal végezzük el a műveleteket. Ezek algoritmizálása, és
programozása a feladat. (Egész, előjeles egész, fix-  és  le-
begőpontos tört stb. számokra külön-külön érdemes  meggondol-
ni.)


 6.73 

Adjunk össze két  'sokjegyű'  előjel  nélküli  egész  számot!
('Sokjegyű'-nek nevezzük a számot, ha a számítógép  már  csak
normálalakban tudja ábrázolni, az alacsony helyiértékű jegyek
elhagyásával! Vagyis pontosan csak szövegként vagy vektorele-
mekben tárolható.)

 6.74 

Az előbbiek mintájára  írjunk  olyan  programot,  amely  több
'sokjegyű' előjeletlen egész számot képes összeadni! ('Sokje-
gyű'... ld. korábban!)


 6.75 

Vonjunk ki egymásból két 'sokjegyű' egész számot!


 6.76 

Lépjünk tovább a string-aritmetikai eljáráscsomag bővítésében
úgy, hogy az eddigieket előjeles egész  számokra  is  képesek
legyünk elvégezni!


 6.77 

Bővítsük az előző feladatok megoldását két 'sokjegyű' (elője-
les) egész szám összeszorzásával!


 6.78 *

Gondoljuk meg az osztás 'manuális' algoritmusát is!
A program legyen képes

   1. két egész szám hányadosának egészrészét kiszámítani!
   2. két egész szám hányadosát adott számjegyre  (törtrészét
      is figyelembe véve) kiszámítani!


 6.79 

Az előző feladatokra építve gondoljuk meg, hogyan  módosulnak
az algoritmusok, ha egész számokról áttérünk  fixpontos  szá-
mokra (amelyek tehát tartalmazhatnak tizedes ponttal  kezdődő
törtrészt is).


   Már az ókori görögöket is foglalkoztatta a következő prob-
léma: bizonyos számok, pl. a négyzetgyök 2 vagy a  PI  előál-
líthatók-e két természetes szám  hányadosaként.  Mint  tudjuk
mindkettő irracionális szám, sőt a PI még  'furcsább'  tulaj-
donságú un. transzcendens szám. A későbbiek során bővült ezen
'furcsa számok' társasága az e-vel. Az alábbi néhány  feladat
ezen számokkal kíván foglalkozni.


 6.80 

Adjuk meg a négyzetgyök 2 értékének első 100 jegyét! A  nagy-
pontosságú műveleteink segítségével az

   N(k+1) := ( 2 - N(k)*N(k) / 2 )

iterációs formulát használjuk! (N(k) jelöli  a  k.  iterációs
lépésben a négyzetgyök 2 értékét.) Addig kell végezni a  szá-
mítást, amíg a megfelelő számú tizedesjegyet elő nem állítot-
tuk. (A módszer szerencsére olyan, hogy minden egyes lépésben
az értékes jegyek számát megduplázza.)


 6.81 

Próbáljuk kiszámítani a PI-t adott (mondjuk 200) jegyre!  Al-
kalmazzuk Wallis 1655-ben felfedezett formuláját:

    PI   2   2   4   4   6   6
   --- = - * - * - * - * - * - * ...
    2    1   3   3   5   5   7


 6.82 

Próbáljuk kiszámítani az e-t adott (mondjuk 200) jegyre! Az e
számítására ajánlható az alábbi (Taylor-formulából  származó)
képlet:

            1    1    1    1
    e = 1 + -- + -- + -- + -- + ...
            1!   2!   3!   4!

(Az 1! az 1 faktoriálisát, a 2! a 2-ét ... jelöli.)


   A további néhány feladat egy érdekes  és  egyben  alapvető
területére vezet bennünket a  számítástudománynak,  nevezete-
sen: a kifejezések (legyenek akár aritmetikai,  logikai  vagy
más)  kiszámításának  területére.   (A   gyakran   fölbukkanó
'lengyel formá'-ról olvashatunk -többek között- Varga László:
Rendszerprogramok elmélete és gyakorlata című könyvében.)


 6.83 

Adjuk meg az algoritmusát annak a programnak, amely egy  nor-
mál módon megadott konstansokat és alapműveleteket tartalmazó
numerikus kifejezést (postfix) lengyel formára hoz!

Pl.: Az

   5*(2+3.1415)/(4-1.41)      kifejezésnek megfelelteti az
   5 2 3.1415 + * 4 1.41 - /  lengyel formájú  kifejezést.


 6.84 

Írjunk olyan algoritmust és programot, amely egy konstansokat
és alapműveleteket tartalmazó lengyel formájú numerikus kife-
jezést kiértékel!


 6.85 

Felhasználva az előbbi feladatok kapcsán elkészült algoritmu-
sokat és  programokat  bővítsük  a  kifejezésben  használható
alapelemek (konstansok, alapműveletek)  körét  függvényekkel!
Engedjük meg, hogy ismert függvényeket (sin,  cos,  tan,  sqr
stb.) is tartalmazhasson a  kifejezés!  Mennyiben  módosul  a
lengyel formára hozás algoritmusa, illetve a kiértékelés?


 6.86 

Gondoljuk meg, hogy mennyi újdonságot jelentene az, ha  nume-
rikus kifejezések helyett logikai kifejezéseket kellene  len-
gyel formára hoznunk, illetve kiértékelnünk!

Pl.: A

   0::=<ÁLLÍTMÁNY>.
                     vagy
              <ÁLLÍTMÁNY>.
   ::=
                     vagy
                     


   <ÁLLÍTMÁNY>::=

   ::=
                     vagy
                     


   ::= 'a' vagy 'az' vagy 'egy'

   ::= 't'

   ,, egy-egy szótárban felsorolt sza-
   vak összessége.

   Pl.: Egy nagy kutya szalad.
        A núbiai macska kergeti a sivatagi egért.

   Figyelem! A példa egyben arra is jó,  hogy  rámutasson:  a
   természetes nyelveknek sok nehezen szabályozható  sajátos-
   sága van ('egért' magyarul helyesen 'egeret')!


   Végezetül néhány nehezebb, 'vérbeli' programozói  feladat,
bár nemcsak ők vehetik  hasznát  az  elkészült  programoknak!
(Hogy még kik és mire használhatják, reméljük, kiderül -  kis
szabad fantáziálás után - a feladatok szövegéből!)


 6.94 **

Írjunk egy egyszerű ún. makroprocesszort!  Makroprocesszornak
hívják azt a programot, amely lehetővé teszi,  hogy  bizonyos
sokszor   -   változatlanul,   vagy   kis,    de    szabályos
változtatásokkal   -   ismétlődő   részeket   rövidítve    is
leírhassunk a szövegben.
A programnak meg kell adni azt, hogy mi legyen az  a  szöveg-
rész, amit rövidíteni szándékszunk (makrótörzs), és hogy  mi-
vel rövidítjük (ez a makró neve)!  Ez  a  makródefiniálás.  A
makródefiníció után már szabadon használhatjuk a  rövidítést,
azaz 'hívhatjuk' a makrót. A program dolga, hogy  feljegyezze
a makródefiníciókat, és felismerve a makróhívásokat behelyet-
tesítse oda a törzset (vagyis, amit rövidít a makró).  Tegyük
föl, hogy a szövegben minden makródefiníció a következő  for-
májú:

   %M név  ... makrótörzs ... %MV

Értelmezés:

   1. A '%M' és a '%MV' szöveg kötött:  ez  jelzi a definíció
      elejét, illetve végét.
   2. A 'név' tetszőleges betűkből és számokból álló szöveg.
   3. A makrótörzs bármilyen szöveg  lehet  (akár több sorból
      is állhat), de nem tartalmazhat  újabb  makródefiníciót
      vagy -hívást.
   4. A szóközök, elválasztó jelek fontosak.

A makróhívás a definícióban szereplő szöveggel történik. Hogy
könnyebben felismerhető legyen, ezért egy speciális jellel  -
mondjuk a '%' jellel - kezdődjék!

Pl. az alábbi Z80 assembly programot  a  makroprocesszor  így
alakítja át:

   A bemenet:

   ' LD HL,VALAMI
     %M LDDEHL
     LD D,H
     LD E,L
     %MV
     ADD HL,HL
     %LDDEHL
     ADD HL,HL
     ADD HL,HL
     ADD HL,DE '

   A kimenet:

   ' LD HL,VALAMI
     ADD HL,HL
     LD D,H
     LD E,L
     ADD HL,HL
     ADD HL,HL
     ADD HL,DE '


 6.95 **

Módosítsuk az előző feladatban leírt makroprocesszort két do-
loggal!

   1. A makródefinícióban is lehet makróhívás.
   2. Nagyobb 'flexibilitást' biztosítunk a makrók használha-
      tósága terén azzal, hogy megengedjük bizonyos részeinek
      hívástól függő megváltozását. Ezt  a  makrók  paraméte-
      rezhetőségével tesszük lehetővé.  A  makródefinícióbeli
      törzsben $x (x=1, 2, ...) jelöli az x. paramétert,  te-
      hát azt a szövegrészt, amit a híváskor aktualizálunk.

Pl. az előző feladatban szereplő Z80 assembly  programot  al-
kalmasan módosítva paraméteres makróval:

   A bemenet:

   ' LD HL,VALAMI
     %M LDRP
     LD $1,$3
     LD $2,$4
     %MV
     ADD HL,HL
     %LDRP D,E,H,L
     ADD HL,HL
     ADD HL,HL
     ADD HL,DE '

   A kimenet:

   ' LD HL,VALAMI
     ADD HL,HL
     LD D,H
     LD E,L
     ADD HL,HL
     ADD HL,HL
     ADD HL,DE '


 6.96 **

Igen hasznos lenne, ha az algoritmikus nyelvünket a  számító-
gép rögtön megértené,  ezzel  ugyanis  feleslegessé  válna  a
programírás egyik legfárasztóbb, s kétségkívül  legunalmasabb
része a kódolás. Tanítsuk meg a számítógépet  arra,  hogy  az
általunk írt algoritmust megértse, s -mondjuk- ELAN0  nyelvre
lefordítsa!


 6.97 

Táblázatoljuk a sin(), a cos(), a tg(), és a ctg() függvények
értékeit úgy egy táblázatban, hogy a  megfelelő  helyiértékek
egymás alatt helyezkedjenek el! (A feladat  - természetesen -
akkor érdekes, ha nem használjuk ki az egyik-másik  BASIC-ben
speciálisan a formázásra kitalált PRINT-beli lehetőségeket! A
PRINT USING-szerű lehetőségekre gondolunk.)


 6.98 

Nagyméretű grafikon kinyomtatásának sokszor nem az az  akadá-
lya, hogy nem képes a nyomtató grafikus jelek írására,  hanem
maga a grafikon olyan 'hatalmas', hogy képtelenség az  infor-
máció lényeges csökkenése  nélkül  megjeleníteni.  Gondoljunk
egy nagyon hosszú mérési sorozatra, amelynek  apró  részletei
is fontosak lehetnek! (Ilyen pl. egy kardiogram, vagy egy en-
kefalogram stb.) Ekkor a megjelenítést a papíron nem a szoká-
sos formában képzeljük el ('szélességében'), hanem a leporel-
lón hosszanti irányban 'végtelenítjük' az ábrát. Az egyes mé-
rési értékekhez megfelelően (normált) darabszámú  '*'  jelből
álló oszlop tartozik. Oldjuk meg, hogy az egyes oszlopok  alá
(vagy csak bizonyos oszlopok alá) korlátozott mennyiségű szö-
veg is írható legyen!


 6.99 

Egy - pl. adatállományból beolvasott - szöveget kell a képer-
nyőn megjelenítenünk. Mivel ez akár több képernyőnyi  is  le-
het, ezért fel kell készülnünk a szöveg esetleges lapozására.
Tervezzünk olyan programot, amely a szöveget 'lapozottan' ké-
pes megjeleníteni! (A felhasználó egy speciális  billentyűvel
- mondjuk a 'SZ•KÖZ'  billentyűvel -  tudatja  a  programmal,
hogy az éppen látható lapot elolvasta.


 6.100 

Bővítsük az előző feladat megoldását azzal feltétellel,  hogy
sor végén szót nem vághat ketté, azaz a következő  sorba  át-
nyúló szavakat teljes egészében vigye  át!  Legyen  lehetőség
megadni az aktuális sorhosszat, sőt beállítani a  'balmargót'
is (a sorok a képernyőn itt kezdődnek)!


 6.101 *

Egy bevitt dokumentumot 'bal- és jobbmargóhoz' igazítva  sze-
retnénk megjeleníteni. A sorokat csak szóközöknél szabad meg-
törni! A margók hollétét paraméterként kell a  felhasználónak
megadnia!


 6.102 

Egy szöveg megjelenítését úgy képzeljük el, hogy minden sor a
képernyő vagy - kinyomtatás esetén - a  lap  közepén  legyen.
Írjunk programot, amely ezt lehetővé teszi! Arra  is  figyel-
jünk, hogy szavakat ne vágjunk félbe, és egy  sorba  - termé-
szesen - minél több szó kerüljön!


 6.103 

Nyomtatónk szövegkiemelési lehetőségei meglehetősen  korláto-
zottak, ezért azt találtuk ki,  hogy  a  kiemelendő  szavakat
kétszer írja ki a papírra. (Tegyük föl azt, hogy  a  nyomtató
képes ugyanabba a sorba többször is nyomtatni, vagyis soreme-
lés nélkül újra meg újra nyomtatni.) A program, amely vezérli
a nyomtatót (vagy létrehozza a  nyomtatási  képnek  megfelelő
szöveget) a következőt tudja:

   1. A szöveget sorokra tördeli,  és első jelként egy megfe-
      lelő un. vezérlő jelet illeszt a sorhoz.  A vezérlő jel
      utasítja arra a nyomtatót, hogy a következő sorba írja-
      e a kapott egy sornyi szöveget ('1'),  vagy  ugyanabba,
      amibe az előzőt írta ('+').  A vezérlő jelek -természe-
      tesen- nem kerülnek nyomtatásra.
   2. Bizonyos  speciális  jelekkel  határolt  szövegrészeket
      felismer, ezeket kell duplán nyomtatni.


 6.104 

Az előző feladatban leírt nyomtatónk - sajnos - csak az angol
ABC-t ismeri, sőt csak a nagybetűket.  Módosítsuk  az  előbbi
programot azzal, hogy második ráírással külön írjuk az ékeze-
tes betűkre az ékezeteket, illetve a szövegbeli nagy- és kis-
betűket is ilymódon különböztetjük meg (a nagybetűket  duplán
írva). A szövegben az ékezetes betűket két  jellel  szerepel-
tetjük:

    á = a' , é = e' , í = i' , ó = o' , ö = o'' ( ő is ) ,
    u = u' , ü = u'' ( ű is ) , a nagybetűsekre hasonlóan.


 6.105 *

Adott szöveget beolvasva írjuk ki a képernyőre vagy a nyomta-
tóra lapokra, a lapon belül 2 hasábra tördelve!


 6.106 

Gyakran szükséges a szöveg bizonyos részeinek kiemelése.  Mi-
vel a nyomtatók néhány fajtája nem támogatja ezt  az  igényt,
ezért ezt magunknak kell valamilyen módon megvalósítanunk.  A
kiemelendő szót

   1. ritkítva szedve írjuk ki,
   2. aláhúzással emeljük ki  (ekkor  persze  minden  második
      sorba kerülnek csak a kiírandók, a köztessorok használ-
      hatók az aláhúzások elhelyezésére).

(A kiemelés szövegbeli jelölése a szöveg írója számára legyen
kényelmes!)


 6.107 

Matematikai szövegek szerkesztésénél gyakorta fölmerülő igény
az indexírás. Valósítsuk meg úgy, hogy az indexek egy  sorral
lejjebb, az indexelendő szó végéhez  igazítva  helyezkedjenek
el! Természetesen emiatt a normál szöveg csak minden  második
sorba írható. Az indexet közvetlenül  az  indexelendő  szöveg
után kell a szövegbe tenni egy speciális jellel kezdve.


 6.108 

Ha a szövegbe pl. görög vagy cirill betűket kell írnunk,  ak-
kor a nyomtató grafikus képességeit alaposan ki kell használ-
nunk! A nyomtatók általában  az  alábbi  kétféle  lehetőséget
biztosítják (legalább az egyiket):

   - az írófej képes egy karakterrel visszalépni az adott so-
     ron belül, majd az ott levőre egy újabbat írni  (csak az
     alap karakterkészletébe tartozót);
   - a nyomtató új (grafikus) karaktert képes kirajzolni  pl.
     úgy, hogy egy speciális jel után megadjuk a kirajzolandó
     karakter kontúrját (un. bitmintáját).

     pl. a nagy, 'nyomtatott' delta bitmintája

          .....o.           , így a delta gyanánt kiküldendő
          ....oo.           
számsorozat (MPS-801 esetén)
          ...ooo.                                                                                                                    
8 (nyitó speciális jel),
          ..o.oo.                                                                                                                
224 (=128+96), 208 (=128+80),
          .o..oo.                                                         
200 (=128+72), 194 (=128+66),
          o...oo.                                                       
255 (=128+127), 255,
          oooooo.                                                 
15 (záró speciális jel)

Írjunk programot, amely a kétféle megoldású nyomtatást  vezé-
relni tudja. A szövegben lévő grafikus (nem  szabványos)  je-
leknek egy táblázat tartalmazza  a  szövegbeli  kódját  és  a
kirajzolás definícióját  (pl. é-betű = e  +    +
; vagy delta = 8 224 208 200 196 254  255  15).  A
szöveg létrehozásához természetesen speciális szövegszerkesz-
tő program szükséges, amely a táblázatban szereplő  speciális
jeleket speciális billentyűkombináció  segítségével  illeszti
be a helyére.