Oláh-Gál Róbert Az informatika alapjai közgazdász- és ...
Oláh-Gál Róbert Az informatika alapjai közgazdász- és ...
Oláh-Gál Róbert Az informatika alapjai közgazdász- és ...
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>Oláh</strong>-<strong>Gál</strong> <strong>Róbert</strong><br />
<strong>Az</strong> <strong>informatika</strong> <strong>alapjai</strong><br />
<strong>közgazdász</strong>- <strong>és</strong> mérnökhallgatóknak<br />
1
Bevezetı __________________________________________________________________ 4<br />
A szimbolikus logika_________________________________________________________ 4<br />
<strong>Az</strong> ítéletek logikája – logikai mőveletek_____________________________________________ 5<br />
Logikai függvénykalkulus (predikátumok logikája) __________________________________ 6<br />
<strong>Az</strong> ítéletek <strong>és</strong> predikátumok axiómái _______________________________________________ 7<br />
A szillogizmusok – a skolasztikus logika következtet<strong>és</strong>i módjai _________________________ 8<br />
Filozófiai jelent<strong>és</strong>, interpretáció, háttér____________________________________________ 10<br />
Szakirodalom _________________________________________________________________ 11<br />
Boole-algebra _____________________________________________________________ 11<br />
Bevezetı _____________________________________________________________________ 11<br />
Egy r<strong>és</strong>zlegesen rendezett halmaz fontos elemei _____________________________________ 12<br />
Disztributív <strong>és</strong> teljes hálók ______________________________________________________ 18<br />
Boole-algebra, a szimbolikus logika aritmetikája____________________________________ 19<br />
B2 algebra____________________________________________________________________ 20<br />
Ítéletek algebrája ______________________________________________________________ 21<br />
A Boole-algebrai függvények ____________________________________________________ 21<br />
A Boole-féle függvények normál alakja ____________________________________________ 23<br />
A Boole- függvények kanonikus alakja ____________________________________________ 24<br />
Boole-függvények egyszerősít<strong>és</strong>e _________________________________________________ 25<br />
Alkalmazások <strong>közgazdász</strong>oknak, Boole egyenletrendszerek ___________________________ 27<br />
Boole-algebrai egyenlet- <strong>és</strong> egyenlıtlenségrendszerek ________________________________ 28<br />
Változatok egy témára__________________________________________________________ 30<br />
Szakirodalom _________________________________________________________________ 31<br />
Algoritmika _______________________________________________________________ 32<br />
Algoritmusok ábrázolása _______________________________________________________ 33<br />
Elemi mőveletek_______________________________________________________________ 34<br />
Számítsuk ki n beolvasott szám összegét! ___________________________________________________ 34<br />
<strong>Az</strong> elsı n term<strong>és</strong>zetes szám összege ________________________________________________________ 35<br />
Számítsuk ki n beolvasott szám szorzatát! ___________________________________________________ 35<br />
Fatömeg térfogatának számolás (A farönkök köböl<strong>és</strong>e) ________________________________________ 36<br />
Hordó térfogata _______________________________________________________________ 37<br />
A kamatos kamat ______________________________________________________________ 38<br />
Hatványozás __________________________________________________________________ 39<br />
<strong>Az</strong> eratoszten<strong>és</strong>zi szita___________________________________________________________________ 41<br />
Néhány érdekes számelméleti feladat _____________________________________________ 44<br />
Írjunk programot a tökéletes számok megkeres<strong>és</strong>ére! __________________________________________ 44<br />
Keressünk álprímeket!___________________________________________________________________ 45<br />
Euklideszi algoritmus __________________________________________________________ 46<br />
Átalakítások számrendszerek között________________________________________________________ 48<br />
2
Hanoi torony. _________________________________________________________________ 52<br />
Rendez<strong>és</strong>ek ___________________________________________________________________ 53<br />
Sorozat legnagyobb értékő elemének megkeres<strong>és</strong>e ____________________________________________ 54<br />
Számsorozat elemeinek rendez<strong>és</strong>e _________________________________________________________ 54<br />
Buborékos rendez<strong>és</strong>_____________________________________________________________________ 58<br />
Shell rendez<strong>és</strong> _________________________________________________________________________ 59<br />
Gyorsrendez<strong>és</strong> _________________________________________________________________________ 63<br />
Rekurzív gyorsrendez<strong>és</strong> _________________________________________________________________ 65<br />
Sorozatok elemeinek rendezett egyesít<strong>és</strong>e ___________________________________________________ 66<br />
Rekurziók a kombinatorikában __________________________________________________ 68<br />
Számítsuk ki n elem ismétl<strong>és</strong> nélküli permutációinak számát! ___________________________________ 68<br />
Faktoriális kiszámítása rekurzív módszerrel__________________________________________________ 69<br />
Egy adott permutáció transzpozicióik szorzatára való bontása ___________________________________ 70<br />
Permutációk, variációk <strong>és</strong> kombinációk elıállítása __________________________________ 71<br />
<strong>Az</strong> összes ismétl<strong>és</strong>ek nélküli permutáció elıállítása ___________________________________________ 71<br />
Permutációk elıállítása rekurzív módszerrel _________________________________________________ 72<br />
Variációk elıállítása ____________________________________________________________________ 73<br />
Kombinációk elıállítása _________________________________________________________________ 75<br />
Mátrixok _____________________________________________________________________ 78<br />
Szakirodalom _________________________________________________________________ 80<br />
Grafika __________________________________________________________________ 81<br />
Szimulálási feladatok___________________________________________________________ 81<br />
Hegyek ______________________________________________________________________ 82<br />
Körök _______________________________________________________________________ 86<br />
A Logo programozási nyelv („Nincs királyi út a programozáshoz”) _________________ 88<br />
Fejlesztıi környezet ____________________________________________________________ 89<br />
Logo programozási elemek ______________________________________________________ 89<br />
A teknıcgrafika _______________________________________________________________ 91<br />
“Ide ne lépjen aki nem szereti a geometriát” _______________________________________ 94<br />
Folytonos <strong>és</strong> diszkrét jelenségek __________________________________________________ 95<br />
Szakirodalom _________________________________________________________________ 97<br />
3
Bevezetı<br />
<strong>Az</strong> <strong>informatika</strong> <strong>alapjai</strong> féléves tananyag mind a <strong>közgazdász</strong>-, mind a mérnök<br />
hallgatóknak. Általában logikai alapokat, Boole-algebrát <strong>és</strong> algoritmus-leírásokat<br />
foglal magába. Mivel ebben a témában, már sok kiváló könyv <strong>és</strong> jegyzet áll a<br />
hallgatók rendelkez<strong>és</strong>ére ezért a most közreadott jegyzetben az újszerőségre<br />
törekedtem. Ötévi tapasztalat alapján úgy vettem <strong>és</strong>zre, hogy a hallgatók hadilábon<br />
állnak a matematikai logika legalapvetıbb fogalmaival. Ezért ezt a r<strong>és</strong>zt minél<br />
érthetıbben <strong>és</strong> olvasmányosan igyekeztem megírni. Gondolom azzal mindenki<br />
egyetért, hogy bármilyen szoftver, de már az Internet használatának is nélkülözhetetlen<br />
alapja a matematikai logika, hiszen egy lekérdez<strong>és</strong> lényegében egy logikai<br />
függvény. A matematikai logikai függvényeket használja az Excel, az Access, a<br />
Turbo Pascal, Delphi, Matlab, Maple <strong>és</strong> más közgazdasági vagy mérnöki alkalmazások<br />
<strong>és</strong> célszoftverek.<br />
<strong>Az</strong> algoritmusok gyakorlati megvalósítására kitőnı eszköz a Turbo Pascal. A<br />
Pascal nyelv nem más mint egy számítógépen futó pszeudokód. Ezt a nyelvet is<br />
didaktikai céllal hozta létre Nicolas Wirth, azért, hogy megtanítsa az elsıéves<br />
hallgatóknak a zürichi Politechnikán a programozás elemeit. Csak k<strong>és</strong>ıbb lett belıle<br />
ipari programozási nyelv is. Ezért tartjuk jónak, ha a hallgatók a Turbo Pascal<br />
nyelvvel kezdik. De a tapasztalat azt mutatja, hogy a hallgatók nagy r<strong>és</strong>zének még<br />
ennek a nyelvnek az elsajátítása is gondot jelent, <strong>és</strong> az ı érdekükben betettem a<br />
legegyszerőbb ("legdidaktikusabb") programnyelv, a Comenius Logo rövid ismertet<strong>és</strong>t.<br />
Noha, ez a nyelv a legdidaktikusabb, ipari alkalmazások tekintetében nem<br />
vetekedhet más nyelvekkel, de ezért nem szabad leértékelni. Mivel utasításai<br />
grafikusak (is), ezért igen jól szemlélteti a programozás, <strong>és</strong> általában az algoritmus<br />
lényegét. De egy nagyon kis r<strong>és</strong>zben a Pascal grafikájáról is szót ejtettünk.<br />
Igyekeztünk az eredetiségre <strong>és</strong> az önállóságra törekedni. "Nincsen királyi út" a<br />
programozásban sem!<br />
A szimbolikus logika<br />
Számítástechnika mindenütt – aligha akad a társadalmat <strong>és</strong> a tudományt figyelı<br />
hallgató, aki ezt megcáfolná. Nem vitás, hogy a számítástechnika ilyen mérető<br />
felfutását <strong>és</strong> betör<strong>és</strong>ét a mindennapi életbe, fizikai <strong>és</strong> technikai felfedez<strong>és</strong>ek tették<br />
lehetıvé (félvezetık, tranzisztorok, integrált áramkörök, mikroprocesszorok). De mi<br />
volt megjelen<strong>és</strong>ének, a számítástechnika genézisének egyik elméleti alapja –<br />
elgindítója? Véleményem szerint a szimbolikus logika megalkotása <strong>és</strong> kidolgozása<br />
volt. <strong>Az</strong> a leibnizi idea, ami szerint a folyamatok <strong>és</strong> állapotok döntı többsége<br />
kifejezhetı két jellel, a 0-val <strong>és</strong> az 1-gyel. Ez a Leibniztıl származó metafizikai<br />
vízió a XX. század küszöbén, a matematikai logika <strong>és</strong> az elektronika felfedez<strong>és</strong>ei<br />
révén, megérett a megvalósulásra, mert nyilvánvaló, hogy bármilyen csatornának,<br />
áramkörnek két lehetséges állapota van: vagy halad át rajta valamilyen hatás vagy<br />
nem. Neumann János szerint a számítógép elméleti megtervez<strong>és</strong>ének ábécéje a<br />
szimbolikus vagy matematikai logika, ezért ez a számítástechnikával foglakozó<br />
szakember, a számítógéppel párbeszédet folytató programozó munkaeszközévé vált.<br />
A logikának a hétköznapjainkba való beköltöz<strong>és</strong>e term<strong>és</strong>zetesen nem a<br />
számítástechnikával kezdıdött, többé-kev<strong>és</strong>bé mindig is jelen volt minden<br />
kijelent<strong>és</strong>ünkben, ítéletünkben, vagy következtet<strong>és</strong>einkben. Hogy ez mennyire így<br />
van, igazolja a következı jelenség: Egy könyvesboltban volt olvasható a következı<br />
felhívás: „Tilos ebbe az üzletbe égı cigarettával <strong>és</strong> fagylalttal belépni”. Gondolom<br />
4
nem kis vita kerekedhetett volna az üzletvezetıvel abból, ha mondjuk egy fagylalttal<br />
beléptem volna az üzletbe – <strong>és</strong> nehezen tudtam volna megmagyarázni, hogy a<br />
logikai konjunkció csak akkor igaz, ha az „<strong>és</strong>” kötıszóval összekötött ítéletek<br />
egyidejőleg igazak. Vagyis a kiírás értelmében égı cigarettával is <strong>és</strong> fagylalttal is<br />
(egyidejőleg) tilos belépni, de külön fagylalttal vagy külön égı cigarettával nem.<br />
Nyilvánvaló, hogy a felhívás szerzıje összetévesztette a logikai konjunkciót az<br />
alternatívával – a helyes megfogalmazás így lett volna: „Tilos belépni ebbe az<br />
üzletbe égı cigarettával vagy fagylalttal!”<br />
Epiktétosz, Néró császár egyik testırének volt a rabszolgája. A testır látván<br />
Epiktétosz ragyogó szellemi képességét elhatározta, lehetıséget ad, hogy az eszével<br />
felszabadítsa magát. Bezáratta egy olyan cellába, amelyen két kijárat volt, <strong>és</strong><br />
mindkettı elıtt ır állt. <strong>Az</strong>t mondta neki: „<strong>Az</strong> egyik ır mindig hazudik, a másik csak<br />
az igazat mondja, de nem tudod, hogy melyik. <strong>Az</strong> egyik kapu a szabadságba visz, a<br />
másik a rabszolgaságba. Egy kérd<strong>és</strong>t intézhetsz az egyik ırnek, <strong>és</strong> a feleletébıl<br />
döntsd el, melyik kaput választod”. Epiktétosz egy kis gondolkodás után, odament<br />
az egyik ırhöz <strong>és</strong> megkérdezte: „Mit fog mondani a társad, ha megkérdezem, hogy<br />
melyik kapu visz a szabadságba?” Epiktétosz pedig a válaszban megjelölt kijáratnak<br />
az ellenkezıjét választotta. Vajon miért? Jelöljük az egyik ır feleletét p-vel a<br />
másikét q-val. Epiktétosz oly módon fogalmazta meg kérd<strong>és</strong>ét, hogy abból mind a<br />
két ır feleletét megtudja, vagyis a „p <strong>és</strong> q”-t vagy a „q <strong>és</strong> p”-t. Mivel az egyik<br />
hazudik, a másik igazat szól, a p <strong>és</strong> q válaszok közül az egyik hamis, a másik pedig<br />
igaz. Ilyenformán a „hamis <strong>és</strong> igaz”, vagy „igaz <strong>és</strong> hamis” mindig hamis. Ezért a<br />
válaszában megadott kapu megfelel a „p <strong>és</strong> q” által megjelöltnek, de ez hamis, így<br />
ennek az ellenkezıje igaz! Vagyis ez visz a szabadságba.<br />
<strong>Az</strong> ítéletek logikája – logikai mőveletek<br />
A logika tárgya a helyes gondolkodási módok <strong>és</strong> módozatok megalkotása <strong>és</strong> felállítása.<br />
Egy gondolatmenet pedig feltev<strong>és</strong>ek, állítások láncolatából áll. Ezért elsısorban<br />
az érdekel bennünket, hogyan tudjuk az ítéleteket összekötni, <strong>és</strong> hogy<br />
kiindulva bizonyos kijelent<strong>és</strong>ekbıl (mint nyersanyagokból) hogyan tudunk ezekbıl<br />
más (összetett) ítéleteket alkotni. A kiinduláshoz szükséges egyszerő feltev<strong>és</strong>eket<br />
elemi ítéleteknek mondjuk.<br />
A matematikai logikának azt a fejezetét, amely az ítéletek közötti kapcsolatot,<br />
ítéletek képz<strong>és</strong>ét <strong>és</strong> összetételét vizsgálja, anélkül, hogy e kijelent<strong>és</strong>ek belsı szerkezetét,<br />
jelent<strong>és</strong>üket, értelmi közvetít<strong>és</strong>üket figyelembe venné, ítéletek logikájának<br />
nevezzük. <strong>Az</strong> ítéleteket jelölhetjük p, q, r, … betőkkel, <strong>és</strong> csak annyi érdekel<br />
bennünket, hogy ezek igazak-e vagy hamisak. Egy kijelent<strong>és</strong> igaz vagy hamis volta a<br />
szóban forgó ítéletek logikai értéke. Tehát minden egyes ítélethez hozzárendelünk<br />
egy logikai értéket – azaz egy függvényt értelmezünk az elemi ítéletek halmazából<br />
egy kételemő halmazba, amelynek elemeit jelölhetjük 0-val <strong>és</strong> 1-gyel, jelent<strong>és</strong>e<br />
pedig hamis <strong>és</strong> igaz.<br />
Mivel minden egyes ítéletnek megfeleltetünk egy logikai értéket, ezért az elemi<br />
ítéletekbıl az összetett ítéletek alkotásának szabályait, <strong>és</strong> így a logikai mőveletek<br />
meghatározását is elégséges, ha a logikai értékek halmazán (vagyis a {0,1}-en)<br />
adjuk meg.<br />
Logikai mőveletek a konjunkció, az alternatíva (vagy diszjunkció), a tagadás<br />
(negáció), az implikáció <strong>és</strong> az ekvivalencia.<br />
A konjunkció két ítéletnek az "<strong>és</strong>" kötıszóval való összekapcsolása, ennek jele ∧ ,<br />
(vagy &) meghatározása pedig ez: 1 ∧ 1 = 1,<br />
0 ∧ 1 = 0,<br />
1 ∧ 0 = 0,<br />
0 ∧ 0 = 0 .<br />
5
Két ítéletnek a "vagy" kötıszóval való összekapcsolása az ítéletek alternatívája<br />
(vagy diszjunkciója). Ennek jele ∨ , <strong>és</strong> azt mondjuk, hogy p, q kijelent<strong>és</strong>ek<br />
alternatívája igaz, ha legalább az egyik kijelent<strong>és</strong> igaz, <strong>és</strong> csak akkor hamis, ha mind<br />
a két kijelent<strong>és</strong> hamis. 1 ∨ 1 = 1,<br />
0 ∨1<br />
= 1,<br />
1∨<br />
0 = 1,<br />
0 ∨ 0 = 0.<br />
Szokás még használni, a<br />
kizáró vagyot (xor), (exkluzív alternatíva), amelyet a "vagy...vagy" szavakkal<br />
alkotunk például: "vagy p vagy q", <strong>és</strong> amely akkor igaz, ha csak az egyik összetevı<br />
igaz a p <strong>és</strong> q közül, <strong>és</strong> hamis, ha az összetevıknek ugyanaz a logikai értéke.<br />
Klasszikus példa erre a "szakállasok antinómiája", amely a következıképpen szól:<br />
Egy szigeten, távol a civilizált világtól, létesítettek egy katonai támaszpontot. A<br />
tábor minden tagja szakállt nıvesztett. Figaró is, a tábor borbélya. De egyszer a<br />
parancsnok megunta a sok szakállast, <strong>és</strong> kiadta a parancsot: "Minden katonát vagy<br />
borotváljon meg Figaró, a tábor borbélya, vagy borotválkozzon meg saját kezőleg".<br />
A parancsot teljesítették, egyedül Figarót állították katonai ítélıszék elé, azzal a<br />
váddal, hogy megszegte a parancsot: saját kezőleg is, <strong>és</strong> a tábor borbélya is<br />
megborotválta!<br />
A tagadás vagy negáció egy ítéletnek a non (vagy nem) szóval való képz<strong>és</strong>e. Ha<br />
egy kijelent<strong>és</strong> igaz, akkor annak a tagadása hamis, <strong>és</strong> fordítva, ha egy kijelent<strong>és</strong><br />
hamis, akkor annak a tagadása igaz. non ( 1)<br />
= 0,<br />
non(<br />
0)<br />
= 1.<br />
<strong>Az</strong> implikáció-t a "ha...akkor" szópárral képzzük, <strong>és</strong> a "⇒ " jellel jelöljük. A p<br />
kijelent<strong>és</strong>bıl a q kijelent<strong>és</strong> implikáció csak akkor hamis, ha a p igaz <strong>és</strong> q hamis, az<br />
összes többi esetekben az implikáció igaz. A p ⇒ q jelöl<strong>és</strong>ben p-t az implikáció<br />
0 ⇒ 0 igaz<br />
premisszájának, q-t konklúziójának nevezzük.<br />
0 ⇒ 1<br />
1 ⇒ 1<br />
igaz<br />
. Meggondolkodtathat<br />
igaz<br />
1 ⇒ 0 igaz<br />
bennünket, miért értelmezzük igaznak az implikációt, ha hamisból hamis<br />
következik, vagy hamisból igaz. <strong>Az</strong>ért, mert itt nyelvtani szabályról van szó (a<br />
szimbolikus logika "helyesírásáról"), <strong>és</strong> nem az elıbb írt értelmez<strong>és</strong>rıl. A<br />
matematikai, <strong>informatika</strong>i (programozási) gyakorlatban csak az igazból igaz<br />
implikációjával dolgozunk. Könnyen meggyızıdhetünk arról, hogy a p ⇒ q ítélet<br />
azonos a non p vagy q ítélettel.<br />
<strong>Az</strong> ekvivalencia jele ⇔ . A p <strong>és</strong> q ítéletek ekvivalenciája akkor igaz, ha két<br />
ítéletnek ugyanaz a logikai értéke <strong>és</strong> hamis, ha különbözı logikai értéke van. A<br />
q<br />
p ⇒ q ∧ q ⇒ p kijelent<strong>és</strong>sel.<br />
p ⇔ kijelent<strong>és</strong> azonos a ( ) ( )<br />
Logikai függvénykalkulus (predikátumok logikája)<br />
<strong>Az</strong> ítéletek logikája (az ítéletkalkulus) nem vizsgálja az ítéletek jelent<strong>és</strong>ét, sem<br />
azt, hogy mire vonatkoznak, mi módon kapcsolódnak egymáshoz, vagyis a közöttük<br />
fennálló viszonyt, <strong>és</strong> hogyan lehet elemi ítéletekbıl összetett ítéleteket alkotni. De<br />
term<strong>és</strong>zetesen egy adott kijelent<strong>és</strong>nél fontosnak látszik annak jelent<strong>és</strong>beli közvetít<strong>és</strong>ével<br />
<strong>és</strong> a vonatkoztatási tartalmával – tárgyával foglalkozni. Ez utóbbit tanulmányozza<br />
a predikátumok logikája. Legyen T egy adott tulajdonság, vagyis egy<br />
kijelent<strong>és</strong>; ha egy x tárgy vagy dolog T tulajdonságra vonatkozik, akkor azt írjuk,<br />
hogy T(x). Jelöljük H-val azon x tárgyak összességét, amelyek T-re vonatkoznak, H-t<br />
a diskurzus univerzumának mondjuk. A T-t lehet úgy is értelmezni, mint egy, a H<br />
halmazból a {0,1}-be vivı függvényt: T : H → { 0,<br />
1}<br />
, H egy x-elemének megfelel<br />
T(x); ha T(x) = 1 akkor azt mondjuk, hogy x rendelkezik a T tulajdonsággal, ha T(x)<br />
6
= 0 akkor nem rendelkezik. Egy adott T tulajdonság esetében felvetıdik a kérd<strong>és</strong>,<br />
hogy H minden egyes eleme vagy csak néhány rendelkezik vagy nem T-vel. H-nak<br />
az elemei legyenek h1, h2, h3,... H={ h1,h2,h3,...}. Ebben az értelemben szeretnénk<br />
kifejezni <strong>és</strong> formalizálni azt a tényt, hogy :"h1 rendelkezik T-vel, <strong>és</strong> h2 rendelkezik<br />
T-vel, <strong>és</strong> h3 rendelkezik T-vel, <strong>és</strong> ..." <strong>és</strong> azt, hogy "h1 rendelkezik T-vel, vagy h2<br />
rendelkezik T-vel, vagy h3 rendelkezik T-vel, vagy ...", tehát a konjunkciónak <strong>és</strong> az<br />
alternatívának a végtelen sok esetre való kiterjeszt<strong>és</strong>érıl van szó. Ugyanis, ha a H<br />
elemeinek a száma véges, akkor az elıbbi felsorolás elvileg megvalósítható, de ha<br />
elemeinek száma végtelen, akkor a felsorolás lehetetlen. Ezért bevezetünk két új<br />
mőveletet az univerzális <strong>és</strong> az egzisztenciális kvantálást, <strong>és</strong> ennek megfelelı két új<br />
szimbólumot, az univerzális kvantort: ∀ , <strong>és</strong> az egzisztenciális kvantort: ∃ . <strong>Az</strong><br />
univerzális kvantort úgy olvassuk ki, hogy "bármely", "tetszıleges", <strong>és</strong> az<br />
egzisztenciálisat úgy, hogy "létezik", "van egy". E szerint az elmondottakat úgy írjuk<br />
le: bármely x-re H-ból: T(x) vagyis ∀ x, x∈H: T(x) <strong>és</strong> létezik egy elem H-ból, amely<br />
rendelkezik T-vel: ∃ x, x∈H: T(x).<br />
Egy vagy több változótól függı állítás, amely a változók adott halmazból vett<br />
tetszıleges behelyettesít<strong>és</strong>i értékeire igaz vagy hamis ítéletté alakul, prédikátumok<br />
vagy logikai függvények. A predikátumok megadásánál lényeges, hogy rögzítsük azt<br />
a halmazt, amelybıl a változók értékeket vehetnek fel, vagyis a diskurzus<br />
univerzumát (egyes szerzık szerint az individuum tartományt).<br />
Míg az elemi ítéletek tagadása nagyon egyszerő (Például "az <strong>informatika</strong><br />
ellenszenves" ítélet tagadása "az <strong>informatika</strong> nem ellenszenves", vagy 2 = 5<br />
tagadása 2 ≠ 5 , addig a predikátumok tagadása nehezebb (az összetett ítéletek<br />
tagadása is lehet bonyolult). Itt a következı a szabály:<br />
( ∃ x : T ( x)<br />
) = x : nonT(<br />
x)<br />
<strong>és</strong> non( x : T(<br />
x)<br />
) = ∃x<br />
: nonT(<br />
x)<br />
non ∀<br />
∀ ,<br />
vagyis az egzisztenciális kvantor átmegy univerzálissá, <strong>és</strong> a tulajdonságot úgy<br />
tagadjuk meg, mint egy ítéletet, <strong>és</strong> fordítva az univerzális kvantor tagadása<br />
egzisztenciálissá lesz <strong>és</strong> megtagadjuk a tulajdonságot. Például a: "minden ruhámhoz<br />
van egy hozzáillı cipım" predikátum tagadása az, hogy "van egy ruhám, amelyhez<br />
bármely cipım nem illik" (magyarán: van egy ruhám, amelyhez nem illik egyik<br />
cipım sem.). Vagy: "minden term<strong>és</strong>zettörvénynek van egy matematikai alakja" -<br />
tagadása: "van egy term<strong>és</strong>zettörvény, amelynek nincs tetszıleges matematikai<br />
alakja".<br />
<strong>Az</strong> ítéletek <strong>és</strong> predikátumok axiómái<br />
Egy, az összetevıinek a logikai értékétıl függetlenül azonosan igaz képletet<br />
tautológiának nevezünk. <strong>Az</strong> arisztotel<strong>és</strong>zi (bivalens) logika két legfontosabb<br />
tautológiája a harmadik kizárásának elve (exclusii tercii principium) <strong>és</strong> az<br />
ellentmondás elve (principium contradictionis). A harmadik kizárásának elve: P<br />
vagy non P: P ∨ P'<br />
<strong>és</strong> azt mondja ki, hogy egy kijelent<strong>és</strong> (vagy bármilyen, a<br />
szimbolikus logika nyelvére átültetett tétel) vagy igaz vagy hamis, <strong>és</strong> más lehetıség<br />
nincs, más szóval: egy kijelent<strong>és</strong> vagy annak tagadása azonosan igaz.<br />
<strong>Az</strong> ellentmondás elve ( P ∧ P')'<br />
, vagyis (non(P <strong>és</strong> nonP)), jelent<strong>és</strong>e: egyidejőleg<br />
nem lehet igaz egy kijelent<strong>és</strong> <strong>és</strong> annak tagadása is.<br />
A tautológiák a logikai kalkulus legfontosabb eszközei, egyr<strong>és</strong>zt segítségükkel<br />
megfogalmazhatjuk a gondolkodási sémákat, másr<strong>és</strong>zt pedig egyes logikai<br />
7
mőveleteket visszavezethetünk másokra. Például a p ⇒ q ⇔ p'∨q<br />
tautológiát<br />
konkrétan fel is használják a számítástechnikában, ahol az a munkahipotézis, hogy a<br />
lehetı legkevesebb szimbólummal, a lehetı legtöbb mőveletet tudjuk kodifikálni.<br />
Következtet<strong>és</strong>i szabályoknak nevezzük az olyan eljárásokat, amelyek<br />
segítségével igaz ítéletekbıl újabb igaz ítéleteket képezhetünk. Minden matematikai<br />
levezet<strong>és</strong>, vagy bizonyítás, következtet<strong>és</strong>i szabályokra, vagy következtet<strong>és</strong>i sémák<br />
láncolatára támaszkodik.<br />
Következtet<strong>és</strong>i szabályok:<br />
• A modus ponens: ha egy igaz implikációnak igaz a premisszája akkor<br />
A, A ⇒ B<br />
a konklúziója is igaz. Ezt így jelöljük: .<br />
B<br />
• A szillogizmus szabálya: ha két igaz implikációban az elsı<br />
konklúziója megegyezik a második premisszájával, akkor az elsı premisszájából<br />
A ⇒ B,<br />
B ⇒ C<br />
következik a második konklúziója. Képlettel:<br />
.<br />
A ⇒ C<br />
• A kontrapozíció: Ha A-ból következik B, akkor non B-bıl következik<br />
non A. Álljon itt példaként Gauss egy megjegyz<strong>és</strong>e: „Ha egy filozófus állít<br />
valamit, ami igaz, akkor az triviális. Ha viszont olyant állít, ami nem triviális,<br />
akkor az nem igaz.” Könnyő felismerni e gondolatmenetben a kontrapozíció<br />
sémáját.<br />
• A modus tollens: ha egy igaz implikációnak hamis a konklúziója,<br />
A ⇒ B,<br />
nonB<br />
akkor a premisszája is hamis: .<br />
nonA<br />
• A reductio ad absurdum: ha A-ból következik B <strong>és</strong> A-ból következik<br />
A ⇒ B,<br />
A ⇒ nonB<br />
non B, akkor A hamis: .<br />
nonA<br />
• A dilemma elve: ha két kijelent<strong>és</strong> alternatívája igaz, <strong>és</strong> az egyikbıl<br />
következik egy harmadik ítélet <strong>és</strong> a másikból is következik ugyanaz az ítélet,<br />
A ∨ B,<br />
A ⇒ C,<br />
B ⇒ C<br />
akkor ez a harmadik ítélet igaz: .<br />
C<br />
A ⇒ ( B ⇒ C)<br />
• A premisszák felcserél<strong>és</strong>i szabálya:<br />
.<br />
B ⇒ ( A ⇒ C)<br />
A ⇒ ( B ⇒ C)<br />
• A premisszák egyesít<strong>és</strong>i szabálya:<br />
.<br />
A ∧ B ⇒ C<br />
A ∧ B ⇒ C<br />
• A premisszák felbontási szabálya:<br />
.<br />
A ⇒ ( B ⇒ C)<br />
A szillogizmusok – a skolasztikus logika következtet<strong>és</strong>i módjai<br />
Arisztotel<strong>és</strong>z az ítéleteknek négyfajta módozatát különböztette meg:<br />
Egyetemesen állító ítéletek: Minden S P vagyis minden S hozzátartozik P-hez.<br />
Prédikátumként leírva: ∀ x S(<br />
x)<br />
⇒ P(<br />
x).<br />
(jele a)<br />
Egyetemesen tagadó ítéletek: Egyes S sem P, vagy mint predikátum:<br />
∀ x S(<br />
x)<br />
⇒ nonP(<br />
x).<br />
(jele e)<br />
R<strong>és</strong>zlegesen állító: Egyes S-ek P-k, ∃ x S(<br />
x)<br />
⇒ P(<br />
x).<br />
(jele i)<br />
R<strong>és</strong>zlegesen tagadó (jele o): Egyes S-ek nem P-k.<br />
8
A szillogizmusok a skolasztikus logika legfontosabb (általa összesnek vélt)<br />
következtet<strong>és</strong>i módjai, amelyek három arisztotel<strong>és</strong>zi ítéletbıl: két premisszából <strong>és</strong><br />
egy konklúzióból állnak. Például: Minden P M<br />
Egyetlen S sem M<br />
Egyetlen S sem P.<br />
Egy szillogizmusban három terminus szerepel: egy szubjektum (S), egy<br />
predikátum (P) <strong>és</strong> egy középsı terminus (M) (<strong>és</strong> mondhatjuk, hogy a diskurzus<br />
univerzuma S <strong>és</strong> P egyesít<strong>és</strong>ébıl áll). A fenti példa egy egyetemesen állító – a –<strong>és</strong><br />
két egyetemesen tagadó ítéletekbıl –e-e- áll <strong>és</strong> ezért a Camestres névvel illeték. A<br />
középkorban, ily módon az a, e, i, o magánhangzókból kiválasztott hármasokból, a<br />
megfelelı következtet<strong>és</strong>i módok megjelöl<strong>és</strong>ére mőszavakat képeztek. A<br />
skolasztikusok összesen 19 szillogizmust különböztettek meg, ezek a következı<br />
nevet kapták: Barbara, Celarent, Darii, Ferio, Cesare, Canestros, Festino, Baroco,<br />
Datisi, Ferison, Disamis, Bocardo, Darapti, Felapton, Calemus, Fresison, Dimatis,<br />
Bamalis, Fesapo.<br />
Érdekeségként elmondjuk a Baroco alakját, ugyanis a barokk mőv<strong>és</strong>zeti irányzat<br />
neve is innen ered, mint a bonyolultság: „bonyolult következtet<strong>és</strong>ek” jelképe:<br />
a: Minden P M<br />
o: Egyes S-ek nem M-ek<br />
o: Egyes S-ek nem P-k.<br />
A szillogizmusok úgy is kezelhetık mint ítélet rendszerek, de úgy is mint<br />
predikátumok, sıt a szillogizmusokat átírhatjuk halmazelméleti nyelvezetben Boolealgebrai<br />
egyenletrendszerekké. E fejezetet hídnak szántuk az ítéletek, predikátumok<br />
<strong>és</strong> Boole-algebrák között. Ha például a szillogizmusokat átírjuk Boole-egyenletekké<br />
akkor összesen 128, a klasszikus formákhoz közel álló szillogizmust különböztetünk<br />
meg <strong>és</strong> ily módon ezek jellemz<strong>és</strong>e <strong>és</strong> megoldása is elegánsan megadható a Boolealgebrában.<br />
A modern eszközökkel való tárgyalásnál egyes klasszikus<br />
szillogizmusokat megcáfoltak (Darapti, Felapton, Bamalip, Fesapo). Például a<br />
Darapti:<br />
Minden M P<br />
Minden M S<br />
Egyes S-ek P-k.<br />
Minden zöldostoros állat is<br />
Minden zöldostoros növény is<br />
Egyes növények állatok.<br />
Könnyen beláthatjuk, hogy a szillogizmusokat felépítı Arisztotel<strong>és</strong>z négy fajta<br />
ítélet alakja nem tartalmazza az összes lehetségest, ismertessünk még négy típust,<br />
amelyet nem tárgyaltak a skolasztikus logicisták (jelöljük ezeket a’, e’, o’, i’)<br />
a’: Minden P-k S-ek<br />
e’: Minden non S-ek P-k<br />
o’: Egyes P-k non S-ek.<br />
i’: Egyes non P-k non S-ek.<br />
9
Filozófiai jelent<strong>és</strong>, interpretáció, háttér<br />
A számítógép memóriájában minden adatot két jellel kódolunk a 0-val <strong>és</strong> az 1gyel,<br />
ezt a 0 vagy 1 értéket felvevı elemi információs egységet bitnek nevezzük.<br />
Ezért a bit napjaink legfontosabb mértékegysége.<br />
Gottfried Wilhelm Leibniz bebizonyította, hogy a kettes számrendszerben a 0-val<br />
<strong>és</strong> az 1-gyel bármilyen aritmetikai mővelet elvégezhetı, <strong>és</strong> a kettes számrendszerben<br />
tárgyalható az eg<strong>és</strong>z aritmetika. Úgy tőnhet tehát, hogy az 1-gyel <strong>és</strong> a 0-val – amely<br />
jelent<strong>és</strong>e lehet az igen <strong>és</strong> a nem – majdnem minden kifejezhetı, leírhatunk fizikai<br />
állapotokat <strong>és</strong> matematikai összefügg<strong>és</strong>eket.<br />
(Ennek csiráját már a Bibliában is megtaláljuk, Szent Máté evangéliumában (Mt<br />
5, 33-37) „Hallottátok azt a régieknek szóló parancsot: Hamisan ne esküdjél, hanem<br />
tartsd meg az Úrnak tett esküdet. Én pedig azt mondom nektek: Egyáltalán ne<br />
esküdjél: sem az égre, mert az az Isten trónja, sem a Földre, mert az lábának<br />
zsámolya, sem Jeruzsálemre, mert az a nagy király városa. Még fejedre se esküdjél,<br />
mert egyetlen hajszáladat sem tudod fehérré vagy feketévé tenni. Beszédetek legyen:<br />
igen, igen; nem, nem. Ami ezt meghaladja, az a gonosztól van.”. Ezért tartotta azt<br />
Leibniz, hogy az Isten csak a 0-t <strong>és</strong> az 1-et teremtette, a többi a matematikusok<br />
dolga, melyet napjaink tényállásához igazítva: a matematikusok az adatokat<br />
kifejezik bitben, a többi a számítógép dolga.)<br />
A szimbolikus logikának absztrahált <strong>és</strong> szigorúan formalizált nyelvezete van. Aki<br />
e tudományágat bemutató szakkönyvet a kezébe vesz, nagyon megrémülhet a sok<br />
jeltıl <strong>és</strong> jelöl<strong>és</strong>tıl, a képletek <strong>és</strong> tételek teljesen kodifikált kalkuláció jellegétıl,<br />
amelyek a jelek <strong>és</strong> szimbólumok mozaikjának tőnhetnek. Nehéz ebben eligazodni.<br />
Ez volna a gondolkodás szabályzata, ilyen száraz, <strong>és</strong> minden íztıl, zamattól <strong>és</strong><br />
szemlélettıl megfosztott?<br />
Tisztázzuk röviden a szemantika <strong>és</strong> szintaxis mibenlétét. Ha a szimbolikus<br />
logikában (vagy egy formális rendszerben) az axiómákból kiindulva, azt<br />
tanulmányozzuk, milyen levezethetı tételek, milyen szabályok érvényesülnek,<br />
továbbá a megadott nyelvezet szabályai közötti belsı összefügg<strong>és</strong>eket <strong>és</strong> annak<br />
kiterjeszt<strong>és</strong>ét, majd az így kapott eredményeket, akkor azt mondjuk, hogy a rendszer<br />
szintaxisán dolgozunk, <strong>és</strong> e módszert szintaktikus vizsgálatnak nevezzük. Ha pedig a<br />
szimbolikus logika (vagy egy formális rendszer) értelmez<strong>és</strong>ét – jelent<strong>és</strong>beli<br />
közvetít<strong>és</strong>ét-illetve annak egy modellen való megvalósulását tanulmányozzuk, akkor<br />
azt mondjuk, hogy a rendszer szemantikáját szerkesztjük, <strong>és</strong> e módszert szemantikusnak<br />
mondjuk. Ez esetben egy modellen egy olyan konkrét matematikai<br />
objektumot (halmazt, struktúrát) értünk, amelyen a rendszer axiómái teljesülnek, a<br />
tételek <strong>és</strong> levezetett eredmények pedig értelmezhetık <strong>és</strong> interpretálhatók.<br />
Húzható-e éles határ e kétfajta aspektus <strong>és</strong> módszer között? Vagy parafrazálva a<br />
kérd<strong>és</strong>t: szabad-e félredobni <strong>és</strong> leértékelni egy jelekkel, kódokkal, "hieroglifákkal"<br />
teletöltött szakkönyvet, cikket azzal vádolna, amivel a matematikát is megbélyegzik,<br />
hogy az steril, a valós világtól elszakadt szellemi játék, amiben ha akarok r<strong>és</strong>zt<br />
veszek, ha akarok nem?! Erre válaszol az ítéletek logikájának alaptétele, amely<br />
szerint a tételek szintaktikus <strong>és</strong> szemantikus megadása egyenértékő. De ezt mondja<br />
ki a Lindenbaum-Tarski algebrában az úgy nevezett Gödel-tétel, hogy a szemantikus<br />
<strong>és</strong> szintaktikus implikációk ekvivalensek. Mit is jelent ez?<br />
<strong>Az</strong>t, hogy a dolgok formális <strong>és</strong> tartalmi oldala egyenértékő, függetlenül attól,<br />
hogy értjük-e vagy sem, szemléletes-e vagy nem. (Einsteint idézve: "...nehezen<br />
tehetjük meg tudományos kritériumnak azt, hogy valamit képesek vagyunk-e<br />
megérteni vagy sem").<br />
10
Mit jelent ez? A forma <strong>és</strong> az eszme (tartalom) egységét, amely megtalálható úgy<br />
a tudományban, mint a mőv<strong>és</strong>zetben. (Gondoljunk csak egy épület megtervez<strong>és</strong>ében<br />
a forma <strong>és</strong> a funkció harcára, a matematikában a kalkulus <strong>és</strong> az intuíció egységére, a<br />
fizikában az elméleti megsejt<strong>és</strong>re <strong>és</strong> a kísérleti igazolásra, a szobrászatban a design<br />
felé való eltolódásra, stb.) Ez egy kicsit elgondolkodtató: az eszköz egyenrangúvá<br />
lesz a közölt tartalommal, az eszmével? Intellektuális szférában, a szellem<br />
birodalmában talán igen. Hiszen a term<strong>és</strong>zettudományokban ma már alapvetı<br />
tudományos munkahipotézis a term<strong>és</strong>zet egységes voltában vetett hit. Miért ne lenne<br />
ez így a szellem Univerzumában is?<br />
Szakirodalom<br />
1. Páter Zoltán: A matematikai logika <strong>alapjai</strong>. Dacia Könyvkiadó, Kolozsvár, 1978.<br />
2. Fáy Gyula, Tırös <strong>Róbert</strong>: Kvantumlogika. Gondolat, Budapest, 1978.<br />
Boole-algebra<br />
Bevezetı<br />
A középiskolában megismerkedtünk az absztrakt algebra legelemibb struktúráival: a<br />
csoport, győrő <strong>és</strong> a test struktúrájával. Ezek axiómái minden középiskolás által<br />
könnyen felfoghatók <strong>és</strong> könnyen is kezelik ezeket a fogalmakat. <strong>Az</strong> algebrai rendszerek<br />
axiómái nagyon egyszerőek <strong>és</strong> kis számúak, viszont sok-sok modellel rendelkezünk,<br />
ezzel szemben a geometriában, az axiómák jóval „nehezebben” kezelhetık <strong>és</strong><br />
igen kev<strong>és</strong> modellünk van. <strong>Az</strong> <strong>informatika</strong> matematikai <strong>alapjai</strong>ban kiemelkedı<br />
struktúra a háló <strong>és</strong> a Boole-algebra.<br />
Hilbert száz éve tette pontra az euklideszi geometria axiómarendszerét, ma szinte<br />
általános lett az axiómák használata. <strong>Az</strong> euklideszi síkgeometriában az egyetlen<br />
modellünk a síkfelület. Talán a híres XI. axióma értelmez<strong>és</strong>énél, a nehézség <strong>és</strong> probléma<br />
éppen az volt, hogy nem választották szét a geometriát, mint matematikai<br />
elméletet, a modelljétıl, a síkfelülettıl.<br />
Bolyai János geometriájának egyik leglényegesebb mondanivalója, hogy válasszuk<br />
szét az absztrakt geometriát a modelltıl, a síkfelülettıl vagy tértıl.<br />
Már említettük, hogy az absztrakt algebrában rengeteg modellünk van. Vegyük csak<br />
a csoport-elméletet, ezt meghatározza a belsı mővelet fogalma <strong>és</strong> három axióma.<br />
Példánk vagyis modellünk nagyon sok van. Persze itt is vannak „term<strong>és</strong>zetes”<br />
prototípusok, mint amilyen az eg<strong>és</strong>z számok additív csoportja, vagy a permutációk<br />
csoportja, amely n elemen létesített bijektív függvények halmaza, de sok más<br />
nyilvánvaló példánk van még.<br />
Ezzel szemben a geometriában, példák dolgában szegényebbek vagyunk.<br />
<strong>Az</strong> aritmetika az eg<strong>és</strong>z számokkal való mőveleteket tanulmányozza. A matematikai<br />
logika bevezeti a diszjunkciót, konjunkciót valamint az ítéletek tagadását (a negációt).<br />
Egy halmaz r<strong>és</strong>zeinek halmaza esetén az egyesít<strong>és</strong>, metszet <strong>és</strong> komplementer<br />
mőveleteket használtuk. A fent említett mőveletek nagyon eltérnek egymástól,<br />
elsısorban azért, mert olyan elemekre alkalmazzák, amelyek különbözı halmazokhoz<br />
tartoznak.<br />
A mőveletek rendelkezhetnek vagy nem, bizonyos tulajdonságokkal. Különbözı<br />
mőveletek amelyek jól meghatározott elemekre hatnak, rendelkezhetnek ugyanazon<br />
tulajdonságokkal. <strong>Az</strong> összeadás, szorzás, egyesít<strong>és</strong>, metsz<strong>és</strong>, konjunkció <strong>és</strong> diszjunkció<br />
kommutatív <strong>és</strong> asszociatív mőveletek.<br />
11
A mőveletek közötti, tulajdonságokon alapuló hasonlóság adta az ötletet, hogy ne<br />
vegyék figyelembe a mőveletek vagy a értelmez<strong>és</strong>i halmaz elemeinek jellegét, hanem<br />
csak a közös tulajdonságaikat. A meghatározott (konkrét) mőveletekrıl a határozatlan<br />
(absztrakt) mőveletekre való áttér<strong>és</strong>, hasonló a számtanról az algebrára való áttér<strong>és</strong>sel,<br />
ahol az ismert számokkal való mőveletekrıl áttérünk az ismeretlenekkel való<br />
mőveletekre.<br />
Hogyha valamely halmazon meghatároztunk egy vagy több mőveletet bizonyos<br />
tulajdonságokkal, akkor a halmazt algebrai struktúrával láttuk el. Néha a halmazt a<br />
mőveletekkel együtt algebrának nevezik. <strong>Az</strong> algebra elnevez<strong>és</strong> sugall némi hasonlóságot<br />
az ismert algebrával, de szükséges kiemelnünk az algebra szó kettıs jellegét:<br />
matematikai ág valamint bizonyos struktúrával ellátott halmaz.<br />
A Boole-algebra az algebra egy sajátos esete, az itt meghatározott mőveleteknek<br />
teljesíteniük kell néhány jól meghatározott feltételeket. Ahhoz, hogy meghatározzuk a<br />
Boole-algebra struktúrát, elıször egy egyszerőbb, hálónak nevezett struktúrát határozunk<br />
meg.<br />
Egy r<strong>és</strong>zlegesen rendezett halmaz fontos elemei<br />
P , egy r<strong>és</strong>zlegesen rendezett halmaz <strong>és</strong> legyen A ⊆ P .<br />
Egy α elemet, az A r<strong>és</strong>zhalmaz legkisebb, vagy elsı elemének nevezzük, ha<br />
⎧1.<br />
α ∈ A<br />
⎨<br />
⎩2,<br />
∀x<br />
∈ A ⇒ α ≤ x<br />
.<br />
Egy ω elemet az A r<strong>és</strong>zhalmaz legnagyobb, vagy utolsó elemének nevezzük, ha<br />
⎧1.<br />
ω ∈ A<br />
⎨<br />
⎩2,<br />
∀x<br />
∈ A ⇒ x ≤ ω<br />
.<br />
Vegyük <strong>és</strong>zre, egy r<strong>és</strong>zhalmaznak lehet, hogy létezik legkisebb eleme, de lehet,<br />
hogy nem!<br />
De, ha a <strong>és</strong> b valós számok a < b, akkor (a,b), (a,b], [a,b), intervallumoknak nincs<br />
legkisebb, vagy legnagyobb eleme!<br />
Kijelent<strong>és</strong>. Ha egy r<strong>és</strong>zlegesen rendezett halmaz valamely A r<strong>és</strong>zhalmazának van<br />
legkisebb eleme, akkor az egyértelmő!<br />
'<br />
Bizonyítás. Legyen α <strong>és</strong> α két legkisebb eleme az A-nak. Tehát<br />
⎧1.<br />
α ∈ A<br />
⎨<br />
⎩2,<br />
∀x<br />
∈ A ⇒ α ≤ x<br />
<strong>és</strong><br />
'<br />
⎪⎧<br />
1.<br />
α ∈ A<br />
'<br />
'<br />
'<br />
⎨<br />
. Akkor x : = α ∈ A,<br />
α ≤ α <strong>és</strong> x : = α ∈ A,<br />
α ≤ α .<br />
'<br />
⎪⎩ 2,<br />
∀x<br />
∈ A ⇒ α ≤ x<br />
'<br />
És akkor az antiszimmetriából következik, hogy α = α .<br />
Értelmez<strong>és</strong>. Egy r<strong>és</strong>zlegesen rendezett halmaz valamely A r<strong>és</strong>zhalmazának<br />
minimális elemei azok az m elemek, melyek eleget tesznek a következı feltételeknek:<br />
1. m ∈ A<br />
2. nem létezik egyetlenegy x elem sem A-ból, melyre x
Kijelent<strong>és</strong>. Ha egy r<strong>és</strong>zlegesen rendezett halmaz valamely r<strong>és</strong>zhalmazának van<br />
legkisebb (illetve legnagyobb) eleme, akkor az minimális (illetve maximális) eleme is!<br />
Bizonyítás. Legyen α egy A r<strong>és</strong>zhalmaznak legkisebb eleme. Be akarjuk látni,<br />
hogy ez egyben minimális is! α ∈ A <strong>és</strong> még be kell látni, hogy nem létezik x ∈ A,<br />
úgy,<br />
hogy x < α . Feltétezzük, mint abszurditás, hogy létezik x ∈ A úgy, hogy<br />
x < α . ⇒ x ≤ α <strong>és</strong> x ≠ α.<br />
De x ∈ A ⇒ α ≤ x.<br />
Vagyis x = α.<br />
x < α . Tehát α minimális!<br />
Ez ellentmondás, mert<br />
Példa. Vegyük egy M nem üres halmaz r<strong>és</strong>zhalmazainak halmazát<br />
( P(<br />
M ) , ⊆)<br />
, M ≠ φ.<br />
A = { X ∈ P(<br />
M ) / X ≠ φ}<br />
⊂ P(<br />
M ).<br />
elem!<br />
Értelmez<strong>és</strong>. Egy r<strong>és</strong>zlegesen rendezett ( , ≤)<br />
Ebben az esetben minden x ∈ M -re { x } minimális<br />
P halmaz A r<strong>és</strong>zhalmazának<br />
minoránsai, azok a t ∈ A elemek, amelyre ∀ x ∈ A ⇒ t ≤ x . Egy r<strong>és</strong>zlegesen rendezett<br />
( P,<br />
≤)<br />
halmaz A r<strong>és</strong>zhalmazának majoránsai, azok a z ∈ A elemek, amelyre<br />
∀ x ∈ A ⇒ x ≤ z .<br />
Például a valós számok halmazában, ha vesszük az (a,b), (a,b], [a,b), [a,b]<br />
intervallumokat, akkor<br />
itt egy t elem minoráns ⇔ t ≤ a <strong>és</strong> egy z elem majoráns ⇔ b ≤ z.<br />
minoránsok<br />
a<br />
P halmaz A r<strong>és</strong>zhalmazának a legnagyobb minoránsa<br />
az A halmaz infimuma, (legnagyobb alsó korlátja) <strong>és</strong> a legkisebb majoránsa, a<br />
szupremuma , vagyis a legnagyobb alsó korlátja.<br />
Tehát inf (a,b) = inf [a,b) = inf (a,b] = inf [a,b] = a <strong>és</strong> sup (a,b) = sup [a,b) = sup<br />
(a,b] = sup [a,b] = b.<br />
Ha vesszük {1,2,…,10} <strong>és</strong> az oszthatóságot, akkor inf{1,2,…,10}=1 <strong>és</strong><br />
sup{1,2,…,10}=23.32.5.7=2520.<br />
Nincs infimuma a ( − ∞,<br />
b)<br />
, R, Z-nek nincs szupremuma a ( a , ∞)<br />
, R, Z-nek.<br />
Elsı megjegyz<strong>és</strong>: Ha egy r<strong>és</strong>zlegesen rendezett ( P, ≤)<br />
halmaz A r<strong>és</strong>zhalmazának<br />
van elsı eleme (utolsó eleme), akkor az infimum is (supremum is)!<br />
Egy r<strong>és</strong>zlegesen rendezett ( , ≤)<br />
b<br />
majoránsok<br />
Valóban: Legyen α , az A halmaz elsı eleme, akkor igaz, hogy<br />
⎧a,<br />
α ≤ A<br />
⎨<br />
⎩b,<br />
∀x<br />
∈ A ⇒ α ≤ x<br />
. Be, kell lássuk, hogy α egyben infimum is, vagyis<br />
⎧1.,<br />
∀x<br />
∈ A ⇒ α ≤ x<br />
⎨<br />
⎩2.,<br />
∀t<br />
∈ P(<br />
∀x<br />
∈ A,<br />
t ≤ x)<br />
⇒ t ≤ α<br />
. De b ,⇒ 1.<br />
Ezért, még be kell látni a 2.-ot. Legyen t egy minoráns. Így t ≤ x,<br />
∀x<br />
∈ A , legyen<br />
akkor x : = α ⇒ t ≤ α . Tehát α a legnagyobb minoráns, vagyis infimum!<br />
Második megjegyz<strong>és</strong>: Egy r<strong>és</strong>zlegesen rendezett ( P, ≤)<br />
halmaz A r<strong>és</strong>zhalmazának<br />
infimuma, illetve suprémuma egyértelmő!<br />
13
Valóban: Legyenek ω, ϖ suprémumai az A r<strong>és</strong>zhalmaznak. Tehát<br />
⎧a,<br />
∀x<br />
∈ A ⇒ x ≤ ω jelölhetjük,<br />
ezt így A ≤ ω<br />
⎨<br />
⎩b,<br />
∀z,<br />
A ≤ z ⇒ ω ≤ z<br />
<strong>és</strong><br />
⎧1,<br />
∀x<br />
∈ A ⇒ x ≤ϖ<br />
jelölhetjük,<br />
ezt így A ≤ϖ<br />
⎨<br />
Ha megfigyeljük, akkor a,-ból <strong>és</strong> 2-<br />
⎩2,<br />
∀z,<br />
A ≤ z ⇒ϖ<br />
≤ z<br />
bıl z = ω következik, hogy A ≤ϖ<br />
⇒ϖ<br />
≤ ω <strong>és</strong> analóg módon b,-bıl <strong>és</strong> 1-bıl<br />
A ≤ ω ⇒ ω ≤ϖ<br />
. Tehát ω = ϖ .<br />
Duális fogalmak<br />
≤ ≥<br />
Minimális elem Maximális elem<br />
Elsı elem Utolsó elem<br />
Minoráns Majoráns<br />
Infimum Suprémum<br />
Értelmez<strong>és</strong>: Hálónak nevezünk 1 egy r<strong>és</strong>zlegesen rendezett halmazt ( , ≤)<br />
amelyben<br />
definició <br />
∀x<br />
∈ H,<br />
∀y<br />
∈ H ⇒ ∃ inf{<br />
x,<br />
y}<br />
<strong>és</strong> ∃ sup{<br />
x,<br />
y}<br />
.<br />
Példák.<br />
Bármely teljesen rendezett halmaz egyben hálót is alkot. Valóban legyen ( , ≤)<br />
teljesen rendezett halmaz <strong>és</strong> legyen x ∈ T , y ∈T<br />
. Két eset lehetséges:<br />
⎧x<br />
≤ y ⇒ inf<br />
⎨<br />
⎩y<br />
≤ x ⇒ inf<br />
{ x,<br />
y}<br />
= x,<br />
sup{<br />
x,<br />
y}<br />
{ x,<br />
y}<br />
= y,<br />
sup{<br />
x,<br />
y}<br />
= y<br />
= x<br />
.<br />
H ,<br />
T egy<br />
A teljesen rendezett halmaznál az inf{x,y}=x, egyben az elsı elem is <strong>és</strong> a<br />
sup{x,y}=y, egyben az utolsó elem is.<br />
( P( M ), ⊆)<br />
, inf{<br />
A,<br />
B}<br />
= A∩<br />
B,<br />
sup{<br />
A,<br />
B}<br />
= A∪<br />
B.<br />
( N , / ) , inf { m,<br />
n}<br />
= l.<br />
n.<br />
k.<br />
o{<br />
m,<br />
n}<br />
, sup{<br />
m,<br />
n}<br />
= l.<br />
k.<br />
k.<br />
t{<br />
m,<br />
n}.<br />
Egyik legfontosabb példa hálóra!<br />
Példát adhatunk a geometriából is, ahol az elemek – a pont, egyenes <strong>és</strong> a sík, elsı<br />
elem – az üres halmaz, az utolsó elem – a tejes tér, <strong>és</strong> a rendez<strong>és</strong>i reláció – a<br />
bennfoglalás!<br />
Most lássuk milyen tulajdonságai vannak az így bevezetett hálóstruktúrának!<br />
Bevezethetünk két algebrai mőveletet a következıképpen:<br />
1 Oystein Ore-értelemben<br />
14
∨ : L × L → L,<br />
∀(<br />
x,<br />
y)<br />
∈ L<br />
∀(<br />
x,<br />
y)<br />
∈ L<br />
Tulajdonságok:<br />
1.,<br />
2.,<br />
3.,<br />
2<br />
2<br />
x ≤ x ∨ y,<br />
y ≤ x ∨ y,<br />
→ x ∨ y = sup<br />
→ x ∧ y = inf<br />
x ∧ y ≤ x<br />
x ∧ y ≤ y<br />
x ≤ z,<br />
y ≤ z ⇒ x ∨ y ≤ z<br />
.<br />
t ≤ x,<br />
t ≤ y ⇒ t ≤ x ∧ y<br />
{ x,<br />
y}<br />
{ x,<br />
y}<br />
x ≤ y,<br />
t ≤ v ⇒ x ∨ y ≤ y ∨ v<br />
.<br />
x ≤ y,<br />
t ≤ v ⇒ x ∧ y ≤ y ∧ v<br />
. <strong>Az</strong> inf, sup egyértelmően meghatározott.<br />
Kommutativitás:<br />
x ∨ y = y ∨ x,<br />
x ∧ y = y ∧ x<br />
Asszociativitás:<br />
( x ∨ y)<br />
∨ z = x ∨ ( y ∨ z),<br />
( x ∧ y)<br />
∧ z = x ∧ ( y ∧ z)<br />
Abszorpció (elnyel<strong>és</strong>):<br />
Idempotencia:<br />
x ∨ ( x ∧ y)<br />
= x,<br />
x ∧ ( x ∨ y)<br />
= x<br />
x ∨ x = x,<br />
x ∧ x = x<br />
Ezen tulajdonságok bebizonyítása nem okozhat nehézséget. Lássuk a 3-as<br />
tulajdonságot: x ≤ y,<br />
t ≤ v ⇒ x ∨ y ≤ y ∨ v .<br />
a) x ≤ y<br />
b) t ≤ v<br />
c) y ≤ y ∨ v , mert y ∨ v = sup { y, v}<br />
d) x ≤ y ∨ v , mert a, <strong>és</strong> b, tranzitivitás<br />
e) v ≤ y ∨ v , mert y ∨ v = sup{ y,<br />
v}<br />
f) t ≤ y ∨ v , mert b, <strong>és</strong> e, tranzitivitás<br />
g) x ∨ t ≤ y ∨ v , mert<br />
majoránsok közül.<br />
y ∨ v majoránsa {x,t}, d, f <strong>és</strong> x ∨ t , a legkisebb a<br />
Ezzel bebizonyítottuk a 3-at<br />
A kommutativitás abból következik, hogy az inf, sup egyértelmő:<br />
x ∨ y = sup{ x,<br />
y}<br />
= sup{ y,<br />
x}<br />
= y ∨ x.<br />
<strong>Az</strong> asszociativitás a következıbıl származik:<br />
inf{inf{ x,<br />
y},<br />
z}<br />
= inf{ x,<br />
y,<br />
z}<br />
inf{ x,<br />
inf{ y,<br />
z}}<br />
= inf{ x,<br />
y,<br />
z}<br />
.<br />
A többi tulajdonság bebizonyítása egyszerő, de fontos gyakorlat!<br />
Feladat: Egy teljesen rendezett halmazban az elsı elem <strong>és</strong> a minimális elem<br />
megegyezik.<br />
15
Fordítva is igaz: Ha egy r<strong>és</strong>zlegesen rendezett halmazban az elsı elem megegyezik<br />
a minimális elemmel, akkor az a halmaz teljesen rendezett!<br />
A Boole-algebra arra szolgál, hogy a logikai ítéleteinket, következtet<strong>és</strong>einket <strong>és</strong><br />
gondolkodásunkat átalakítsa algebrai számítássá.<br />
Egy ρ bináris reláció egy M halmazon, nem más mint az M×M r<strong>és</strong>zhalmaza.<br />
(Például az Access adatbázis-kezelıt relációs adatbázis-kezelınek nevezzük mert,<br />
T × T × T × .. × T adatok közötti relációt fejezi ki, ahol T egy tábla, valamilyen<br />
rendezet adathalmaz)<br />
Legyen P egy halmaz, <strong>és</strong> ρ egy P-n értelmezett bináris reláció, akkor ρ r<strong>és</strong>zleges<br />
rendez<strong>és</strong>i reláció, ha<br />
∀ x-re x ρ x,<br />
∀ x-re, ∀ y-ra, ∀ z-re ha x ρ y <strong>és</strong> y ρ z, akkor x ρ z.<br />
Ebben az esetben a (P, ρ) párt r<strong>és</strong>zlegesen rendezett halmaznak nevezzük.<br />
Például, a {1,2,3,4,5,6,7,8,9,10} számok halmaza az oszthatóságra nézve,<br />
r<strong>és</strong>zlegesen rendezett halmaz. (<strong>Az</strong> ismert számhalmazok, mint (N, ≤ ), (Z, ≤ ), (Q, ≤ ),<br />
(R, ≤ ) mind r<strong>és</strong>zlegesen rendezett halmazok, de nem jó példák, mert mind teljesen<br />
rendezettek is).<br />
De r<strong>és</strong>zlegesen rendezett halmaz a term<strong>és</strong>zetes számok halmaza, az oszthatóságra<br />
nézve is, vagyis: m ⁄n ↔létezik p term<strong>és</strong>zetes szám, úgy hogy n=m . p<br />
De a (P(M), ⊆ ) is egyik legfontosabb példa r<strong>és</strong>zlegesen rendezett halmazra.<br />
Értelmez<strong>és</strong>. Hasse-diagramnak nevezünk, egy pontokból <strong>és</strong> vonalakból álló rajzot,<br />
amely egy véges r<strong>és</strong>zlegesen rendezett halmazt szemléltet a következıképpen. A<br />
pontok a halmaz elemeit szemléltetik, a vonalak azt, ha a két elem (két pont)<br />
relációban van egymással. A Hasse-diagram, úgy fejezi<br />
ki x ≤ y, hogy x y alatt van <strong>és</strong> egy kis szakasszal vannak<br />
összekötve. Lényegében az a fontos, hogy x <strong>és</strong> y között<br />
nincs egy elem se, <strong>és</strong> ha a két elem nincs ≤ relációban,<br />
akkor nincsenek is összekötve.<br />
Például a mellékelt ábra az {1, 2, 3, 4, 5, 6, 7, 8, 9,<br />
10} halmazon értelmezett oszthatósági relációt<br />
szemlélteti.<br />
Értelmez<strong>és</strong>. Egy (P, ρ) r<strong>és</strong>zlegesen rendezett halmaz teljesen rendezett, ha bármely<br />
két eleme összehasonlítható, vagyis ∀ x, ∀y<br />
− ra : xρy<br />
∨ yρx<br />
Általában:<br />
∀ x,<br />
∀y,<br />
x ≤ y ∨ y ≤ x ∨ ( non(<br />
x ≤ y)<br />
∧ non(<br />
y ≤ x))<br />
<br />
x≠<br />
y<br />
azt jelenti, hogy x <strong>és</strong> y inkompatibilis (összehasonlíthatatlan).<br />
Egy teljesen rendezett halmaz, egy olyan r<strong>és</strong>zlegesen rendezett halmaz, amelyben<br />
nincsenek összehasonlíthatatlan elemek!<br />
Fontos megjegyz<strong>és</strong>. A ≥ reláció a ≤ reláció duálisa. A duális azt jelent, hogy , ha<br />
egy tétel igaz egy r<strong>és</strong>zlegesen rendezett halmazban a ≤ , relációra, akkor igaz ≥<br />
relációra is. Vagyis csak ki kell értelemszerően cserélni ≤ relációt a ≥- relációra.<br />
Értelmez<strong>és</strong>. Legyen ( P , ≤)<br />
egy r<strong>és</strong>zlegesen rendezett halmaz, akkor értelmezzük a<br />
szigorú rendez<strong>és</strong>t, úgy, hogy < , amelyet így értelmezünk:<br />
16
∀ x, ∀y<br />
− ra : x < y ⇔ x ≤ y ∧ x ≠ y . Ezt tehát úgy nevezzük, hogy szigorúan<br />
r<strong>és</strong>zleges rendez<strong>és</strong>i reláció!<br />
Kijelent<strong>és</strong>. Egy r<strong>és</strong>zlegesen rendezett halmazban (P, ≤ ), a hozzárendelt szigorúan<br />
)P1∪P2 a legkisebb mérető konvex sokszög amely tartalmazza P1∩P2.<br />
Ezen mőveletek teljesítik a háló meghatározásában megadott feltételeket (lásd a<br />
mellékelt ábrát). Mutassuk ki, hogy ez a háló nem disztributív.<br />
Legyen P = ABCΔ, P1 = A1B1C1Δ, P2 = A2B2C2Δ<br />
P1∪P2 = A1B1C1C2A2<br />
P∩(P1∪P2) = AE1C1FA<br />
P∩P1 = C1D1E1Δ<br />
P∩P2 = B2E2D2Δ<br />
(P∩P1) ∪(P∩P2) = D1E1C1E2D2<br />
Megfigyelhetı, hogy AE1C1FD2 ≠ D1E1C1E2D2<br />
Észrevételek.<br />
1. A két feltétel, a háló meghatározásából, duális<br />
egymáshoz viszonyítva, tehát a dualitás elve érvényes a<br />
disztributív hálókban is.<br />
2. Kimutatható, hogy egy hálóban a két<br />
disztributivitási feltétel ekvivalens.<br />
Disztributív <strong>és</strong> teljes hálók<br />
Értelmez<strong>és</strong>. Egy disztributív hálót teljesnek nevezünk ha teljesülnek a<br />
következő feltételek:<br />
Létezik egy semleges elem u, a ∩ mőveletre nézve, amely teljesíti a<br />
a ∩ u = a relációt bármely a ∈ L;<br />
Létezik egy semleges elem n, a ∪ mőveletre nézve (zéros elem), amely teljesíti a<br />
a ∪ n = a relációt bármely a∈L;<br />
Bármely a ∈ L elemre létezik egy komplementer elem⎺a ∈ L amely teljesíti:<br />
a ∩⎺a = n<br />
a ∪⎺a = u<br />
Példák:<br />
A < P(M) ,∩ ,∪> egy kieg<strong>és</strong>zített disztributív háló, mert az M halmaz egy semleges<br />
elem a metszetre nézve, az üres halmaz Φ, semleges elem az egyesít<strong>és</strong>re nézve, <strong>és</strong> ∀ A<br />
⊆ M halmaz esetén a CMA = M - A halmaz az A halmaz komplementere.<br />
Hogyha a k szám csak elsıfokú prím tényezıkbıl áll, akkor a «{x| x osztója k-nak},<br />
lnko, lkkt» háló disztributív <strong>és</strong> teljes. A k szám semleges elem az elsı mőveletre, mivel<br />
a lnko(x, k) = x bármely x osztója k esetén, az 1 pedig semleges elem a második<br />
mőveletre mivel lkkt(x, 1) = x bármely x-re.<br />
Ha egy x elemre meghatározzuk a k/x számot, akkor lnko(x, x/k) = 1 <strong>és</strong> lkkt(x, x/k) =<br />
k, mivelhogy ezen számoknak nincs közös osztójuk. Tehát a k/x szám az x szám<br />
komplementere.<br />
Ha a k szám magasabb fokú prím tényezıkbıl áll, akkor az osztók hálója nincs<br />
kieg<strong>és</strong>zítve. Legyen k = 60 = 22 . 3 . 5, az 10-es számra nem létezik egy szám, amely<br />
teljesítse a komplementaritási feltételeket. <strong>Az</strong> elsı feltételt teljesíti az 1-es <strong>és</strong> a 3-as<br />
szám, de már nem teljesítik a második feltételt (lkkt(10,1) = 10 ≠ 60 <strong>és</strong> lkkt(10, 3) = 30<br />
≠ 60).<br />
Kijelent<strong>és</strong>: Egy disztributív <strong>és</strong> teljes hálóban bármely elemnek egyetlen<br />
komplementere van.<br />
Bizonyítás: Legyen L egy disztributív <strong>és</strong> kieg<strong>és</strong>zített háló <strong>és</strong> feltételezzük reductio<br />
ad absurdum módszerrel, hogy létezik olyan a ∈ L elem, amelynek két különbözı<br />
komplementere a1 <strong>és</strong> a2, a1 ≠ a2 van.<br />
18
a1 =a1 ∪ n (n a ∪ semleges eleme)<br />
= a1 ∪ (a ∩ a2) (a2 az a komplementere)<br />
= (a1 ∪ a) ∩ (a1 ∩ a2) (a ∪ disztributivitása ∩ szemben)<br />
= u ∩ (a ∪ a1) (a1 az a komplementere)<br />
= a1 ∪ a2 (u semleges elem ∩)<br />
Hasonlóan<br />
a2 = a2 ∪ n = a2 ∪ (a ∩ a1) = (a2 ∪ a) ∩(a2 ∩ a1) = u ∩ (a2 ∪ a1)=a2 ∪ a1<br />
Tehát: a1 = a1 ∪ a2 = a2 ∪ a1 = a2 ami ellentmond a a1 ≠ a2 feltételnek.<br />
Például a mellékelt ábra nem disztrubutív, <strong>és</strong> z-nek<br />
komplementuma x is <strong>és</strong> y is!<br />
Értelmez<strong>és</strong>. Egy disztributív <strong>és</strong> teljes hálót Boole-algebrának<br />
nevezünk, <strong>és</strong> a következı módon jelöljük .<br />
A mellékelt ábra a 30 osztóit abrázolja a lnko <strong>és</strong> a lkkt<br />
mőveletekkel. A Hasse-diagrammon is könnyen<br />
ellenırizhetı, hogy Boole-algebrát alkot. A következı ábra<br />
azt szemlélteti, hogy a 12 osztói nem képeznek Boolealgebrát.<br />
Boole-algebra, a szimbolikus logika aritmetikája<br />
Boole-algebrának nevezünk egy olyan halmazt, amelyen értelmeztünk három<br />
mőveletet, jelöljük ezeket rendre ∨, ∧,<br />
'-vel<br />
<strong>és</strong> amelyek eleget tesznek bizonyos<br />
axiómáknak. Minden Boole-algebra tartalmaz két kitüntetett tulajdonságú elemet,<br />
amelyeknek semleges hatása van a két ( ∨ illetve ∧ ) mőveletre nézve. Ezért ezeket<br />
semleges, illetve egységelemnek is nevezzük, <strong>és</strong> általában 0-val, illetve 1-gyel jelöljük.<br />
Legfontosabb példa Boole-algebrára egy tetszıleges halmaz (jelöljük H-val)<br />
r<strong>és</strong>zhalmazainak halmaza (jelöl<strong>és</strong>e P(H)), amely a H összes r<strong>és</strong>zeinek a halmaza. Ezen<br />
a halmazon értelmezzük a H r<strong>és</strong>zeinek az egyesít<strong>és</strong>ét (∪ ), a metszetét (∩ ) <strong>és</strong> a<br />
komplementálást ('), a semleges elem az üres halmaz (φ ), amely nem tartalmaz egy<br />
elemet sem <strong>és</strong> az egységelem maga a H halmaz. Stone tétele alapján bármely véges<br />
Boole-algebra izomorf (ugyanolyan struktúrájú) mint egy P(H), tehát a Boole-algebrák<br />
prototípusa, standard alakja a r<strong>és</strong>zhalmazok halmaza. Egy másik példa Boole-algebrára<br />
az ítéletek logikája, ahol a Boole-algebrát magát az ítéletek halmaza alkotja, a három<br />
mővelet az alternatíva, a konjunkció <strong>és</strong> a tagadás, a semleges elem az ellentmondások<br />
osztálya, az egységelem pedig a tautológiák osztálya.<br />
A Boole-algebrák fontossága, az általános struktúrájában <strong>és</strong> a benne érvényesülı<br />
egyszerő kalkulációs szabályok egységébıl áll. Ebben rejlik sok konkrét modellként<br />
való alkalmazhatósága. Boole-algebrában a logikai implikáció áttranszformálódik a<br />
" ≤ " relációra, amelyet a következı módon értelmezünk: p ⇒ q ⇔ p ≤ q ⇔ p ∧ q'=<br />
0 .<br />
19
Észrevételek.<br />
Feltételezhetjük, az elıbbi tétel alapján, hogy egy Boole-algebrában<br />
meghatározható egy unáris mővelet, mely egy elem komplementerének<br />
meghatározásában áll, tehát mondhatjuk, hogy egy Boole-algebrában három mővelet<br />
létezik ∩, ∪, −. Egy Boole-algebrában e három mőveletet ”.”, ”+”, ”-”, a semleges<br />
elemeket ”1”, ”0”-val jelölik.<br />
A Boole-algebra meghatározásában szereplı feltételek nem függetlenek egymástól.<br />
Kimutattuk, hogy egy disztributív hálónak elég csak az egyik feltétel teljesül<strong>és</strong>e.<br />
Kimutatható, hogy ahhoz, hogy meghatározzunk egy Boole-algebrát elég az, hogy<br />
bármely a, b, c elemekre igazak legyenek a következı állítások:<br />
a b = b a a + b =b + a<br />
a (b + c) = a b + a c a + b c = (a + b) (a + c)<br />
a.1 = a a + 0 = a<br />
a.⎺a = 0 a +⎺a = 1<br />
(a b) c = a (b c) (a + b) + c = a + (b + c)<br />
a ( a + b) = a a + a b = a<br />
A zérós elem elsı, míg az általános elem utolsó (lásd 8. példa)<br />
Stone kimutatta , hogy bármely «A, ., +, − ,1, 0» véges Boole-algebra bijektíven<br />
összekapcsolható egy halmaz r<strong>és</strong>zhalmazainak halmazával.<br />
B2 algebra<br />
A B2-es algebra kéttagú Boole-algebra. Ezen elemek a két mővelet semleges<br />
elemei: 0 <strong>és</strong> 1. Ez mondható a legegyszerőbb Boole-algebrának. A három mővelete a<br />
következıképpen alakul:<br />
0+0=0 0.0=0 ⎺0=1<br />
0+1=1 0.1=0 ⎺1=0<br />
1+0=1 1.0=0<br />
1+1=1 1.1=1<br />
A Boole-algebra meghatározásában szereplı feltételek teljesül<strong>és</strong>ének kimutatására<br />
ellenırizzük a következı egyenleteket, behelyettesítve az a, b, c elemeket 0 <strong>és</strong> 1–gyel<br />
minden lehetséges kombinációra. Például az abszorpció ellenırizhetı az I.1. táblázat<br />
alapján.<br />
A a+b a(a+b) ab a+ab<br />
(1)<br />
(3) (4) (5) (6)<br />
2<br />
)<br />
0<br />
0 0<br />
0<br />
0<br />
0<br />
1 0<br />
0<br />
0<br />
1<br />
1 1<br />
0<br />
1<br />
1<br />
1 1<br />
1<br />
1<br />
I.1. táblázat<br />
<strong>Az</strong> (1), (4),(6) oszlopok egyformasága igazolja az a=a(a+b)=a+ab képlet<br />
teljesül<strong>és</strong>ét.<br />
Figyelemre méltó, hogy a “.” mővelet ugyanaz, mint a számtani szorzás, azonban a<br />
“+” eltér a számtani összeadástól, mivel 1+1=1. Például a+b=max(a,b) ∀a,b ∈B2.<br />
20
Ezen algebrának fontos szerepe volt a számítógépek fejlıd<strong>és</strong>ében. A román Grigore<br />
C. Moisil (1906-1973) matematikusnak fontos elméleti <strong>és</strong> gyakorlati hozzájárulása volt<br />
a Boole-algebra tanulmányozásához.<br />
Ítéletek algebrája<br />
A propozíciók halmazának keretén belül meghatározható a diszjunkció, konjunkció<br />
<strong>és</strong> a negáció. Ha az ekvivalens propozíciókat egyenlınek tekintjük, akkor ezen<br />
mőveletek asszociativitása, disztributivitása <strong>és</strong> kommutativitása teljesítve van. <strong>Az</strong><br />
egyetemes elemet a tautológiák (mindig igaz propozíciók) osztálya alkotja, <strong>és</strong> a zérus<br />
elemet az ellentmondások (mindig hamis propozíciók) alkotják. Könnyen kimutatható,<br />
hogy ezen semleges elemek teljesítik a Boole-algebra meghatározásában szereplı<br />
feltételeket. Tehát a propozíciók ekvivalenciájának osztálya egy Boole-algebra,<br />
minden osztály logikailag ekvivalens mondatokat tartalmazva.<br />
A Boole-algebrai függvények<br />
Amint láttuk egy Boole- féle algebra: ( B, ∨ , ∧,<br />
non,<br />
0,<br />
1)<br />
vagy ha a konjukció vagy<br />
metszet = ∧ = . , <strong>és</strong> a diszjunkció vagy egyesít<strong>és</strong> = ∨ = + . Akkor ( B , + ,., non,<br />
0,<br />
1)<br />
Boolealgebra<br />
egy disztributív haló, 0 elsı <strong>és</strong> 1 utolsó elemmel, amelyben minden elemnek<br />
van komplementere <strong>és</strong> amelyben a 0 ≠ 1.<br />
1<br />
Még szoktuk a közönséges elemet x = x jelölni <strong>és</strong> a komplementumát<br />
0<br />
non( x)<br />
= x'=<br />
x = x , ∀x<br />
∈ B<br />
. <strong>Az</strong>ért, hogy tömörebben is felírhassuk a monomot vagy<br />
n<br />
αi11<br />
αi12<br />
i1p<br />
αi11<br />
αi12<br />
i1p<br />
tagot: f : B → B,<br />
f ( x , x ,..., x ) = x ∧ x ∧...<br />
∧ x = x x ... x , ahol az<br />
i1<br />
i2<br />
ip<br />
1<br />
2<br />
n<br />
i1<br />
α , α ,..., α , indexek kettınként különbözıek. Ha a p megegyezik az n-nel, akkor<br />
teljes monomról beszélünk. Például, ha n=3, akkor<br />
x 1 ∧ x'2<br />
∧x'3<br />
= x1x'<br />
2 x'3<br />
.<br />
Boole-függvénynek nevezünk egy<br />
i2<br />
α<br />
i p<br />
i1<br />
1<br />
i2<br />
x ∧ x<br />
2<br />
α<br />
in<br />
p<br />
<br />
= x1x<br />
2 . Vagy<br />
n<br />
αi11<br />
αi12<br />
i1<br />
p<br />
αi11<br />
αi12<br />
i1<br />
p<br />
f : B → B,<br />
f ( x1,<br />
x2<br />
,..., xn<br />
) = ∨ xi<br />
∧ x ...<br />
... ,<br />
1 i ∧ ∧ x<br />
2<br />
i = ∨ x 1 2<br />
1 ,<br />
p<br />
i xi<br />
xi<br />
2,...,<br />
1,<br />
n p<br />
α α α<br />
α α<br />
n<br />
2,...,<br />
αn<br />
a<br />
monomok egy tetszıleges diszjunkcióját vagy a 0, vagy az 1 konstans függvényt. A<br />
továbbiakban a diszjunkciót +, míg a konjukciót . jelöljük!<br />
x2<br />
Boole függvények megadási módja:<br />
0 0 1 1<br />
0 1 0 1<br />
f 0 0 0 1<br />
x1<br />
x 2<br />
x1<br />
0 1<br />
0 0 0<br />
1 0 1<br />
x 2x 3<br />
x1<br />
00 01 10 11<br />
α<br />
jelıelı<br />
α<br />
21
x2<br />
x 2<br />
0 1 0 0 0<br />
1 1 0 1 1<br />
x3x4<br />
x1x2 00 01 10 11<br />
00 1 0 0 0<br />
10 1 0 1 1<br />
10 0 1 1 0<br />
11 1 0 1 1<br />
x1 0 0 1 1 Neve Szintetikusan<br />
0 1 0 1<br />
f0 0 0 0 0 Konstans 0 f0(x1,x2)=0 f1 0 0 0 1 Szorzat konjunkció f1(x1,x2)= x 1x 2<br />
f2 0 0 1 0 Indirekt metszet<br />
x<br />
f2(x1,x2)= x1 2<br />
f3 0 0 1 1 Elsı argumentum f3(x1,x2)= 1<br />
f4 0 1 0 0 Indirekt metszet<br />
x<br />
f5 0 1 0 1 Második<br />
argumentum<br />
f5(x1,x2)= x 2<br />
f6 0 1 1 0 Szimmetrikus<br />
különbség<br />
f6(x1,x2)=<br />
x<br />
f4(x1,x2)= x 1 2<br />
x 1 2<br />
x + x1 x 2<br />
x + x<br />
f7 0 1 1 1 Logikai összeg f7(x1,x2)= 1 2<br />
f8 1 0 0 0 Peirce függvénye<br />
f8(x1,x2)= x 1 x2<br />
f9 1 0 0 1 Ekvivalencia f9(x1,x2)=<br />
x 1x 2 + x 1 x2<br />
f10 1 0 1 0 Második arg.<br />
Tagadás<br />
f10(x1,x2)= x 2<br />
f11 1 0 1 1 Implikáció<br />
f11(x1,x2)= x 1 + x 2<br />
f12 1 1 0 0 Elsı arg. tagadás<br />
x2<br />
x2x3<br />
f13 1 1 0 1 Implikáció<br />
f14 1 1 1 0 Sheffer függvénye<br />
f12(x1,x2)= x 1<br />
f13(x1,x2)= x 1 + x 2<br />
f14(x1,x2)= x 1 + x 2<br />
f 15 1 1 1 1 Konstans 1 f 15(x 1,x 2)=1<br />
x 1<br />
0 0 1 1<br />
0 1 0 1<br />
f 0 0 0 1<br />
x 1<br />
0 1<br />
0 0 0<br />
1 0 1<br />
x1<br />
00 01 10 11<br />
0 1 0 0 0<br />
1 1 0 1 1<br />
22
x 3x 4<br />
x1x2<br />
00 01 10 11<br />
00 1 0 0 0<br />
10 1 0 1 1<br />
10 0 1 1 0<br />
11 1 0 1 1<br />
A Boole-féle függvények normál alakja<br />
Egy Boole-féle függvénynek több alakja is lehet <strong>és</strong> ezek az alakok nem egyértelmőek.<br />
<strong>Az</strong> lenne a célunk, hogy valamilyen formában standardizáljuk – egységesítsük a<br />
különbözı alakokat. Ez az egységesít<strong>és</strong> egyedi kell legyen, egy lehetı legegyszerőbb<br />
Boole- fele kifejez<strong>és</strong> által, ami lehetıvé teszi, hogy két Boole- féle függvényt könnyen<br />
összehasonlítsunk, eldöntsük gyorsan, hogy egyenlık-e, stb.<br />
Értelmez<strong>és</strong>. Boole- féle változók egyszerő szorzata, amelyben minden változó vagy<br />
annak komplementere csak egyszer fordul elı.<br />
abc, xyz,<br />
x y egyszerő szorzat, de a + abc<br />
, vagy xy már nem egyszerő<br />
Pl: 1 1<br />
szorzat, mert xy = x + y <strong>és</strong> nem egyszerő szorzat.<br />
Továbbá, egy Boole- féle függvény diszjunktív normál formájú, ha elemi szorzatok<br />
összege ( diszjunkciója). Pl: ab + bc + a , de x yz<br />
+ xyz,<br />
x y csak diszjunktív normál<br />
formákra!<br />
Term<strong>és</strong>zetesen egy függvény diszjunktív normál formája még nem egyértelmő,<br />
hiszen f ( x,<br />
y,<br />
z)<br />
= xy + yz + xz<br />
= xy + xz<br />
= xy + xyz + xz<br />
Felhasználva az abszorpció <strong>és</strong> idempotens tulajdonságokat, akárhány diszjunkív<br />
normál formát szerkeszthetünk.<br />
Értelmez<strong>és</strong>. Elemi vagy egyszerő összeg, ha valamilyen Boole- változók vagy ezek<br />
komplementumának összegét vesszük. anélkül, hogy ugyanazok a változók többször<br />
megismételıdjenek.<br />
Pl: a + b + c,<br />
vagy a + b + c,<br />
x + y + z,<br />
x + x2<br />
elemi vagy egyszerő õsszegek, míg<br />
a+bc, x + y már nem elemi összeg.<br />
Értelmez<strong>és</strong>. Konjunktív normál formája egy Boole- féle kifejez<strong>és</strong>nek az egyszerő<br />
összegek szorzata.<br />
Pl: ( a + b)(<br />
b + c)(<br />
a +c), vagy ( x + y + z)(<br />
x + y + z)<br />
x + y ,. Mind kifejez<strong>és</strong>ek, mint<br />
konjunktív normál formák.<br />
A konjunktív normál formák sem egyértelmőek, mivel<br />
( x + y)(<br />
y + z)(<br />
x + z)<br />
= ( x + y)(<br />
x + z)<br />
= ( x + y)((<br />
x + z)<br />
= ( x + y)(<br />
x + y + z)(<br />
x + z)<br />
Ami fontos megállapítás, hogy bármely Boole- féle kifejez<strong>és</strong> tehát minden Booleféle<br />
függvény is diszjunktív normál formára vagy konjunktív normál formára hozható!<br />
Ahhoz, hogy egy kifejez<strong>és</strong>t diszjunktív normál formára vagy konjunktív normál<br />
formára hozzunk a következı eljárást kell alkalmazzuk:<br />
Ha a kifejez<strong>és</strong>ben több változó <strong>és</strong> mőveletekkel összekötött változó<br />
komplementálása található, akkor alkalmazzuk a De Morgan-féle képleteket<br />
mindaddig, amíg az adott kifejez<strong>és</strong>ben már csak a változók komplementuma szerepel!<br />
A szorzás szétoszlik az összeadásra, vagyis alkalmazzuk, hogy a szorzás disztributív az<br />
összeadásra vonatkozóan – kiejtjük azokat a szorzatokat, amelyek megsemmisíthetık<br />
1<br />
23
vagy ismétlıdnek <strong>és</strong> azokat a változókat, Pl: amelyek egy szorzatban többször<br />
szerepelnek. Például a következıképpen alakítjuk ki:<br />
E = xy(<br />
xz<br />
+ x + z)<br />
+<br />
x yz<br />
E = ( x + y)(<br />
xz<br />
+ xz)<br />
+<br />
x yz<br />
E = ( xz<br />
+ x yz<br />
+ x yz)<br />
+ x yz<br />
= xz<br />
+ x yz<br />
+ x yz<br />
= xz<br />
+<br />
A Boole- függvények kanonikus alakja<br />
Értelmez<strong>és</strong>. minimumtagnak nevezünk egy olyan kifejez<strong>és</strong>t, amelyben az összes<br />
változó vagy azok komplementumának szorzata szerepel. Tehát egy minimumtagnak n<br />
tényezıje van<br />
l: Ha a kifejez<strong>és</strong> a, b-tól függ ,akkor ab vagy ab vagy a b , vagy a b minimumtag,<br />
három változó esetén x 1 x2<br />
x3,<br />
x1<br />
x2x<br />
3,<br />
x1x<br />
2 x3,<br />
minimumtagok.<br />
Ha a változót 1-gyel, míg a komplementumát 0-val helyettesítjük, akkor kapok egy<br />
( 11)<br />
x yz<br />
2<br />
vagy x x x<br />
→<br />
( 000)<br />
1<br />
2-es számrendszerbeli számot.<br />
Ha n változós Boole-féle kifejez<strong>és</strong>ek vannak, akkor összesen 2 n<br />
különbözı<br />
minimumtagúk van!<br />
A minimumtagok nagyon fontos szerepet játszanak a Boole-féle függvények<br />
reprezentációjában, mivel egy minimumtag értéke 1 egyszerő szorzat esetén.<br />
Egy Boole-szorzat 1 akkor <strong>és</strong> csakis akkor, ha az összes tényezı 1, míg egy<br />
minimumtag tényezıi Boole-változók, egyszerőek vagy komplementumok.<br />
01001 → 0<br />
1111 → 1<br />
Értelmez<strong>és</strong>. n x x x ... , 2<br />
2<br />
2<br />
3<br />
→<br />
yz<br />
( 110)<br />
1 változó szerint maximumtagnak nevezzük az olyan összeget,<br />
amelyben minden változó vagy annak komplementuma szerepel<br />
xx + x2<br />
+ x3,<br />
vagy x1<br />
+ x2<br />
+ x3<br />
vagy x1<br />
+ x 2 + x 3<br />
Egy minimumtag érték 1, csak egyetlen egy Boole-változói szorzatra. Tehát csak<br />
egy adott Boole- változói szorzattal állítható elı az 1-es értek.<br />
x x x 3 → 110<br />
= 111<br />
Példa.<br />
1<br />
2<br />
Bármilyen más kombinációra (szorzatra) nulla lesz az értek!<br />
Egy maximumtagunk értéke 0 csak egyetlen egy Boole-változói szorzatra!<br />
x1<br />
+ x 2 + x 3 → 0 + 1+<br />
1 = 0 + 0 + 0<br />
Értelmez<strong>és</strong>. Egy Boole-algebrai kifejez<strong>és</strong>t diszjunktív kanonikus formának<br />
nevezünk egy olyan n változóból álló kifejez<strong>és</strong>t, amelyben csak n változós<br />
minimumtagok szerepelnek!<br />
A diszjunktív kanonikus formákat diszjunktív perfekt formáknak is nevezzük.<br />
abc<br />
+<br />
abc<br />
+ abc<br />
Példa.:<br />
vagy xyz +<br />
x1x<br />
2<br />
x<br />
3<br />
x<br />
4<br />
x yz<br />
+ x x<br />
1<br />
2<br />
x<br />
3<br />
x<br />
4<br />
+ x1x<br />
x x<br />
2<br />
3<br />
4<br />
2<br />
24
Kijelent<strong>és</strong>. Egy Boole-függvény diszjunktív kanonikus alakja egyértelmő, ha<br />
eltekintünk a minimumtagok sorrendjétıl.<br />
Bizonyítás. Feltételezzük, hogy ugyanannak a függvénynek két elıállítása is volna<br />
diszjunktív kanonikus alakban.<br />
Akkor létezne egy olyan minimumtag, amelyik az egyikben szerepelne, de a<br />
másikban nem. Válasszuk akkor a Boole-féle változók egy olyan szorzatát, amire pont<br />
az a tag egyértékő lesz. Figyeljük meg, hogyan változik a két függvény értéke.<br />
<strong>Az</strong> elsı értéke 1 lesz, míg a második értéke 0, hiszen az megegyezik ez elsıvel, ami<br />
pont azzal a taggal különbözik, amelyiknek értéke 1. Tehát a két elıállítás nem<br />
lehetséges, vagyis a két elıállításban ugyanazok a minimumtagok szerepelnek. Ezért a<br />
Boole-függvényeket diszjunktív kanonikus alakba állítjuk elı, mert azok az<br />
elıállítások egyértelmőek.<br />
Csak a 0 függvény nem állítható elı diszjunktív kanonikus alakban.<br />
Hogyan kapjuk meg egy függvény diszjunktív kanonikus alakját?<br />
a<br />
b<br />
c<br />
f<br />
A<br />
0 0 0 0 1 1 1 1<br />
0 0 1 1 0 0 1 1<br />
0 1 0 1 0 1 0 1<br />
1 0 0 0 1 0 1 1<br />
f = abc<br />
+ abc<br />
+ abc<br />
+ abc<br />
Lássuk, most hogyan állítjuk elı a kanonikus alakot számolással:<br />
f ( a,<br />
b,<br />
c)<br />
= bc<br />
+ ac<br />
+ ab = bc(<br />
a + a)<br />
+ ac(<br />
b + b)<br />
+ ab(<br />
c + c)<br />
=<br />
bca<br />
+<br />
bca<br />
+<br />
acb<br />
Példák, feladatok<br />
+ acb<br />
+ abc + abc<br />
= abc + abc<br />
+ abc<br />
+<br />
abc<br />
Állapítsuk meg, hogy az alábbi formák közül melyek kanonikusak!<br />
a) f ( x,<br />
y,<br />
z)<br />
= x y + yz(<br />
nem!<br />
)<br />
b) f ( a,<br />
b,<br />
c)<br />
= abc<br />
+ abc<br />
+ abc<br />
+ abc<br />
f ( x , x , , x ) = x x x x + x x x x + x x x x<br />
c) 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4<br />
d) F ( x,<br />
y)<br />
= x + y<br />
Boole-függvények egyszerősít<strong>és</strong>e<br />
A háromváltozós Boole-függvényeket legegyszerőbb Euler-Venn diagramokkal<br />
egyszerősíteni. Ezeknél a diagramoknál a Boole-féle változókat körökkel (vagy zárt<br />
25
görbékkel, esetleg sokszögekkel) jelöljük <strong>és</strong> síkbeli halmazoknak tekintjük. Így a metszet,<br />
illetve az egyesít<strong>és</strong> a két síkhalmaz metszete, illetve az egyesít<strong>és</strong>e.<br />
<strong>Az</strong> elsı három ábránál rendre azt szemléltetjük, hogy f(A,B,C) = B, f(A,B,C) = A C,<br />
f(A,B,C) = AC.<br />
A negyedik ábránál f(A,B,C)= A B C . <strong>Az</strong> ötödiknél bemutatjuk a három változós Boolefüggvény<br />
minimumtagjainak ábrázolását a Venn-diagramon.<br />
A hatodiknál f ( A,<br />
B,<br />
C)<br />
= ABC<br />
+ ABC<br />
+ ABC<br />
+ ABC = C , egyszerősít<strong>és</strong> technikáját<br />
szemlélteti a Venn-diagram.<br />
A négyváltozós Boole-függvényeknél a Venn-diagramok analogónja a Karnaugh-táblázat.<br />
Értelmez<strong>és</strong>. Karnaugh-táblázatnak nevezzük a Boole-függvények egy olyan táblázatba<br />
rendezett, téglalapokkal való megadását, ahol a téglalapok metszete a konjunkciót, egyesít<strong>és</strong>e<br />
pedig a diszjunkciót szemlélteti.<br />
Lényegében a Venn-diagramok körlapjai itt téglalapoknak felelnek meg, de „rendezettebb”<br />
formában.<br />
26
Alkalmazások <strong>közgazdász</strong>oknak, Boole egyenletrendszerek<br />
Sok hallgató tette fel a kérd<strong>és</strong>t, miért kell Boole-algebrát tanítani közgazdaságtudományi<br />
vagy a mérnöki szakon. Sokan azt vallják, hogy az <strong>informatika</strong> <strong>alapjai</strong> alatt az<br />
irodai programcsomag oktatása (Word: szövegszerkesztı, Excel: táblázatkezelı,<br />
Access: adatbáziskezelı <strong>és</strong> Power Point: bemutató k<strong>és</strong>zít<strong>és</strong>e) bıven elegendı! Mivel a<br />
"hallgatói közvélemény", de talán néhány tanárkolléga is, egyértelmően elfogadja, hogy<br />
mondjuk az Excel táblázatkezelı egy <strong>közgazdász</strong>nak nélkülözhetetlen segédeszköz,<br />
ezért megpróbáljuk a Boole-algebra fölöttébb szükségességét erre, vagyis az Excelre<br />
visszavezetni.<br />
Lényegében a Boole-algebra arra szolgál, hogy a logikát átalakítsa számítássá,<br />
vagyis a logikai összefügg<strong>és</strong>eket algebrai kifejez<strong>és</strong>ekkel tudja jellemezni. Így, ha el<br />
akarjuk dönteni egy összetettebb logikai rendszerrıl, hogy igaz-e vagy hamis,<br />
(ellentmondásos-e vagy nem), akkor lényegében egy számolást kell végezzünk. Ez az<br />
óhaj vagy elv, már több száz éve foglalkoztatja a matematikusokat, fıleg a logicistákat<br />
<strong>és</strong> egyik elindítója Wilhelm Leibniz, neves német matematikus volt. İ ugyanis azt tőzte<br />
ki célul, hogy ha egy törvényszéken (vagy akármilyen jogi tárgyaláson) el akarjuk<br />
dönteni, hogy kinek van igaza, akkor ezt egy algebrai számítással kell megvalósítani.<br />
Ma közel állunk ennek a kivitelez<strong>és</strong>éhez <strong>és</strong> ha a törvény házába <strong>és</strong> a törvényhozók közé<br />
bevinnék a logicistákat <strong>és</strong> a számítógéptudósokat, akkor valóban nagyon közel lennénk<br />
a Leibniz-i elv megvalósításához. Ha a törvények konzisztensek <strong>és</strong> ellentmondásnélküliek<br />
volnának, akkor egy szakértıi rendszer valóban el tudná dönteni, hogy egy<br />
peres ügyben kinek van igaza.<br />
Lássuk elıször a Boole-algebra <strong>és</strong> az Excel kapcsolatát!<br />
Mondjuk, hogy szociális segélyt szavaz meg Csíkszereda tanácsa, <strong>és</strong> következı<br />
határozatot hozzák: Segélyben r<strong>és</strong>zesül minden család, amely eleget tesz a következı<br />
feltételek egyikének: <strong>Az</strong> egy fıre esı havi jövedelem kisebb mint 50 lej <strong>és</strong> csíkszeredai<br />
<strong>és</strong> panelházban lakik vagy egy fıre esı havi jövedelem kisebb mint 50 lej <strong>és</strong><br />
csíkszeredai <strong>és</strong> nem lakik panelházban, vagy az egy fıre esı havi jövedelem kisebb<br />
mint 50 lej <strong>és</strong> nem csíkszeredai <strong>és</strong> panelházban lakik, vagy az egy fıre esı havi<br />
jövedelem kisebb mint 50 lej <strong>és</strong> nem csíkszeredai <strong>és</strong> nem lakik panelházban.<br />
Term<strong>és</strong>zetesen, ezt úgy szokták megoldani, hogy a hivatal tisztviselıi k<strong>és</strong>zítenek egy<br />
Excel táblázatot <strong>és</strong> aki eleget tesz valamelyik feltételnek, az fog segély kapni. Ez<br />
technikailag azt jelenti, hogy legkevesebb három oszlopot kell létrehozni, egyik jelöli,<br />
azt, hogy "az egy fıre esı havi jövedelem kisebb mint 50 lej", a másik, hogy<br />
"csíkszeredai" <strong>és</strong> a harmadik, hogy "panelházban lakik". Ahhoz, hogy segélyt kapjon e<br />
három feltétel (logikai változó) logikai konjunkciója (logikai <strong>és</strong>, vagy szorzás) igaz kell<br />
legyen. Nos, aki viszont egy kicsit Boole-algebrailag elemzi a határozatot hamar rájön,<br />
hogy lényegében az egyenértékő azzal, hogy "az egy fıre esı havi jövedelem kisebb<br />
mint 50 lej" ugyanis a többi feltétel logikailag leegyszerősödik. Képletben, ha<br />
a = "az egy fıre esı havi jövedelem kisebb mint 50 lej"<br />
b = "csíkszeredai"<br />
c = "panelházban lakik",<br />
akkor, ha "." jelöljük a konjunkciót, "+", a diszjunkciót, akkor azt kapjuk, hogy<br />
abc + abc<br />
+ abc<br />
+ abc<br />
= ab + ab<br />
= a<br />
itt, a b azt, jelenti, hogy b tagadása, vagyis nem b.<br />
27
Lássunk egy kicsit nehezebb példát, a Boole-algebra <strong>és</strong> az Excel kapcsolatára!<br />
Mondjuk, hogy értekezletet akarnak tartani azok a pedagógusok, akiknek a havi<br />
fizet<strong>és</strong>e kisebb mint háromszáz lej <strong>és</strong> csíkszeredaiak. A következı módon írják ki a<br />
felhívást: Jelentkezzenek azok, akik pedagógusok <strong>és</strong> csíkszeredaiak vagy akiknek a<br />
havi fizet<strong>és</strong>e kisebb mint háromszáz lej <strong>és</strong> nem csíkszeredaiak vagy akik pedagógusok<br />
<strong>és</strong> havi fizet<strong>és</strong>ük kisebb mint háromszáz lej. Vezessünk be itt is alkalmas jelöl<strong>és</strong>t:<br />
a = "pedagógus"<br />
b = "akiknek a havi fizet<strong>és</strong>e kisebb mint háromszáz lej"<br />
c = "csíkszeredaiak"<br />
ac + bc<br />
+ ab = ac + bc<br />
.<br />
Itt az az érdekes, hogy a harmadik feltétel fölösleges, az már benne van az elsı<br />
kettıben. Ezeket a Boole-algebrai egyszerősít<strong>és</strong>eket nem lehet <strong>és</strong>zrevenni "józan<br />
<strong>és</strong>szel", vagyis aki azt nem tanulta meg, nincs ahogy kiügyeskedje. <strong>Az</strong> élet ennél jóval<br />
összetettebb <strong>és</strong> bonyolultabb összefügg<strong>és</strong>rendszereket <strong>és</strong> helyzeteket alkot. Minden<br />
programozásnak, de a számítógép intelligens kezel<strong>és</strong>ének is elemi követelménye, hogy<br />
az illetı rendelkezzen bár a matematikai logika elemeivel.<br />
Boole-algebrai egyenlet- <strong>és</strong> egyenlıtlenségrendszerek<br />
Legyen ( ,+ ,., , 0,<br />
1)<br />
B egy Boole-algebra. Boole-algebra egyenlet <strong>és</strong>/vagy<br />
egyenlıtlenségrendszereknek nevezzünk<br />
⎧ f<br />
⎪<br />
⎨ f<br />
⎪<br />
⎩ f<br />
i<br />
i<br />
i<br />
= g<br />
≤ g<br />
i<br />
≥ g<br />
i<br />
i<br />
n<br />
ahol f i , g i : B → B , Boole függvények. (i=1,…,n, + jel a diszjunkció, . a<br />
konjunkció, <strong>és</strong> felsı vonás a tagadást jelöli).<br />
<strong>Az</strong> elsı fontos <strong>és</strong>zrevétel, hogy bármely Boole-algebra egyenlet- <strong>és</strong>/vagy<br />
egyenlıtlenségrendszer egyenértékő egyetlen egy Boole-egyenlettel:<br />
n<br />
f ( x1<br />
, x2<br />
,..., xn<br />
) = 0 , ahol f : B → B , Boole-függvény.<br />
Bizonyítás. Bármely Boole-féle algebrában fennállnak a következı azonosságok:<br />
f ≤ g ⇔ f g <strong>és</strong> f = g ⇔ f g + f g = 0 .<br />
Ez pedig azt jelenti, hogy elégséges egyenletekkel dolgozni, mert az<br />
egyenlıtlenségek egyenletekké alakíthatók.<br />
Tehát minden egyenlıtlenséget átalakítunk egyenletté. Megoldás alatt pedig egy<br />
Boole-algebrai ( 1, 2,...,<br />
n ) x x x vektort értünk.<br />
Alapvetı tulajdonság.<br />
(i). ax + bx<br />
= 0 , ahol a, b ∈ B , egyenletnek van megoldása, akkor <strong>és</strong> csakis akkor,<br />
ha ab = 0 .<br />
(ii). Ha ab = 0 , akkor a megoldások halmaza [ b, a]<br />
= { x ∈ B : b ≤ x ≤ a}<br />
.<br />
Bizonyítás.<br />
(i). ax + bx<br />
= 0 ⇔ ax = 0 <strong>és</strong> bx<br />
= 0 ⇔ x ≤ a <strong>és</strong> b ≤ x ⇒ b ≤ a ⇔ ab = 0 .<br />
28
Fordítva, az elégséges feltételbıl, hogy ab = 0,<br />
következik, hogy ab + bb<br />
= 0<br />
vagyis b valóban egy megoldás. Vagyis ha az ax + bx<br />
= 0 egyenletbe az x helyébe a<br />
b-t helyettesítjük, akkor az kielégíti a Boole-egyenletünket.<br />
Ennek az egyszerő, de fontos segédeszköznek a birtokában lássunk olyan<br />
közgazdasági feladatokat, amelyekben látható a Boole-algebra szerepe.<br />
1. Ha egy vállalatra kiírják a csıdeljárást, akkor a raktárk<strong>és</strong>zletét vagy Fifo 2 vagy<br />
Lifo vagy beszerz<strong>és</strong>i árak súlyozott átlaga szerint értékesíti.<br />
2. Ha az infláció meghaladja a 40%-ot, akkor az csıd!<br />
3. Ha a beszerz<strong>és</strong>i árak súlyozott átlaga szerint történik az értékesít<strong>és</strong>, akkor az<br />
infláció nem haladhatja meg a 40%-ot <strong>és</strong> nem írnak ki csıdeljárást.<br />
4. Ha csıdeljárás történik, akkor az értékcsökken<strong>és</strong>t napirendre kell hozni.<br />
5. Ha értékcsökken<strong>és</strong>t számítunk akkor a FIFO módszert alkalmazzuk.<br />
6. Ha beszerz<strong>és</strong>i árak súlyozott átlaga szerint értékesít<strong>és</strong>t nem alkalmazzuk akkor<br />
nincs csıdeljárás.<br />
Döntsük el, mi a lényeg a fenti feltételrendszerben!<br />
Vezessünk be alkalmas jelöl<strong>és</strong>t: Cs legyen a csıdeljárás, F a FIFO módszer, L a<br />
LIFO módszer, S a súlyozott átlag, I az infláció, A az amortizáció, vagyis az<br />
értékcsökken<strong>és</strong>. Ezzel a jelöl<strong>és</strong>sel a fenti feltételrendszer így reprezentálható Boolealgebrai<br />
egyenlıtlenségrendszerként<br />
⎧Cs<br />
≤ F + L + S<br />
⎪<br />
⎪<br />
I ≤ Cs<br />
: ⎪<br />
⎪S<br />
≤ ICs<br />
⎨<br />
⎪Cs<br />
≤ A<br />
⎪A<br />
≤ F<br />
⎪<br />
⎪⎩<br />
S ≤ Cs<br />
Ez aztán egyetlen egy egyenletté átalakítva:<br />
Cs(<br />
F + L + S)<br />
+ ICs<br />
CsF<br />
LS<br />
Cs + SI + ICs<br />
= Cs + I + SI = Cs + I = 0<br />
Cs + I = 0<br />
+ S(<br />
ICs)<br />
+ CsF<br />
+ SCs<br />
= 0<br />
+ ICs<br />
+ SI + SCs + CsF<br />
+ SCs<br />
= 0<br />
A megoldás pedig azt jelenti, hogy ha a fenti kijelent<strong>és</strong>eket igaznak fogadjuk el, akkor<br />
abból az következik, hogy nincs csıd <strong>és</strong> nincs 40%-os infláció! Mert a vagy csak akkor<br />
hamis, ha mindkettı hamis. Tehát Cs=0 <strong>és</strong> I=0, vagyis hamis a csıd <strong>és</strong> hamis az infláció,<br />
tehát nincs csıd <strong>és</strong> nincs infláció!<br />
2 A FIFO (First in, first out) módszer lényege, hogy amelyik árut elıbb vettük meg, azt elıbb is adjuk el, így a<br />
megmaradó k<strong>és</strong>zletet mindig a k<strong>és</strong>ıbb beszerzett áruk után értékeljük, míg a LIFO (Last in, first out)<br />
módszernél, amelyik terméket utoljára vettük, azt adjuk el elıbb, így a korábban vett áruk beszerz<strong>és</strong>i értékét<br />
vesszük alapul. Ezek a módszerek a programozásban is megvannak (mint pl. memóriakezel<strong>és</strong>i <strong>és</strong>/vagy<br />
objektumorientált technikák!)<br />
29
Változatok egy témára<br />
1. Ha van két felsıfokú nyelvvizsgája akkor EU-tisztviselı akar lenni, vagy van<br />
ECDL-bizonyítványa.<br />
2. Ha tud közlekedni az Interneten <strong>és</strong> van két felsıfokú nyelvvizsgája akkor EUtisztviselı<br />
akar lenni.<br />
3. Ha nem tud internetezni akkor nincs ECDL-bizonyítványa vagy nincs két<br />
felsıfokú nyelvvizsgája vagy EU-tisztviselı.<br />
Most fordítsuk le a fenti kijelent<strong>és</strong>eket a logika nyelvére <strong>és</strong> alakítsuk át egyetlen egy<br />
Boole-egyenletté:<br />
F(<br />
Eu + E)<br />
+ IF Eu + I ( E + F + Eu)<br />
= 0<br />
F EuE<br />
+<br />
IF Eu<br />
+ IEF<br />
Eu = 0<br />
Ezt most Karnaugh-táblázattal fogjuk leegyszerősíteni:<br />
F EuE<br />
+ IF Eu + IEF<br />
Eu = IF<br />
EEu<br />
+ IF EEu<br />
+ IFEEu<br />
+ IF EEu<br />
+ IFE<br />
Eu =<br />
IF<br />
EEu<br />
+<br />
IF EEu<br />
+ IFEEu<br />
+ IFE<br />
Eu = 0<br />
IF\E<br />
Eu<br />
00<br />
0<br />
0<br />
0 1 1<br />
1 1 0<br />
01 1 1<br />
11<br />
10<br />
1 1<br />
⎧F<br />
≤ Eu + E<br />
⎪<br />
⎨IF<br />
≤ Eu<br />
⎪<br />
⎩I<br />
≤ E + F + Eu<br />
F Eu = 0 , F ≤<br />
Eu<br />
Vagyis<br />
Ami azt jelenti, ha van két felsıfokú nyelvvizsgája akkor Eu-tisztviselı!<br />
K<strong>és</strong>zítünk egy másik (mesterkélt) feladatot, ugyancsak az elıbbi témára:<br />
1. Ha nemzetközi jogász <strong>és</strong> nem Eu-tisztviselı akkor nem <strong>közgazdász</strong> vagy nincs<br />
ECDL bizonyítványa.<br />
2. Ha <strong>közgazdász</strong> <strong>és</strong> van ECDL bizonyítványa akkor Eu-tisztviselı.<br />
3. Ha <strong>közgazdász</strong> akkor nemzetközi jogász vagy Eu-tisztviselı.<br />
4. Ha nem <strong>közgazdász</strong> akkor nem nemzetközi jogász vagy nincs ECDL<br />
bizonyítványa.<br />
5. Ha nemzetközi jogász akkor nem Eu-tisztviselı vagy nincs ECDL bizonyítványa.<br />
Term<strong>és</strong>zetesen, a fenti feladat egy kitaláció. Vele csak azt szeretnénk példázni, hogy<br />
egy viszonylag egyszerő feltételrendszer is nehezen érthetı, <strong>és</strong> hogyan néz ki a feladat<br />
30
logikai gerince. Amit be fogunk bizonyítani az hogy, a fenti öt logikai feltétel logikailag<br />
implikálja a másodikat. Tehát, ha csak a másodikkal dolgozunk, az kifejezi mind az<br />
ötnek a logikai "súlyát". Ezek a Ha...akkor feltételek nagyon könnyen leírhatók minden<br />
programozási nyelven <strong>és</strong> az Excelben is! Ott a HA, illetve az IF függvényt kell<br />
megfelelıen kitölteni.<br />
Lássuk akkor a fenti feltételrendszernek – ami lényegében egy Boole-algebrai<br />
egyenlıtlenségrendszer – a megoldását! Jelöljük a-val a <strong>közgazdász</strong>t, b-vel a<br />
nemzetközi jogászt, c-vel az Eu-tisztviselıt <strong>és</strong> d-vel az ECDL-bizonyítványt, akkor a<br />
feltételrendszerünk így formalizálható:<br />
adc<br />
+ bcad<br />
+ abc<br />
abcd<br />
+<br />
abcd<br />
+<br />
⎧bc<br />
≤ a + d<br />
⎪<br />
⎪ad<br />
≤ c<br />
⎪<br />
⎨a<br />
≤ b + c<br />
⎪<br />
⎪a<br />
≤ b + d<br />
⎪<br />
⎩b<br />
≤ c + d<br />
+<br />
abcd<br />
abd<br />
+<br />
+ bcd = 0<br />
abcd<br />
Ezt is lényegében Karnaugh-táblázattal egyszerősítjük:<br />
ab\<br />
cd<br />
0<br />
0<br />
0 1 1<br />
1 1 0<br />
00<br />
01 1 1<br />
11 1 1<br />
10 1 1<br />
Ami azt jelenti, hogy<br />
bd +<br />
dac<br />
da ≤ c<br />
abc<br />
= 0<br />
= 0<br />
+<br />
abcd<br />
+ abcd = 0<br />
Ezzel az állításunkat igazoltuk, vagyis az öt feltételrendszer leegyszerősíthetı a másodikra!<br />
Ebben a r<strong>és</strong>zben csak a Boole-algebrai egyenlıtlenségrendszereknek néhány közgazdasági<br />
alkalmazását mutattuk be. Nem ismertettük, hogy mit nevezünk Boole-algebrának, Boolealgebrai<br />
kifejez<strong>és</strong>nek, -függvénynek <strong>és</strong> azok egyszerősít<strong>és</strong>ének, ugyanis ez az elsıéves<br />
tananyagnak szerves r<strong>és</strong>ze. Mi csak ennek szükségességét szeretnénk igazolni!<br />
Szakirodalom<br />
1. Ioan Tomescu, Adrian Leu: Matematică aplicată în tehnica de calcul, Ed, did. şi ped.<br />
1980<br />
2. Sergiu Rudeanu: Curs de bazele informaticii, (manuscris).<br />
31
3. Román-magyar vállalkozói kisszótár (összeállította Réz Miklós), Kriterion, Kossuth<br />
1994.<br />
Algoritmika<br />
Szinte mindent algoritmizálunk <strong>és</strong> így sztereotipek (vagyis algoritmusok) szerint<br />
élünk <strong>és</strong> dolgozunk. Amit szabály szerint vagy megszokásból teszünk, az mind<br />
algoritmus! A jól mőködı gyárakban <strong>és</strong> üzemekben algoritmus szerint kell történjen<br />
minden. <strong>Az</strong> algoritmus elıírja, hogy egy feladat elvégz<strong>és</strong>ekor milyen mőveleteket kell<br />
elvégezni <strong>és</strong> hogy milyen sorrendben kell elvégezni ezeket. Egy technológiai<br />
folyamat is algoritmus, egy munkás akkor dolgozik jól, ha szigorúan betartja a<br />
technológiai szabályokat, vagyis egy algoritmust. A nyugati ipar azért<br />
eredményesebb, mint nálunk, mert pontosan betartják a szabályokat <strong>és</strong> precíz<br />
algoritmusokkal dolgoznak. Nálunk ugyanabban a gyárban, ugyanaz a munkacsoport<br />
nem képes két egyforma terméket elıállítani. <strong>Az</strong>ért, mert nincs jól kidolgozott<br />
algoritmus, se a gépi folyamatokra, se a kézi feldolgozásra. Egy jó algoritmus:<br />
szabályok rendszerbe foglalása, pontos receptek győjteménye, stb. De nem csak a<br />
társadalomban ilyen fontos a szabályok rendszere, hanem a tudományban is. Ugyanis<br />
ami a tudományban tanítható <strong>és</strong> elsajátítható az szabályok, törvények rendszere. Ami<br />
kreatív, vagyis új szabályok felfedez<strong>és</strong>ét vagy megalkotását illeti, ahhoz speciális<br />
adottságok kellenek. Ezért lényegében recepteket tanítunk. <strong>Az</strong> algoritmusok<br />
tulajdonságai a végesség, egyértelmőség, általánosság. A végesség azt jelenti, hogy<br />
véges számú lép<strong>és</strong> után az algoritmus elvezet a feladat eredményéhez, vagy<br />
megmutatja, hogy a kitőzött feladat megoldhatatlan. <strong>Az</strong> algoritmus ugyanakkor<br />
egyértelmő kell legyen, vagyis a lép<strong>és</strong>ekben elıírt mőveletek világosak, pontosan<br />
követhetık kell legyenek.<br />
<strong>Az</strong> algoritmusoknak különbözı típusai vannak:<br />
A direkt algoritmus nem tartalmaz feltételes utasításokat. Pl. a Héron képlet<br />
kiszámítása.<br />
<strong>Az</strong> elágazó algoritmus feltételes utasítást is tartalmaz, de visszacsatolást nem. Pl.<br />
elsıfokú, másodfokú egyenlet gyökeinek kiszámítása<br />
A visszacsatolásos algoritmus esetében egy r<strong>és</strong>z végrehajtása többször is<br />
ismétlıdik. Ez a ciklus.<br />
Elsıfajú ciklusról beszélünk, ha az ismétl<strong>és</strong>ek száma elıre ismert. Másodfajú<br />
ciklusról beszélünk, ha az ismétl<strong>és</strong>ek száma ismeretlen. Iterációról beszélünk, ha az új<br />
érték kiszámítása a következı képlet alapján történik: xi+1 = f(xi).<br />
Annak ellenére, hogy az algoritmus fogalmát elég szemléletesen <strong>és</strong> érthetıen körül<br />
tudjuk írni, nem definiáljuk pontosan, hanem elfogadhatjuk alapfogalomnak, mint<br />
amilyen a halmaz, vagy a pont, egyenes, amit nem definiálunk.<br />
A matematika nem egy öncélú logikai játék, sokkal inkább a valós világ<br />
történ<strong>és</strong>einek pontos követ<strong>és</strong>ére <strong>és</strong> megjósolására szolgáló eszköz. Arra szolgál, hogy<br />
a term<strong>és</strong>zet törvényeit, szőkebb értelemben a term<strong>és</strong>zet, a társadalom jelenségeit<br />
felmérje, kövesse <strong>és</strong> elıre jelezze.<br />
Amikor egy sorozat határértékét kiszámítjuk, tisztában kell legyünk azzal, hogy ez<br />
a sorozat sokféle interpretációra ad lehetıséget. A sorozat elemei egy társadalmi<br />
jelenség mér<strong>és</strong>i adatai lehetnek, de egy fizikai jelenség mér<strong>és</strong>i adatai is. Ha a sorozat<br />
konvergál, akkor az adatok valamilyen pontos értéket tetszılegesen megközelítenek,<br />
más szóval az adatok egy szabályosságot követnek <strong>és</strong> egy tény kifejez<strong>és</strong>e rejlik<br />
bennük. Egy konvergens sorozatból ha véges számú elemet elhagyunk, konvergens<br />
marad, hasonlóan egy társadalmi jelenséghez, amelyet ha helyesen írtunk le, akkor<br />
32
nem számít egyedi esetek kilógása a sorból, egyedi esetek különbözısége, a<br />
jelenséget leíró sorozat konvergál! A Fibonacci sorozat például a nyulak szaporodását<br />
is modellezi.<br />
Mindezeket azért írtuk le, hogy lássuk, mennyire fontos a kísérleti matematika,<br />
vagyis az, amikor egy megsejtett összefügg<strong>és</strong>t sok-sok esetben leellenırzünk a<br />
számítógépen.<br />
Be kell látni, hogy a tudomány emberek mőve, <strong>és</strong> sok-sok tapasztalat<br />
kikristályosodott fogalmi győjteménye. A számítógéppel azonban, amit évszázadok<br />
munkája alapján alkottak meg, sok mindent ellenırizhet. Meg kell szokni, hogy egy<br />
sorozat határértékét úgy is kiszámíthatjuk, hogy sok tagját géppel számítjuk ki, <strong>és</strong><br />
azzal már szinte be is bizonyítottuk a sorozat határértékének helyességét.<br />
Algoritmusok ábrázolása<br />
<strong>Az</strong> algoritmusokat pszeudokódban, logikai folyamatábrán, blokk-diagramon<br />
szokták megadni. A pszeudokód, amint a neve is mutatja egy átmenet a kód (ami a<br />
programnyelv) <strong>és</strong> a leírás között. Egy álkód, félig-kód, félig magyarázat. Benne az<br />
utasításokat mondatszerően adjuk meg betartva néhány szabályt.<br />
Bemeneti utasítás: OLVASD, kimeneti utasítás: KIÍR (vagy ÍRD), feltételes<br />
utasítás (még hívják HA, vagy elágazási struktúrának), HA feltétel AKKOR<br />
utasítás(ok) KÜLÖNBEN utasítás(ok) HA_VÉGE.<br />
Ciklusok (ismétlı struktúrák): AMÍG feltétel VÉGEZD EL utasítás(ok)<br />
AMÍG_VÉGE. ISMÉTELD utasítás(ok) AMEDDIG feltétel. MINDEN (léptetı<br />
ciklus, for ciklus): MINDEN i:= elsıtıl utolsóig VÉGEZD EL utasítások<br />
MINDEN_VÉGE.<br />
Például:<br />
OLVASD szám<br />
HA szám
Bemeneti utasítás: OLVASD, kimeneti utasítás: KIÍR (vagy IRD), feltételes<br />
utasítás (még hívják HA, vagy elágazási struktúrának), HA feltétel AKKOR<br />
utasítás(ok) KÜLÖNBEN utasítás(ok) HA_VÉGE.<br />
Ciklusok (ismétlı struktúrák): AMÍG feltétel VÉGEZD EL utasítás(ok)<br />
AMÍG_VÉGE. ISMÉTELD utasítás(ok) AMEDDIG feltétel. MINDEN (léptetı<br />
ciklus, for ciklus): MINDEN i:= elsıtıl utolsóig VÉGEZD EL utasítások<br />
MINDEN_VÉGE.<br />
Elemi mőveletek<br />
Számítsuk ki n beolvasott szám összegét!<br />
<strong>Az</strong> algoritmus elk<strong>és</strong>zít<strong>és</strong>énél megadhatjuk a változókat. Muszáj megadni! Több<br />
változóra lesz szükségünk: egyik n értékét, egy másik a keresett összeget fogja<br />
tartalmazni. Legyen ez utóbbi változó neve S.<br />
A sorra beolvasott számokat egy x változóban helyezzük el. Beolvassuk n értékét<br />
<strong>és</strong> az S változónak a 0 kezdıértéket adjuk. Ezután n-szer végezzük el a következı<br />
mőveleteket:<br />
- beolvasunk egy bemeneti értéket<br />
- hozzáadjuk S értékéhez.<br />
<strong>Az</strong> algoritmus<br />
OLVASD n<br />
S := 0<br />
CIKLUS<br />
(VEGEZD EL minden i-re 1-tol n-ig, 1-es lép<strong>és</strong>közzel)<br />
OLVASD x<br />
S := S + x<br />
CIKLUS_VEGE<br />
IRD S<br />
VEGE<br />
A program:<br />
program szumma1;<br />
uses crt;<br />
var<br />
n,x,i:integer;<br />
S :longint;<br />
begin<br />
clrscr;<br />
write('Irjuk be n erteket : ');<br />
readln(n);<br />
S:=0;<br />
for i:=1 to n do<br />
begin<br />
write('Irjuk be az osszeadando szamot:');<br />
readln(x);<br />
S:=S+x;<br />
end;<br />
writeln;<br />
writeln('<strong>Az</strong> n= ',n:2,<br />
' darab termeszetes szam osszege= ',S:8);<br />
readln;<br />
34
end.<br />
Megjegyz<strong>és</strong>: Ha meg akarjuk ırizni a beolvasott számokat, akkor szükségünk van<br />
egy vektor típusú változóra, amelynek elemei tartalmazni fogják a beolvasott<br />
értékeket. Beolvasáskor azt is megszámlálhatjuk, hogy hány számot akarunk<br />
összeadni.<br />
<strong>Az</strong> elsı n term<strong>és</strong>zetes szám összege<br />
<strong>Az</strong> algoritmus egyszerőbb az elızınél, mert nem kell beolvasnunk a számokat.<br />
Beolvassuk az összeadandó számok számát.<br />
<strong>Az</strong> S változót a 0-val inicializáljuk. Ezután n-szer végezzük el a következı<br />
mőveleteket:<br />
– rátérünk a következı számra<br />
– hozzáadjuk S értékéhez<br />
<strong>Az</strong> algoritmus<br />
OLVASD n<br />
S := 0<br />
CIKLUS<br />
(VEGEZD EL minden i-re 1-tol n-ig, 1-es lép<strong>és</strong>közzel)<br />
S := S + i<br />
CIKLUS_VEGE<br />
IRD S<br />
VEGE<br />
A program a következı:<br />
program szumma2;<br />
{<strong>Az</strong> elso n termeszetes szam osszege.}<br />
uses crt;<br />
const n=30;<br />
var<br />
S,i,m:integer;<br />
begin<br />
clrscr;<br />
for m:=1 to n do<br />
begin<br />
S:=0;<br />
for i:=1 to m do S:=S+i;<br />
writeln ('<strong>Az</strong> elso ',m:2,<br />
' termeszetes szam osszege= ',S:8);<br />
end;<br />
readln;<br />
end.<br />
Számítsuk ki n beolvasott szám szorzatát!<br />
Szükséges változók : n, x, i.<br />
<strong>Az</strong> eredményül kapott szorzat legyen a P változóban.<br />
Beolvassuk n értékét <strong>és</strong> a P változónak az 1 kezdıértéket adjuk. Erre külön fel kell<br />
figyelni! Ha a P változóban 0 kezdıérték kerülne, az eredmény is nulla maradna!<br />
35
Ezután n-szer végezzük el a következı mőveleteket:<br />
– beolvasunk egy bemeneti értéket<br />
– hozzáadjuk S értékéhez.<br />
<strong>Az</strong> algoritmus pszeudokódja :<br />
OLVASD n<br />
P := 1<br />
CIKLUS<br />
(VEGEZD EL minden i-re 1-tol n-ig, 1-es lép<strong>és</strong>közzel)<br />
OLVASD x<br />
P := P * x<br />
CIKLUS_VEGE<br />
IRD P<br />
VEGE<br />
program szorzat;<br />
uses crt;<br />
var<br />
n,x,i:integer;<br />
P : longint; {A P változó típusa legyen LONGINT (hosszú<br />
eg<strong>és</strong>z),mert az INTEGER típus értéke csak 32767-ig terjed}<br />
begin<br />
clrscr;<br />
write('Irjuk be n erteket : ');<br />
readln(n);<br />
P:=1;<br />
for i:=1 to n do<br />
begin<br />
clrscr;<br />
write('Irjuk be az osszeszorzando szamot:');<br />
readln(x);<br />
P:=P*x;<br />
end;<br />
writeln;<br />
writeln ('A(z) ',n:2,<br />
' darab, termeszetes szam szorzata = ',P:10);<br />
readln;<br />
end.<br />
Kezdetnek lássunk néhány hasznos feladatot. Ezeknek a feladatoknak a megoldása<br />
egy képlet. (Egy képlet már egy algoritmus. Aki tudja a képletet már meg tudja oldani<br />
a feladatot, aki érti a képletet, az érti az algoritmust.)<br />
Fatömeg térfogatának számolás (A farönkök köböl<strong>és</strong>e)<br />
I ⎛ C ⎞<br />
Ha a rönk hengeres, akkor a térfogataV<br />
= . ⎜ ⎟ , ahol I a rönk magassága <strong>és</strong> C az<br />
π ⎝ 2 ⎠<br />
alapkör kerülete (a mérıszalag hossza)<br />
{A rönk köböl<strong>és</strong>e (a rönk térfogatának kiszámítása)ha a rönk<br />
hengerV=(C/2)^2*I/Pi képlettelV a térfogat<br />
C a rönk alapjának kerülete (hossza)<br />
I a rönk magassága}<br />
program koboles;<br />
2<br />
36
var V,C,I: real;<br />
begin<br />
write('kerem a ronk magassagat (cm) ');readln(I);<br />
write('kerem a ronk alapjanak a keruletet (cm) ');readln(C);<br />
V:=sqr(C/2)*I/Pi;<br />
writeln('a ronk kobtartalma = ',V:10:2,' cm^3 =<br />
',V/1000000:12:6,' m^3');<br />
readln;<br />
end.<br />
I ⎛ C ⎞<br />
Ha a rönk kúpos (egy csonka kúp lesz a rönk) V = . ⎜ ⎟ , ahol I a rönk magassága <strong>és</strong> C<br />
π ⎝ 2 ⎠<br />
annak a körnek a kerülete, amelyet a rönk közepénél mérnek!<br />
{A rönk köböl<strong>és</strong>e (a rönk térfogatának kiszámítása)<br />
ha a rönk csonkakúp<br />
V=(C/2)^2*I/Pi képlettel<br />
V a térfogat<br />
C a rönk alapjának kerülete (hossza)<br />
I a rönk magassága}<br />
program koboles;<br />
var V,C,I: real;<br />
begin<br />
write('kerem a ronk magassagat (cm) ');readln(I);<br />
write('kerem a ronk kozepenek a keruletet (cm) ');readln(C);<br />
V:=sqr(C/2)*I/Pi;<br />
writeln('a ronk kobtartalma = ',V:10:2,' cm^3 =<br />
',V/1000000:12:6,' m^3');<br />
readln;<br />
end.<br />
Hordó térfogata<br />
Számítsuk ki a hordó térfogatát.<br />
R a hordó sugara a közepénél (a hordó „hasának” a sugara, vagyis legnagyobb köre<br />
sugara)<br />
D a hordó átmérıje a közepénél (a hordó hasának átmérıje)<br />
rt a hordó <strong>alapjai</strong>nak sugara<br />
dt a hordó <strong>alapjai</strong>nak átmérıje<br />
I a hordó magassága<br />
A hordók térfogatát a következı közelítı képletekkel számoljuk ki:<br />
⎛ 2D<br />
+ dt ⎞<br />
• V = π ⎜ ⎟ . I<br />
⎝ 6 ⎠<br />
• V = 0.<br />
8 I D dt<br />
•<br />
2<br />
( ) 2<br />
R rt<br />
⎛ 3 − ⎞<br />
V = π I ⎜ R − ⎟ Dez-képlete<br />
⎝ 8 ⎠<br />
2<br />
37
I 2 2<br />
• V = ( 2R<br />
+ r )<br />
π<br />
Oughtud-képlete<br />
3<br />
Írjunk programot amellyel megvalósítjuk a fenti képleteket <strong>és</strong> össze is hasonlítjuk<br />
pontosságukat!<br />
{a hordó térfogatának kiszámításaV=Pi/sqr(6)*sqr(2*D+dt)*I<br />
V=0,8*I*D*dt<br />
V=Pi*I*sqr(R-3/8*(R-r))<br />
V=Pi*I/3*(2*sqr(R)+sqr(r))<br />
ahol D a hordó átmérıje a közepénél, R a hordó sugara a<br />
közepénél<br />
dt a hordó átmérıje az <strong>alapjai</strong>nál, rt az alapkör sugara<br />
I a hordó magassága}<br />
var V1,V2,V3,V4,R,D,dt,rt,I,NK,kk:real;<br />
begin<br />
write('kerem a hordo magassagat ');readln(I);<br />
write('kerem a hordo keruletet a kozepenel (legnagyobb<br />
kerulet) ');readln(NK);<br />
write('kerem a hordo keruletet az alapoknal (legkisebb<br />
kerulet ');readln(kk);<br />
R:=NK/2/Pi; D:=2*R;<br />
rt:=kk/2/Pi; dt:=2*rt;<br />
V1:=Pi/sqr(6)*sqr(2*D+dt)*I;<br />
V2:=0.8*I*D*dt;<br />
V3:=Pi*I*sqr(R-3/8*(R-r));<br />
V4:=Pi*I/3*(2*sqr(R)+sqr(r));<br />
Writeln('Elso terfogat = ',V1:16:8);<br />
Writeln('Masodik terfogat = ',V1:16:8);<br />
Writeln('Dez-terfogat = ',V1:16:8);<br />
Writeln('Oughtud-terfogat = ',V1:16:8);<br />
readln;<br />
end.<br />
A kamatos kamat<br />
Talán a leggyakrabban alkalmazott ismétl<strong>és</strong>es algoritmus, a kamatos kamat kiszámítása. Ez<br />
matematikailag sem egyszerő, mert lényegében egy mértani sor összege. Informatikailag jól<br />
algoritmizálható, mert periódus (amit általában hónapokban adunk meg) számú ismétl<strong>és</strong>t kell<br />
végezzünk, a kamat kiszámításához. Egy adott periódusban, a tıkegyarapodás egyenlı az<br />
elızı hónapnyi összeg plusz azon összegnek kamatlábnyi százaléka.<br />
{Kamatos kamatT tıke<br />
k a kamatlab (evi kamatlabot adnak meg %-ban)<br />
p periodus = a honapok szama}<br />
var T,k,S:real;<br />
p,i:integer;<br />
begin<br />
write('kerem a to"ket ');readln(T);<br />
write('kerem a honapok szamat ');readln(p);<br />
write('kerem a kamatlabot ');readln(k);<br />
S:=T;<br />
38
for i:=1 to p do<br />
S:=S+S*k/12/100;<br />
writeln('a kamatozott to"ke, ',p,' honap utan ',k:2:0,'%os<br />
kamatlabbal = ',S:16:2);<br />
readln;<br />
end.<br />
A hallgatók ellenırizhetik az Excel JBÉ (jövıbeni érték, angolul FV) pénzügyi<br />
függvényével.<br />
Például:<br />
1.219.391,08 1 millió, 20%, 12 hónap JBÉ((20/12)%;12;0; -1000000; 1)<br />
7.297.605,95 3 millió, 30%, 36 hónap JBÉ(2,5%;36;0; -3000000; 1)<br />
820,14 500 lej, 25% 24 hónap JBÉ((25/12)%;24;0; -500; 1)<br />
901,46 800 lej, 12% 12 hónap JBÉ(1%;12;0; -800; 1)<br />
981,12 700 lej, 17% 24 hónap JBÉ((17/12)%;24;0; -700; 1)<br />
Hatványozás<br />
A Turbo Pascal nagyon sok elıre-definiált függvényt kínál, de mielıtt<br />
hozzáfognánk ezek kizárólagos használatához, jó ha elıbb mi magunk is<br />
meggyızıdünk arról, hogy el tudjuk k<strong>és</strong>zíteni ezeket a függvényeket, eljárásokat.<br />
Függvény létrehozása akkor elınyös, ha az adott r<strong>és</strong>zfeladat az algoritmusban<br />
többször is elıfordul, de más-más adatokkal.<br />
Számítsuk ki az a szám n eg<strong>és</strong>z hatványkitevıre való emel<strong>és</strong>ének értékét, a <strong>és</strong> n<br />
különbözı értékeire.<br />
<strong>Az</strong> algoritmus elk<strong>és</strong>zít<strong>és</strong>énél felhasználjuk a hatványozás esetén érvényes<br />
azonosságokat, miszerint:<br />
x 2y = x y . x y = (x y ) 2<br />
x 2y+1 = x y . x y . x = (x y ) 2 . x<br />
A hatványozás egy lehetséges algoritmusa:<br />
OLVASD a,n<br />
EREDMENY := 1<br />
ALAP := a<br />
KITEVO := n<br />
CIKLUS (amig KITEVO > 0)<br />
CIKLUS (ha a KITEVO paros)<br />
KITEVO := KITEVO : 2<br />
ALAP = ALAP * ALAP<br />
CIKLUS_VEGE<br />
KITEVO := KITEVO - 1<br />
EREDMENY := EREDMENY * ALAP<br />
CIKLUS_VEGE<br />
IRD EREDMENY<br />
VEGE<br />
Egy példa, hogy követni tudjuk az algoritmus lép<strong>és</strong>eit:<br />
39
a = 3<br />
n = 7<br />
eredmény=1<br />
alap = 3<br />
kitevı = 7<br />
a külsı ciklus elıször kerül végrehajtásra:<br />
a kitevı páratlan, a belsı ciklus nem kerül végrehajtásra<br />
kitevı = 7 - 1 = 6<br />
eredmény = 1*3 = 3<br />
a kitevı > 0, a külsı ciklus másodszor kerül végrehajtásra:<br />
a kitevı páros, ezért elvégezzük a belsı ciklust<br />
kitevı = 6 : 2 = 3<br />
alap = 3*3 = 9<br />
a kitevı páratlan, befejezıdik a belsı ciklus<br />
kitevı = kitevı - 1 = 2<br />
eredmény=eredmény*alap = 3 * 9 = 27<br />
a kitevı > 0<br />
a külsı ciklus harmadszor kerül végrehajtásra:<br />
a kitevı páros, elvégezzük a belsı ciklust<br />
kitevı = 2 : 2 = 1<br />
alap = 9*9 = 81<br />
a kitevı páratlan, vége a belsı ciklusnak<br />
kitevı = kitevı - 1 = 0<br />
eredmény = eredmény*alap = 27*81 = 2187<br />
a kitevı nulla, vége a külsı ciklusnak<br />
Kiíratjuk az eredményt : 2187<br />
Program Hatvanyoz;<br />
uses<br />
Crt;<br />
var<br />
a,n : integer;<br />
function hatvany(var alap,kitevo:integer):longint;<br />
var<br />
eredmeny:longint;<br />
begin<br />
eredmeny:=1;<br />
while kitevo > 0 do<br />
begin<br />
while not Odd(kitevo) do {mig a kitevo paros}<br />
begin<br />
kitevo:=kitevo div 2;<br />
alap:=sqr(alap)<br />
end;<br />
kitevo:=kitevo-1;<br />
eredmeny:=alap*eredmeny;<br />
end;<br />
hatvany:=eredmeny;<br />
end;<br />
Begin<br />
Repeat<br />
Write('a= ');<br />
40
ReadLn(a);<br />
if a 0 then<br />
begin<br />
Write('n= ');<br />
ReadLn(n);<br />
WriteLn('<strong>Az</strong> eredmeny = ',hatvany(a,n):6);<br />
end;<br />
Until a=0; {amig a beolvasott szam 0}<br />
End.<br />
<strong>Az</strong> eratoszten<strong>és</strong>zi szita<br />
Ez egy módszer prímszámok keres<strong>és</strong>ére. A szita elnevez<strong>és</strong> hasznos, mert könnyen<br />
el lehet képzelni azt, hogy az eljárás kezdetén a szitánk minden (N-nél kisebb)<br />
term<strong>és</strong>zetes számot tartalmaz. Közben, amíg tart a törzsszámok keres<strong>és</strong>e, sorra<br />
kihullanak a halmazból a már megtalált prímszámok többszörösei. A prímszámok<br />
nem hullnak ki, csak a többszöröseik. <strong>Az</strong> algoritmus leírásához bevezetünk egy N<br />
elembıl álló halmazt, amelyben felírjuk egy tetszıleges nagyértékő k korlátig az 1nél<br />
nagyobb term<strong>és</strong>zetes számokat. (Ezt a halmazt elnevezhetjük SZITÁ-nak).<br />
Eljárásunk kezdetén töröljük közülük a 2-vel oszthatókat. A kettes számot, ami az<br />
elsı prímszám, bevisszük a PRIMEK nevő halmazba, a megmaradó számok közül a<br />
legkisebbel (ami különbözik 0-tól, elıbb 3, majd 5 stb.), megismételjük az eljárást. <strong>Az</strong><br />
eljárás végén a PRIMEK halmaz elemei éppen a k-nál nem nagyobb prímszámok, a<br />
SZITA pedig üres.<br />
A algoritmus :<br />
N := 1000<br />
SZITA := {2,3,4,...,N}<br />
{A prímek halmaza kezdetben üres halmaz}<br />
PRIMEK:= {\Phi}<br />
{<strong>Az</strong> elsı prímszám az 1, ezzel nem foglalkozunk, a következı a 2}<br />
KOVETKEZO := 2<br />
CIKLUS<br />
CIKLUS (amig KOVETKEZO nincs a SZITA - ban)<br />
KOVETKEZO := KOVETKEZO utani szam<br />
CIKLUS_VEGE<br />
PRIMEK := PRIMEK U {KOVETKEZO}<br />
I := KOVETKEZO<br />
{következik egy ciklus, ami végignézi a SZITA-beli elemeket, kiveszi a<br />
prímszámot <strong>és</strong> annak többszöröseit}<br />
CIKLUS(I-vel, amig I
i,kovetkezo:integer;<br />
Begin<br />
szita:=[2..n];<br />
primek:=[]; {kezdetben ures halmaz}<br />
kovetkezo:=2;<br />
repeat<br />
while not(kovetkezo in szita) do<br />
kovetkezo:=succ(kovetkezo);<br />
primek:=primek+[kovetkezo];<br />
i:=kovetkezo;<br />
while i
BELSO_CIKLUS (VEGEZD EL minden i-re 2-tol j-ig<br />
vagy ameddig OSZTHATO = IGAZ, 1-es lép<strong>és</strong>közzel)<br />
ha k osztható PRIMEK(i) - vel<br />
OSZTHATO := IGAZ<br />
kilép a BELSO_CIKLUS - bol<br />
(egyébként, i := i+1-re, újra elvégzi a BELSO_CIKLUS - ban levı<br />
utasításokat)<br />
CIKLUS_VEGE<br />
ha OSZTHATO = HAMIS<br />
(vagyis találtunk egy prímszamot)<br />
j := j + 1<br />
PRIMEK(j) := k<br />
egyébként<br />
OSZTHATO := HAMIS<br />
CIKLUS_VEGE<br />
KIIR : PRIMEK<br />
VEGE<br />
A program:<br />
program primek;<br />
const n=1000;<br />
var primek: array[1..n] of integer;<br />
i,k,j:integer;<br />
oszthato : boolean;<br />
begin<br />
primek[1]:=2;<br />
primek[2]:=3;<br />
j:=2;<br />
k:=3;<br />
while k < n do<br />
begin<br />
i:=2;<br />
oszthato:=FALSE;<br />
while (i
end.<br />
Néhány érdekes számelméleti feladat<br />
A tökéletes számok<br />
Egy term<strong>és</strong>zetes számot tökéletes számnak nevezünk, ha a szám valódi<br />
osztóinak összege egyenlı magával a számmal. A valódi osztók közé tartozik az<br />
egy is, de maga a szám nem. Tökéletes számok például:<br />
6 = 1 + 2 + 3.<br />
28 = 1 + 2 + 4 + 7 + 14.<br />
Nyitott kérd<strong>és</strong> a matematikában, hogy van-e páratlan tökéletes szám.<br />
Aki erre választ tud adni, annak neve bekerül a megismer<strong>és</strong>ért tett legnagyobb<br />
szellemharcosok közé. A tökéletes számokra vonatkozik a következı, már Eukleid<strong>és</strong>z<br />
által is ismert tétel:<br />
Ha 1 + 2 + 2 2 + 2 3 +...+ 2 n = 2 n+1 -1 = p <strong>és</strong> p prím, akkor 2 n p = 2 n (2 n+1 -1) szám<br />
tökéletes.<br />
Írjunk programot a tökéletes számok megkeres<strong>és</strong>ére!<br />
Term<strong>és</strong>zetesen az elsı, ebben a témában megírt programunk, egy egyszerő<br />
tesztel<strong>és</strong>en alapszik. Vesszük a term<strong>és</strong>zetes számok sorozatát, mondjuk 1-tıl 10.000 -<br />
ig <strong>és</strong> minden számra leteszteljük, hogy az osztóinak összege egyenlı-e a számmal. Ha<br />
igen akkor az a szám tökéletes. A hogy i osztja n-et azt jelenti, hogy (n mod i)=0<br />
vagyis n-nek az i-vel való osztási maradéka 0. Érdemes eltöprengni azon, hogy<br />
hogyan lehetne gyorsítani a program futtatását <strong>és</strong> általában optimalizálni ezt az<br />
algoritmust.<br />
program tokeletes; {tokeletes szamok kerese'se}<br />
{n+}<br />
uses crt;<br />
var n,s,i,n2:longint;<br />
begin<br />
clrscr;<br />
for n:=1 to 10000 do<br />
begin<br />
s:=0;<br />
n2:=n div 2;<br />
for i:=1 to n2 do<br />
if (n mod i)=0 then s:=s+i;<br />
if n=s then writeln(n:4,' ez tokeletes');<br />
end;<br />
end.<br />
Még érdekesebbek a barátságos számok: Két szám akkor áll barátságban<br />
egymással, ha az egyik osztóinak összege a másik számot adja <strong>és</strong> fordítva. Ilyen<br />
alapon 220 <strong>és</strong> 284 barátok! Mint ahogy az életben is ritka az igazi barátság, úgy a<br />
matematikában is kev<strong>és</strong> szám áll barátságban egymással. Tízezerig, csak öt barát-pár<br />
létezik.<br />
Írjunk programot, amelyik kiírja a baráti számokat.<br />
Tulajdonképpen a tökéletes számok elıállítására írt programunkat kell<br />
megmódosítanunk. Vegyük <strong>és</strong>zre, hogy a tökéletes számok saját magukkal állnak<br />
44
arátságban, <strong>és</strong>, ha 220 <strong>és</strong> 284 barátok, akkor nyílván 284 <strong>és</strong> 220 is barátok. Tehát ez<br />
utóbbiakat csak egyszer kell kiírassuk. A program kimondottan iskolai jellegő.<br />
program baratsagos; {baratok keresese}<br />
{n+}<br />
uses crt;<br />
var n,s,p,i,n2,s2:longint;<br />
begin<br />
clrscr;<br />
n:=1;<br />
while n0 do<br />
begin<br />
while not odd(e) do<br />
begin e:=e div 2;u:=u*u end;<br />
45
e:=e-1;z:=u*z<br />
end;<br />
pw:=z;<br />
end;<br />
begin<br />
clrscr;<br />
p:=2;<br />
while p B then<br />
begin<br />
osztando := A<br />
oszto := B<br />
end<br />
else {felcsereljuk}<br />
begin<br />
osztando:=B;<br />
46
oszto:=A;<br />
end;<br />
repeat<br />
hanyados:= osztando div oszto;<br />
maradek:= osztando - oszto*hanyados;<br />
osztando:=oszto;<br />
oszto:=maradek;<br />
until maradek = 0;<br />
writeln('A legnagyobb kozos oszto:',osztando:4);<br />
{mert ebben van a legutolsó nem nulla osztó }<br />
readln;<br />
end.<br />
<strong>Az</strong> euklideszi algoritmusunk második változatánál felhasználjuk a Turbo Pascal<br />
nyelv beépített maradékot adó mod operátorát.<br />
program Eukli_2 { Euklideszi algoritmus};<br />
var<br />
A,B,R:integer;<br />
begin<br />
writeln('Kerem az A szamot'); readln(A);<br />
writeln('Kerem az B szamot'); readln(B);<br />
if B > A then begin {felcsereljuk}<br />
R:=A;<br />
A:=B;<br />
B:=R;<br />
end;<br />
repeat<br />
R:= A mod B;<br />
A:=B;<br />
B:=R;<br />
until B=0;<br />
Writeln('A legnagyobb kozos oszto:',A:4);readln;<br />
end.<br />
(<strong>Az</strong>ért kell az A számot kiíratni, mert a szerepcsere már megtörtént <strong>és</strong> a<br />
megálláskor B-ben nulla van.)<br />
Most értelmezzük mi magunk a maradék függvényt, hogy még érthetıbb legyen a<br />
feladat megoldása. <strong>Az</strong>t az elvet vesszük figyelembe, hogy a maradékos osztás<br />
lényegében ismételt kivonás. Rendkívül kényelmes <strong>és</strong> elegáns:<br />
while x
maradek:=x<br />
end;<br />
begin<br />
writeln('Kerem az A szamot'); readln(A);<br />
writeln('Kerem az B szamot'); readln(B);<br />
if B > A then begin {felcsereljuk}<br />
R:=A;<br />
A:=B;<br />
B:=R;<br />
end;<br />
repeat<br />
R:= maradek(A,B);<br />
if R=0 then<br />
begin<br />
Writeln('A legnagyobb kozos oszto:',B:4);<br />
readln;<br />
exit;<br />
end<br />
else<br />
begin<br />
A:=B;<br />
B:=R;<br />
end;<br />
until false;<br />
end.<br />
Átalakítások számrendszerek között<br />
Alakítsunk át egy eg<strong>és</strong>z számot B alapú számrendszerbıl 10-es alapú<br />
számrendszerbe. <strong>Az</strong> átalakítandó M szám formája a beolvasáskor: M = Vn Vn-1 ... V3<br />
V2 V1, ahol Vn Vn-1 ... V3 V2 V1 az M szám számjegyei B alapú számrendszerben. <strong>Az</strong><br />
eljárás könnyen megírható ha a számok helyértékes írásmódjára gondolunk. Ennek<br />
alapján a számunk felírható a számjegyek <strong>és</strong> a helyi értékek szorzatának összegeként,<br />
ahol a helyi érték az alapszám megfelelı hatványa.<br />
M = V1 + V2 * B + V3 * B 2 + ... + Vn n-1 * B<br />
program alakit;<br />
uses crt;<br />
type tomb = array[1..10] of integer;<br />
var vekt,fordvekt:tomb;<br />
alap,k,n:integer;<br />
function hatvany(a,b:integer):integer;<br />
var<br />
i,p:integer;<br />
begin<br />
p:=1;<br />
for i:=1 to b do<br />
p:=p*a;<br />
hatvany:=p;<br />
end;<br />
function alapx_10(v:tomb;n,b:integer):Integer;<br />
var<br />
M,i:integer;<br />
begin<br />
M:=0;<br />
for i:=1 to n Do<br />
48
M:=M+v[i]*hatvany(b,i-1);<br />
alapx_10:=M;<br />
end;<br />
begin {foprogram}<br />
clrscr;<br />
writeln('Irjuk be a szamjegyek szamat:');<br />
readln(n);<br />
writeln('Irjuk be az alapot:');<br />
readln(alap);<br />
randomize;<br />
for k:=1 to n do<br />
vekt[k]:=random(alap-1);<br />
write('<strong>Az</strong> eredeti szam: ');<br />
for k:=1 to n do<br />
write(vekt[k]:1);<br />
writeln;<br />
for k:=1 to n do<br />
fordvekt[k]:=vekt[n-k+1];<br />
writeln<br />
('<strong>Az</strong> atalakitott szam: ',alapx_10(fordvekt,n,alap));<br />
readln;<br />
end.<br />
Alakítsunk át egy eg<strong>és</strong>z számot 10-es alapú számrendszerbıl B alapú<br />
számrendszerbe.<br />
A szám maga egy vektorban helyezkedik el:<br />
szam = array[1..100]<br />
szam[1] a legkisebb helyiértéken levı számjegyet tartalmazza<br />
szam[n] a legnagyobb helyiértéken levı számjegyet tartalmazza<br />
N10 = xm . p m + xm-1 . p m-1 + ... + x2 . p 2 + x1 . p + x0<br />
<strong>Az</strong> xi - ismeretleneket kell megkapnunk.<br />
Osztjuk az egyenlıség mindkét oldalát p - vel :<br />
N10 = (xm . p m-1 + xm-1 . p m-2 + ... + x2 . p + x1) .p + x0<br />
A maradék megadja x0 értékét.<br />
Ezután a zárójelbe tett kifejez<strong>és</strong> értékét (az elızı osztás hányadosa) osztjuk az<br />
alapszámmal, p-vel, így megkapjuk az x maradékot, ami a következı számjegye a p<br />
alapszámú számnak.<br />
A algoritmus:<br />
OLVASD szam,p<br />
osztando := szam<br />
oszto := p<br />
maradek := szam - (szam / p) * p<br />
i := 1<br />
CIKLUS<br />
hanyados := osztando / oszto<br />
maradek := osztando - oszto * hanyados<br />
x(i) := maradek<br />
ha a hanyados kulonbozik 0 - tol<br />
VEGEZD EL:<br />
osztando := hanyados<br />
49
i := i + 1<br />
CIKLUS_VEGE (ha a hanyados = 0-val)<br />
KIIR eredmeny : x(i) , i = 1,....,m<br />
A program:<br />
program vissza;<br />
uses crt;<br />
type tomb = array[1..20] of integer;<br />
var vekt:tomb;<br />
szam : longint;<br />
alap,k,n,m:integer;<br />
procedure alap10_x;<br />
var<br />
osztando,oszto,maradek,hanyados,i:integer;<br />
begin<br />
for i:=1 to 20 do<br />
vekt[k]:=0;<br />
osztando:=szam;<br />
oszto:=alap;<br />
maradek:=szam - (szam div alap)*alap;<br />
i:=1;<br />
repeat<br />
hanyados:=osztando div oszto;<br />
maradek:=osztando - oszto*hanyados;<br />
vekt[i]:=maradek;<br />
if hanyados 0 then<br />
begin<br />
osztando:=hanyados;<br />
i:=i+1;<br />
end;<br />
until hanyados = 0;<br />
m:=i;<br />
end;<br />
begin {foprogram}<br />
clrscr;<br />
writeln('Irjuk be a szamot:');<br />
readln(szam);<br />
writeln('Irjuk be az alapot:');<br />
readln(alap);<br />
writeln;<br />
alap10_x;<br />
writeln('<strong>Az</strong> atalakitott szam: ');<br />
for k:=m downto 1 do<br />
begin<br />
write(vekt[k]:1);<br />
end;<br />
readln;<br />
end.<br />
Megjegyz<strong>és</strong>. Ha egy feladatban B alapú számrendszerbıl B1alapú számrendszerbe<br />
kell átalakítani egy számot, akkor ezt két lép<strong>és</strong>ben végezhetjük el: elıbb a B alapból<br />
10-es alapú számrendszerbe alakítunk, ezután pedig 10-es alapú számrendszerbıl B1<br />
alapúba alakítjuk át a számot.<br />
Számítsuk ki az MCMLXXIX római szám értékét!<br />
50
Római számok ábrázolási rendszerében a számokat az I, V, X, L, C, D, M betők<br />
segítségével írjuk le. <strong>Az</strong> egység az I bető, értéke 1, a V értéke 5, X = 10, L = 50, C =<br />
100, D = 500, M = 1000. Átírásuknál tulajdonképpen a betőknek megfelelı<br />
számértékekkel dolgozunk. Figyelembe kell vegyük a következı szabályokat:<br />
Ha egy római számot ábrázoló sorozatban ugyanolyan értékő betőjelek vannak<br />
egymás mellett, akkor a szám értéke egyenlı a betőjelek értékének összegével.<br />
Ha egy római számot ábrázoló sorozatban a kisebb értékő számjegy a nagyobb<br />
értékő baloldalán áll, akkor a számjegyek összértéke egyenlı a két számjegy<br />
értékének különbségével.<br />
Ha egy római számot ábrázoló sorozatban a kisebb értékő számjegy a nagyobb<br />
értékő baloldalán áll, akkor a számjegyek összértéke egyenlı a két számjegy<br />
értékének összegével.<br />
<strong>Az</strong> algoritmusban a következıképpen valósulnak meg ezek a szabályok:<br />
Konstansként bevezetjük csökkenı sorrendben a római számok sorozatát, <strong>és</strong> egy<br />
másik vektort, ami ezeknek az értékeit tartalmazza. Például az elsı helyen álló M,<br />
vagyis a római ezres értéke az Ertek[1] elemben található. Kiszámítjuk a római szám<br />
hosszát, majd egy ciklus segítségével elvégezzük a következı mőveleteket: Ha az<br />
átírandó bető értéke kisebb az utána következı bető értékénél, akkor ki kell vonnunk<br />
abból az értékbıl, ha nagyobb, akkor értéke hozzáadódik a már számított értékhez.<br />
Kivétel az utolsó bető, amit hozzá kell adni az addig kiszámított értékhez.<br />
<strong>Az</strong> algoritmus:<br />
M := 1000<br />
D := 500<br />
C := 100<br />
L := 50<br />
X := 10<br />
V := 5<br />
I := 1<br />
BEOLVAS : Romai-Szam<br />
Arab-Szam:=0<br />
HOSSZ:=a Romai-Szam betuinek szama<br />
CIKLUS (k:=1, amig k < HOSSZ, k:=k+1)<br />
HA a k. betu erteke
Ertek : array[1..8] of integer =<br />
(1000,500,100,50,10,5,1,0);<br />
Sorozat : array[1..8] of String[1] =<br />
('M','D','C','L','X','V','I',' ');<br />
Begin<br />
Write('A romai szam : ') ;<br />
Read(RomSzam);<br />
ArabSzam:=0;<br />
Hossz:=Length(RomSzam);<br />
SegedSor:='';<br />
For i:= 1 to Hossz Do<br />
For j:=1 to 7 Do<br />
If RomSzam[i] = Sorozat[j] Then<br />
Begin<br />
Str(j:1,String1);<br />
SegedSor:=Copy(Segedsor,1,i-1)+String1;<br />
End;<br />
For i:= 1 to Hossz - 1 Do<br />
Begin<br />
Val(SegedSor[i],j1,ErrCod);<br />
Val(SegedSor[i+1],j2,ErrCod);<br />
If j1
Bebizonyítható, hogy n korong átpakolásához 2 n - 1 lép<strong>és</strong>re van szükség!<br />
Feltételezzük, hogy a baloldali pálcikán vannak a korongok <strong>és</strong> a jobb oldalira<br />
szeretnénk átpakolni, a középsı felhasználásával. A megoldási stratégia a következı<br />
elvekre épül:<br />
1. Egy korongot egyszerően áthelyezünk a cél(jobb)pálcikára.<br />
2. N korong áthelyez<strong>és</strong>e a következı három rekurzív lép<strong>és</strong>re bontható:<br />
2.1. N-1 korongot áthelyezünk a középsı pálcikára<br />
2.2. <strong>Az</strong> utolsó (legnagyobb) korongot közvetlenül áthelyezzük a jobb<br />
pálcikára<br />
2.3. Majd a középsı pálcikán maradt N-1 korongot áthelyezzük a jobb oldalira,<br />
persze újra véve a 2. lép<strong>és</strong>tıl az átpakolási eljárást.<br />
Ezt rekurzív elgondolásban a következıképpen tömöríthetjük:<br />
Hanoi(n) eljárás<br />
Hanoi(n-1) korongok középre<br />
n-edik korong jobbra<br />
Hanoi(n-1) jobbra.<br />
De ezzel még nem oldottuk meg a korongok középre, jobbra technikai<br />
kivitelez<strong>és</strong>ét! Ehhez már pontosabban kell fogalmazzunk:<br />
Ha ezt a megoldást valaki önállóan "kisüti", akkor egy parányit megértett a<br />
term<strong>és</strong>zet mőköd<strong>és</strong>ébıl is. Mert ebben a megoldási stratégiában is rejlik egy olyan<br />
elv, amely szerint a genetikai kódok is kifejlıdnek <strong>és</strong> mőköd<strong>és</strong>be lépnek.<br />
Term<strong>és</strong>zetesen, ha már vannak elıtanulmányaink errıl a megoldási technikáról,<br />
akkor nem jelent gondot a programozása, de ha nincsenek akkor igenis szép<br />
teljesítmény az önálló megoldás.<br />
program hanoi; {Hanoi tornyai}<br />
uses crt;<br />
const n=3;<br />
type hely=string[5];<br />
procedure han(n:integer;A,B,C:hely);<br />
var i:integer;<br />
begin<br />
if n=1 then<br />
writeln('korong a ',A,'-rol a ',C,'-re')<br />
else begin<br />
han(n-1,A,C,B);<br />
writeln('korong a ',A,'-rol a ',C,'-re');<br />
han(n-1,B,A,C);<br />
end;<br />
end;<br />
begin<br />
clrscr;<br />
Han(n,'bal','kozep','jobb');<br />
readln;<br />
end.<br />
Rendez<strong>és</strong>ek<br />
53
Sorozat legnagyobb értékő elemének megkeres<strong>és</strong>e<br />
Feladat: Keressük meg egy adott számsorozat, vagy számértékeket tartalmazó<br />
vektor legnagyobb elemét, vagyis a maximumát!<br />
Nyilvánvaló, hogy összehasonlításokat kell végezni a sorozat elemei között. A<br />
megoldás a következı: A számsorozat elsı elemét elhelyezzük a Maxim nevő<br />
változóban. Egy ciklus segítségével végigjárjuk a sorozat összes elemét <strong>és</strong><br />
valahányszor a Maxim változó értékénél nagyobb elemet találunk, azt kicseréljük<br />
vele.<br />
program legnagy;{obb}<br />
uses crt;<br />
type<br />
tomb = array[1..100] of real;<br />
var<br />
n : integer; { a sorozat elemeinek szama }<br />
i : integer;<br />
vekt : tomb;<br />
maxim : integer; {eredmeny}<br />
begin<br />
writeln('Irjuk be az elemek szamat:');<br />
readln(n);<br />
randomize;<br />
for i:=1 to n do<br />
vekt[i]:=random(10000);<br />
if n > 1 then<br />
maxim:=v[1];<br />
for i:= 2 to n do<br />
if vekt[i] > maxim then<br />
maxim:=vekt[i];<br />
{<strong>Az</strong> eredmeny kiiratasa}<br />
writeln('A legnagyobb elem:',maxim:6);<br />
readln;<br />
end.<br />
<strong>Az</strong> elızı feladatot fokozhatjuk azzal, hogy keressük meg egy adott vektor<br />
legnagyobb elemét, <strong>és</strong> azt is mondjuk meg, hogy a vektor hányadik eleme a<br />
legnagyobb. Ebben az esetben az index értékét is meg kell ırizni.<br />
Számsorozat elemeinek rendez<strong>és</strong>e<br />
Módosítsunk egy adott számsorozatot a következıképpen: Cseréljük fel a sorozat<br />
elemeit úgy, hogy az elsı m elem kerüljön a vektor utolsó m helyére <strong>és</strong> az eredeti<br />
vektor utolsó n–m elem kerüljön a vektor elejére.<br />
Megoldás<br />
Legyen a a beolvasott vektor.<br />
Szükségünk van egy b segédvektorra, amelyben az eredményül kapott elemeket<br />
tároljuk.<br />
A b vektor elsı n-m helyére elhelyezzük az eredeti vektorunk utolsó n-m elemét,<br />
majd az üresen maradt m helyre beírjuk az a vektor elsı m elemét.<br />
A program:<br />
program sorban1;<br />
{Egy sorozatban lev• elemek sorrendjének kicserél<strong>és</strong>e}<br />
type<br />
vekt = array[1..100] of integer;<br />
54
var<br />
i,j,n,m:integer;<br />
a,b : vekt; {a - beolvasott vektor,b - segedvektor}<br />
begin<br />
for i:=1 to 100 do<br />
a[i]:=i;<br />
writeln('Irjuk be az elemek szamat:');<br />
repeat<br />
readln(n);<br />
until n < 100;<br />
randomize;<br />
for i:=1 to n do<br />
a[i]:=random(1000);<br />
writeln('Irjuk be a valasztoindex szamat:');<br />
repeat<br />
readln(m);<br />
until m < 99;<br />
j:=n-m;<br />
for i:=1 to j do<br />
b[i]:=a[m+i];<br />
for i:=1 to m do<br />
b[j+i]:=a[i];<br />
writeln;<br />
writeln('<strong>Az</strong> atrendezett sorozat:');<br />
for i:=1 to n do<br />
begin<br />
write(b[i]:6);<br />
if i mod 6 = 0 then<br />
writeln;<br />
end;<br />
readln;<br />
end.<br />
Példa:<br />
<strong>Az</strong> eredeti sorozat:<br />
a = (1,8,9,7,6,5,2)<br />
m = 3<br />
n = 4<br />
<strong>Az</strong> algoritmus elvégz<strong>és</strong>e után így néz ki a sorozat :<br />
a = (7,6,5,2,1,8,9)<br />
Második megoldás.<br />
A vektor m. elemét az utolsó helyre visszük, úgy, hogy a(m) az a(m+1) helyére,<br />
a(m+2) az a(m+1) helyére,...,a(n) az a(n-1) helyére kerül. Ezután a következıképpen<br />
néz ki a sorozatunk: A(1), A(2),..., A(m-1), A(m+1), A(m+2),..., A(n), A(m).<br />
Maradék vektor m-1. elemét az n-1. helyre juttatjuk, az elızıhöz hasonló<br />
felcserél<strong>és</strong>eket végezve. A sorozat a következıképpen alakul: A(1), A(2), ..., A(m-2),<br />
A(m+1), A(m+2),..., A(n), A(m-1), A(m).<br />
Hasonló felcserél<strong>és</strong>eket végzünk a vektor m-2. elemével, majd az m-3., ..., 2., 1.<br />
elemekkel, így a vektor elemei a kívánt sorrendbe kerülnek. <strong>Az</strong> algoritmus hátránya,<br />
hogy nagyon sok felcserél<strong>és</strong>t kell végezni, ami nagyon idıigényes.<br />
A program :<br />
55
program sorban2;<br />
type<br />
vekt = array[1..100] of integer;<br />
var<br />
i,j,k,n,m:integer;<br />
a,b : vekt;<br />
begin<br />
writeln('irjuk be az elemek szamat:');<br />
repeat<br />
readln(n);<br />
until n < 100;<br />
randomize;<br />
for i:=1 to n do<br />
a[i]:=random(1000);<br />
writeln('irjuk be a valasztoindex szamat:');<br />
repeat<br />
readln(m);<br />
until m < n-1;<br />
for i:=m downto 1 do<br />
for j:=i to n-m+i-1 do<br />
begin<br />
k:=a[j];<br />
a[j]:=a[j+1];<br />
a[j+1]:=k;<br />
end;<br />
writeln;<br />
writeln('<strong>Az</strong> atrendezett sorozat:');<br />
for i:=1 to n do<br />
begin<br />
write(a[i]:6);<br />
if i mod 6 = 0 then<br />
writeln;<br />
end;<br />
readln;<br />
end.<br />
Harmadik megoldás<br />
Elsı lép<strong>és</strong>ként felcseréljük a vektorban levı elemek sorrendjét.<br />
A kapott sorozat: A(n), A(n-1),..., A(2), A(1). Második lép<strong>és</strong>ként felcseréljük az<br />
utolsó m pozícióban levı elemek sorrendjét. Ezután így néz ki a sorozatunk:<br />
A(n), A(n-1),..., A(m+1), A(1), A(2),..., A(m).<br />
Harmadik lép<strong>és</strong> az elsı n-m elem sorrendjének felcserél<strong>és</strong>e.<br />
A program :<br />
program sorban3;<br />
uses dos;<br />
type<br />
vekt = array[1..100] of integer;<br />
var<br />
i,j,k,n,m,m1:integer;<br />
a : vekt;<br />
ho,mi,se1,se2 : word;<br />
begin<br />
writeln('Irjuk be az elemek szamat:');<br />
repeat<br />
56
eadln(n);<br />
until n < 100;<br />
randomize;<br />
for i:=1 to n do<br />
a[i]:=random(1000);<br />
writeln('Irjuk be a valasztoindex szamat:');<br />
repeat<br />
readln(m);<br />
until m < n-1;<br />
GetTime(Ho,Mi,Se1,Se2);<br />
write(ho:5,mi:5);<br />
j:=n div 2;<br />
for i:=1 to j do<br />
begin<br />
k:=a[i];<br />
a[i]:=a[n+1-i];<br />
a[n+1-i]:=k;<br />
end;<br />
j:=(n-m) div 2;<br />
m1:=n-m+1;<br />
for i:=1 to j do<br />
begin<br />
k:=a[i];<br />
a[i]:=a[m1-i];<br />
a[m1-i]:=k;<br />
end;<br />
j:=m div 2;<br />
m1:=n-m;<br />
for i:=1 to j do<br />
begin<br />
k:=a[m1+i];<br />
a[m1+i]:=a[n+1-i];<br />
a[n+1-i]:=k;<br />
end;<br />
writeln;<br />
writeln('<strong>Az</strong> atrendezett sorozat:');<br />
for i:=1 to n do<br />
begin<br />
write(a[i]:6);<br />
if i mod 6 = 0 then<br />
writeln;<br />
end;<br />
GetTime(Ho,Mi,Se1,Se2);<br />
writeln;<br />
write(ho:5,mi:5);<br />
readln;<br />
end.<br />
Megjegyz<strong>és</strong>. Felhasználtuk a DOS unit GetTime eljárását, az idıigény<br />
ellenırz<strong>és</strong>ére.<br />
Rendezzük egy eg<strong>és</strong>z számokból álló halmaz elemeit növekvı sorrendbe. Ha<br />
elıször találkozunk ezzel a feladattal a legkézenfekvıbb megoldás, hogy sorban<br />
összehasonlítjuk a halmaz elemeit a következı elemekkel.<br />
Beolvassuk:<br />
– a sorba rendezendı számok számát<br />
– a rendezendı elemeket a vekt nevő vektorban.<br />
57
A belsı ciklus minden menetben átrendezi a helytelen sorrendben álló elemeket.<br />
<strong>Az</strong> elsı elem helyére, azaz vekt[i]-be kerül a legkisebb elem.<br />
A külsı ciklus ezt a folyamatot ismétli, minden alkalommal eggyel növelve az<br />
összehasonlítandó elem indexét, vagyis közben i értéke az 1 kezdıértéktıl eljut n-1 -<br />
ig. Ekkor vekt[n]-be a maximális kerül. Hátránya az, hogy idıigényes.<br />
A program:<br />
program rendez1;<br />
uses crt;<br />
type<br />
tomb = array[1..100] of integer;<br />
var<br />
n : integer; {a sorbarendezendo szamok szama}<br />
vekt : tomb; {a rendezendo elemek vektora}<br />
i,j,k:integer;<br />
{i,j az eppen osszehasonlitando elemek indexe<br />
k valtozo a kicsereleshez}<br />
begin<br />
{beolvasni n-et ,a szamokat}<br />
writeln('Irjuk be az elemek szamat:');<br />
readln(n);<br />
randomize;<br />
for i:=1 to n do<br />
vekt[i]:=random(Maxint);<br />
if n > 1 then<br />
for i:= 1 to n - 1 do {kulso ciklus kezdete}<br />
for j:= i + 1 to n do {belso ciklus kezdete}<br />
if vekt[i] > vekt[j] then<br />
begin<br />
k:=vekt[j];<br />
v[j]:=vekt[i];<br />
vekt[i]:=k;<br />
end;<br />
{kiiratas}<br />
writeln('<strong>Az</strong> atrendezett sorozat:');<br />
for i:=1 to n do<br />
begin<br />
write(vekt[i]:6);<br />
if i mod 6 = 0 then<br />
writeln;<br />
end;<br />
end.<br />
Buborékos rendez<strong>és</strong><br />
Jobb az a megoldás, amit az úgynevezett buborékos rendez<strong>és</strong> kínál. A változók<br />
valamint maga a fıprogram hasonló az elsı megoldásban levıhöz.<br />
A különbség a Buborék nevő eljárásban van. A belsı ciklus minden menetben<br />
átrendezi a helytelen sorrendben álló szomszédos elemeket. A menet végére a<br />
legnagyobb elem, mint folyadékban a buborék, a felszínre, vagyis a tömb végére, azaz<br />
v[i] -be kerül. A külsı ciklus ezt a folyamatot ismétli, minden alkalommal 1-gyel<br />
csökkentve az aktuális felsı tömbhatárt. A buborékos rendez<strong>és</strong> fı elınye az<br />
egyszerőség. Komoly hátránya, hogy ha a rendezendı elemek száma túlságosan<br />
naggyá válik, akkor az eljárás erısen lelassul.<br />
A program :<br />
58
program rendez2;<br />
uses crt;<br />
type<br />
tomb = array[1..100] of integer;<br />
var<br />
n ,i: integer;{a sorbarendezendo szamok szama}<br />
v : tomb;{a rendezendo elemek vektora}<br />
procedure buborek(var v:tomb;n:integer);<br />
var<br />
i,j,k:integer;<br />
begin<br />
for i:= n downto 1 do<br />
for j:= 1 to i do<br />
if v[j] > v[j+1] then {osszehasonlitas}<br />
begin<br />
k:=v[j]; {felcsereles}<br />
v[j]:=v[j+1];<br />
v[j+1]:=k;<br />
end;<br />
end;<br />
begin {foprogramresz};<br />
{beolvasni n-et ,a szamokat}<br />
clrscr;<br />
write('Irjuk be az elemek szamat:');<br />
readln(n);<br />
randomize;<br />
for i:=1 to n do<br />
v[i]:=random(1000);<br />
if n > 1 then<br />
Buborek(v,n);<br />
{kiiratas}<br />
writeln('<strong>Az</strong> atrendezett sorozat:');<br />
for i:=1 to n do<br />
begin<br />
write(v[i]:6);<br />
if i mod 10 = 0 then<br />
writeln;<br />
end;<br />
readln;<br />
end.<br />
Shell rendez<strong>és</strong><br />
A shell rendez<strong>és</strong> bonyolultabb, mint a buborékos rendez<strong>és</strong>. Elınye, hogy nagyobb<br />
tömbök esetében sokkal gyorsabb. Kezdetben nem a szomszédos elemeket hasonlítjuk<br />
össze, hanem az egymástól távolabb esıket. Ezzel a nagymértékő rendezetlenség<br />
gyorsan csökken, <strong>és</strong> így k<strong>és</strong>ıbbre kevesebb munka marad. <strong>Az</strong> összehasonlított elemek<br />
távolsága fokozatosan csökken, amíg el nem éri az 1-et, ekkor a rendez<strong>és</strong>i algoritmus<br />
átmegy a szomszédos elemek felcserél<strong>és</strong>ét alkalmazó módszerbe.<br />
A külsı ciklus az összehasonlított elemek közötti távolságot vezérli. Ez kezdetben<br />
az aktuális felsı tömbhatár fele, <strong>és</strong> minden menetben felére csökken, amíg 0 -vá nem<br />
válik.<br />
A középsı ciklus az egymástól a LEPES által elválasztott elemeket hasonlítja<br />
össze. <strong>Az</strong> összehasonlítás úgy történik, hogy az elsı menetben (a külsı ciklus elsı<br />
végrehajtásakor, LEPES =a felsı tömbhatár fele) az elsı elemet összehasonlítja a fele<br />
59
+ 1 - gyel, a másodikat a fele + 2 - vel <strong>és</strong> így tovább. A második menetben (a külsı<br />
ciklus második végrehajtásakor, LEPES = a felsı tömbhatár negyede) az elsı elemet<br />
összehasonlítja a negyede + 1 - gyel, a másodikat a negyede + 2 - vel <strong>és</strong> így tovább,<br />
sorra véve minden negyedr<strong>és</strong>zt a vektorból. A legbelsı ciklus felcseréli azokat az<br />
elemeket, amelyek fordított sorrendben vannak. Mivel a LEPES végül 1-re csökken,<br />
az elemek helyes sorrendbe rendezıdnek.<br />
A shell eljárás, amelyben a v vektor egy indexvektor szerepét tölti be, a v2 a<br />
ténylegesen sorba rendezendı elemek vektora. A két vektor azonos helyen álló elemei<br />
összefügg<strong>és</strong>ben vannak egymással. (Például a v2 vektor tartalmazhatna egy névsort, a<br />
v vektor tartalmazná a megfelelı személyek életkorát. Rendezzük el a névsort az<br />
életkor szerinti csökkenı sorrendben!)<br />
procedure shell(n:integer;var v,v2:vekt);<br />
var<br />
lepes,i,j,jl:integer ;<br />
l:boolean;<br />
s:integer;<br />
begin<br />
lepes:=n div 2 ;<br />
while lepes > 0 do<br />
begin<br />
for i:=lepes+1 to n do<br />
begin<br />
j:=i-lepes;<br />
l:=true ;<br />
while ((j>0) and l) do<br />
begin<br />
jl:=j+lepes;<br />
if(v[j]>v[jl]) then<br />
l:=false<br />
else<br />
begin<br />
s:=v[j];<br />
v[j]:=v[jl];<br />
v[jl]:=s;<br />
s:=v2[j];<br />
v2[j]:=v2[jl];<br />
v2[jl]:=s;<br />
j:=j-lepes ;<br />
end;<br />
end;<br />
end;<br />
lepes:=lepes div 2 ;<br />
end;<br />
end;<br />
Példa egy 6 elembıl álló vektor rendez<strong>és</strong>ére, ez esetben a sorbarendezendı vektor<br />
a következı számsorozat:<br />
-2, 0, 7, 4, 2, 8<br />
az elsı utasítás:<br />
LÉPÉS= 6 / 2 = 3 > 0<br />
60
az i változó LÉPÉS+1 - tıl, azaz 4 - tıl megy 6 - ig<br />
a LÉPÉS a halmazt két r<strong>és</strong>zre bontja, ennek a két r<strong>és</strong>znek az elemeit<br />
hasonlítgatjuk össze<br />
- a j változó i-LÉPÉS lesz,vagyis 4 - 3 = 1<br />
- a jl változó j+LÉPÉS lesz,vagyis 1 + 3 = 4<br />
- a j. <strong>és</strong> jl. elemeket összehasonlítva -2 < 4, el kell végezni a<br />
két elem cseréjét<br />
a megváltozott vektor : 4, 0, 7, -2, 2, 8<br />
az i változót növeljük 1 - gyel, i= 5<br />
- a j változó i-LÉPÉS lesz,vagyis 5 - 3 = 2<br />
- a jl változó j+LÉPÉS lesz,vagyis 2 + 3 = 5<br />
- a j. <strong>és</strong> jl. elemeket összehasonlítva 0 < 2, el kell végezni a<br />
két elem cseréjét<br />
a megváltozott vektor : 4, 2, 7, -2, 0, 8<br />
úgyanígy cseréljük ki a 3. <strong>és</strong> 6. elemek értékeit az i = 6 esetén<br />
a megváltozott vektor : 4, 2, 8, -2, 0, 7<br />
eljutottunk a középsı ciklus végére, mert i = n = 6<br />
LÉPÉS= 3 / 2 = 1 > 0<br />
a LÉPÉS a halmazt két r<strong>és</strong>zre bontja, ennek a két r<strong>és</strong>znek az elemeit<br />
hasonlítgatjuk össze<br />
az i változó most 2 - tıl megy 6 - ig<br />
- a j változó i-LÉPÉS lesz,vagyis 2 - 1 = 1<br />
- a jl változó j+LÉPÉS lesz,vagyis 1 + 1 = 2<br />
- a j. <strong>és</strong> jl. elemeket összehasonlítva 4 > 2, nem kell cserét végezni<br />
i = 3<br />
- j = 2, jl = 3 2 < 3, kicserélıdnek<br />
a vektor :4, 8, 2, -2, 0, 7<br />
most újra elvégezzük a belsı ciklust, mert<br />
- j = j - LÉPÉS = 2 - 1 = 1 > 0, jl = 2 4 < 8 , kicserélıdnek<br />
a vektor :8, 4, 2, -2, 0, 7<br />
i = 4<br />
- j = 3, jl = 4 2 < -2 , nincs csere<br />
i = 5<br />
- j = 4, jl = 5 -2 < 0 , csere<br />
a vektor : 8, 4, 2, 0, -2, 7<br />
i = 6<br />
- j = 5, jl = 6 -2 < 7 , kicserélıdnek<br />
a vektor : 8, 4, 2, 0, 7, -2<br />
most ujra elvégezzük a belsı ciklust j = 4-re,3-ra,2-re,1-re:<br />
- j = j - LÉPÉS = 5 - 1 = 4 > 0, jl = 5 0 < 7 , kicserélıdnek<br />
a vektor : 8, 4, 2, 7, 0, -2<br />
- j = j - LÉPÉS = 4 - 1 = 3 > 0, jl = 4 2 < 7 , kicserélıdnek<br />
a vektor : 8, 4, 7, 2, 0, -2<br />
- j = j - LÉPÉS = 3 - 1 = 2 > 0, jl = 3 4 < 7 , kicserélıdnek<br />
61
a vektor : 8, 7, 4, 2, 0, -2<br />
- j = j - LÉPÉS = 2 - 1 = 1 > 0, jl = 2 8 > 7 , nincs csere<br />
elértünk a belsı ciklus végére mert<br />
- j = j - LÉPÉS = 1 - 1 = 0<br />
másodszor is eljutottunk a középsı ciklus végére, mert i = n = 6<br />
LÉPÉS= 1 / 2 = 0 < 0, a külsı ciklust már nem kell elvégezni<br />
többször, elértünk az algoritmus végére, a vektorunk rendezett<br />
Feladat<br />
A v2 vektor tartalmazzon egy névsort, a v vektor tartalmazza a névsorban levı<br />
személyek életkorát. Rendezzük el a névsort az életkor szerinti csökkenı sorrendben!<br />
A különbség az elızı algoritmushoz képest az, hogy a két rendezendı vektornak nem<br />
azonos a típusa.<br />
A program:<br />
program rendez3;<br />
uses crt;<br />
type<br />
vekt = array[1..100] of integer;<br />
nevek = array[1..100] of string[20];<br />
var v: vekt;<br />
v2: nevek;<br />
n,k:integer;<br />
procedure shell(n:integer;var v:vekt,v2:nevek);<br />
var<br />
lepes,i,j,jl:integer ;<br />
l:boolean;<br />
s:integer;s2:string[20];<br />
begin<br />
lepes:=n div 2 ;<br />
while lepes > 0 do<br />
begin<br />
for i:=lepes+1 to n do<br />
begin<br />
j:=i-lepes;<br />
l:=true ;<br />
while ((j>0) and l) do<br />
begin<br />
jl:=j+lepes;<br />
if(v[j]>v[jl]) then<br />
l:=false<br />
else<br />
begin<br />
s:=v[j];<br />
v[j]:=v[jl];<br />
v[jl]:=s;<br />
s2:=v2[j];<br />
v2[j]:=v2[jl];<br />
v2[jl]:=s2;<br />
j:=j-lepes ;<br />
end;<br />
end;<br />
end;<br />
lepes:=lepes div 2 ;<br />
end;<br />
62
end;<br />
begin {foprogram}<br />
clrscr;<br />
writeln('Irjuk be az elemek szamat:');<br />
readln(n);<br />
for k:=1 to n do<br />
begin<br />
v[k]:=0;<br />
v2[k]:=' ';<br />
end;<br />
writeln;<br />
for k:=1 to n do<br />
begin<br />
write('Nev :');<br />
read(v2[k]);<br />
write('Eletkor:');<br />
read(v[k]);<br />
readln;<br />
end;<br />
writeln;<br />
if n > 1 then<br />
shell(n,v,v2);<br />
writeln('<strong>Az</strong> atrendezett sorozat:');<br />
writeln;<br />
writeln(' Nev: Eletkor:');<br />
for k:=1 to n do<br />
begin<br />
write(v2[k]:20,v[k]:6);<br />
writeln;<br />
end;<br />
readln;<br />
end.<br />
A shell rendez<strong>és</strong> elınye, hogy nagyobb tömbök esetében is gyorsabban mőködik,<br />
mint a buborékos rendez<strong>és</strong>.<br />
Gyorsrendez<strong>és</strong><br />
Eredetileg C.A.R. Hoare fejlesztette ki a gyorsrendez<strong>és</strong>t amely a köztudatban<br />
quicksort néven terjedt el. <strong>Az</strong> eredeti sorozatot r<strong>és</strong>zekre bontjuk oly módon, hogy két<br />
csoportot képezünk: azon elemekét, amelyek egy, a halmazból tetszılegesen<br />
kiválasztott elemnél kisebbek, <strong>és</strong> azokét, amelyek ennél nagyobbak. Ezután ezt a<br />
felosztást alkalmazzuk a két r<strong>és</strong>zhalmazra egymás után mindaddig, ameddig minden<br />
egyes r<strong>és</strong>zhalmaz csupán egyetlen elembıl nem áll. Ha az összes r<strong>és</strong>zhalmazt<br />
felbontottuk, az eredeti halmaz rendezetté vált. Két segédtömb bevezet<strong>és</strong>ére van<br />
szükségünk, amelyben rendre elhelyezzük az éppen vizsgált r<strong>és</strong>zsorozat kezdı <strong>és</strong><br />
végsı indexét.<br />
A program:<br />
program rendez4;<br />
uses crt;<br />
type<br />
tomb = array[1..100] of integer;<br />
63
segedtomb = array[1..20] of integer;<br />
var t:tomb;<br />
tjobb,tbal : segedtomb;<br />
foelem,n,k:integer;<br />
procedure csere(var x,y:integer);<br />
var z : integer;<br />
begin<br />
z:=x;<br />
x:=y;<br />
y:=z;<br />
end;<br />
procedure gyors;<br />
var<br />
i,j,cikl:integer;<br />
begin<br />
tbal[1]:=1;<br />
tjobb[1]:=n;<br />
cikl:=1;<br />
repeat<br />
if (tbal[cikl] >= tjobb[cikl]) then<br />
cikl:=cikl - 1<br />
else<br />
begin<br />
{csoportositas}<br />
i:=tbal[cikl] - 1;<br />
j:=tjobb[cikl];<br />
foelem:=t[j];<br />
while (i < j) do<br />
begin<br />
while t[i] < foelem do i:=i+1;<br />
while (t[j] > foelem) and (j > i) do j:=j-1;<br />
if i < j then<br />
csere(t[i],t[j])<br />
else<br />
begin<br />
j:=tjobb[cikl];<br />
{csere(t[i],t[j]);}<br />
foelem:=t[j];<br />
end;<br />
end; {a segédtömbökben elhelyezzük az éppen<br />
vizsgált r<strong>és</strong>zhalmaz elemeit, minden lép<strong>és</strong>nél el•ször a<br />
rövidebb r<strong>és</strong>zhalmazzal foglalkozunk}<br />
if (i -tbal[cikl] < tjobb[cikl] -i) then<br />
begin<br />
tbal[cikl+1]:=tbal[cikl];<br />
tjobb[cikl+1]:=i-1;<br />
tbal[cikl]:=i+1;<br />
end<br />
else<br />
begin<br />
tbal[cikl+1]:=i+1;<br />
tjobb[cikl+1]:=tjobb[cikl];<br />
tjobb[cikl]:=i-1;<br />
end;<br />
cikl:=cikl+1;<br />
end;<br />
until cikl=0;<br />
64
end;<br />
begin {foprogram}<br />
clrscr;<br />
{A beolvasásokat a véletlenszám generáló eljárással<br />
végezzük el.}<br />
writeln('Irjuk be az elemek szamat:');<br />
readln(n);<br />
randomize;<br />
for k:=1 to n do<br />
t[k]:=random(1000);<br />
writeln('<strong>Az</strong> eredeti sorozat:');<br />
for k:=1 to n do<br />
begin<br />
write(t[k]:6);<br />
if k mod 8 = 0 then<br />
writeln;<br />
end;<br />
writeln;<br />
if n > 1 then<br />
gyors;<br />
writeln('<strong>Az</strong> atrendezett sorozat:');<br />
for k:=1 to n do<br />
begin<br />
write(t[k]:6);<br />
if k mod 8 = 0 then<br />
writeln;<br />
end;<br />
readln;<br />
end.<br />
Rekurzív gyorsrendez<strong>és</strong><br />
A gyorsrendez<strong>és</strong>t elvégzı eljárást legjobban rekurzív eljárásként lehet megadni.<br />
Akkor szoktuk ezt alkalmazni, amikor az algoritmus elk<strong>és</strong>zít<strong>és</strong>e közben rájövünk,<br />
hogy az eljárásunk utasításai ismétlıdnek, csak más bemenı adatokkal. Innen<br />
következik a rekurzió meghatározása is: Rekurzív eljárásnak nevezünk egy olyan<br />
feldolgozási módot (A), amely a végrehajtás alatt behívja saját magát (A-t), vagy<br />
behív egy másik eljárást (B), amely azután az eredeti eljárást (A) hívja be.<br />
Rövidebben: Egy eljárás vagy függvény önmagából való aktivizálását rekurzív<br />
hívásnak nevezzük. A Quick(bal,jobb) eljárást felhasználó program:<br />
A program:<br />
program rendez5;<br />
uses crt;<br />
type<br />
tomb = array[1..100] of integer;<br />
var t:tomb; n:integer;<br />
procedure quick(bal,jobb:integer);<br />
var<br />
i,j,x,y:integer;<br />
begin<br />
i:=bal;<br />
j:=jobb;<br />
x:=t[(i+j) div 2];<br />
65
epeat<br />
while t[i] < x do i:=i+1;<br />
while t[j] > x do j:=j-1;<br />
if i j;<br />
if bal
i,j,x,y:integer;<br />
begin<br />
i:=bal;<br />
j:=jobb;<br />
x:=vekt[(i+j) div 2];<br />
repeat<br />
while vekt[i] < x do i:=i+1;<br />
while vekt[j] > x do j:=j-1;<br />
if i j;<br />
if bal
egin<br />
k:=k+1;<br />
t[k]:=ty[j];<br />
j:=j+1;<br />
end;<br />
writeln('<strong>Az</strong> osszevalogatott sorozat elemei:');<br />
for k:=1 to n+m do<br />
begin<br />
write(t[k]:6);<br />
if k mod 6 = 0 then<br />
writeln;<br />
end;<br />
readln;<br />
end.<br />
Rekurziók a kombinatorikában<br />
Sok szép algoritmus fedezhetı fel a permutációkkal való mőveletekre.<br />
Ez a XI.-es algebra bevezetı tananyaga. Mi a következı feladatokra adunk<br />
algoritmust:<br />
– a permutációk számának kiszámítása<br />
– az összes permutáció elıállítása<br />
– két permutáció összetev<strong>és</strong>e<br />
– egy adott permutáció elıjelének kiszámítása<br />
– egy adott permutáció felbontása inverziók szorzatára<br />
A permutációk csoportot alkotnak, ahogy ezt a XII.-es algebra órán megtanítják. A<br />
legfontosabb véges csoport, abban az értelemben, hogy minden véges csoport izomorf<br />
(ugyanolyan struktúrájú) valamelyik permutáció csoport r<strong>és</strong>zcsoportjával. Ezért jó, ha<br />
a tanulóknak errıl a csoportról alapos élményük <strong>és</strong> ismeretük marad.<br />
A legtöbb esetben egy permutációt egy vektorral fogunk megadni, amelynek a<br />
komponensei az elsı n term<strong>és</strong>zetes szám. Ez azt jelenti, hogy ha a-val jelöljük a<br />
permutációt megadó vektort, akkor a[i] azt jelenti, hogy i-nek megfelel a[i]. Vagyis<br />
az a permutáció i-t a[i]-be permutálja.<br />
Számítsuk ki n elem ismétl<strong>és</strong> nélküli permutációinak számát!<br />
Fontos <strong>és</strong> egyszerő n elem permutációinak kiszámítása. Tehát n! megadása, ahol !<br />
a faktoriális jele. Papíron kiszámítani fárasztó, viszont géppel ajánlott, a növeked<strong>és</strong><br />
érzékeltet<strong>és</strong>éért. Ugyanis a faktoriális gyorsabban növekedik, mint a<br />
hatványfüggvény, a n /n! tart a zéróhoz. A programocska lényegében egy ciklusból áll.<br />
<strong>Az</strong>ért kell egy hosszú valós számban (sablonban) kiszámítani a faktoriálist, mert<br />
olyan nagy szám keletkezik, hogy eg<strong>és</strong>z típusú változóba nem fér bele.<br />
Például 20 faktoriális 24 számjegybıl áll.<br />
<strong>Az</strong> algoritmus pszeudokódban is nagyon egyszerő:<br />
OLVASD m<br />
FF := 1<br />
CIKLUS<br />
(VEGEZD EL minden i-re 1-tol m-ig, 1-es lepeskozzel)<br />
FF := FF * i<br />
CIKLUS_VEGE<br />
IRD FF<br />
68
VEGE<br />
– Beolvassuk m értékét <strong>és</strong> az FF változónak ,amíg az eredményt fogja<br />
tartalmazni az 1 kezdıértéket adjuk.<br />
– Ezután m - szer végezzük el a következı mőveletet:<br />
– megszorozzuk FF eddigi értékét i - vel, ahol i = 1,...,m<br />
program fakt; {n elem faktorialis szama}<br />
{n+}<br />
uses crt;<br />
const n=30;<br />
var<br />
i,m:integer;<br />
ff:double;<br />
begin<br />
clrscr;<br />
for m:=1 to n do<br />
begin<br />
ff:=1;<br />
for i:=1 to m do ff:=ff*i;<br />
writeln (m:2,' faktorialis= ',ff:40:4);<br />
end;<br />
readln;<br />
end.<br />
Faktoriális kiszámítása rekurzív módszerrel<br />
Átírhatjuk a programot úgy, hogy külön függvényben számítjuk ki a faktoriális<br />
értékét. Ez a megoldás klasszikus példa a rekurzív függvény használatára.<br />
program permut;<br />
uses crt;<br />
var<br />
n:integer;<br />
function fakt(szam:integer):longint;<br />
begin<br />
if szam = 0 then<br />
fakt:=1<br />
else<br />
fakt:=szam*fakt(szam-1);<br />
end;<br />
begin<br />
clrscr;<br />
write('Irjuk be n erteket : ');<br />
readln(n);<br />
writeln;<br />
writeln('<strong>Az</strong> n= ',n:2,<br />
' szam permutacioinak szama = ',fakt(n):8);<br />
readln;<br />
end.<br />
A permutáció elıjelének kiszámítása<br />
program inv;<br />
const n=5;<br />
type mm=array[1..n] of integer;<br />
const a:mm=(2,1,3,4,5);<br />
69
var<br />
i,j,epsz,inverzio:integer;<br />
begin<br />
{for i:=1 to n do write(a[i],',');}<br />
inverzio:=0;<br />
for i:=n downto 1 do<br />
for j:=i-1 downto 1 do<br />
if a[j]> a[i] then<br />
inverzio:=inverzio+1;<br />
if odd(inverzio) then epsz:=-1<br />
else epsz:=+1;<br />
writeln('Inverzio=',Inverzio:2,'Elojel =',epsz:2);<br />
readln;<br />
end.<br />
Egy adott permutáció transzpozicióik szorzatára való bontása<br />
Transzpoziciónak nevezzünk egy olyan permutációt, amelyet az identikustól, csak<br />
egy helycserében különbözik. Vagyis i < j, de a[i] > a[j], az összes többi k elemre<br />
a[k] = k (tehát k ≠i <strong>és</strong> k ≠ j)<br />
program inv;<br />
uses crt;<br />
const n=6;<br />
type perm=array[1..n] of integer;<br />
tt=array[1..2] of integer;<br />
const a:perm=(6,4,5,3,2,1);<br />
var<br />
i,k:integer;<br />
b:perm;<br />
t:array[1..n] of tt;<br />
procedure perm_szor(a,b:perm;var c:perm);<br />
{Ket permutacio szorzata}<br />
var i:integer;<br />
begin<br />
for i:=1 to n do c[i]:=a[b[i]];<br />
end;<br />
begin<br />
clrscr;<br />
for i:=1 to n do begin write(a[i],',');<br />
b[i]:=a[i]<br />
end;<br />
writeln;<br />
for i:=1 to n do<br />
begin<br />
k:=0;<br />
if ib[i] then begin<br />
write('(',i:1,',',a[i]:1,')*');<br />
k:=k+1;<br />
t[k][1]:=i;<br />
t[k][2]:=b[i];<br />
b[b[i]]:=b[i];<br />
b[i]:=i;<br />
end;<br />
end;<br />
writeln;<br />
{if k paros<br />
70
paratlan<br />
for i:=1 to k do }<br />
for i:=1 to n do write(b[i],',');<br />
readln;<br />
end.<br />
Permutációk, variációk <strong>és</strong> kombinációk elıállítása<br />
Igazi programozási feladat a permutációk, variációk <strong>és</strong> kombinációk generálása.<br />
Nem ezek számának megadásáról van szó, hanem a tényleges felsorolásukról<br />
<strong>Az</strong> összes ismétl<strong>és</strong>ek nélküli permutáció elıállítása<br />
<strong>Az</strong> eljárás a következı: p vektort feltöltjük az identikus permutációval (1-tıl n-ig).<br />
Ez az elsı permutáció. A következı permutáció megadásához ciklikusan permutáljuk<br />
az elemeket az elsıtıl kezdve – tehát (2, 3,.., n, 1)-et kapjuk, <strong>és</strong> ezt addig folytatjuk,<br />
amíg az elsı helyre visszakerül az 1. Ezután végzünk egy ciklikus permutációt a 2.<br />
elemtıl kezdve: (1, 3, 4,.., n, 2) <strong>és</strong> cirkulárisan folytatjuk mindaddig, amíg,<br />
visszakerül az 1 az elsı helyre. Újra végzünk egy cirkuláris permutációt a 2. elemtıl<br />
kezdve. Ezt addig folytatjuk, amíg az elsı két elem 1 <strong>és</strong> 2 lesz, majd végzünk egy<br />
cirkuláris permutációt, de a 3. elemtıl kezdve, <strong>és</strong> folytatjuk a fent leírt eljárást. Tehát,<br />
ha egy adott állapotban az elsı i helyen az 1-tıl az i értékek találhatók, sorrendben, de<br />
az i+1 helyen i+1 értéktıl különbözı érték áll, akkor cirkulárisan permutálunk (i+1)tıl.<br />
Mikor az összes elem újra növekvı sorrendben áll, vagyis visszakaptuk az<br />
identikus permutációt, akkor megállunk.<br />
Például: n = 3 -ra<br />
1 2 3<br />
2 3 1<br />
3 1 2<br />
1 3 2<br />
3 2 1<br />
2 1 3<br />
program cirperm;<br />
uses crt;<br />
const<br />
n=4;<br />
var<br />
i,k:integer;<br />
p:array[1..n] of integer;<br />
procedure helycsere(pozicio:integer);<br />
var<br />
k,i:integer;<br />
begin<br />
k:=p[pozicio];<br />
for i:=pozicio+1 to n do<br />
p[i-1]:=p[i];<br />
p[n]:=k;<br />
end; {helycsere}<br />
procedure per(var paritas:integer);<br />
var<br />
i,l:integer;<br />
begin<br />
l:=0;<br />
71
i:=0;<br />
repeat<br />
i:=i+1;<br />
helycsere(i);<br />
if(odd(n-i)) then<br />
paritas:=-paritas;<br />
if (p[i]i) then<br />
l:=1<br />
else<br />
l:=0;<br />
until ((l=1)or(i=n-1));<br />
if l=0 then<br />
paritas:=0;<br />
end;<br />
begin<br />
clrscr;<br />
for i:=1 to n do<br />
p[i]:=i;<br />
k:=1;<br />
repeat<br />
for i:=1 to n do<br />
Write(' ',p[i]:1);<br />
write(' A paritas = ',k:2,',');<br />
writeLn;<br />
per(k);<br />
until k=0;<br />
readln;<br />
end.<br />
Permutációk elıállítása rekurzív módszerrel<br />
A feladat lényege maga kínálja a rekurzió választását. A permutációnál az alapötlet<br />
a következı: n elem permutációja elıállítható n-1 elem permutációjából, ha annak<br />
minden lehetséges helyére (elejére, kettı közé, végére) beillesztjük az n-et. Ezt végzi<br />
a megjelölt r<strong>és</strong>z a perm eljárásban. <strong>Az</strong> n rangú permutációt a v vektorban állítjuk elı,<br />
n-1 rangú p permutációból, úgy hogy a "fıátló" helyére az n-et beillesztjük.<br />
Term<strong>és</strong>zetesen, ahogy egy permutációval elk<strong>és</strong>zültünk, átadjuk a feladatot egy<br />
ranggal nagyobb permutáció megalkotására <strong>és</strong> ezekkel a feladatkiosztásokkal akkor<br />
állunk le, ha elértük a kért rangot, amit a programban az m jelöl. Ekkor a rekurzív<br />
hívások visszafőzıdnek <strong>és</strong> elıállítják az összes permutácót m-ig. Minket<br />
term<strong>és</strong>zetesen csak az m rangúak érdekelnek <strong>és</strong> ezért csak azokat írjuk ki.<br />
program ppp;<br />
uses crt;<br />
const m=4;<br />
type t=array [1..m] of integer;<br />
var n:integer;<br />
p:t;<br />
procedure perm(n:integer; var p:t);<br />
var k,l,i:integer;<br />
v:t;<br />
begin<br />
if n=m+1 then<br />
else<br />
begin<br />
72
for k:=1 to n do<br />
begin<br />
i:=1;<br />
l:=1;<br />
while i
end.<br />
Variációk <strong>és</strong> kombinációk számának megadásánál is felhasználhatjuk az elıbb<br />
definiált faktoriális nevő rekurzív függvényt.<br />
Most térjünk rá a variációkra: n elem m-ed osztályú variációja megkapható n elem<br />
(m-1)-ed osztályú variációjából, ha annak (mondjuk, hogy) az elsı helyére<br />
beillesztjük az (m-1)-esek között még nem variált elemet. Ezt fejezi ki a Vn m = (nm+1)<br />
Vn m-1 képlet is, vagyis minden egyes (m-1)-ed osztályú variációból (n-m+1) új<br />
állítható elı m-ed osztályúvá.<br />
Itt a permutációkhoz képest a felfejleszt<strong>és</strong> bonyolultabb, mert n-szer kell a<br />
fıprogramból is meghívni a varia rekurzív eljárást, egyszerősödik ellenben az új<br />
elemek elhelyez<strong>és</strong>e a régebbi generációhoz, mert csak az elsı helyre tesszük a még<br />
nem variált elemet. Ezt elegánsan úgy oldjuk meg, hogy kiszitáljuk a már variált<br />
elemeket <strong>és</strong> a megmaradt elemeket helyezzük az elsı helyre, majd átadjuk az eggyel<br />
nagyobb osztály generálását a rekurzív procedúrának. A H halmaz tölti be a szita<br />
szerepét, benne maradnak a még nem variált elemek. A technika egyébként ugyanaz<br />
mint a permutációnál. Itt is vigyázni kell arra, hogy a kiírást csak a kívánt osztály<br />
elér<strong>és</strong>ekor végezzük el. Ellenırz<strong>és</strong>ként külön kiszámítottuk a variációk számát <strong>és</strong> a jj<br />
változóval követni tudjuk, hogy eljárásunk helyesen mőködik-e, elıállítván az összes<br />
variációt.<br />
program vvv;<br />
uses crt;<br />
const m1=3;<br />
n=5;<br />
type t=array [1..m1] of integer;<br />
halmaz=set of 1..n;<br />
var p:t;<br />
i:integer;<br />
jj:integer;<br />
function vv(n,m:integer):integer;<br />
var t,j:integer;<br />
begin<br />
t:=1;<br />
for j:=1 to m do t:=t*(n-j+1);<br />
VV:=t;<br />
end;<br />
procedure varia(n,m:integer; var p:t);<br />
var elem,k,l,i:integer;<br />
v:t;<br />
H:halmaz;<br />
begin<br />
if m=m1+1 then<br />
else<br />
begin<br />
H:=[1..n];<br />
for k:=1 to m-1 do<br />
H:=H-[p[k]];<br />
for elem:=1 to n do<br />
if elem in H then<br />
begin<br />
v[1]:=elem;<br />
for l:=2 to m do<br />
v[l]:=p[l-1];<br />
74
varia(n,m+1,v);<br />
if m=m1 then<br />
begin<br />
for l:=1 to m do write(v[l]:2,',');<br />
writeln(' az ',jj,'.'); jj:=jj+1;<br />
readln;<br />
end;<br />
end;<br />
end;<br />
end;<br />
begin<br />
clrscr;<br />
writeln<br />
(' ',n:1,'elem -',m1:1,'osztalyu variacioja :<br />
',VV(n,m1):4);<br />
jj:=1;<br />
for i:=1 to n do<br />
begin<br />
p[1]:=i;<br />
varia(n,2,p);<br />
end;<br />
end.<br />
Kombinációk elıállítása<br />
Számítsuk ki n elem m-enkénti kombinációinak számát!<br />
A kombinációk számának kiszámításához a következı képletet hívjuk segítségül:<br />
K m n= V m n/Pm= n(n-1)(n-2)...(n-m+1)/m!=n!/((n-m)!(m!))=Pn/(Pn-m Pm)<br />
<strong>Az</strong> algoritmus pszeudokódban :<br />
OLVASD n,m<br />
P1 := 1<br />
CIKLUS (VEGEZD EL minden i-re 1-tol n-ig, 1-es lép<strong>és</strong>közzel)<br />
P1 := P1 * i<br />
CIKLUS_VEGE<br />
P2 := 1<br />
CIKLUS (VEGEZD EL minden i-re 1-tol n-m -ig, 1-es lép<strong>és</strong>közzel)<br />
P2 := P2 * i<br />
CIKLUS_VEGE<br />
P3 := 1<br />
CIKLUS (VEGEZD EL minden i-re 1-tol m -ig, 1-es lép<strong>és</strong>közzel)<br />
P3 := P3 * i<br />
CIKLUS_VEGE<br />
K := P1 osztva P2×P3 - mal<br />
IRD K<br />
VEGE<br />
program Kombin;<br />
uses crt;<br />
var<br />
n,m,i:integer;<br />
K:longint;<br />
function faktorialis(szam:integer):longint;<br />
begin<br />
75
if szam = 0 then<br />
faktorialis:=1<br />
else<br />
faktorialis:=szam*faktorialis(szam-1);<br />
end;<br />
begin<br />
clrscr;<br />
write('Irjuk be n erteket : ');<br />
readln(n);<br />
write('Irjuk be m erteket : ');<br />
readln(m);<br />
K:=fakt(n) div faktorialis(n-m)*faktorialis(m);<br />
writeln;<br />
writeln ('<strong>Az</strong> n= ',n:2,' elem ,m= ',m:2,<br />
'-ed rendu kombinacioinak szama = ',K:8);<br />
readln;<br />
end.<br />
A variációtól már csak egy lép<strong>és</strong> választ el a kombinációk elıállításáig. <strong>Az</strong> iskolai<br />
matematikában azt tanultuk, hogy a variációkból kihagyva a permutációkat,<br />
megkapjuk a kombinációkat. A Cn m = Vn m /Pn képlet is ezt fejezi ki. Ezért elsı<br />
ötletünk az lehetne, hogy próbáljuk meg kiszitálni a permutációkat a variációkból. De<br />
ez technikás <strong>és</strong> hosszas megoldást követel. Ha rájövünk, hogy a kombinációk<br />
rendezett variációk akkor a problémát meg is oldottuk. Ugyanis H-ból még kiszitálva<br />
azokat az elemeket, amelyek kisebbek, a már elıállított, egy ranggal kisebb variációk<br />
elemeinél, <strong>és</strong> ezzel dolgozva tovább, megkapjuk az összes variációk származtatását a<br />
variációk származtatásának algoritmusával.<br />
A kombio procedurában a<br />
for k:=1 to m-1 do<br />
H:=H-[p[k]];<br />
for i:=1 to n do<br />
if i in H then<br />
begin<br />
for k:=1 to m-1 do<br />
if i< p[k] then H:=H-[i];<br />
end;<br />
r<strong>és</strong>zt kicserélhetjük azzal, hogy :<br />
for i:=1 to n do<br />
if i in H then<br />
begin<br />
for k:=1 to m-1 do<br />
if i
i:integer;<br />
jj:integer;<br />
function CC(n,m:integer):integer;<br />
var t,u,j:integer;<br />
begin<br />
t:=1;<br />
u:=1;<br />
for j:=1 to m do t:=t*(n-j+1);<br />
for j:=1 to m do u:=u*j;<br />
CC:=t div u;<br />
end;<br />
procedure kombio(n,m:integer; var p:t);<br />
var elem,k,l,i:integer;<br />
v:t;<br />
H:halmaz;<br />
begin<br />
if m=m1+1 then<br />
else<br />
begin<br />
H:=[1..n];<br />
for k:=1 to m-1 do<br />
H:=H-[p[k]];<br />
for i:=1 to n do<br />
if i in H then<br />
begin<br />
for k:=1 to m-1 do<br />
if i< p[k] then H:=H-[i];<br />
end;<br />
for elem:=1 to n do<br />
if elem in H then<br />
begin<br />
v[1]:=elem;<br />
for l:=2 to m do<br />
v[l]:=p[l-1];<br />
kombio(n,m+1,v);<br />
if m=m1 then<br />
begin<br />
for l:=1 to m do write(v[l]:2,',');<br />
writeln(' az ',jj,'.');<br />
jj:=jj+1; readln;<br />
end;<br />
end;<br />
end;<br />
end;<br />
begin<br />
clrscr;<br />
writeln(' ',n:1,' elem --',m1:1,<br />
'osztalyu kombinacioja :',CC(n,m1):2);<br />
jj:=1;<br />
for i:=1 to n do<br />
begin<br />
p[1]:=i;<br />
kombio(n,2,p);<br />
end;<br />
end.<br />
77
Mátrixok<br />
Két mátrix szorzását a jól ismert sor-oszlop szabály szerint végezzük el. A<br />
következı megfogalmazásban már benne van a megoldás lényege:<br />
Keressük meg azt a z=(z{i,j}){i=1,2,...,n, j=1,2,...,l} mátrixot amelyet az x=(x{i,j}){i=1,2,...,n,<br />
j=1,2,...,m} <strong>és</strong> y=(y{i,j}){i=1,2,...,m, j=1,2,...,l} mátrixból nyerünk a következı képlet<br />
segítségével:<br />
m<br />
zik = ∑ xij<br />
y jk<br />
j=<br />
1<br />
<strong>Az</strong> algoritmus nagyon egyszerő, csak az egymásba ágyazott három ciklus<br />
indexértékeire kell figyelni. A két külsı ciklusban az x mátrix oszlopindexét növeljük<br />
1-tıl n-ig <strong>és</strong> az y mátrix sorindexét 1-tıl l-ig. A belsı ciklusban a z mátrix azon<br />
elemét számítjuk ki, amelynek oszlopindexét az x mátrix oszlopindexe, sorindexét<br />
pedig az y mátrix sorindexe adja.<br />
A program:<br />
program matrix;<br />
uses crt;<br />
type<br />
matr = array[1..20,1..20] of Integer;<br />
var<br />
i,j,k,l,m,n : integer;<br />
a,b,c : matr;<br />
procedure szorzas(x,y:matr;var z:matr);<br />
begin<br />
for i:= 1 to n do<br />
for k:=1 to l do<br />
begin<br />
z[i,k]:=0;<br />
for j:= 1 to m do<br />
z[i,k]:=z[i,k]+x[i,j]*y[j,k];<br />
end;<br />
end;<br />
begin<br />
clrscr;<br />
{beolvasni n,m,l - t}<br />
writeln('Elso matrix sorainak szama:');<br />
repeat<br />
readln(n);<br />
until n < 21;<br />
writeln('Elso matrix oszlopainak szama:');<br />
repeat<br />
readln(m);<br />
until m < 21;<br />
writeln('Masodik matrix oszlopainak szama:');<br />
repeat<br />
readln(l);<br />
until l < 21;<br />
randomize;<br />
writeLn('<strong>Az</strong> elso matrix:');<br />
for i:= 1 to n do<br />
begin<br />
for j:=1 to m do<br />
begin<br />
a[i,j]:=random(9);<br />
78
write(a[i,j]:5);<br />
end;<br />
writeln;<br />
end;<br />
writeLn('A masodik matrix:');<br />
for i:= 1 to m do<br />
begin<br />
for j:=1 to l do<br />
begin<br />
b[i,j]:=random(9);<br />
write(b[i,j]:5);<br />
end;<br />
writeln;<br />
end;<br />
if m > 1 then<br />
szorzas(a,b,c);<br />
{kiiratas}<br />
writeln('A harmadik matrix:');<br />
for i:= 1 to n do<br />
begin<br />
writeln;<br />
for k:=1 to l do<br />
write(c[i,k]:7);<br />
writeln;<br />
end;<br />
readln;<br />
end.<br />
Írjuk ki spirálisan egy négyzetes mátrix elemeit<br />
Ez azt jelent, hogy egy 2 × 2-es mátrixot a11, a12, a22, a21-es sorrendben, egy 3 × 3as<br />
mátrixot a11, a12, a13, a23, a33, a32, a31, a21, a12-es sorrendben kell kiíratni.<br />
K<strong>és</strong>zítsük el erre a programot!<br />
program matrixspiral;<br />
const<br />
n=6;<br />
var i,p,l:integer;<br />
begin<br />
for l:=n downto round(n/2) do<br />
begin<br />
p:=n+1-l;<br />
for i:=p to l do write(' ',p,',',i);<br />
for i:=p+1 to l do write(' ',i,',',l);<br />
for i:=l-1 downto p do write(' ',l,',',i);<br />
for i:=l-1 downto p+1 do write(' ',i,',',p);<br />
end;<br />
readln;<br />
end.<br />
Ez a kis program tulajdonképpen csak az indexek játéka. De éppen ez az amire jó<br />
felfigyelni. <strong>Az</strong> indexek megfelelı variálásával, szimuláljuk a kiírást. Figyeljünk fel<br />
arra, hogy az informatikában nagyon kev<strong>és</strong> eszközzel, gyakorlatilag végtelen sok<br />
jelenség modellezhetı. A fenti feladatnak más megoldásai is adhatók, de itt pontosan<br />
az indexek zsonglıröz<strong>és</strong>ének technikáján van a hangsúly. A programban csak az<br />
indexeket íratjuk ki. Term<strong>és</strong>zetesen egy tetszıleges négyzetes mátrix tartalma is<br />
kiíratható. Ebben az esetben a program:<br />
79
program matrixspiral;<br />
const<br />
n=5;<br />
a:array[1..n,1..n] of char=(('*','*','*','*','*'),<br />
('#','#','#','#','#'),<br />
('@','@','@','@','@'),<br />
('&','&','&','&','&'),<br />
('','','','',''));<br />
var i,p,l:integer;<br />
begin<br />
for l:=n downto round(n/2) do<br />
begin<br />
p:=n+1-l;<br />
for i:=p to l do write(a[p,i],',');<br />
for i:=p+1 to l do write(a[i,l],',');<br />
for i:=l-1 downto p do write(a[l,i],',');<br />
for i:=l-1 downto p+1 do write(a[i,p],',');<br />
end;<br />
readln;<br />
end.<br />
Szakirodalom<br />
1. N. Wirth: Algoritmusok+Adatstruktúrák = Programok, Mőszaki Kiadó, Budapest,<br />
1982.<br />
2. H. Georgescu, O. Bâscă: Culegere de probleme in limbajul FORTRAN, Ed.<br />
Albatros, Bucureşti, 1977.<br />
3. Kása Zoltán: Algoritmusok tervez<strong>és</strong>e, Stúdium Könyvkiadó, Kolozsvár, 1994.<br />
4. Ionescu Klára: Bevezet<strong>és</strong> az algoritmikába, Egyetemi Kiadó, Kolozsvár, 2005.<br />
5. ALGEBRA, tanköny a XII. osztály számára Bukarest, Ed. did. ped. 1979-83.<br />
6. Székely V.-Benkı T-né: Karakterisztikák, diagramok, nomogramok, Mőszaki<br />
Könyvkiadó, Budapest, 1975.<br />
7. Szabó József, Számítógépi grafika, Debrecen, 1986 (Egyetemi jegyzet)<br />
8. Szabó József, Feladatok a számítógépi grafikából, Debrecen, 1992 (Egyetemi<br />
jegyzet)<br />
9. Shoenberg, Privelişti matematice, Ed.tehnică, Bucureşt,1989.<br />
10. Tudomány, a Scientific American magyar fordítása, 1986/6.<br />
11. Matematikai Lapok, 1995, 9-es szám.<br />
80
Grafika<br />
A számítógépes oktatásból nem lehet kihagyni a grafikai lehetıségeket. Általában<br />
a rajznak nagyon fontos szerepe van, amely a kultúrában jóval mélyebben<br />
gyökerezik, mint a szöveg. A képi információ az írotthoz vagy hallotthoz képest<br />
elsıbbrendő <strong>és</strong> könnyebben értelmezhetı.<br />
Egy képrıl olyan információk olvashatók ki, amelyek tudat alatt is nagyon<br />
erısek <strong>és</strong> biztonságos tanulási képzeteket alkotnak. Ezért elemi óhaja az<br />
embernek a rajzolás, a képalkotás (foto, film, videó, stb.). Erre is ideális eszköz a<br />
számítógép, vele valóban rajzok <strong>és</strong> csodálatos képek k<strong>és</strong>zíthetık. Olyan szerepe<br />
is van, mint a mikroszkópnak, de olyan matematikai struktúrákba is bepillantást<br />
enged, mint a komplex számsík, vagy 4, 5 dimenziós tér, törtdimenziós<br />
halmazok, stb. Más szóval, számítógéppel valóban mélyebben<br />
bekukucskálhatunk az Univerzum eddig ismeretlen r<strong>és</strong>zleteibe.<br />
Vannak speciális, rajzolást segítı, rajzoló programok, <strong>és</strong> nagyon sok rajzolási<br />
segédeszköz, de ennek a példatárnak csak annyi a célja, hogy a rajzolás,<br />
egyszóval a számítógépi grafika alapelveit vázolja, egy pár fontos alkalmazással.<br />
A számítógépi grafikához, egyesek szerint nem kell tudni semmit, csak neki<br />
kell fogni, <strong>és</strong> sokat rajzolni a gépen. Mások szerint egy jó rajzprogrammal<br />
(CorelDraw, 3D_Studio) minden megoldható. Egy másik szemlélet szerint<br />
komoly analitikus geometriai tudás kell ahhoz, hogy gépen rajzoljunk.<br />
Olyan véleményt is hallottam, hogy lényegében a számítógépi grafika =<br />
ábrázoló geometria + számítástechnika. Valószínő, hogy minden fenti<br />
kijelent<strong>és</strong>ben van valamennyi igazság.<br />
Persze e fölött is vitatkoznak a számítástechnikusok <strong>és</strong> matematikusok.<br />
Ugyanis már sok számítógépi grafikai szakfolyóirat létezik, <strong>és</strong> sok helyen úgy is<br />
oktatják, mint egy külön tudományt. Egy dolog bizonyos, sokat kell rajzoltatni a<br />
számítógépet <strong>és</strong> próbálkozzunk mindenféle geometriai struktúra lerajzolásával.<br />
Szimulálási feladatok<br />
Egy érdekes szimulálási feladat: a képernyın szimuláljunk egy hernyó mozgását.<br />
Ez abból áll, hogy egy hosszúkás nyúlványszerő alakzatot fokozatosan módosítunk<br />
azzal a technikával, hogy az elejének vett r<strong>és</strong>zhez (a fejéhez) egy újabb ugyanolyan<br />
alakocskát hozzárajzolunk <strong>és</strong> a végérıl (a farkáról) egy alakocskát letörölünk.<br />
Lényeges, hogy a fejez való hozzáragasztás véletlenszerő legyen, csak a fej<br />
szomszédságában történjen. Ha ügyesen variáljuk, akkor egy nagyon élető<br />
hernyómozgást kapunk. Term<strong>és</strong>zetesen lehet még okosítani ezt az eljárást azzal,<br />
hogy az eg<strong>és</strong>z alakzatot egy alakzattal arrébb toljuk, vagyis a fej új pozícióba kerül<br />
<strong>és</strong> a "nyak" felveszi a "fej" pozícióját, <strong>és</strong> minden "testr<strong>és</strong>z" egy pozícióval arrébb<br />
kerül.<br />
<strong>Az</strong> elsı próbálkozásunknál nem is szükséges, hogy átváltsunk grafikus<br />
üzemmódba, szöveges képernyınél is boldogulunk, ha például a hernyó testét<br />
csillagocskákból építjük fel. Négy csillagocska már elegendı. Tanulmányozzuk rajta<br />
a mozgás szimulálását. Próbálkozzunk azzal a változattal is, amikor a hernyó testét<br />
több karakterbıl építjük fel <strong>és</strong> "durvábban" bolyongjon a képernyın. Ha a problémát<br />
teljesen uraljuk, akkor váltsunk át grafikus képernyıre <strong>és</strong> k<strong>és</strong>zítsünk egy minél élet<br />
hőbb, színes hernyót. A mellékelt program csak a legelsı változatra ad egy egyszerő<br />
megoldást, a továbbfejleszt<strong>és</strong> már a hallgatók feladata.<br />
81
program hernyo;<br />
uses crt;<br />
type pont =record<br />
x,y:integer;<br />
end;<br />
var a:array[0..3] of pont;<br />
i:integer;<br />
xx,yy:integer;<br />
begin clrscr;<br />
a[0].x:=4; a[0].y:=10; a[1].x:=5; a[1].y:=10;<br />
a[2].x:=6; a[2].y:=10; a[3].x:=7; a[3].y:=10;<br />
for i:=0 to 3 do begin<br />
gotoxy(a[i].x, a[i].y);<br />
write('*');<br />
end;<br />
randomize;<br />
xx:=1;<br />
yy:=1;<br />
repeat<br />
a[0]:=a[1];<br />
a[1]:=a[2];<br />
a[2]:=a[3];<br />
a[3].x:=a[3].x+xx;<br />
a[3].y:=a[3].y+yy;<br />
if a[3].x=80 then begin xx:=-1; yy:=random(3)-<br />
1;end;<br />
if a[3].x=0 then begin xx:=1; yy:=1;end;<br />
if a[3].y=0 then begin xx:=1; yy:=1;end;<br />
if a[3].y=25 then begin xx:=random(3)-1; yy:=-<br />
1;end;<br />
clrscr;<br />
for i:=0 to 3 do<br />
begin<br />
gotoxy(a[i].x,a[i].y);<br />
write('*');<br />
end;<br />
delay(200);<br />
until keypressed;<br />
end.<br />
Hegyek<br />
<strong>Az</strong> <strong>informatika</strong>i oktatás fı feladata, hogy a hallgatók modellezık<strong>és</strong>zségét fejlessze,<br />
vagyis azt a k<strong>és</strong>zséget, hogy egy szavakkal leírt, vagy gyakorlati jelenséget<br />
számítógépre átvigyenek. Itt nemcsak az algoritmizáló k<strong>és</strong>zségrıl van szó, hanem<br />
arról is, hogy megtanulják: gondolataikat, meglátásaikat pontosan <strong>és</strong> törvényszerően<br />
kell megfogalmazni. A számítógép ebben igazi tanár, de segítı barát is, hiszen egy<br />
rosszul megfogalmazott feladat nem fog magától megoldódni, hanem csak akkor ha a<br />
hallgató rá nem jön a helyes algoritmusra, szabályra-szabályokra. Ilyen "vérbeli"<br />
modellezı feladat a következı:<br />
Vegyünk egy tetszıleges háromszöget <strong>és</strong> a háromszög oldalainak felezıpontjait.<br />
Majd rajzoljuk meg a háromszög középvonalait. Mindegyik felezıpontot<br />
véletlenszerően vagy valamilyen szabály szerint toljuk el egy kicsit, majd az így<br />
kapott pontokat kössük össze. Négy új háromszög keletkezik!<br />
82
Most mind a négy háromszöggel végezzük el újra a fenti eljárást. Vagyis<br />
megkeressük az oldalak felezıpontjait <strong>és</strong> azokat egy kicsikét eltoljuk. <strong>Az</strong> így kapott<br />
pontokat összekötjük. Ha 6-7-szer megismételjük ezt az eljárást, akkor egy térhatású<br />
képet kapunk, amely egy hegy fraktál szerkezetét szemlélteti. Itt van tehát egy<br />
mindenki által jól megérthetı eljárás. A feladat, hogy ezt rajzoltassuk meg a<br />
számítógéppel. Ez egy szép modellez<strong>és</strong>i feladat <strong>és</strong> a megoldása nem könnyő, annak<br />
ellenére, hogy a leírása rendkívül egyszerő <strong>és</strong> szemléletes. A feladat maga igényli a<br />
rekurziót, vagyis az önmaga megismétl<strong>és</strong>ét, hiszen a megfogalmazása is ezen<br />
alapszik. Szükségünk van egy összetett eljárásra, amely megkeresi egy tetszıleges<br />
háromszög oldalainak a felezıpontjait, azokat véletlenszerően eltolja <strong>és</strong> az így kapott<br />
pontokat összeköti, rajzolván így 4 darab új háromszöget.<br />
Hol rejtızik a feladat lényege <strong>és</strong> nehézsége ?<br />
Nyilvánvaló, hogy a fenti eljárás bemenı paraméterei a háromszög három csúcspontjának<br />
koordinátái, de ezekbıl származtatok még három darab pontot, az<br />
oldalfelezı pontok eltolásával. Ha ezeket véletlenszerően generáljuk, akkor a<br />
rekurzió ezekben a pontokban nem főzıdik szépen össze, mert a véletlenszerően<br />
generált pontok nem adódnak át a másik rekurzív hívásnak. Ennek a nehézségnek a<br />
kiküszöböl<strong>és</strong>ére több lehetıségünk van. A hegy1.pas programocskában az<br />
felezıpontok eltolását a következı szabály szerint végezzük: <strong>Az</strong> oldalszakaszt<br />
megfelezzük <strong>és</strong> a felezıpontot a két szakasz hosszával arányosan toljuk el – ez azt<br />
jelenti, hogy két adott végpont esetén a felezıpont mindig egy jól determinált helyre<br />
kerül <strong>és</strong> így a másik rekurzív eljárás is ezt a pontot ugyanoda viszi, ezért a<br />
háromszögek szépen összefőzıdnek. <strong>Az</strong> eljárás hátránya, hogy szabályos szerkezet<br />
alakul ki <strong>és</strong> nem lesz igazából fraktálszerő.<br />
Mielıtt egy másik felezıpont-eltoló technika bemutatásához hozzákezdenénk,<br />
ejtsünk néhány szót a hegy nevő eljárásról. Ez csak 3 vonalat rajzol, egy háromszög<br />
3 oldalát, <strong>és</strong> átadja a feladatot a generált új felezıpontnak. <strong>Az</strong> n paraméter jelöli a<br />
generációt <strong>és</strong> például, ha az kisebb mint 4, 5,... stb., akkor rajzolok, ha nem, akkor<br />
átadjuk a feladatot eggyel kisebb generációnak, elvégezve az új oldalfelezı pontok<br />
származtatását. Ha a hallgatók megértik a rekurziónak ezt az alkalmazását, akkor<br />
jelentıs "<strong>informatika</strong>i eszköznek" jutottak a birtokába, amellyel sok szép feladatot<br />
tudnak megoldani, de igen érdekes rajzokat is k<strong>és</strong>zíthetnek. Sıt a term<strong>és</strong>zet<br />
törvényszerőségeibıl <strong>és</strong> mőköd<strong>és</strong>ébıl is megértenek egy parányi, de igen jelentıs<br />
elvet, az élıvilág alapvetı rekurzivitásának az elvét. A hegy.pas nevő program már<br />
véletlenszerően generálja a felezıpontokat, de ide is be kellett csemp<strong>és</strong>zni egy kis<br />
szabályosságot. Ez pedig abban áll, hogy a véletlen számokat elıre származtatjuk <strong>és</strong><br />
elraktározzuk két vektorban az rx <strong>és</strong> ry-ban, azért, hogy ugyanolyan generációnak<br />
ugyanazok a véletlen számok feleljenek meg. A háromszögek összeragadását így<br />
tudjuk biztosítani. A h.pas programnál még jobban a véletlenre bízzuk a dolgot <strong>és</strong><br />
minden síkbeli ponthoz, amelyen a hegy fraktált felfejlesszük, hozzárendelünk egy<br />
véletlen számot.<br />
Javasoljuk, hogy a hallgatók próbáljanak még egyszerőbb megoldást találni erre a<br />
feladatra! Hogy jobban megértsék, hogy miért is beszélünk a háromszögek<br />
hézagmentes összefőz<strong>és</strong>érıl, bemutatunk egy negyedik programot is, amely talán a<br />
legterm<strong>és</strong>zetesebb, azáltal, hogy minden szakasz felezıpontjához teljesen<br />
véletlenszerően rendelünk hozzá egy pontot. Így megmutatkozik a probléma<br />
nehézsége. A feladat megoldásához elég annyit tudni analitikus mértanból, hogy ha<br />
egy szakasz végpontjai<br />
A(x1,y1) <strong>és</strong> B (x2,y2), akkor a felezıpont koordinátái: F((x1 + x2)/2, (y1 + y2) / 2)<br />
(Ez elemi úton levezethetı, még ha nem is tanult valaki analitikus geometriát.)<br />
83
program h;<br />
uses Graph,Crt;<br />
const<br />
n=5;<br />
m=1;<br />
var<br />
i,Meghajto,Uzemmod,GrafHiba:integer;<br />
var rx,ry:array[1..n] of integer;<br />
procedure hegy(n,m,x1,y1,x2,y2,x3,y3:integer);<br />
begin<br />
if n
A következı változat volna a legterm<strong>és</strong>zetesebb megoldás, de a probléma, hogy<br />
lyukak keletkeznek a hegy domborzatában. Ennek a kiküszöböl<strong>és</strong>ében rejlik a<br />
technikai probléma.<br />
program hegy; {Elso probalkozas}<br />
uses Graph,Crt;<br />
const<br />
n=6;<br />
m=2;<br />
var i,Meghajto,Uzemmod,GrafHiba:integer;<br />
procedure hegy(n,m,x1,y1,x2,y2,x3,y3:integer);<br />
begin<br />
if n
Körök<br />
Egy másik érdekes feladat a következı: Jelöljünk ki a képernyın hét (általánosan<br />
n) pontot, majd ezeket középpontnak tekintve, fokozatosan növesszünk (rajzoljunk)<br />
nem metszı köröket.<br />
A körnöveked<strong>és</strong>t állítsa meg a szomszédkör valamelyikével, vagy a képernyı<br />
szélével való érintkez<strong>és</strong>. Term<strong>és</strong>zetesen, ha egy kör növeked<strong>és</strong>e megállt, attól a<br />
többiek még növekedhetnek – de biztos, hogy mindegyik növeked<strong>és</strong>e le fog állni,<br />
hiszen határt vagy kört fog érinteni.<br />
A feladat segíti a modellálló k<strong>és</strong>zséget. A probléma szemléletes <strong>és</strong> a megoldás<br />
helyessége a program futtatása során azonnal ellenırizhetı. Jó példa a párhuzamos<br />
mőköd<strong>és</strong> szemléltet<strong>és</strong>ére, hisz lényegében a körök egyszerre kellene növekedjenek,<br />
de ezt csak úgy tudjuk elérni, hogy sorba vesszük a köröket <strong>és</strong> mindegyiket növeljük<br />
egy kicsikét (a sugarukat növeljük egy értékkel). Mi a továbbiakban két megoldását<br />
mutatjuk be a feladatnak: az egyik, az egzakt matematikai, a másik az empirikus,<br />
gépközeli. Nem szabad megfeledkezzünk arról, hogy a számítógéppel való<br />
kölcsönhatás <strong>és</strong> a vele való munka kialakít egy újfajta lehetıséget <strong>és</strong> tapasztalatot.<br />
Sok feladatra adhatnak olyan megoldást, amelyet a gép, az alkalmazások<br />
szempontjából, jól <strong>és</strong> viszonylag gyorsan megold, de matematikailag kifogásolható.<br />
Ennél a feladatnál kísérjük végig ezt a két megoldási stratégiát.<br />
<strong>Az</strong> elsı a matematikai: Term<strong>és</strong>zetesen a két kör akkor érinti egymást, ha a<br />
középponttól mért távolság egyenlı sugaraik összegével. Képletben:<br />
d(O1,O2) = r1 + r2 <strong>és</strong><br />
ha O1(x1,y1) <strong>és</strong> O2(x2,y2), akkor (x2 - x1) 2 + (y2-y1) 2 = (r1 + r2) 2 .<br />
Már ez a képlet feltételezi, hogy két valós szám egyenlıségét kell ellenırizni.<br />
Hiába eg<strong>és</strong>zek a sugarak a képernyın, a négyzetgyökvonás valós számot térít vissza.<br />
Tudni kell, hogy két valós szám egyenlıségének logikai feltétele gyakorlatilag nem<br />
teljesül, hiszen a számítógépek valós számok helyett racionális számokkal dolgoznak<br />
(10–18 tizedes jeggyel számolnak), ezért két valós szám s, t egyenlıségét általában<br />
úgy ellenırizzük, hogy abs(s – t) < ε. ahol ε egy elıre jól meghatározott hibaküszöb<br />
(nagyon kis pozítiv szám). Tehát azt vizsgáljuk, hogy a különbségük abszolút<br />
értékben kisebb, mint egy elıre megadott küszöb. Ez már a problémát egy kicsit<br />
bonyolítja, nem beszélve arról, hogy fontos, milyen nagysággal, milyen kvantummal<br />
növeljük fokozatosan a sugarat. Ha túl kicsivel, akkor lassú a rajzolás, ha túl naggyal<br />
akkor átugorhatjuk a körök érintkez<strong>és</strong>ét. Ennél a megoldásnál, minden kör<br />
számontartásához, az ismert adatok mellett (mint a kör középpontja <strong>és</strong> sugara) még<br />
szükségünk van egy logikai adatra amellyel mérni tudjuk, hogy még növelhetı-e az<br />
illetı kör vagy sem. A többi r<strong>és</strong>zletet már ki kell tudni olvasni a forrásprogram<br />
szövegébıl.<br />
Egy másik ötletes gépközeli megoldásban a lényeg az, hogy úgy ellenırzi az<br />
érintkez<strong>és</strong>eket, hogy a kör növel<strong>és</strong>e elıtt megnézi, van-e kigyújtva képpont a kör<br />
kerületének egy képpontos környezetében. Ha igen akkor ez azt jelenti, hogy ott<br />
vagy határ vagy egy másik kör található, <strong>és</strong> ezért az illetı kör tovább már nem<br />
növelhetı. Ennek a megoldásnak az elınye, hogy nem igényel valós számokat <strong>és</strong><br />
valós számításokat <strong>és</strong> könnyen általánosítható mondjuk ellipszisekre vagy<br />
tetszıleges síkidomokra. Hátránya viszont, hogy jóval lassúbb mint az elsı<br />
megoldás. Tény, hogy az elsı megoldást nem is lehet például ellipszisekre<br />
alkalmazni, vagy csak nagyon-nagyon komoly <strong>és</strong> bonyolult matematikai<br />
számításokkal. Míg ez utóbbi azonnal alkalmazható ellipszisekre.<br />
86
program korok_novekedese;{ parhuzamos novekedes}<br />
uses crt,graph;<br />
const n=29;<br />
type kor=record<br />
x,y,r:integer;<br />
b:boolean;<br />
end;<br />
var a: array[1..n] of kor;<br />
gd,gm,i,j:integer;<br />
function d(a,b:kor):longint;<br />
var x1,x2,y1,y2:real;<br />
begin<br />
x1:=a.x; x2:=b.x; y1:=a.y; y2:=b.y;<br />
d:=round(sqrt(sqr(x1-x2)+sqr(y1-y2)));<br />
end;<br />
begin<br />
randomize;<br />
gd:=detect;<br />
initgraph(gd,gm,'c:\tp\bgi');<br />
rectangle(0,0,getmaxx,getmaxy);<br />
for i:=1 to n do<br />
begin<br />
a[i].x:=random(getmaxx);<br />
a[i].y:=random(getmaxy);<br />
a[i].r:=0;<br />
a[i].b:=true;<br />
end;<br />
repeat<br />
for i:=1 to n do<br />
begin<br />
if a[i].b then inc(a[i].r);<br />
for j:=1 to n do<br />
if ij then<br />
if (a[i].r+a[j].r>=d(a[i],a[j])) or<br />
(a[i].x+a[i].r>getmaxx) or<br />
(a[i].x-a[i].r
A Logo programozási nyelv („Nincs királyi út a programozáshoz”)<br />
A magyar <strong>informatika</strong>oktatás egyik jó dönt<strong>és</strong>e volt, hogy a Comenius Logot<br />
választotta <strong>és</strong> javasolta mint oktatásra alkalmas programozási nyelvet (környezetet). Mi<br />
is ez a Comenius Logo? Lényegében egy programozási nyelv <strong>és</strong> környezet. De ami<br />
még fontosabb, hogy egy gondolkodási mód, egy új szemlélet, nem csak a programozásban,<br />
de az ember-számítógép kommunikációban is. De az ismeretszerz<strong>és</strong> <strong>és</strong><br />
tájékozódás egy újfajta eszköze is. A Logo, egy újfajta geometria, amit szemléletesen<br />
teknıcgeometriának mondunk. Akkor lássuk, mi is a teknıcgeometria? <strong>Az</strong> eg<strong>és</strong>z<br />
nevetségesen egyszerő <strong>és</strong> talán ebbıl származik a nagyszerősége. Arról van szó, hogy<br />
minden kisgyerek szeret firkálni-rajzolni. A legmélyebben rejtızı gondolataink talán<br />
képi információkból tevıdnek össze, ezt próbáljuk meg kifejezni a gép-ember<br />
kommunikációban is. Mikor a számítógéppel valamit meg szeretnénk rajzoltatni igen<br />
komoly „koordinátageometria” tudás szükségeltetik. Persze, lehet, hogy ez a tudás már<br />
be van építve egy programba (szoftverbe), de e háttér nélkül nem boldogulunk. Egy<br />
kisgyerek viszont tud rajzolni <strong>és</strong> ki tudja fejezni érzelmi <strong>és</strong> gondolati világát, rajzolva,<br />
firkálva anélkül, hogy valaha is hallott volna geometriáról vagy koordinátarendszerrıl.<br />
Akkor ezt nem tudnánk számítógéppel is szimulálni? Nem tudna a gép is olyan<br />
egyszerően <strong>és</strong> term<strong>és</strong>zetesen rajzolni, mint ahogy egy 4-5 éves gyerek már papírra veti<br />
gondolatait? Ezeket a kérd<strong>és</strong>eket Seymour Papert, amerikai matematikus válaszolta meg<br />
kielégítıen.<br />
A Logo tehát programozási nyelv, amelynek sok változata fut világszerte: Logo<br />
Writer, MsLogo, SuperLogo, Comenius Logo stb. Ezek közül nagyon sikeres verzió a<br />
Comenius Logo. Ennek a programozási nyelvnek a háttere <strong>és</strong> története túlmutat a többi<br />
programozási nyelv ontológiáján, ugyanis ezt kimondottan a gyerekek számára írták. A<br />
gyerekek viszont a legértıbb számítógép felhasználók, <strong>és</strong> minden nemzedék jövıje a ma<br />
gyerektársadalmán nyugszik. Lássuk, hogyan nyilatkozik errıl Seymour Papert:<br />
„Manapság az oktatási szituációk nagy r<strong>és</strong>zében a gyerekek úgy találkoznak a<br />
számítógéppel, hogy kipróbálja képességeiket: megfelelı nehézségi szintő feladatot ad<br />
nekik, a megoldásról visszajelez <strong>és</strong> információkat közöl- tehát a számítógép<br />
programozza a gyereket. LOGO környezetben ez a viszony megfordul: már jóval<br />
iskoláskor elıtt is a gyerek irányít, ı programozza a komputert. És miközben<br />
gondolkodni tanítja a számítógépet, felfedezı munkába kezd saját gondolkodásáról. Ez<br />
az élmény felkavarhatja a gyereket: a gondolkodásról gondolkodva episztemológussá<br />
válik, ami a legtöbb felnıttel sohasem esik meg.<br />
<strong>Az</strong> episztemológus gyerek nagyszerő képe akkor ragadta meg fantáziámat, amikor<br />
Piaget-vel dolgoztam együtt. 1964-ben, miután öt évet töltöttem Piaget-vel genfi<br />
Genetikus Ismeretelméleti Központjában, igen lenyőgözött az a megállapítás, hogy a<br />
gyerekek saját gondolati struktúráik építıi. <strong>Az</strong>, hogy a tanuló maga építi fel a gondolati<br />
struktúrákat, <strong>és</strong> nem a tanár tanítja meg neki, még nem jelenti, hogy a semmibıl<br />
építkezik. Épp ellenkezıleg: mint minden építı, ı is azokat az anyagokat hasznosítja,<br />
amelyeket a környezetében talál, kiváltképpen a környezeti kultúra által felkínált<br />
modelleket <strong>és</strong> képleteket.<br />
Piaget leírja, hogy milyen sorrendben fejleszti ki a gyermek a különbözı szellemi<br />
képességeit. Én nagyobb hangsúlyt fektetnék azoknak az anyagoknak a hatására,<br />
amelyek révén egy adott kultúra meghatározza ezt a sorrendet 3 .”<br />
3 Seymour Papert: Észrenget<strong>és</strong> (A gyermeki gondolkodás titkos útjai) Számalk 1988.<br />
88
A Logo-típusú feladatok <strong>és</strong> megoldások sokkal könnyebben érthetık a kezdı programozónak.<br />
A differenciált oktatásban, amelyet lassan-lassan az egyetemi szinten is be kell vezetni,<br />
szerepet kaphat az <strong>informatika</strong> <strong>alapjai</strong>nak oktatásában.<br />
Ennek egy elemi, de alapvetı eszköze lehet akár a Logo nyelv is.<br />
Fejlesztıi környezet<br />
A grafikai ismeret, a grafikai információ erısebb, mint a szöveges. Ha valamit látunk, azt<br />
könnyebben <strong>és</strong> jobban megjegyezzük, ha csak hallunk róla, vagy, ha csak olvasunk róla. Ami<br />
a Logonak nagy értéke, hogy szemlélteti az utasításainkat, tehát hamarabb <strong>és</strong> könnyebben<br />
megértjük egy programocska lényegét.<br />
Pascalban egy külön nehézségi ugrás az eljárásoknak <strong>és</strong> a függvényeknek a bevezet<strong>és</strong>e <strong>és</strong><br />
megért<strong>és</strong>e. Ez is a Logoban term<strong>és</strong>zetesebben érthetı. Mindannyiunknak vannak térbeli<br />
ismereteink. Többet tudunk, vagyis elemibb információ a szabályos sokszög vagy az egyszerő<br />
mértani alakzatok, mint például a prímszámok, a hatványok vagy a törtek. Persze, a mai<br />
oktatás egyik nagy értelmetlensége, hogy a mértant a középiskolában elfelejtetik, sajnos a<br />
helyette leadott modern algebrából (csoport, győrő, test) semmivel sem marad az érettségizı.<br />
Ennek az áldatlan állapotnak az enyhít<strong>és</strong>ére szolgálna a Logo bevezet<strong>és</strong>e <strong>és</strong> használata a<br />
programozási alapelvek leadásában. A térbeli, síkbeli ismereteket még felnıttkorban is pótolni<br />
lehet, az aritmetikai ismereteket már nehezebben.<br />
Ezért a mozgás <strong>és</strong> a mértani információk alapvetık <strong>és</strong> könnyen érthetık, mert tapasztalattal<br />
rendelkezünk, míg algebrai tapasztalataink nagyon hiányosak.<br />
Logo programozási elemek<br />
Szekvencia<br />
Elágazás<br />
Ciklus<br />
Eljárás<br />
Rekurzió<br />
Programozási elemek<br />
Önálló utasítások<br />
Ciklusok<br />
Számlálós ciklus (Ismétl<strong>és</strong>…)<br />
Feltételvizsgálat<br />
ha feltétel [akkor utasítások]<br />
ha feltétel [akkor utasítások][különben utasítások]<br />
Önálló utasítások 1.<br />
Relatív utasítások<br />
•Mozgások<br />
–elıre (e)<br />
–hátra (h)<br />
•Fordulások<br />
–jobbra (j)<br />
–balra (b)<br />
Abszolút utasítások<br />
Mozgások<br />
89
–x!<br />
–y!<br />
–xy!<br />
Fordulások<br />
–irány!<br />
Önálló utasítások 2.<br />
Beállítások<br />
•tollszín! (tsz!)<br />
•tollvastagság! (tv!)<br />
•töltıszín! (tlsz!)<br />
•töltıminta! (tlm!)<br />
•rajzlapszín! (rsz!)<br />
Egyéb utasítások<br />
•tollatfel (tf)<br />
•tollatle (tl)<br />
•törölrajzlap (tr)<br />
•tollradír (trd)<br />
•tölt<br />
Számlálós ciklus<br />
ismétl<strong>és</strong> N [utasítások]<br />
•N-szer (N=ciklusváltozó) hajtja végre az utasításokat.<br />
Például síkidomok rajzolása ismétl<strong>és</strong>sel:<br />
ism 4 [e 100 j 90]<br />
ism 3 [e 100 j 120]<br />
Feltételvizsgálat<br />
•Ha feltétel [utasítás1] [utasítás2]<br />
•Ha a feltétel igaz, akkor az utasítás1-et, ha a feltétel hamis, akkor az utasítás2-t hajtja<br />
végre. Utasítás2 elhagyható.<br />
Példa:<br />
ha szam < 0 [kiír [negatív]][kiír [pozitív]]<br />
ha oldal = 5 [ism 5[e 100 b 360 / 5]][ism 7[e 50 j 360 / 7]]<br />
Eljárás k<strong>és</strong>zít<strong>és</strong>e<br />
Paraméter nélkül<br />
Tanuld eljárás<br />
…<br />
vége<br />
tanuld négyzet<br />
ism 4 [e 100 j 90]<br />
vége<br />
tanuld kör<br />
ism 360 [e 1 j 1]<br />
vége<br />
<strong>Az</strong> eljárás hívása: négyzet, illetve kör.<br />
Paraméterrel<br />
Tanuld eljárás :paraméter<br />
…<br />
vége<br />
tanuld sokszög :szam<br />
90
ism :szam [e 100 j 360 / :szam]<br />
vége<br />
<strong>Az</strong> eljárás hívása:<br />
sokszög 5<br />
Rekurzió<br />
Önmagát hívó eljárás<br />
Végtelen rekurzív eljárás:<br />
tanuld ötszög<br />
e 50 j 360/5<br />
ötszög<br />
vége<br />
Rekurzív eljárás kilép<strong>és</strong>i feltétellel:<br />
tanuld ötszög<br />
e 50 j 360/5<br />
ha irány 0 [ötszög]<br />
vége<br />
A teknıcgrafika<br />
A Logo programozás didaktikai elınyét a teknıcgrafikában, vagy a teknıcgeometriában<br />
kell látassuk. A felhasználó szemléletesen látja <strong>és</strong> tapasztalja az utasításainak<br />
hatását. Megérti az algoritmikus gondolkodás <strong>és</strong> cselekv<strong>és</strong> lényegét. Egy dolog az, amit<br />
szeretnénk, <strong>és</strong> más lesz az utasításaink eredménye. Hol a hiba? A mi gondolkodásmódunkban<br />
van! Erre tanít meg a teknıcgeometria. Gyorsan <strong>és</strong> konkrétan segít, hogy<br />
korrigáljuk hibás utasításainkat, helytelen algoritmusunkat.<br />
Noha a képernyın egy rejtett Descartes-féle derékszögő koordinátarendszer van (egy<br />
rácsháló), csak bizonyos programozási <strong>és</strong> geometriai ismeretek birtokában tudjuk<br />
hatékonyan kihasználni. Ugyanis kell hozzá ismerni a koordinátageometriát, vagy<br />
pontosabban az síkbeli analitikus geometriát! Ezért, ha nincsenek koordinátageometriai<br />
ismereteink, akkor használjuk bátran a teknıcgeometriát, amit az alábbiakban ismertetünk.<br />
A teknıc egy állapottal rendelkezı pont. Lényegében a grafikus mutató (kurzor).<br />
Alapértelmez<strong>és</strong>ben adhatunk neki elemi utasításokat, mint amilyen: mozogj elıre, hátra,<br />
jobbra <strong>és</strong> balra.<br />
A teknıc alaphelyzetben az origón áll, <strong>és</strong> <strong>és</strong>zaki irányba néz. A teknıc az utasításokat<br />
azonnal végrehajtja. Sok más programnyelv is átvette ezt az újfajta világszemléletet,<br />
amit teknıcgeometriának mondunk, de akár az oktatási módszertanba is beépíthetı.<br />
(Lásd Waldorf-iskolák, de vannak olyan magánóvodák, ahol elıször eljátsszák a<br />
fontosabb teknıcgeometriai fogalmakat <strong>és</strong> csak utána próbálják ki a számítógépen is.)<br />
A teknıcgeometria nem más, mint egy potenciálisan rajzoló gyermek, pontosabban<br />
egy állapottal rendelkezı pont a véges síkon (vagyis a képernyın). (Úgyis felfoghatjuk<br />
mint egy nagyon egyszerő Turing-gépet, egy állapottal <strong>és</strong> iránnyal ellátott automatát).<br />
A teknıc állapotváltoztató utasításai: menj elıre valamennyi képpontot, hátra<br />
valamennyi képpontot. A teknıc irányváltoztató utasításai: fordulj jobbra valamennyi<br />
fokot, balra valamennyi fokot.<br />
Például egy négyzetet így rajzoltatunk meg a teknıcgeometriában:<br />
91
Ismételd 4[el•re 100 jobbra 90]<br />
(Vagyis ismételje négyszer: elıre 100 képpontot <strong>és</strong> jobbra 90 fokot)<br />
Nagyon tanulságos a sík legtökéletesebb alakzatának, a körnek a következı összehasonlítása<br />
a koordinátageometria-beli megadásával. Koordinátageometriában (x-a) 2 +(yb)<br />
2 =r 2 . <strong>Az</strong> euklideszi geometriában, a kör azon pontok mértani helye, amelyek egyenlı<br />
távolságra vannak egy rögzített ponttól. Ezzel szemben a teknıcgeometriában, a kör az<br />
nem más, mint egy kicsit elıre, egy kicsit balra, <strong>és</strong> ezt ismételjük mindaddig amíg<br />
bezárul a vonal. Ami érdekes, hogy ugyancsak kör az is, ha egy kicsit elıre, egy kicsit<br />
jobbra megyünk <strong>és</strong> ismételjük sokszor. Itt máris a tér egy mély filozófiai fogalmával is<br />
megismerkedünk <strong>és</strong> ez az irányíthatóság fogalma vagy a szimmetria fogalma, amelynek<br />
mély fizikai jelentısége is van. A teknıcgeometriával kezünkben tartjuk a<br />
síkgeometriáját, megtapasztalhatjuk minden szépségét <strong>és</strong> minden nehézségét.<br />
Tehát kört úgy rajzolhatunk Logoban, hogy: ismételd 360-szor elıre 1, jobbra 1. Ezt<br />
tömören így írjuk:<br />
ism 360 [el•re 1 jobbra 1].<br />
Ha jól megértettük a kör megrajzoltatását, akkor sokféleképpen variálhatjuk. Például<br />
lássuk a legsőrőbb körkitölt<strong>és</strong>t:<br />
ism 6 [ism 60 [el•re 1 jobbra 1] ism 360 [el•re 1 balra<br />
1]]<br />
De egy szép virágot is rajzolhatunk:<br />
ism 10 [ism 36 [el•re 1 jobbra 1] ism 360 [el•re 1 balra<br />
1]]<br />
Játsszuk el most ezt sokszögekkel!<br />
ism 7 [el•re 10 ism 7 [el•re 10 balra 360 / 7] jobbra 360<br />
/ 7]<br />
Nézzünk néhány teknıcgeometriai tételt:<br />
Hasonlóság: ha a szögek változatlanok maradnak, <strong>és</strong> csak a méreteket (elıre, hátra<br />
utasítások paramétereit) változtatjuk, akkor hasonló alakzatokat kapunk.<br />
Szimmetria: Ha a méreteket változatlanul hagyjuk, de a fordulatok irányát<br />
ellentétesre fordítjuk (jobbot a ballal cseréljük), akkor szimmetrikus alakzatokat kapunk.<br />
Teljes teknıc-tétel: Ha a teknıc akármilyen alakzatot bejárva pontosan ugyanoda ér<br />
vissza ahonnan kiindult, akkor a fordulatok összege 360 fok, vagy annak többszöröse.<br />
Vagy idézzük szó szerint a LOGO megalkotóját Seymour Papert-et:<br />
„A Teljes Teknıs Túra Tétele az alábbiakat mondja ki: Ha a Teknıc bármilyen<br />
területet körbejár, <strong>és</strong> a túra végén ugyanabba az állapotba kerül, mint amikor elindult,<br />
akkor az összes elfordulások összege 360 o .<br />
E tétel megért<strong>és</strong>éhez az is hozzátartozik, hogy megtanuljuk alkalmazni egy jól<br />
meghatározott problémacsoport megoldására. Ahogy tehát a gyerek ezzel a tétellel<br />
találkozik, sokban eltér a hasonló euklideszi tétel memorizálásától: A háromszögek<br />
belsı szögeinek összege 180 o .<br />
92
Elıszöris (legalábbis a LOGO számítógépekkel kapcsolatban) a Teljes Teknıs Túra<br />
sokkal hasznosabb: a gyerek a gyakorlatban tudja alkalmazni. Másr<strong>és</strong>zt általánosabb:<br />
nemcsak háromszögekre, hanem négyzetekre <strong>és</strong> másfajta görbékre is érvényes.<br />
Harmadszor érthetıbb is: bizonyítását könnyő felfogni. Ezenkívül személyesebb is: az<br />
ember végig tudja járni, <strong>és</strong> ezáltal általános modellt ad a matematikai <strong>és</strong> az egyéni<br />
tudás összekapcsolására 4 .”<br />
Ha a körrel már ennyi szép kitölt<strong>és</strong>t megvalósítottunk, akkor a további kérd<strong>és</strong>,<br />
hogyan rajzoljunk ellipszist úgy, hogy mindenki megértse. Ezáltal az ellipszis egy<br />
érdekes „belsı” geometriai tulajdonságát fedezhetjük fel. Igazi statisztikus, vagy ami<br />
még fontosabb, az ellipszis egy diszkrét tulajdonsága. A lényeg, hogy amíg egy teknıc<br />
egy körpályát ír, addig egy másik e körpálya megfelelı pontjait kicsit módosítja.<br />
Pontosabban, ha a teknıc x, y pontban van, akkor egy másik legyen x <strong>és</strong> (x+y)/2<br />
pontban, vagyis a körpálya pont egyik koordinátája maradjon, a másik a számtani<br />
közepe legyen.<br />
Comenius Logoban ez így néz ki:<br />
tanuld ellipszis<br />
ism 360 [tf el•re 1 jobbra 1 make "x xhely make "y yhely~<br />
xyhely! :x ( :x + :y ) / 2 ~<br />
tl pont tf xyhely! :x :y]<br />
vége<br />
Magyarárat:<br />
– tf jelent<strong>és</strong>e tollat fel. Ezt azért használjuk, hogy a kört ne rajzoltassuk meg, bár a<br />
tanulás-megért<strong>és</strong> során meg is rajzoltathatjuk.<br />
– e 1 j 1: a kör megrajzoltatása,<br />
– make "x xhely make "y yhely: az x <strong>és</strong> az y felveszi a kör aktuális pontjait<br />
(pozicióit).<br />
– xyhely! :x ( :x + :y ) / 2: az új pontokra pozicionálunk (odavisszük<br />
a grafikus mutatót)<br />
– tl pont: a tollat letesszük <strong>és</strong> pontot kigyújtunk a képernyın,<br />
– tf xyhely! :x :y: tollat felvesszük <strong>és</strong> x, y régi körpontokba pozicionálunk.<br />
A Comenius Logoban akár 4000 teknıcöt is<br />
elıhívhatunk <strong>és</strong> munkára foghatunk. A mellékelt példán<br />
csak 36 teknıckét hívtunk elı <strong>és</strong> körbe állítottuk. Ezek<br />
után minden utasításunkat 36 teknıc egyszerre fog<br />
teljesíteni. Persze itt látszik, hogy lényegében sorban<br />
dolgoznak <strong>és</strong> nem párhuzamosan. Ha lassú a gépünk a<br />
processzora 386-os vagy 486-os akkor bizony nagyon<br />
lelassul 36 teknıc egyidejő mozgatásánál.<br />
tanuld sok_teki :n<br />
név "k 2<br />
ism :n [újtekn•c :k [0 0 0 látható<br />
figyelj] ~<br />
kérem :k [j :k * 10 e 100] ~<br />
név "k :k + 1]<br />
vége<br />
4 Seymour Papert: Észrenget<strong>és</strong> (A gyermeki gondolkodás titkos útjai) Számalk 1988.<br />
93
Pitagoraszi kabala<br />
ism 5[e 100 j 360/5 ism 5 [e 100 j 2*360/5]]<br />
Rekurzív eljárással k<strong>és</strong>zített ábrák<br />
Paraméter változtatása<br />
tanuld csiganégyzet :hossz<br />
e :hossz j 90<br />
csiganégyzet :hossz + 10<br />
vége<br />
Mozaikok<br />
Területkitölt<strong>és</strong>ek<br />
Algoritmusa:<br />
Alapelem rajzolása<br />
Sor k<strong>és</strong>zít<strong>és</strong>e alapelemekbıl<br />
Mozaik k<strong>és</strong>zít<strong>és</strong>e sorokból<br />
Mozaik rekurzióval<br />
<strong>Az</strong> eljárások:<br />
•alapelem<br />
•sor k<strong>és</strong>zít<strong>és</strong>e az alapelembıl<br />
•mozaik eljárás rekurzívan<br />
Amit régebb csak körzı <strong>és</strong> vonalzó segítségével tudtak megszerkeszteni, igen nagy<br />
fáradsággal, azt most a teknıcke egy szempillantás alatt megrajzolja. Például a<br />
szabályos 7 szög szerkeszt<strong>és</strong>e, Gauss nagy felfedez<strong>és</strong>ei közé tarozik. Logoban ez annyi,<br />
hogy ism 7[e 100 j 360/7]. Persze ez egy mély ismeretelméleti problémát vet fel.<br />
Világos, hogy a számítógép approximál <strong>és</strong> numerikusan dolgozik. Tehát nem<br />
beszélhetünk elvi megszerkesztıségrıl. De algoritmikus gondolkodás fejleszt<strong>és</strong>rıl,<br />
számítási geometriáról igen. Hiszen ezzel csak megtanulja a hallgató, hogy minden n<br />
oldalú szabályos sokszög megrajzolható, így<br />
ism n[e 100 j 360/n] (Comenius Logoban a változókat a : kettıspont<br />
hozzáragasztásával kapjuk meg).<br />
Hogy ezt azt egyszerő eljárást is a tanuló megértse, tudnia kell, hogy a szabályos<br />
sokszög körbeírható, minden szöge egybevágó, <strong>és</strong> a kieg<strong>és</strong>zítı szögei 360/n fokosak.<br />
Vagy minden szöge 180-(360/n) fokos. Talán ez elegendı is, ha ennyit minden tanuló<br />
megjegyezne. Hogy melyek azok a szabályos sokszögek amelyek körzı <strong>és</strong> vonalzó<br />
segítségével megszerkeszthetık, ez már egy mély matematikai kérd<strong>és</strong>. És nem is biztos,<br />
hogy meg kell tanítani az iskolai matekban.<br />
“Ide ne lépjen aki nem szereti a geometriát”<br />
Nagyon sokat beszélünk a Bolyaiakról, de keveset tudunk a Bolyai-geometriáról. <strong>Az</strong><br />
Appendix ma is egy igen nehéz olvasmány, megért<strong>és</strong>e nagy szellemi erıfeszít<strong>és</strong>t<br />
igénylı mő. Ennek egyik oka, hogy még napjainkban is nehezen szemléltethetı<br />
94
geometria. A következıkben azt szeretném bemutatni, hogyan lehet elkezdeni a Bolyaigeometria<br />
szemléltet<strong>és</strong>ét elemi szinten, például Comenius Logo segítségével.<br />
A Bolyai-geometria egyik alapvetı tulajdonsága, hogy azon pontok mértani helye,<br />
amely egy adott egyenestıl egyenlı távolságra helyezkednek el, az már nem egyenes,<br />
hanem egy hiperciklus. Nos, ezt jó volna megrajzoltatni a teknıccel. Lehet úgy is, hogy<br />
a teknıcöt megtanítjuk a Bolyai-féle távolságmér<strong>és</strong>re. Könnyebb sugársorokkal<br />
dolgozni. Vegyük azoknak a síkbeli egyeneseknek az összességét, amelyek merılegesek<br />
egy adott egyenesre. Ezek ez euklideszi geometriában párhuzamos sugársort alkotnak, a<br />
Bolyai- féle geometriában viszont megfelelı (eltérı) sugársora merıleges „egyenes” a<br />
hiperciklus. Hogyan tudjuk ezt bemutatni <strong>és</strong> a gyerekekkel megértetni. Biztos, hogy<br />
nem egyórai anyag, <strong>és</strong> alapos módszertani körültekint<strong>és</strong>t igényel. Elıször is, a<br />
számítógép képernyıje a Poincaré-féle félsíkmodellhez áll a legközelebb. Ezen a<br />
modellen a végtelen távoli pontok a képernyı alja (alsó határvonala), a téglalap alakú<br />
képernyı többi 3 oldala bármennyire kiterjeszthetı (elvileg a végtelenig). Ezen a<br />
modellen a Bolyai-féle egyenesek a alsó határvonalat merılegesen metszı félkörök <strong>és</strong><br />
egyenesek. Vagyis azok az egyenesek amelyek merılegesek erre a határ egyenesre, <strong>és</strong><br />
azok a félkörök amelyek középpontja a határ egyenesen helyezkednek el. Utána a<br />
következıképpen okoskodhatunk. Vegyünk egy euklideszi teknıcöt (a zöld kicsi<br />
teknıs) <strong>és</strong> egy Bolyai-féle teknıcöt (a háromszög alakú). Amíg egyik euklideszi<br />
sugársort rajzol, a másik Bolyai-fé lét. Majd a euklideszi, illetve a Bolyai-féle<br />
megrajzolja mind a két sugársor merıleges pályaívét (ortogonális trajektóriáját).<br />
Programozástechnikailag, de akár módszertanilag is a legkönnyebb úgy dolgozni, hogy<br />
az euklideszi síkon összetartó (centrális) sugársort rajzoltatunk, <strong>és</strong> ezt egy közönséges<br />
inverzióval átvisszük a Bolyai-féle síkra. Ezt így könnyebb megvalósítani, mert elvileg<br />
az euklideszi síkon egy adott egyenesre merıleges egyenesek párhuzamos sugársort<br />
alkotnak, <strong>és</strong> az ezekre merıleges vonalak is párhuzamos egyenesek. Ezzel szemben a<br />
Bolyai-geometriában egy széttartó (divergens) sugársora merıleges vonalak a<br />
hiperciklusok A Bolyai-síkgeometriában vannak széttartó, vagyis se nem párhuzamos,<br />
se nem metszı egyenesek, az euklidesziben ilyenek csak a térben léteznek.)<br />
Talán könnyebb megérteni a paraciklus vonalat. <strong>Az</strong> euklideszi geometriában<br />
párhuzamos sugársorokra egy merıleges vonal ugyancsak egyenes. Ha pedig többet<br />
veszünk, akkor párhuzamos sugársorok merıleges pályaívei ugyancsak párhuzamos<br />
sugársorok lesznek (rácsvonalak). Ezzel szemben a Bolyai-síkgeometriában ezek<br />
lesznek a paraciklusok. (<strong>Az</strong> elnevez<strong>és</strong> Gausstól származik) A modellünkön a paraciklus<br />
egy kör lesz. Még egy nagyon fontos tény, amelynek a megért<strong>és</strong>e hozzájárulhat, a<br />
Bolyai-féle geometriai szemlélet kialakításához. Ahogy minden egyenes, vagy annak<br />
egy darabja, egybevágó minden más egyenessel, így a Bolyai-geometriában is minden<br />
paraciklus, illetve annak egy darabja, egybevágó. Tehát lehetne gyártani paraciklus<br />
vonalzót. A modellünkön a képernyı alsó határvonalát érintı körök lesznek a<br />
paraciklusok, <strong>és</strong> ezek elvileg mind egybevágóak. (Ezt is könnyen „bizonyíthatjuk” egy<br />
„programozási teszttel”.) Ezt úgy is felfoghatjuk, hogy a végtelent érintı körök, vagyis<br />
végtelen sugarú körök.<br />
Folytonos <strong>és</strong> diszkrét jelenségek<br />
A Logoban könnyen szemléltethetı úgy a folytonos, mint a diszkrét matematika.<br />
95
Két fontos példán keresztül szeretnénk bemutatni, hogy Comenius Logoban egyaránt<br />
könnyen lehet szemléltetni, mind a folytonos, mind a diszkrét geometriát. Hihetetlenül<br />
könnyen <strong>és</strong> vonzó szépséggel rajzolhatóak a fraktálok. (Fraktáloknak nevezzük az<br />
önhasonló halmazokat, amelyek egy r<strong>és</strong>zének felnagyításával megkapjuk az eredeti<br />
halmazt.) Íme néhány példa! A mellékelt ábra lényege, hogy csak szabályos sokszöget<br />
rajzoltatunk a géppel. De ezt rekurzíven, például minden csúcsban kisebbet <strong>és</strong> kisebbet,<br />
amíg mondjuk az oldalhosszúság kisebb mint egy képpont.<br />
<strong>Az</strong> eljárások amivel ezek az ábrák k<strong>és</strong>zültek hihetetlenül egyszerőek:<br />
tanuld so :n :s<br />
ha :s > 1 [ism :n [e :s b ( 360 / :n ) so :n :s / 3]]<br />
vége<br />
tanuld sok :n :s<br />
ha :s > 1 [tf h ( :s / 2 ) / tan ( 360 / ( 2 * :n ) ) j<br />
90 tl ~<br />
e ( :s / 2 ) b ( 360 / :n ) sok :n :s / 3 ~<br />
ism ( :n - 1 ) [e :s b ( 360 / :n ) sok :n :s / 3] ~<br />
e ( :s / 2 ) b 90 tf ~<br />
e ( :s / 2 ) / tan ( 360 / ( 2 * :n ) ) tl sok :n :s<br />
/ 3]<br />
vége<br />
A folytonos geometria (lényegében a differenciálgeometria) bemutatására is<br />
minden eszközünk a rendelkez<strong>és</strong>ünkre áll. <strong>Az</strong> ellipszis megrajzoltatásának ötletét fogjuk<br />
felhasználni, hogy bemutassuk, hogyan lehet folytonosan áttranszformálni koncentrikus<br />
köröket. Vagyis mi lesz a koncentrikus körök képe, egy folytonos transzformáció során.<br />
Felix Klein, híres erlangeni programja szerint, a geometria nem más, mint valamilyen<br />
transzformációkkal szemben invariáns (változatlan) tulajdonságok vizsgálata. Ezt<br />
minden egyetemi geometria elıadáson elmondják csak éppen nem tudjuk szemléltetni.<br />
Most íme itt egy hihetetlenül könnyen kezelhetı eszköz amivel akár már<br />
középiskolásoknak is be tudjuk mutatni az erlangeni program lényegét. Eddig<br />
viszonylag könnyő volt az euklideszi, a hasonlósági, az affin, a<br />
projektív geometria szemléltet<strong>és</strong>e, ugyanis azokat körzıvel <strong>és</strong><br />
vonalzóval meg tudtuk szerkeszteni. Ezzel szemben a folytonos<br />
transzformáció invariáns tulajdonságait számítógép nélkül<br />
nagyon nehéz szemléltetni. Ugyanígy a differenciálgeometria<br />
alapvetı tulajdonságait is.<br />
96
<strong>Az</strong> alábbi eljárások lényege, hogy amíg egy teknıc koncentrikus köröket rajzol,<br />
addig egy másik, ezeknek a koncentrikus pontoknak az áttranszformált képeit fogja<br />
megrajzolni. Itt a hallgatók kedvükre kísérletezhetnek, én azt választottam, hogy<br />
x’=(x+y)/2, y’=x+(y/2)*sin x.<br />
tanuld kor :s<br />
tf j 90 e :s b 90 tl<br />
ism 360 [e 3.14 * 2 * :s / 360 b 1]<br />
tf b 90 e :s j 90 tl<br />
vége<br />
tanuld tw :s<br />
tf j 90 e :s b 90<br />
make "k 0<br />
ism 360 [kérem "sanyi [tf make "k :k + 1 e 3.14 * 2 * :s / 360 b 1 ~<br />
make "x xhely make "y yhely] ~<br />
kérem "pali [ha :k = 1 [tf][tl] ~<br />
xyhely! ( ( :x + :y ) / 2 ) ( :x + :y / 2 * sin :x )]]<br />
tf b 90 e :s j 90 tl<br />
vége<br />
tanuld iso<br />
make "i 5<br />
ism 10 [make "i :i + 5 tw :i]<br />
vége<br />
A matematikai analízis néhány sarkalatos függvényét is könnyen be tudjuk<br />
mutatni Comenius Logoban. Például a mindenütt folytonos, sehol sem deriválható<br />
függvényt, vagy a véges területet kitöltı végtelen hosszú vonalat, a terület nélküli<br />
síkbeli halmazokat, a Cantor típusú perfekt halmazokat, stb. Ezeket mint egy a<br />
keletkez<strong>és</strong>ük folyamatában tudja bemutatni az elıadó. De a klasszikusnak mondott<br />
görbékkel is könnyebben megbarátkozhatnak a hallgatók. Újra fölfedezhetik a cikloist,<br />
az epicikloist, az aszteroidát, stb. Ezekrıl már teljesen elfeledkezetünk, pedig a<br />
számítógépi grafika által ezek reneszánszának lehetünk tanúi.<br />
Szakirodalom<br />
1. Farkas Károly: Logo Writer programnyelv gyerekeknek, Múzsák Kiadó Reál<br />
Szerkesztısége, Budapest, 1994.<br />
2. A LOGO programozási nyelv, Mőszaki Könyvkiadó Budapest 1986. (Turcsányiné Szabó<br />
Márta <strong>és</strong> Dietrich Senftleben munkája)<br />
3. Seymour Papert: Észrenget<strong>és</strong> (A gyermeki gondolkodás titkos útjai) Számalk 1988.<br />
4. Turcsányiné Szabó Márta-Zsakó László: Comenius Logo gyakorlatok, Kossuth Kiadó,<br />
1997.<br />
5. Dancsó Tünde: Comenius Logo – Játék <strong>és</strong> animáció (Kossuth Kiadó), 2001<br />
6. Dancsó Tünde: <strong>Az</strong> <strong>informatika</strong> <strong>alapjai</strong>, Kossuth Kiadó 1995.<br />
7. Dumitru, Petru, LOGO – 16 lecŃii şi aplicaŃii, Editura Spot, Focşani, 1996.<br />
8. Dumitru, Petru, LOGO – 500 de proceduri, Editura Spot, Focşani, 1997.<br />
9. Ion Diamandi: Cine ştie LOGO, Editura Agni, Bucureşti, 1994.<br />
97
10. Diamandi I., Vass Gh. LOGO, o nouă metodă de a învăŃa cu ajutorul calculatorului,<br />
Editura Pacific, Bucureşti, 1991.<br />
11. Vass, Gheorghe: Logomatematica – IniŃiere în Logo, Matematică şi ŞtiinŃe exacte.,<br />
Editura Alternative, Bucureşti, 1995.<br />
98