Tartalom
A továbbiakban olyan esetekkel fogunk foglalkozni, amelyekben a feladat állapotterét kell megváltoztatnunk. Vegyük észre: eddig is csináltunk már ilyet: bevezethetünk új változókat, vagy akár el is hagyhatunk komponenseket.
Az összetettebb esetekben az eredeti állapottér bizonyos komponenseit újakkal helyettesítjük.
Gyakran előfordul, hogy az állapottér egy komponensének típusát egy kapcsolódó másik típusra kell cserélnünk. Az ilyen transzformációk úgy általánosíthatók, hogy egy leképezést definiálunk a két állapottér egymásnak megfelelő komponensei között.
Típustranszformációról akkor beszélhetünk, ha az állapottér bizonyos komponenseit valami kapcsolódó típusra cseréljük.
A programozási tételek – és általában véve a (feladat, megoldó program) párok – az alábbiakban bemutatásra kerülő transzformációkon keresztül általánosíthatók, ha az állapotterek közötti transzformáció tulajdonképpen típustranszformáció. Ekkor az ábrán látható valamely típuson megoldott program egyszerű szabályok segítségével átvihető egy kapcsolódó típusra.
Az alábbi sémák a programozási tételek típusok közötti transzformációjakor elvégzendő helyettesítéseket definiálják. A transzformáció úgy történik, hogy az első típus adott műveletét a második típus megfelelő (azonos sorban levő) műveletére cseréljük.
Halmazról ( ) sorozatra (
) (egy input halmaz/sorozat esetén)
A két típus közötti megfeleltetés: az és
sorozatok tagjai felsorolják az
és
halmazok elemeit.
________________________________
_
A fenti megfeleltetésben szereplő művelet a
művelet olyan kiterjesztése, amely megengedi, hogy egy legfeljebb egy elemű
halmazzal terjesszük ki a sorozatot. Ha a halmaz egy elemű, akkor azzal az
elemmel terjeszti ki a sorozatot, míg ha üres, akkor a sorozatot helyben hagyja.
Ennek megfelelően az elemenként feldolgozható
függvényről is feltesszük, hogy egy egy elemű halmazhoz legfeljebb egy
elemű halmazt rendel hozzá. Az
művelet helyett az
változónak feleltettük meg az
értéket, mert a
függvény mindig a sorozat első elemét adja vissza ellentétben az eredeti
értékkiválasztással.
Példa (egyváltozós egyértékű elemenkénti feldolgozás):
________________________________________________
______________
______
_______________________________
Sorozatról ( ) szekvenciális input file-ra (lopop,ext) (
) vagy (read) (
): (előreolvasási technika)
A két típus közötti megfeleltetés: ha az sorozat nem üres, akkor megegyezik a
és
sorozatokkal, míg üres sorozat esetén az
és
sorozatokkal.
____________________________
___________________
___________________
A transzformált program egy plusz (vagy
) művelettel kezdődik.
Példa (egyváltozós egyértékű elemenkénti feldolgozás):
________________________________________________
_______________________________
_____
___________________________
Halmazról ( ) vektorra (
)
Feleltessük meg az (és
) halmaznak a
(ill.
) párt oly módon, hogy az
(ill.
) halmaz elemei a
vektor
(ill. a
vektor
) indexű elemeivel egyeznek meg.
________________________________________________
_____
Példa (egyváltozós egyértékű elemenkénti feldolgozás):
________________________________________________
______________
_________
________________________________________
Sorozatról ( ) vektorra (
)
Sorozatok esetén a sorozat és vektor típusokra megengedett műveletek korlátozzák a két típus közötti megfeleltetés szabad választását: nem használható ugyanaz a leképezés, mint halmazoknál. Válasszunk hát a típusműveletekhez illeszkedő megfeleltetést!
Feleltessük meg az sorozatnak a
párt oly módon, hogy az
sorozat tagjai rendre a
vektor
indexű elemeivel egyeznek meg. A
sorozatnak viszont a
párt úgy feleltessük meg, hogy a
sorozat elemei rendre a
vektor
indexű elemeivel egyeznek meg.
________________________________________________
_____
Példa (egyváltozós egyértékű elemenkénti feldolgozás):
________________________________________________
_______________________________
_________
________________________________________
Intervallum felett definiált függvényről ( és a függvény argumentuma
) sorozatra (
)
Első ránézésre úgy tűnhet, hogy kihagytunk egy lépést, a függvénytípust. De vegyük észre, hogy a függvény típusra való áttérés nem igényel transzformációt!
Itt tulajdonképpen a sorozatot az intervallumnak feleltetjük meg az alábbi
módon: tekintsük az sorozatot egy az
intervallumon értelmezett függvénynek, ahol a függvényértékek a sorozat
megfelelő elemei. Ekkor a tételben szereplő függvénynek tulajdonképpen
az
függvényt tekinthetjük.
________________________________________________
_____
Példa (számlálás tétele):
____________________________________________________
_____________________________
/
________
__________________________________
/
Halmazokról ( ) szigorúan monoton növő sorozatokra (
) a kétváltozós elemenkénti feldolgozás esetén. A kétváltozós elemenkénti
feldolgozásnál az okozhat gondot, hogy el kell tudnunk dönteni, hogy egy
adott elem melyik sorozatban van benne. Ezért tettük fel, hogy a sorozatok
növekvően rendezettek, mert így mindkét sorozat legelső eleme a legkisebb,
és ha ezek közül a kisebbiket választjuk, akkor a tartalmazás egyszerűen
eldönthető. Egyébként a transzformáció többi része megegyezik az
egyváltozós esetnél leírtakkal (itt is szükséges, hogy a függvényérték
legfeljebb egyelemű legyen). Természetesen az elem kiválasztása itt is elhagyható,
hiszen a
művelet a sorozatnak mindig ugyanazt az elemét adja vissza.