07.04.2013 Views

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 ...

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!