programozas - tervezes

of 336 /336
1 Gregorics Tibor PROGRAMOZÁS 1. kötet TERVEZÉS egyetemi jegyzet 2011

Author: schiman-daniel

Post on 29-Dec-2015

79 views

Category:

Documents


1 download

Embed Size (px)

TRANSCRIPT

  • 1

    Gregorics Tibor

    PROGRAMOZS 1. ktet

    TERVEZS

    egyetemi jegyzet

    2011

  • ELSZ

    2

    TARTALOM

    ELSZ ...................................................................................................................... 4

    BEVEZETS .............................................................................................................. 6

    I. RSZ PROGRAMOZSI FOGALMAK ............................................................. 9

    1. ALAPFOGALMAK ................................................................................................. 10 1.1. Az adatok tpusa ......................................................................................... 10 1.2. llapottr ................................................................................................... 14 1.3. Feladat fogalma ......................................................................................... 15 1.4. Program fogalma ....................................................................................... 17 1.5. Megolds fogalma ...................................................................................... 21 1.6. Feladatok ................................................................................................... 25

    2. SPECIFIKCI...................................................................................................... 28 2.1. Kezdllapotok osztlyozsa ...................................................................... 28 2.2. Feladatok specifikcija ............................................................................ 31 2.3. Feladatok ................................................................................................... 37

    3. STRUKTURLT PROGRAMOK ............................................................................... 38 3.1. Elemi programok ........................................................................................ 40 3.2. Programszerkezetek ................................................................................... 43 3.3. Helyes program, megengedett program ..................................................... 55 3.4. Feladatok ................................................................................................... 58

    II. RSZ PROGRAMTERVEZS MINTK ALAPJN .................................... 61

    4. PROGRAMOZSI TTELEK ................................................................................... 63 4.1. Analg programozs .................................................................................. 64 4.2. Programozsi ttel fogalma ....................................................................... 69 4.3. Nevezetes mintk ........................................................................................ 72 4.4. Feladatok ................................................................................................... 84

    5. VISSZAVEZETS .................................................................................................. 85 5.1. Termszetes visszavezets .......................................................................... 85 5.2. ltalnos visszavezets ............................................................................... 86 5.3. Alteres visszavezets ................................................................................... 87 5.4. Paramteres visszavezets .......................................................................... 91 5.5. Visszavezetsi trkkk ................................................................................ 94 5.6. Rekurzv fggvny kiszmtsa ................................................................... 99 5.7. Feladatok ................................................................................................. 105

    6. TBBSZRS VISSZAVEZETS ........................................................................... 106 6.1. Alprogram ................................................................................................ 108 6.2. Begyazott visszavezets .......................................................................... 111 6.3. Program-talaktsok .............................................................................. 129 6.4. Rekurzv fggvny kibontsa .................................................................... 136 6.5. Feladatok ................................................................................................. 147

    III. RSZ TPUSKZPONT PROGRAMTERVEZS................................... 149

  • ELSZ

    3

    7. TPUS ................................................................................................................ 151 7.1. A tpus fogalma ........................................................................................ 152 7.2. Tpus-specifikcit megvalst tpus ...................................................... 157 7.3. Absztrakt tpus .......................................................................................... 162 7.4. Tpusok kztti kapcsolatok ..................................................................... 171 7.5. Feladatok ................................................................................................. 180

    8. PROGRAMOZSI TTELEK FELSOROL OBJEKTUMOKRA ................................... 181 8.1. Gyjtemnyek ........................................................................................... 183 8.2. Felsorol tpus specifikcija .................................................................. 185 8.3. Nevezetes felsorolk ................................................................................. 188 8.4. Programozsi ttelek ltalnostsa ........................................................ 194 8.5. Visszavezets nevezetes felsorolkkal ...................................................... 204 8.6. Feladatok ................................................................................................. 216

    9. VISSZAVEZETS EGYEDI FELSOROLKKAL ....................................................... 217 9.1. Egyedi felsorol ....................................................................................... 218 9.2. Felttel fennllsig tart felsorols ....................................................... 219 9.3. Csoportok felsorolsa .............................................................................. 222 9.4. sszefuttats ............................................................................................ 234 9.5. Rekurzv fggvny feldolgozsa ............................................................... 248 9.6. Felsorol gyjtemny nlkl .................................................................... 254 9.7. Feladatok ................................................................................................. 257

    10. FELADATOK MEGOLDSA ............................................................................... 260

    IRODALOM JEGYZK ....................................................................................... 336

  • 4

    ELSZ

    Ez a knyv az Etvs Lornd Tudomnyegyetem programtervez informatikus szaknak azon tantrgyaihoz ajnlom, amelyeken a hallgatk az els benyomsaikat szerezhetik meg a programozs szakmjrl.

    A knyvre ersen rnyomja blyegt az a gondolkodsmd, amely C. A. R. Hoare s E. W. Dijkstra munkira plve alakult s csiszoldott ki az informatika oktatsnak sorn az ELTE Informatika Karn (illetve annak jogeldjn). A nyolcvanas vek eleje ta tart kutat s oktat munkban rszt vev hazai alkotcsapatbl magasan kiemelkedik Fthi kos, aki ttr s vezet szerepet jtszott s jtszik egy sajtos programozsi szemlletmd kialaktsban, aki a sz klasszikus rtelmben iskolt teremtett maga krl. Ennek a szemlletmdnak, programozsi mdszertannak sok eleme tudomnyos kzlemnyekben is megjelent mr, ugyanakkor igen szmottev tudomnyos folyiratokban nem kzlhet eredmny gylt ssze a mindennapos oktats sorn hasznlt pldatrak, segdanyagok, didaktikai elemek (bevezet pldk, segdttelek, demonstrcis feladatok) formjban. Hangslyozom, hogy az alapgondolat s szmos tlet Fthi kostl szrmazik, de sok rszletet msok dolgoztak ki. Hadd emltsem meg ezek kzl Kozics Sndort, aki akrcsak Fthi kos, tanrom volt. Ma mr igen nehz azt pontosan meghatrozni, hogy egy-egy rszlet kitl szrmazik: egyrszt azrt, mert bizonyos tletek megszletse s kidolgozsa nem mindig ugyanahhoz a szemlyhez fzdnek, msrszt pedig a szakfolyiratokban nem kzlhet elemek szerzinek neve sehol nincs dokumentlva. A legteljesebb nvsort azokrl, akik ennek a csapatmunknak rszvevi voltak, valsznleg a Workgroup on Relation Models of Programming: Some Concepts of a Relational Model of

    Programming,Proceedings of the Fourth Symposium on Programming

    Languages and Software Tools, Ed. prof. Varga, L., Visegrd, Hungary, June 9-10, 1995. 434-44. publikciban talljuk.

    Ez a knyv, amely a programozshoz kapcsold munkim els ktete, a Tervezs cmet viseli, s az ELTE IK programtervez informatikus szak Programozs trgynak azon eladsaihoz s gyakorlataihoz szolgl jegyzetknt, ahol a programtervezsrl esik sz.

  • ELSZ

    5

    (A msodik ktetben majd a program futtathat vltozatnak ellltsrl, teht az implementlsrl s a tesztelsrl lesz sz.) Mivel az emltett tantrgynak nem clja a tervezsnl hasznlt mdszertan elmleti htternek bemutatsa (ezt egy msik tantrgy teszi meg), ezrt ez a ktet nem is tr ki erre rszleteiben, csak nagy vonalakban emlti meg a legfontosabb fogalmakat. A ktet elssorban a visszavezets technikjnak gyakorlati alkalmazsra fkuszl, arra, amikor algoritmus mintk, gynevezett programozsi ttelek segtsgvel oldunk meg feladatokat. A megolds egy absztrakt program formjban szletik meg, amelyet aztn tetszs szerinti programozsi krnyezetben lehet megvalstani.

    A knyv didaktikjnak sszelltsakor elssorban sajt eladsaimra s gyakorlataimra tmaszkodtam, de felhasznltam Fthi kossal folytatott beszlgetseknek tapasztalatait is. A didaktika, a bevezetett jellsek kialaktsban sokat segtettek azok a kollgk is, akikkel kzsen tartjuk a fent emltett trgy gyakorlatait. Kln ksznettel tartozom kzttk Szabn Nacsa Rozlinak, Sike Sndornak, Veszprmi Annnak s Nagy Srnak. Ksznet jr azoknak a hallgatknak is, akik a knyv kzirathoz helyesbt szrevteleket tettek, kztk klnsen Mt Gergelynek.

    A jegyzet tananyagnak kialaktsa az Eurpai Uni tmogatsval, az Eurpai Szocilis Alap trsfinanszrozsval valsult meg (a tmogats szma TMOP 4.2.1./B-09/1/KMR-2010-0003). A jegyzet megjelentetst az ELTE IK tmogatta.

  • 6

    BEVEZETS

    A programozs az a mrnki tevkenysg, amikor egy feladat megoldsra programot ksztnk, amelyet azutn szmtgpen hajtunk vgre. E ltszlag egyszer meghatrozsnak a htterben tbb figyelemre mlt gondolat rejtzik.

    Az egyik az, hogy a programkszts clja egy feladat megoldsa, ezrt a programozs sorn mindig a kitztt feladatot kell szem eltt tartanunk; abbl kell kiindulnunk, azt kell elemeznnk, rszleteiben megismernnk.

    A msik gondolat az, hogy a program fogalma nem ktdik olyan szorosan a szmtgphez, mint azt hinnnk. A programozs valjban egymstl jl elklnthet br a gyakorlatban sszefond rsztevkenysgekbl ll: elszr kitalljuk, megtervezzk a programot (ez az igazn nehz lps), aztn tfogalmazzuk, azaz kdoljuk azt egy szmtgp szmra rthet programozsi nyelvre, vgl kiprbljuk, teszteljk. Nyilvnval, hogy az els a lpsben, a programtervezsben szinte kizrlag a megoldand feladatra kell sszpontostanunk, s nem kell, nem is szabad trdnnk azzal, hogy a program milyen programozsi krnyezetbe gyazdik majd be. Nem veszhetnk el az olyan krdsek rszletezsben, hogy mi is az a szmtgp, hogyan mkdik, mi az opercis rendszer, mi egy programozsi nyelv, hogyan lehet egy programot valamely szmtgp szmra rthetv, vgrehajthatv tenni. A program lnyegi rsze ugyanis nevezetesen, hogy a feladatot megoldja nem fgghet a programozsi krnyezettl.

    A programtervezst egy olyan folyamatnak tekintjk, amely sorn a feladatot jabb s jabb, egyre rszletesebb formban fogalmazzuk meg, miltal egyre kzelebb kerlnk ahhoz a szmtgpes krnyezethez, amelyben majd a feladatot megold program mkdik. Ehhez azt vizsgljuk, hogyan kell egy feladatot felbontani rszekre, majd a rszeket tovbbfinomtani egszen addig, amg olyan egyszer rszfeladatokhoz jutunk, amelyekre mr knnyen adhatk azokat megold programok. Ennek a knyvnek a gyakorlati jelentsge ezeknek a finomt (ms szval rszletez, rszekre bont, idegen szval dekomponl) technikknak a bemutatsban rejlik.

    A programtervezsnek s a programozsi krnyezetnek a sztvlasztsa nemcsak a programozs tanulsa szempontjbl hasznos,

  • BEVEZETS

    7

    hanem a programozi mestersgnek is elengedhetetlen felttele. Aki a programozst egy konkrt programozsi krnyezettel sszefggsben sajttja el, az a megszerzett ismereteit mind trben, mind idben ersen korltozottan tudja csak alkalmazni. Az llandan vltoz technikai krnyezetben ugyanis pontosan kell ltni, melyik ismeret az, amit vltoztats nlkl tovbb hasznlhatunk, s melyik az, amelyet idrl idre le kell cserlnnk. A programtervezsnek az alapelvei, mdszerei, egyszval a gondolkodsmd nem vltozik olyan gyorsan, mint a programozsi krnyezet, amelyben dolgoznunk kell.

    A bevezet mondathoz kapcsold harmadik gondolat a mrnki jelzben rejlik. E szerint a programksztst egy vilgosan rgztett technolgia mentn, szabvnyok alapjn kell vgezni. A legsszetettebb feladat is megfelel elemzs sorn felbonthat olyan rszekre, amelyek megoldsra mr rendelkeznk korbbi mintkkal. Ezek olyan rszmegoldsok, amelyek helyessge, hatkonysga mr bizonytott, hasznlatuk ezrt biztonsgos. Kzenfekv, hogy egy j feladat megoldshoz ezeket a korbban mr bevlt mintkat felhasznljuk, ahelyett, hogy mindent teljesen elejrl kezdjnk el kidolgozni. Ha megfelel technolgit alkalmazunk a mintk jrafelhasznlsnl, akkor a biztonsgos mintkbl garantltan biztonsgos megoldst tudunk pteni.

    Ebben a ktetben a programtervezst lltottam kzppontba: a feladatok specifikcijbl kiindulva azokat megold absztrakt programokat ksztnk. Clom egy olyan programozsi mdszertan bemutatsa, amelyik feladat orientlt, elvlasztja a program tervezst a terv megvalststl, s a tervezs sorn programozsi mintkat kvet. A programozsi mintknak egy specilis csaldjval foglalkozom csak, mgpedig algoritmus mintkkal vagy ms nven a programozsi ttelekkel. Szmos plda segtsgvel mutatom be ezek helyes hasznlatt, amely szavatolja az ellltott programnak, mint termknek a minsgt.

    Ez a ktet hrom rszre tagoldik, amelyet a kitztt feladatot megoldsainak gyjtemnye zr le. Az els rsz a legfontosabb programozsi fogalmakat vezeti be, meghatrozza, hogy a feladataink lershoz milyen eszkzt, gynevezett specifikcis jellst hasznljunk, bevezeti a strukturlt programok fogalmt (elemi programok, programszerkezetek) s egy jellsrendszert (struktogramm) az absztrakt strukturlt programok lersra. A msodik rsz ismerteti a gyakran alkalmazott programozsi tteleket, pldkat

  • BEVEZETS

    8

    mutat azok alkalmazsra, vgl sszetett feladatokon mutatja be azt a tervezsi folyamatot, ahogyan a megoldst olyan rszprogramok sszessgeknt ksztjk el, amelyek egy-egy programozsi ttel mintjra kszltek. A harmadik rszben olyan feladatok megoldsra kerl sor, amelyekben sszetett tpus adatokat hasznlunk. Definiljuk a korszer adattpus fogalmt, mutatunk egy rendszerezsi szempontot az sszetett tpusok csoportostsra, s klns figyelemmel fordulunk az gynevezett gyjtemnyek (trolk) tpusai fel. ltalnostjuk a programozsi tteleket felsorolra, azaz olyan objektumra, amely pldul egy gyjtemny elemeit kpes bejrni s egyms utn felmutatni. Vgl a felsorolra ltalnostott programozsi ttelek segtsgvel sszetett feladatokat fogunk megoldani.

    A knyv klnsen a msodik s harmadik rsze tulajdonkppen egy pldatr, szmos feladat megoldsnak rszletes lerst tartalmazza. Az egyes fejezetek vgn kitztt gyakorl feladatok megoldsai a tizedik fejezetben tallhatk.

  • 9

    I. RSZ PROGRAMOZSI FOGALMAK

    Ebben a rszben egy programozsi modellt mutatunk be, amelynek keretben a programozssal kapcsolatos fogalmainkat vezetjk be. Ez valjban egy matematikai modell, de itt kerlni fogjuk a pontos matematikai defincikat, ugyanis ennek a knyvnek nem clja a programozsi modell matematikai aspektusainak rszletes ismertetse. Ehelyett sokkal fontosabb megltni azt, hogy ez a modell egy sajtos s nagyon hasznos gondolati htteret szolgltat a ktetben trgyalt programtervezsi mdszereknek.

    Fontos pldul azt megrteni s ebben ez a matematikai modell segt , hogy mit tekintnk megoldand feladatnak, mire kell egy feladat megfogalmazsban figyelni, hogyan rdemes az szrevteleinket rgzteni. Tisztzni kell tovbb, hogy mi egy program, hogyan lehet azt ltalnos eszkzkkel lerni gy, hogy ez a lers ne ktdjn konkrt programozsi krnyezetekhez (teht absztrakt programot rjunk), de knnyedn lehessen belle konkrt programokat kszteni. Vlaszt kell kapnunk arra is, mikor lesz helyes egy program, azaz mikor oldja meg a kitztt feladatot. E ktet ksbbi rszeiben alkalmazott klnfle programtervezsi mdszereknek ugyanis ebben az rtelemben lltanak el garantltan helyes programokat. Vgl, de nem utols sorban, a programozsi modell jells rendszere alkalmas eszkzt nyjt a tervezs dokumentlsra.

    Az 1. fejezet a programozsi modell alapfogalmait vezeti be. A 2. fejezet egy a feladatok lersra szolgl formt, a feladat specifikcijt mutatja be. A 3. fejezet a strukturlt program fogalmt definilja, s vzolja, hogy hogyan lehet matematikai korrektsggel igazolni azt, hogy egy strukturlt program megold egy feladatot. A fejezet vgn fogalmazzuk meg azt az ignynket, hogy egy program ne csak helyes legyen, hanem megengedett is, amely azt garantlja, hogy egy absztrakt programot egyszeren kdolhassunk egy konkrt programozsi krnyezetben.

  • 10

    1. Alapfogalmak

    Induljunk ki a bevezets azon megllaptsbl, amely szerint a programozs egy olyan tevkenysg, amikor egy feladat megoldsra programot ksztnk. Ennek rtelmben a programozs hrom alapfogalomra pl: a feladat, a program s a megolds fogalmaira. Mi az a feladat, mi az a program, mit jelent az, hogy egy program megold

    egy feladatot? Ebben a fejezetben erre adjuk meg a vlaszt.

    1.1. Az adatok tpusa

    Egy feladat megoldsa azzal kezddik, hogy megismerkednk azzal az informcival, amelyet a problma megfogalmazsa tartalmaz. Nem jdonsg, nemcsak a programozsi feladatokra rvnyes, hogy a megolds kulcsa a feladat kitzse sorn megjelen informci rtelmezsben, rendszerezsben s lersban rejlik.

    Feladatokkal mindenki tallkozott mr. A tovbbiakban felvetd gondolatok szemlltetse kedvrt most egy iskolai feladatot tznk ki, amely a kvetkezkppen hangzik: Egy nyolc kilogrammos, zld szem szimi macska stlgat egy belvrosi brhz negyedik emeleti ablakprknyn. Az es zuhog, gy az ablakprkny skos. A cica megcsszik, majd a mintegy 12.8 mteres magassgbl lezuhant. Szerencsre a talpra esik! Mekkora fldet rskor a (becsapdsi) sebessge?

    A feladat ltal kzvettett informci els pillantsra igen sszetett. Vannak lnyeges s lnyegtelen elemei; szerepelnek kzttk konkrt rtkeket hordoz adatok s az adatok kztti kapcsolatokat ler sszefggsek; van, ami kzvetlenl a feladat szvegbl olvashat ki, de van, ami rejtett, s csak a szvegkrnyezetbl kvetkeztethetnk r.

    A macsks feladatban lnyegtelen adat pldul a macska szemnek szne, hiszen a krds megvlaszolsa, azaz a becsapdsi sebessg kiszmolsa szempontjbl ez nem fontos. Lnyeges adat viszont a magassg, ahonnan a cica leesett. A kinematikt jl ismerk szmra nyilvnval, hogy egy zuhan test becsapdsi sebessgnek kiszmolshoz nincs szksg a test tmegre sem. Felttelezve ugyanis azt, hogy a macsknak pontszer teste a Fldn csapdik be, a becsapds sebessgt a feladatban kzvetlenl nem emltett, teht

  • 1.1. Az adatok tpusa

    11

    rejtett hg2v kplet (h a magassg, g a nehzsgi gyorsuls)

    segtsgvel szmolhatjuk ki. Itt a nehzsgi gyorsuls is egy rejtett adat, amelynek az rtkt llandknt 10 m/s2-nek vehetjk, ennek

    megfelelen a fenti kplet hv 20 -ra mdosul.

    Abban van nmi szabadsgunk, hogy a feladat szvegben nem pontosan lert elemeket hogyan rtelmezzk. Pldul a nehzsgi gyorsulst is kezelhetnnk bemeneti adatknt ugyangy, mint a magassgot. St magt a becsapdsi sebessg kiszmtsnak kplett is be lehetne adatknt krni annak minden paramtervel (pl. nehzsgi gyorsulssal, srldsi egytthatval, stb.) egytt, ha a problmt nemcsak a fent lert egyszersts (pontszer test zuhansa lgres trben) felttelezse mellett akarnnk megoldani Ezek s az ehhez hasonl eldntend krdsek teszik a feladat megrtst mr egy ilyen viszonylag egyszer pldnl is bonyolultt.

    A feladat elemzst a benne szerepl lnyeges adatok sszegyjtsvel kezdjk, s az adatokat a tulajdonsgaikkal jellemezzk. Egy adatnak igen fontos tulajdonsga az rtke. A pldban szerepl magassgnak a kezdeti rtke 12.8 mter. Ez egy gynevezett bemen (input) adat, amelynek rtkt felttlenl ismerni kell ahhoz, hogy a feltett krdsre vlaszolhassunk. Kzenfekv a kitztt feladatnak egy olyan ltalnostsa, amikor a bemeneti adathoz nem egy konkrt rtket rendelnk, hanem egy tetszlegesen rgztett kezdeti rtket. Ehhez fontos tudni azt, hogy milyen rtkek jhetnek egyltaln szba; melyek lehetnek a bemeneti adatnak a kezdrtkei. A pldnkban szerepl magassg adat egy nem-negatv vals szm.

    Furcsnak tnhet, de adatnak tekintjk az eredmnyt is, azaz a feladatban feltett krdsre adhat vlaszt. Ennek konkrt rtkt nem ismerjk elre, hiszen ppen ennek az rtknek a meghatrozsa a clunk. A pldban a becsapdsi sebessg egy ilyen az eredmnyt megjelent gynevezett eredmny vagy kimeneti (output) adat, amelynek rtke kezdetben definilatlan (tetszleges), ezrt csak a lehetsges rtkeinek halmazt adhatjuk meg. A becsapdsi sebessg lehetsges rtkei is (nem-negatv) vals szmok lehetnek.

    Az adatok msik jellemz tulajdonsga az, hogy az rtkeikkel mveleteket lehet vgezni. A pldnkban a vals szmokhoz kapcsold mveletek a szoksos aritmetikai mveletek, a feladat megoldsnl ezek kzl a szorzsra s a ngyzetgykvonsra lesz szksgnk. Az adatokrl tovbbi jellemzket is ssze lehetne gyjteni

  • 1. Alapfogalmak

    12

    (mrtkegysg, irny stb.), de a programozs szempontjbl ezek nem lnyegesek.

    Egy adat tpust az adat ltal felvehet lehetsges rtkek halmaza, az gynevezett tpusrtk-halmaz, s az ezen rtelmezett mveletek, az gynevezett tpusmveletek egyttesen hatrozzk meg, ms szval specifikljk1.

    Tekintsnk most nhny nevezetes adattpust, amelyeket a tovbbiakban gyakran fogunk hasznlni. A tpus s annak tpusrtk-halmazt tbbnyire ugyanazzal a szimblummal jelljk. Ez nem okoz ksbb zavart, hiszen a szvegkrnyezetbl mindig kiderl, hogy pontosan mikor melyik jelentsre is gondolunk.

    Termszetes szm tpus. Tpusrtk-halmaza a termszetes szmokat (pozitv egsz szmokat s a nullt) tartalmazza,

    jele: . (+ a nullt nem tartalmaz termszetes szmok halmazt jelli.) Tpusmveletei az sszeads (+), kivons (), szorzs (*), az egsz oszts (div), az osztsi maradkot elllt mvelet (mod), esetleg a hatvnyozs, ezeken kvl

    megengedett mg kt termszetes szm sszehasonltsa ( , ,

    , , , ).

    Egsz szm tpus. Tpusrtk-halmaza (jele: ) az egsz

    szmokat tartalmazza (+ a pozitv, a negatv egsz szmok

    halmaza), tpusmveletei a termszetes szmoknl bevezetett mveletek.

    Vals szm tpus. Tpusrtk-halmaza (jele: ) a vals

    szmokat tartalmazza (+ a pozitv, a negatv vals szmok

    halmaza, 0+ a pozitv vals szmokat s a nullt tartalmaz

    halmaz), tpusmveletei az sszeads (+), kivons (), szorzs (*), oszts (/), a hatvnyozs, ezeken kvl megengedett kt

    vals szm sszehasonltsa ( , , , , , ) is.

    Logikai tpus. Tpusrtk-halmaza (jele: ) a logikai rtkeket

    tartalmazza, tpusmveletei a logikai s ( ), logikai vagy

    ( ), a logikai tagads ( ) s logikai egyenlsg ( ) illetve

    nem-egyenlsg ( ).

    1 A tpus korszer defincija ennl jval rnyaltabb, de egyelre ez a

    szktett vltozat is elegend lesz az alapfogalmak bevezetsnl. A rszletesebb meghatrozssal a 7. fejezetben tallkozunk majd.

  • 1.1. Az adatok tpusa

    13

    Karakter tpus. Tpusrtk-halmaza (jele: ) a karaktereket (a nagy s kisbetk, szmjegyek, rsjelek, stb.) tartalmazza,

    tpusmveletei a kt karakter sszehasonltsai ( , , , , ,

    ).

    Halmaz tpus. Tpusrtkei olyan vges elemszm halmazok, amelyek egy meghatrozott alaphalmaz rszei. E alaphalmaz esetn a jele: 2E. Tpusmveletei a szoksos elemi halmazmveletek: halmaz ressgnek vizsglata, elem kivlasztsa halmazbl, elem kivtele halmazbl, elem beraksa a halmazba.

    Sorozat tpus. Tpusrtkei olyan vges hosszsg sorozatok, amelyek egy meghatrozott alaphalmaz elemeibl llnak. E alaphalmaz esetn a jele: E*. Tpusmveletei: egy sorozat hossznak (elemszmnak) lekrdezse (|s|); sorozat adott sorszm elemre trtn hivatkozs (si), azaz egy elem kiolvassa illetve megvltozatsa; sorozatba j elem beillesztse; adott elem kitrlse.

    Vektor tpus. (Egydimenzis tmb) Tpusrtkei olyan vges, azonos hosszsg sorozatok, ms nven vektorok, amelyek egy meghatrozott alaphalmaz elemeibl llnak. A sorozatokat m-tl n-ig terjed egsz szmokkal szmozzuk meg, ms nven indexeljk. Az ilyen vektorok halmazt E alaphalmaz

    esetn az Em..n jelli, m 1 esetn egyszeren E n . Tpusmvelete egy adott index elemre trtn hivatkozs, azaz az elem kiolvassa illetve megvltoztatsa. A vektor els s utols eleme indexnek (az m s az n rtknek) lekrdezse is lnyegben egy-egy tpusmvelet.

    Mtrix tpus. (Ktdimenzis tmb) azaz Vektorokat tartalmaz vektor, amely specilis esetben azonos mdon indexelt E

    l..m-beli vektoroknak (gynevezett soroknak) a

    vektora (El..m

    )k..n

    vagy mskpp jellve El..mk..n, ahol E az elemi rtkek halmazt jelli), s amelyet k=l=1 esetn egyszeren Emn-knt is rhatunk. Tpusmvelete egy adott sor adott elemre (oszlopra) trtn hivatkozs, azaz az elem kiolvassa, illetve megvltoztatsa. Tpusmvelet mg a mtrix egy teljes sorra trtn hivatkozs, valamint a sorokat tartalmaz vektor indextartomnynak, illetve az egyes sorok indextartomnynak lekrdezse.

  • 1. Alapfogalmak

    14

    1.2. llapottr

    Amikor egy feladat minden lnyeges adata felvesz egy-egy rtket, akkor ezt az rtk-egyttest a feladat egy llapotnak nevezzk.

    A macsks feladat egy llapota pldul az, amikor a magassg rtke 12.8, a sebessg 16. Vezessnk be kt cmkt: a h-t a magassg, a v-t a sebessg jellsre, s ekkor az elz llapotot a rvidtett (h:12.8, v:16) formban is rhatjuk. Az itt bevezetett cmkkre azrt van szksg, hogy meg tudjuk klnbztetni egy llapot azonos tpus rtkeit. A (12.8, 16) jells ugyanis nem lenne egyrtelm: nem tudnnk, hogy melyik rtk a magassg, melyik a sebessg. Ugyanennek a feladatnak llapota mg pldul a (h:5, v:10) vagy a (h:0, v:10). St mivel az adatok kztt kezdetben semmifle sszefggst nem tteleznk fel, csak a tpusrtk-halmazaikat ismerjk a (h:0, v:10.68)-t s a (h:25, v:0)-t is llapotoknak tekintjk, noha ez utbbiak a feladat szempontjbl rtelmetlenek, fizikai rtelemben nem megvalsul llapotok.

    Az sszes lehetsges llapot alkotja az llapotteret. Az llapotteret megadhatjuk gy, hogy felsoroljuk a komponenseit, azaz az llapottr lnyeges adatainak tpusrtk-halmazait egyedi cmkkkel elltva. Az llapottr cmkit a tovbbiakban az llapottr vltozinak hvjuk. Mivel a vltoz egyrtelmen azonostja az llapottr egy komponenst, ezrt alkalmas arra is, hogy egy konkrt llapotban megmutassa az llapot adott komponensnek rtkt.

    A macsks pldban az llapottr a (h:0+, v:0

    +). Tekintsk ennek a (h:12.8, v:16) llapott. Ha megkrdezzk, hogy mi itt a h rtke, akkor vilgos, hogy ez a 12.8. Ha elrjuk, hogy vltozzon meg az llapot v komponense 31-re, akkor a (h:12.8, v:31) llapotot kapjuk. Egy llapot komponenseinek rtkt teht a megfelel vltoz nevnek segtsgvel krdezhetjk le vagy vltoztathatjuk meg. Ez utbbi esetben egy msik llapotot kapunk.

    llapottere nemcsak egy feladatnak lehet. Minden olyan esetben bevezethetjk ezt a fogalmat, ahol adatokkal, pontosabban adattpusokkal van dolgunk, gy pldul egy matematikai kifejezs vagy egy program esetben is.

  • 1.3. Feladat fogalma

    15

    1.3. Feladat fogalma

    Amikor a macsks feladatot meg akarjuk oldani, akkor a feladatnak egy olyan llapotbl indulunk ki, ahol a magassg ismert, pldul 12.8, a sebessg pedig ismeretlen. Ilyen kezdllapot tbb is van az llapottrben, ezeket (h:12.8, v:*)-gal jellhetjk, ami azt fejezi ki, hogy a msodik komponens definilatlan, teht tetszleges.

    A feladatot akkor oldottuk meg, ha megtalltuk azt a clllapotot, amelyiknek sebessgkomponense a 16. Egy fizikus szmra a logikus clllapot a (h:0, v:16) lenne, de a feladat megoldshoz nem kell a valdi fizikai clllapot megtallnunk. Az informatikus szmra a magassg-komponens egy bemen adat, amelyre elrhatjuk pldul, hogy rizze meg a kezdrtket a clllapotban. Ebben az esetben a (h:12.8, v:16) tekinthet clllapotnak. Ha ilyen elrs nincs, akkor minden (h: *, v:16) alak llapot clllapotnak tekinthet. llapodjunk meg ennl a pldnl abban, hogy megrizzk a magassg-komponens rtkt, teht csak egy clllapotot fogadunk el: (h:12.8, v:16).

    Ms magassg-rtk kezdllapotokhoz termszetesen ms clllapot tartozik. (Megjegyezzk, hogy ha az llapottr felrsnl nem zrtuk volna ki a negatv vals szmokat, akkor most ki kellene ktni, hogy a feladatnak nincs rtelme olyan kezdllapotokon, amelyek magassg-komponense negatv, pldul (h:-1, v: *), hiszen ekkor a becsapdsi sebessget kiszmol kpletben negatv szmnak kellene vals ngyzetgykt kiszmolni.). ltalnosan lerva az rtelmes kezd- s clllapot kapcsolatokat, a kvetkezt mondhatjuk.

    A feladat egy (h:h0, v: *) kezdllapothoz, ahol h0 egy tetszlegesen

    rgztett (nem-negatv vals) szm, a * pedig egy tetszleges nem-

    definilt rtk, a (h:h0, v: 020 h ) clllapotot rendeli.

    Tekintsnk most egy msik feladatot! Adjuk meg egy sszetett szm egyik valdi osztjt! Ennek a feladatnak kt lnyeges adata van: az adott termszetes szm (cmkje legyen n) s a vlaszknt megadand oszt (cmkje: d). Mindkt adat termszetes szm tpus.

    A feladat llapottere teht: (n:, d:). Rgztsk az llapottr komponenseinek sorrendjt: megllapods szerint az llapotok jellsnl elsknt mindig az n, msodikknt a d vltoz rtkt adjuk meg, gy a tovbbiakban hasznlhatjuk az (n:6, d:1) llapot-jells helyett a rvidebb (6,1) alakot. A feladat kezdllapotai kztt talljuk

  • 1. Alapfogalmak

    16

    pldul a (6,*) alakakat. Ezekhez tbb clllapot is tartozik: (6,2) s (6,3), hiszen a 6-nak tbb valdi osztja is van. Nincs rtelme a feladatnak viszont a (3,*) alak kezdllapotokban, hiszen a 3 nem sszetett szm, azaz nincs valdi osztja. A feladat ltalban az (x,*) kezdllapothoz, ahol x egy sszetett termszetes szm, azokat az (x,k) llapotokat rendeli, ahol k az x egyik valdi osztja.

    A feladat egy olyan kapcsolat (lekpezs), amelyik bizonyos llapotokhoz (kezdllapotokhoz) llapotokat (clllapotokat) rendel. Ez a lekpezs ltalban nem egyrtelm, ms szval nem-determinisztikus, hiszen egy kezdllapothoz tbb clllapot is tartozhat. (Az ilyen lekpezst a matematikban relcinak hvjk.)

    rdekes tanulsgokkal jr a kvetkez feladat: Adjuk meg egy nem-nulla termszetes szm legnagyobb valdi osztjt! Itt bemeneti adat az a termszetes szm, aminek a legnagyobb valdi osztjt keressk. Tudjuk, hogy a krdsre adott vlasz is adatnak szmt, de azt mr nehz szrevenni, hogy a vlasz itt kt rszbl ll. A feladat megfogalmazsbl kvetkezik, hogy nemcsak egy sszetett szm esetn vrunk vlaszt, hanem egy prmszm vagy az 1 esetn is. De ilyenkor nincs rtelme legnagyobb valdi osztt keresni! A szmszer vlaszon kvl teht szksgnk van egy logikai rtk adatra, amely megmutatja, hogy van-e egyltaln szmszer megoldsa a

    problmnak. A feladat llapottere ezrt: (n:, l: , d:). A feladat ebben a megkzeltsben brmelyik olyan llapotra rtelmezhet, amelyiknek az n komponenshez tartoz rtke nem nulla. Az olyan (x,*,*) llapotokhoz (itt is az n,l,d sorrendre pl rvid alakot hasznljuk), ahol x nem sszetett szm, a feladat az (x,hamis,*) alak clllapotokat rendeli; ha x sszetett, akkor az (x,igaz,k) clllapotot, ahol k a legnagyobb valdi osztja az xnek.

    A feladatok vltozit megklnbztethetjk aszerint, hogy azok a feladat megoldshoz felhasznlhat kezd rtkeket tartalmazzk-e (bemen- vagy input vltozk), vagy a feladat megoldsnak eredmnyei (kimen-, eredmny- vagy output vltozk). A bemen vltozk sokszor megrzik a kezdrtkket a clllapotban is, de ez nem alapkvetelmny. A kimen vltozk kezdllapotbeli rtke kzmbs, tetszleges, clllapotbeli rtkk megfogalmazsa viszont a feladat lnyegi rsze. Szmos olyan feladat is van, ahol egy vltoz egyszerre lehet bemen s kimen is, st lehetnek olyan (segd)

  • 1.3. Feladat fogalma

    17

    vltozi is, amelyek csak a felttelek knnyebb megfogalmazshoz nyjtanak segtsget.

    1.4. Program fogalma

    A szakknyvek tbbsge a programot utastsok sorozataknt definilja. Nyilvnval azonban, hogy egy utastssorozat csak a program lersra kpes, s nmagban semmit sem rul el a program termszetrl. Ehhez ugyanis egyfell ismerni kellene azt a szmtgpet, amely az utastsokat rtelmezi, msfell meg kellene adni, hogy az utastsok vgrehajtsakor mi trtnik, azaz lnyegben egy programozsi nyelvet kellene definilnunk. A program fogalmnak ilyen bevezetse mg akkor is hosszadalmas, ha programjainkat egy absztrakt szmtgp szmra egy absztrakt programozsi nyelven rjuk le. A program fogalmnak bevezetsre ezrt mi nem ezt az utat kvetjk, hiszen knyvnk bevezetjben ppen azt emeltk ki, hogy milyen fontos elvlasztani a programtervezsi ismereteket a szmtgpeknek s a programozsi nyelveknek a megismerstl.

    A fenti rvek ellenre idzznk el egy pillanatra annl a meghatrozsnl, hogy a program utastsok sorozata, s vegynk szemgyre egy gy megadott programnak a mkdst! (Ez a plda egy absztrakt gp s absztrakt nyelv ismerett felttelezi, m az utastsok megrtse itt remlhetleg nem okoz majd senkinek sem gondot.)

    1. Legyen d rtke vagy az n-1 vagy a 2. 2. Ha d rtke megegyezik 2-vel akkor

    amg d nem osztja n-t addig nveljk d rtkt 1-gyel, klnben

    amg d nem osztja n-t addig cskkentsk d rtkt 1-gyel.

    A program kt termszetes szm tpus adattal dolgozik: az elsnek cmkje n, a msodik d, azaz a program (adatainak) llapottere

    az (n:, d:). Vizsgljuk meg, mi trtnik az llapottrben, ha ezt a programot vgrehajtjuk! Mindenekeltt vegyk szre, hogy a program brmelyik llapotbl elindulhat.

    Pldul a (6,8) kiindul llapot esetn (itt is alkalmazzuk a rvidebb, az n,d sorrendjt kihasznl alakot az llapot jellsre) a

  • 1. Alapfogalmak

    18

    program els utastsa vagy a (6,2), vagy a (6,5) llapotba vezet el. Az els utasts ugyanis nem egyrtelm, ettl a program mkdse nem-determinisztikus lesz. Termszetesen egyszerre csak az egyik vgrehajts kvetkezhet be, de hogy melyik, az nem szmthat ki elre. Ha az els utasts a d-t 2-re lltja be, akkor a msodik utasts elkezdi nvelni azt. Ellenkez esetben, d=5 esetn, cskkenni kezd a d rtke addig, amg az nem lesz osztja az n-nek. Ezrt az egyik esetben amikor d rtke 2 rgtn meg is ll a program, a msik esetben pedig rintve a (6,5), (6,4) llapotokat a (6,3) llapotban fog terminlni. Brmelyik olyan kiindul llapotbl elindulva, ahol az els komponens 6, az elzekhez hasonl vgrehajtsi sorozatokat kapunk: a program a

    mkdse sorn egy (6,*) alak llapotbl elindulva vagy a (6,*) (6,2)

    llapotsorozatot, vagy a (6,*) (6,5) (6,4), (6,3) llapotsorozatot futja be. Ezek a sorozatok csak a legels llapotukban klnbznek egymstl, hiszen egy vgrehajtsi sorozat els llapota mindig a kiindul llapot.

    Induljunk el most egy (5,*) alak llapotbl. Ekkor az els

    utasts eredmnytl fggen vagy a (5,*) (5,2) (5,3) (5,4) (5,5) ,

    vagy a (5,*) (5,4) (5,3) (5,2) (5,1) vgrehajts kvetkezik be. A (4,*) alak llapotbl is kt vgrehajts indulhat, de mindkett ugyanabban

    az llapotban ll meg: (4,*) (4,2) , (4,*) (4,3) (4,2)

    rdekes vgrehajtsok indulnak az (1,*) alak llapotokbl. Az els utasts hatsra vagy az (1,2) , vagy az (1,0) llapotba kerlnk. Az els esetben a msodik utasts elkezdi a d rtkt nvelni, s mivel az 1-nek nincs 2-nl nagyobb osztja, ez a folyamat soha nem ll le.

    Azt mondjuk, hogy a program a (1,*) (1,2) (1,3) (1,4) vgtelen vgrehajtst futja be, mert vgtelen ciklusba esik. A msik esetben viszont rtelmetlenn vlik a msodik utasts, hiszen azt kell vizsglni, hogy a nulla rtk d osztja-e az n rtkt, de a nullval val oszts nem rtelmezhet. Ez az utasts teht itt illeglis, abnormlis lpst eredmnyez. Ilyenkor a program abnormlisan mkdik tovbb,

    amelyet az (1,*) (1,0) (1,0) vgtelen vgrehajtsi sorozattal modelleznk. Ez azt fejezi ki, mintha a program megprbln jra s jra vgrehajtani az illeglis lpst, majd mindig visszatr az utols leglis llapothoz. Hasonl a helyzet a (0,*) kiindul llapotokkal is, amelyekre az els utasts megksrli a d rtkt (ennek tetszleges rtkk rgztsk s jelljk y-nal) -1-re lltani. A (0,-1) ugyanis nem tartozik bele az llapottrbe, gy az els utasts a program abnormlis

  • 1.4. Program fogalma

    19

    mkdst eredmnyezheti, amelyet a (0,y) (0,y) (0,y) vgtelen sorozattal jellemezhetnk. Mintha jra s jra megprblnnk a hibs utasts vgrehajtst, de a (0,-1) illeglis llapot helyett mindig visszatrnk a (0,y) kiindul llapothoz.. Termszetesen itt is lehetsges egy msik vgrehajts, amikor az els lpsben a (0,2) llapotba kerlnk, ahol a program rgtn le is ll, hiszen a 2 osztja a nullt.

    A program ltal egy llapothoz rendelt llapotsorozatot vgrehajtsnak, mkdsnek, a program futsnak hvunk. A vgrehajtsok lehetnek vgesek vagy vgtelenek; a vgtelen mkdsek lehetnek normlisak (vgtelen ciklus) vagy abnormlisak (abortls). Ha a vgrehajts vges, akkor azt mondjuk, hogy a program vgrehajtsa megll, azaz terminl. A normlis vgtelen mkdst nem lehet biztonsggal felismerni, csak abbl lehet sejteni, ha a program mr rgta fut. Az abnormlis mkds akkor kvetkezik be, amikor a vgrehajts sorn egy rtelmezhetetlen utastst (pldul nullval val oszts) kellene vgrehajtani. Ezt a programunkat futtat krnyezet (opercis rendszer) fel szokta ismerni, s erszakkal lelltja a mkdst. Innen szrmazik az abortls kifejezs. A modellnkben azonban nincs futtat krnyezet, ezrt az abnormlis mkdst olyan vgtelen llapotsorozattal brzoljuk, amelyik az rtelmetlen utasts vgrehajtsakor fennll llapotot ismtli meg vgtelen sokszor. A ksbbiekben bennnket egy programnak csak a vges mkdsei fognak rdekelni, s mind a normlis, mind az abnormlis vgtelen vgrehajtsokat megprbljuk majd elkerlni.

    Egy program minden llapotbl indt vgrehajtst, st egy llapotbl akr tbb klnbzt is. Az, hogy ezek kzl ppen melyik vgrehajts kvetkezik be, nem definilt, azaz a program nem-determinisztikus.

    Vegynk szemgyre egy msik programot! Legyen ennek az

    llapottere az (a:, b:, c:). Az llapotok lershoz rgztsk a tovbbiakban ezt a sorrendet.

    1. Vezessnk be egy j vltozt (i:) s legyen az rtke 1. 2. Legyen c rtke kezdetben 0. 3. Amg az i rtke nem haladja meg az a rtkt addig

    adjuk a c rtkhez az b rtkt, majd nveljk meg i rtkt 1-gyel.

  • 1. Alapfogalmak

    20

    Ez a program pldul a (2,3,2009) llapotbl indulva az albbi

    llapotsorozatot futja be: (2,3,2009), (2,3,2009,1), (2,3,0,1), (2,3,3,1),

    (2,3,3,2), (2,3,6,2), (2,3,6,3), (2,3,6) . A vgrehajtsi sorozat els lpse kiegszti a kiindul llapotot egy j komponenssel s kezdrtket is ad neki. Megllapods szerint az ilyen futs kzben felvett j komponensek a program befejezdsekor megsznnek: ezrt jelenik meg a fenti vgrehajtsi sorozat legvgn egy specilis lps.

    A program llapottere teht a vgrehajts sorn dinamikusan vltozik, mert a vgrehajtsnak vannak olyan lpsei, amikor egy llapotbl attl eltr komponens szm (eltr dimenzij) llapotba kerlnk. Az j llapot lehet bvebb, amikor a megelz llapothoz kpest extra komponensek jelennek meg (lsd a fenti programban az

    i: megjelenst elidz lpst), de lehet szkebb is, amikor elhagyunk korbban ltrehozott komponenseket (erre plda a fenti vgrehajts utols lpse). Megllapodunk abban, hogy a vgrehajts kezdetn ltez komponensek, azaz a kiindul llapot komponensei vgig megmaradnak, nem sznhetnek meg.

    A program kiindul- s vgllapotainak kzs tert a program alap-llapotternek nevezzk, vltozi az alapvltozk. A mkds sorn megjelen jabb komponenseket segdvltozknak fogjuk hvni. A program tartalmazhat segdvltozt megszntet specilis lpseket is, de az utols lps minden segdvltozt automatikusan megszntet. A segdvltoz megjelensekor annak rtke mg nem felttlenl definilt.

    A program az ltala befuthat sszes lehetsges vgrehajts egyttese. Rendelkezik egy alap-llapottrrel, amelyiknek brmelyik llapotbl el tud indulni, s ahhoz olyan vges vagy vgtelen vgrehajtsi sorozatokat rendel, amelyik els llapota a kiindul llapot. Ugyanahhoz a kiindul llapothoz akr tbb vgrehajtsi sorozat is tartozhat. Egy vgrehajtsi sorozat tovbbi llapotai az alap-llapottr komponensein kvl segd komponenseket is tartalmazhatnak, de ezek a vges hossz vgrehajtsok esetn legksbb az utols lpsben megsznnek, gy a vges vgrehajtsok az alap-llapottrben terminlnak.

    Egy program mkdse nem vltozik meg attl, ha mdostjuk az alap-llapotert. Egy alapvltoz ugyanis egyszeren tminsthet segdvltozv (ezt nevezzk az alap-llapottr leszktsnek), s

  • 1.4. Program fogalma

    21

    ekkor csak a program elindulsakor jn ltre, a program befejezdsekor pedig megsznik. Fordtva, egy segdvltozbl is lehet alapvltoz (ez az alap-llapottr kiterjesztse), ha azt mr eleve lteznek tekintjk, ezrt nem kell ltrehozni s nem kell megszntetni. A program alap-llapottert megllapods alapjn jelljk ki. Ebbe nemcsak a program ltal tnylegesen hasznlt, a program utastsaiban elfordul vltozk szerepelhetnek, hanem egyb vltozk is. Az ilyen vltozknak a kezd rtke tetszleges, s azt vgig megrzik a program vgrehajtsa sorn. Azt is knny beltni, hogy az alap-llapottr vltozinak neve is lecserlhet anlkl, hogy ettl a program mkdse megvltozna.

    1.5. Megolds fogalma

    Mivel mind a feladat fogalmt, mind a program fogalmt az llapottr segtsgvel fogalmaztuk meg, ez lehetv teszi, hogy egyszer meghatrozst adjunk arra, mikor old meg egy program egy feladatot.

    Tekintsk jra azt a feladatot, amelyben egy sszetett nem-nulla termszetes szm egyik valdi osztjt keressk. A feladat llapottere:

    (n:, d:), s egy (x,*) kezdllapothoz (ahol x pozitv s sszetett) azokat az (x,y) clllapotokat rendeli, ahol a y rtke osztja az x-et, de nem 1 s nem x. Az elz alfejezet els programjnak llapottere megegyezik e feladatval. A feladat brmelyik kezd llapotbl is indtjuk el a program mindig terminl, s olyan llapotban ll meg, ahol a d rtke vagy a legkisebb, vagy a legnagyobb valdi osztja az n kezdrtknek. Pldul a program a (12,8) kiindul llapotbl elindulva nem-determinisztikus mdon vagy a (12,2), vagy a (12,6) vgllapotban fog megllni, mikzben a feladat a (12,8) kezdllapothoz a (12,2), (12,3), (12,4), (12,6) clllapotokat jelli ki. A program egy vgrehajtsa teht ezek kzl tall meg mindig egyet, azaz megoldja a feladatot.

    Egy program akkor old meg egy feladatot, ha a feladat

    brmelyik kezdllapotbl elindulva biztosan terminl, s olyan llapotban ll meg, amelyet clllapotknt a feladat az adott

  • 1. Programozsi alapfogalmak

    22

    kezdllapothoz rendel.2 Ahhoz, hogy a program megoldjon egy feladatot, nem szksges, hogy egy adott kezdllapothoz tartoz sszes clllapotot megtallja, elg csak az egyiket.

    A program nem-determinisztikussga azt jelenti, hogy ugyanazon llapotbl indulva egyszer ilyen, msszor olyan vgrehajtst futhat be. A megoldshoz az kell, hogy brmelyik vgrehajts is kvetkezik be, az megfelel clllapotban lljon meg. Nem oldja meg teht a program a feladatot akkor, ha a feladat egy kezdllapotbl indt ugyan egy clllapotba vezet mkdst, de emellett egy msik, nem clllapotban megll vagy egyltaln nem terminl vgrehajtst is produkl.

    A megolds vizsglata szempontjbl kzmbs, hogy azokbl az llapotokbl indulva, amelyek nem kezdllapotai a feladatnak, hogyan mkdik a program. Ilyenkor mg az sem szmt, hogy megll-e egyltaln a program. Ezrt nem baj, hogy a (0,*) s az (1,*) alak llapotokbl indulva a vizsglt program nem is biztos, hogy terminl. Az is kzmbs, hogy egy olyan (x,*) llapotbl indulva, ahol x egy prmszm, a program vagy az x-et, vagy az 1-et tallja meg, azaz nem tall valdi osztt.

    A megolds tnyt az sem befolysolja, hogy a program a mkdse kzben mit csinl, mely llapotokat rinti, milyen segdvltozkat vezet be; csak az szmt, hogy honnan indulva hov rkezik meg, azaz a feladat kezdllapotaibl indulva megll-e, s hol. A (4,*) alak llapotokbl kt klnbz vgrehajts is indul, de mindkett a (4,2) llapotban ll meg, hiszen a 2 a 4-nek egyszerre a legkisebb s legnagyobb valdi osztja. A (6,*) alak llapotokbl kt olyan vgrehajts indul, amelyeknek a vgpontja is klnbzik, de mindkett a (6,*)-hoz tartoz clllapot.

    A programnak azt a tulajdonsgt, amely azt mutatja meg, hogy mely llapotokbl indulva fog biztosan terminlni, s ezen llapotokbl indulva mely llapotokban ll meg, a program hatsnak nevezzk. Egy program hatsa figyelmen kvl hagyja azokat az llapotokat s az abbl indul sszes vgrehajtst, amely llapotokbl vgtelen hossz vgrehajts is indul, a tbbi vgrehajtsnak pedig nem mutatja meg a

    2 Ismert a megoldsnak ennl gyengbb meghatrozsa is, amelyik nem

    kveteli meg a lellst, csak azt, hogy ha a program lell, akkor egy megfelel clllapotban tegye azt.

  • 1.5. Megolds fogalma

    23

    belsejt, csak a vgrehajts kiindul s vgllapott. Egy program hatsa termszetesen attl fggen vltozik, hogy mit vlasztunk a program alap-llapotternek. Ekvivalensnek akkor mondunk kt programot, ha brmelyik kzs alap-llapottren megegyezik a hatsuk.

    Ahhoz, hogy egy feladatot megoldjunk egy programmal, a

    program alapvltozinak a feladat (bemen s eredmny) vltozit kell vlasztanunk. A program ugyanis csak az alapvltozin keresztl tud a krnyezetvel kapcsolatot teremteni, csak egy alapvltoznak tudunk kvlrl kezdrtket adni, s egy alapvltozbl tudjuk a terminls utn az eredmnyt lekrdezni. Ezrt a megolds defincijban feltteleztk, hogy a feladat llapottere megegyezik a program alap-llapottervel. A programozsi gyakorlatban azonban sokszor elfordul, hogy egy feladatot egy olyan programmal akarunk megoldani, amelyik llapottere nem azonos a feladatval, bvebb vagy szkebb annl. A megolds fogalmt ezekben az esetekben gy ellenrizzk, hogy elszr a program alap-llapottert a feladathoz igaztjuk, vagy kiterjesztjk, vagy leszktjk (esetleg egyszerre mindkettt) a feladat llapotterre.

    Abban az esetben, amikor a program alap-llapottere bvebb, mint feladat, azaz van a programnak olyan alapvltozja, amely nem szerepel a feladat llapotterben (ez a vltoz nem kommunikl a feladattal: nem kap tle kezd rtket, nem ad neki eredmnyt), akkor ezt a vltozt a program segdvltozjv minstjk. J plda erre az, amikor rendelkeznk egy programmal, amely egy napon keresztl rnknt mrt hmrskleti adatokbl ki tudja szmolni a napi tlaghmrskletet s a legnagyobb hingadozst, ugyanakkor a megoldand feladat csak az tlaghmrsklet kiszmolst kri. A program alap-llapottere teht olyan komponenst tartalmaz, amely a feladatban nem szerepel (ez a legnagyobb hingadozs), ez a feladat szempontjbl rdektelen. A program els lpsben hozzveszi a feladat egy kezdllapothoz a legnagyobb hingadozst, ezutn a program ugyangy szmol vele, mint eredetileg, de a meglls eltt elhagyja ezt a komponenst, hiszen a feladat clllapotban ennek nincs helye; a legnagyobb hingadozs teht segdvltoz lett.

    A msik esetben amikor a feladat llapottere bvebb a program alap-llapotternl a program llapottert kiegsztjk a feladat llapotternek azon komponenseivel, amelyek a program llapotterben nem szerepelnek. Ha egy ilyen j komponens segdvltozknt szerepelt az eredeti programban, akkor ez a kiegszts a segdvltozt

  • 1. Programozsi alapfogalmak

    24

    a program alapvltozjv emeli. Ha az j vltoz segdvltozknt sem szerepelt eddig a programban, akkor ez a vltoz a program ltal nem hasznlt j alapvltoz lesz, azaz kezdeti rtke vgig megrzdik egy vgrehajts sorn. De vajon van-e olyan feladat, amelyet gy meg lehet oldani? Taln meglep, de van. Ilyen az, amikor egy sszetett feladat olyan rsznek a megoldsval foglalkozunk, ahol az sszetett feladat bizonyos komponenseit ideiglenesen figyelmen kvl hagyhatjuk, de attl mg azok a rszfeladat llapotternek komponensei maradnak, s szeretnnk, ha az rtkk nem vltozna meg a rszfeladatot megold program mkdse sorn.

    Az itt bevezetett megolds definci egy logikus, a gyakorlatot jl modellez fogalom. Egyetlen problma van vele: a gyakorlatban trtn alkalmazsa szinte lehetetlen. Nehezen kpzelhet ugyanis az el, hogy egy konkrt feladat s program ismeretben (miutn a program alap-llapottert a feladat llapotterhez igaztottuk), egyenknt megvizsgljuk a feladat sszes kezdllapott, hogy az abbl indtott program ltali vgrehajtsok megfelel clllapotban llnak-e meg. Ezrt a kvetkez kt fejezetben bevezetnk mind a feladatok, mind a programok lersra egy-egy sajtos eszkzt, majd megmutatjuk, hogy ezek segtsgvel hogyan lehet igazolni azt, hogy egy program megold egy feladatot.

  • 1.6. Feladatok

    25

    1.6. Feladatok

    1.1. Mi az llapottere, kezdllapotai, adott kezdllapothoz tartoz clllapotai az albbi feladatnak?

    Egy egyenes vonal egyenletesen halad piros Opel s kilomtert t id alatt tesz meg. Mekkora az tlagsebessge?

    1.2. Mi az llapottere, kezdllapotai, adott kezdllapothoz tartoz clllapotai az albbi feladatnak?

    Adjuk meg egy termszetes szmnak egy valdi prm osztjt!

    1.3. Tekintsk az A = (n:, f:) llapottren az albbi programot!

    1. Legyen f rtke 1 2. Amg n rtke nem 1 addig

    2.a. Legyen f rtke f*n 2.b. Cskkentsk n rtkt 1-gyel!

    rjuk fel e program nhny vgrehajtst! Hogyan lehetne a vgrehajtsokat ltalnosan jellemezni? Megoldja-e a fenti program azt a feladatot, amikor egy pozitv egsz szmnak kell a faktorilist kiszmolni?

    1.4. Tekintsk az A = (x:, y:) llapottren az albbi programot!

    1. Legyen x rtke x-y 2. Legyen y rtke x+y 3. Legyen x rtke y-x

    rjuk fel e program nhny vgrehajtst! Hogyan lehetne a vgrehajtsokat ltalnosan jellemezni? Megoldja-e a fenti program azt a feladatot, amikor kt, egsz tpus vltoz rtkt kell kicserlni?

    1.5. Tekintsk az albbi kt feladatot:

    1) Adjuk meg egy 1-nl nagyobb egsz szm egyik osztjt! 2) Adjuk meg egy sszetett termszetes szm egyik valdi osztjt!

    Tekintsk az albbi hrom programot az A = (n:, d:) llapottren:

  • 1. Programozsi alapfogalmak

    26

    1) Legyen a d rtke 1 2) Legyen a d rtke n 3) Legyen a d rtke n-1. Amg a d nem osztja n-t addig cskkentsk a d-t.

    Melyik program melyik feladatot oldja meg? Vlaszt indokolja!

    1.6. Tekintsk az A=(m:+, n:+, x:) llapottren mkd albbi programokat!

    1) Ha mn, akkor legyen az x rtke elszr a (-1)n, majd adjuk hozz a (-1)n+1-t, utna a (-1)n+2-t, s gy tovbb, vgl a (-1)m-t!

    2) Legyen az x rtke a ((-1)m+ (-1)n)/2!

    rjuk fel e programok nhny vgrehajtst! Lssuk be, hogy mindkt program megoldja az albbi feladatot: Kt adott nem nulla termszetes szmhoz az albbiak szerint rendelnk egsz szmot: ha mindkett pros, adjunk vlaszul 1-et; ha pratlanok, akkor -1-et; ha paritsuk eltr, akkor 0-t!

    1.7. Tekintsk az 1,2,3,4,5A llapottren az albbi fiktv

    programot. (Itt tnyleg egy programot adunk meg, amelybl kiolvashat, hogy az egyes llapotokbl indulva az milyen vgrehajtsi sorozatot fut be.)

    5,2,3,455,3,455,2,45

    4,1,5,4,2414,3,1,2,5,44,1,5,1,44

    3,3,...32,422,12

    1,3,2,...11,4,3,5,211,2,4,51

    S

    Az F feladat az albbi kezd-clllapot prokbl ll: {(2,1) (4,1) (4,2) (4,4) (4,5)}. Megoldja-e az S program az F feladatot?

    1.8. Legyen S olyan program, amely megoldja az F feladatot! Igaz-e,

    hogy

  • 1.6. Feladatok

    27

    a) ha F nem determinisztikus, akkor S sem az?

    b) ha F determinisztikus, akkor S is az?

    1.9. Az S1 bvebb, mint az S2, ha S2 minden vgrehajtst tartalmazza. Igaz-e, hogy ha az S1 program megoldja az F feladatot, akkor azt

    megoldja az S2 is.

    1.10. Az F1 bvebb, mint az F2, ha F2 minden kezd-clllapot prjt tartalmazza. Igaz-e, hogy ha egy S program megoldja az F1

    feladatot, akkor megoldja az F2-t is.

  • 28

    2. Specifikci

    Ebben a fejezetben azzal foglalkozunk, hogy hogyan lehet egy

    feladat kezdllapotait a megolds ellenrzsnek szempontjbl csoportostani, halmazokba rendezni gy, hogy elg legyen egy-egy ilyen halmaznak egy tetszleges elemre ellenrizni azt, hogy onnan indulva az adott program megfelel helyen ll-e meg. Ehhez a feladatnak egy sajtos formj megfogalmazsra, a feladat specifikcijra lesz szksg.

    2.1. Kezdllapotok osztlyozsa

    A megolds szempontjbl egy feladat egy kezdllapotnak legfontosabb tulajdonsga az, hogy milyen clllapotok tartoznak hozz. Megfigyelhet, hogy egy feladat klnbz kezdllapotokhoz sokszor ugyanazokat a clllapotokat rendeli. Kzenfekvnek ltszik, hogy ha egy csoportba vennnk azokat a kezdllapotokat, amelyekhez ugyanazok a clllapotok tartoznak, akkor a megolds ellenrzst nem kellene a kezdllapotokon kln-kln elvgezni, hanem elg lenne az gy keletkez csoportokat egyben megvizsglni: azt kell beltni, hogy a feladat kezdllapotainak egy-egy ilyen csoportjbl elindulva a program megfelel clllapotban ll-e meg.

    Tekintsnk pldaknt egy mr korbban szerepl feladatot: Egy adott sszetett szmnak keressk egy valdi osztjt! A feladat

    llapottere (n:, d:). Az llapotok egyszerbb jellse rdekben rgztsk a fenti sorrendet a komponensek kztt: egy llapot els komponense a megadott szm, a msodik a valdi oszt. Kssk ki, hogy az els komponens kezdrtke a clllapotokban is megmaradjon.

    Az 2.1. brn egy derkszg koordintarendszer I. negyedvel brzoljuk ezt az llapotteret, hiszen ebben minden egsz koordintj rcspont egy-egy llapotot szimbolizl. (A feladat csak azokban az llapotokban rtelmezett, ahol az els komponens sszetett szm.) Kln koordintarendszerbe rajzoltuk be a feladat nhny kezdllapott, s kln egy msikban az ezekhez hozzrendelt clllapotokat. Az bra jl tkrzi vissza azt, hogy a feladat llapotokhoz llapotokat rendel lekpezs.

  • 2.1. Kezdllapotok osztlyozsa

    29

    {(0, *)} {(4, *)} {(6, *)}

    d

    (6,8)

    (6,3)

    n 1 2 3 4 5 6

    d

    F

    (6,3)

    {(0, *)} (4,2) (6,2)

    n 1 2 3 4 5 6

    2.1. bra

    Egy feladat: Keressk egy sszetett szm valdi osztit.

    A feladat pldul a (6,8) kezdllapothoz a (6,3) s a (6,2) clllapotokat rendeli. De ugyanezek a clllapotok tartoznak a (6,6), a (6,3) vagy a (6,127) kezdllapotokhoz is, mivel ezek els komponensben ugyancsak a 6 ll. Teht az sszes (6,*) alak llapot (a

    * itt egy tetszleges rtket jell) ugyanazon csoportba (halmazba) sorolhat az alapjn, hogy hozzjuk egyformn a (6,3) s a (6,2) clllapotokat rendeli a feladat. gyis fogalmazhatunk, hogy a feladat a

  • 2. Specifikci

    30

    {(6,*)} halmaz elemeihez a {(6,3), (6,2)} halmaz elemeit rendeli. Ezen

    megfontols alapjn kln csoportot kpeznek a (0,*), a (4,*), a (6,*) alak llapotok is, ltalnosan fogalmazva azok az (n,*) alak kezdllapotok, ahol az n sszetett szm. Ezt lthatjuk 2. bra fels rszn. Nem kerl viszont bele egyetlen ilyen halmazba sem pldul az (1,1) vagy a (3,5) llapot, hiszen ezek nem kezdllapotai a feladatnak. (Knny megmutatni, hogy ez a csoportosts matematikai rtelemben egy osztlyozs: minden kezdllapot pontosan egy halmazhoz (csoporthoz) tartozik.)

    Amikor a feladathoz megold programot keresnk, azt kell beltnunk, hogy minden ilyen halmaz egyik (tetszleges) elembl (ez teht a feladat egy kezdllapota) indulva a program a feladat ltal kijellt valamelyik clllapotban ll meg. Ha gyesek vagyunk, akkor elg ezt a vizsglatot egyetlen jl megvlasztott halmazra elvgezni, mondjuk az ltalnos (n,*) alak kezdllapotok halmazra, ahol az n sszetett szm.

    ltalban egy feladat kezdllapotainak a fent vzolt halmazait nem knny ellltani. Ennek illusztrlsra tekintsk azt a pldt (lsd 1.1. feladat), amikor egy egyenes vonal egyenletes mozgst vgz testnek kell az tlagsebessgt kiszmolni a megtett t s az eltelt id fggvnyben. Ennek a feladatnak az llapottere (s:, t:, v:), ahol a komponensek rendre az t (s), az id (t), s a sebessg (v). (Rgztjk ezt a sorrendet a komponensek kztt.) A kezdllapotokban az els komponens nem lehet negatv, a msodik komponensnek pedig pozitvnak kell lennie.

    Melyek azok a kezdllapotok, amelyekhez ez a feladat a (*,*,50) alak clllapotokat rendeli? Nem is olyan knny erre a vlasz. A (100,2,*) alak kezdllapotok ilyenek, a (200,4,*) alakak is. Ismerve a feladat megoldshoz hasznlt v=s/t kpletet (ezt a kpletet csak az ilyen egyszer feladatok esetben ltjuk ilyen vilgosan), kis gondolkods utn kitallhatjuk, hogy az (50a,a,*) alak kezdllapotokhoz (ahol a egy tetszleges pozitv vals szm), s csak azokhoz rendeli a feladat a (*,*,50) alak clllapotokat.

    De nem lehetne-e ennl egyszerbben, az eredmnyt kiszmol kplet alkalmazsa nlkl csoportostani a kezdllapotokat? Mirt ne tekinthetnnk kln csoportnak a (100,2,*) kezdllapotokat, s kln a (200,4,*) kezdllapotokat? Mindkett halmazra teljesl, hogy a benne lev kezdllapotokhoz ugyanazon clllapotok tartoznak. Igaz, hogy

  • 2.1. Kezdllapotok osztlyozsa

    31

    ezen clllapotok mindkt csoport esetben ugyanazok, de mirt lenne ez baj? Ezek kijellshez csak azt kell tudnunk, hogy a feladat els kt adata a bemen adat, az eredmny kiszmolsnak kplete nem kell. Azonos bemen adatokhoz ugyanis ugyanazon eredmny tartozik, teht azonos bemen adatokbl felptett kezdllapotokhoz a feladat ugyanazokat a clllapotokat rendeli. Az azonos bemen adatokbl felptett kezdllapotok halmazai is osztlyozzk a kezdllapotokat, hiszen minden kezdllapot pontosan egy ilyen halmazhoz tartozik. Ezrt ha a feladat kezdllapotainak minden ilyen halmazrl belthat, hogy belle indulva a program megfelel clllapotban ll-e meg, akkor igazoltuk, hogy a vizsglt program megoldja a feladatot.

    Termszetesen ilyenkor sem kell az sszes halmazt megvizsglni. Elg egy ltalnos halmazzal foglalkozni. Rgztsk a pldnk bemen adatainak rtkeit az s, t tetszlegesen kivlasztott nem negatv paramterekkel, ahol t nem lehet nulla. Egy vizsglt program akkor oldja meg a feladatot, ha az {(s,t,*)} llapot-halmazbl kiindulva a program az {(*,*, s/t)} llapot-halmaz valamelyik llapotban ll meg.

    Nha tallkozhatunk olyan feladattal is, amelynek nincsenek bemeneti adatai. Ilyen pldul az, amikor egy prmszmot keresnk.

    Ennek a feladatnak az llapottere a lehetsges vlaszoknak az N halmaza. Itt a vlasz nem fgg semmilyen bemeneti rtktl. Az sszes llapot teht egyben kezdllapot is, amelyeket egyetlen halmazba foghatunk ssze, hiszen mindegyikhez ugyanazon clllapotok, a prmszmok tartoznak.

    2.2. Feladatok specifikcija

    Vegyk el jra azt a feladatot, amikor az egyenes vonal egyenletes mozgst vgz testnek a megtett t s az eltelt id fggvnyben kell az tlagsebessgt kiszmolni! A feladat lnyeges adatai a megtett t, az eltelt id s az tlagsebessg. Ennek megfelelen

    a feladat llapottere a vltozkkal: A = (s:, t:, v:). Bemen adatai a megtett t (s) s az eltelt id (t). Rgztsnk a bemen adatok szmra egy-egy tetszlegesen kivlasztott rtket! Legyen az t esetn ez az s, az id esetn a t, ahol egyik sem lehet negatv, st a t nulla sem. A kezdllapotoknak az s, t bemen adatokkal rendelkez rszhalmaza az {(s,t,*)}, az ezekhez tartoz clllapotok pedig a {(*,*, s/t)}.

  • 2. Specifikci

    32

    A kezdllapotoknak s a clllapotoknak a fent vzolt halmazait logikai lltsok (felttelek) segtsgvel is megadhatjuk. A logikai lltsok minden esetben az llapottr llapotait minstik: ha egy llapot kielgti a logikai lltst, azaz a logikai llts igaz rtket rendel hozz, akkor az benne van a logikai llts ltal jelzett halmazban. Pldul a {(100,2,*)} halmazt az s=100 s t=2 logikai lltssal, a {(200,4,*)} halmazt az s=200 s t=4 lltssal is jellhetjk. ltalban az {(s,t,*)} halmazt az s=s s t=t llts rja le, a {(*,*, s/t)} halmazt pedig a v=s/t. Ha ki szeretnnk ktni, hogy az t hossza nem negatv s az id pozitv, akkor a fenti lltsok mell oda kell rnunk azt is, hogy s0 s t>0. A kezdllapotokat ler elfelttelt Ef-fel, a clllapotokat ler utfelttelt Uf-fel fogjuk jellni. Megfigyelhet, hogy mindkett felttel a vltozkra fogalmaz meg megszortsokat. Ha egy vltozt egy felttel nem emlt, az azt jelzi, hogy arra a vltozra nzve nincs semmilyen megkts, azaz annak az rtke tetszleges lehet. Pldnk elfelttelben ilyen a v, az utfelttelben az s s a t.

    Tmren lerva az eddig elmondottakat a feladatnak az albbi gynevezett specifikcijhoz jutunk:

    A = (s:, t:, v:) Ef = (s=s s t=t s s0 s t>0) Uf = (v= s/t)

    A feladat specifiklsa sorn meghatrozzuk a bemen adatok tetszlegesen rgztett rtkeihez tartoz kezdllapotok halmazt, valamint az ehhez tartoz clllapotok halmazt. A feladat specifikcija tartalmazza:

    1. az llapotteret, azaz a feladat lnyeges adatainak tpusrtk-halmazait az egyes adatokhoz tartoz vltoz nevekkel egytt;

    2. az elfelttelt, amely a kezdllapotok azon halmazt ler logikai llts, amely rgzti a bemen vltozk egy lehetsges, de tetszleges kezdrtkt (ezeket ltalban a megfelel vltoznv vesszs alakjval jelljk);

    3. az utfelttelt, amely a fenti kezdllapotokhoz rendelt clllapotok halmazt megad logikai llts.

    Meg lehet mutatni, hogy ha rendelkeznk egy feladatnak a specifikcijval s tallunk olyan programot, amelyrl belthat, hogy egy az elfelttelt kielgt llapotbl elindulva a program az

  • 2.2. Feladatok specifikcija

    33

    utfelttelt kielgt valamelyik llapotba kerl, akkor a program megoldja a feladatot. Ezt mondja ki a specifikci ttele.

    Egy feladat llapotterben megjelen vltozk minsthetek abbl a szempontbl, hogy bemen illetve kimen vltozk-e vagy sem. Ugyanaz a vltoz lehet egyszerre bemen is s kimen is. A bemen vltozk azok, amelyeknek a feladat elfelttele kezdrtket rendel, amelyek explicit mdon megjelennek az elfelttelben. Az utfelttelben explicit mdon megjelen vltozk kzl azok a kimen vltozk, amelyekre nincs kiktve, hogy rtkk megegyezik az elfelttelben rgztett kezdrtkkkel.

    * * *

    Specifikljuk most azt a feladatot, amikor egy sszetett szm legnagyobb valdi osztjt keressk. A feladatnak kt lnyeges adata van: az adott termszetes sszetett szm s a keresett valdi oszt. Mindkt adat termszetes szm tpus. Ezt a tnyt rgzti az llapottr.

    A = (n:, d:)

    A kt adat kzl az els a bemeneti, a msodik a kimeneti adat. Legyen n a tetszlegesen kivlasztott bemen rtk. Mivel a feladat nem rtelmes a 0-ra, az 1-re s a prmszmokra; ezrt az n csak sszetett szm lehet. Az elfelttel:

    Ef = ( n = n s n sszetett szm )

    Kikthetjk, hogy a clllapot els komponensnek, azaz a bemeneti adatnak rtke ne vltozzon meg, maradjon tovbbra is n; a msodik adat pedig legyen az n legnagyobb valdi osztja:

    Uf = ( Ef s d valdi osztja n-nek s brmelyik olyan k szm esetn, amelyik nagyobb mint d, a k nem valdi osztja n-nek )

    Ha elemi matematikai jellssel akarjuk az lltsainkat megfogalmazni, azt is megtehetjk. Az utfelttelben egy oszt

    "valdi" voltt egyszeren kifejezhetjk a d [2..n1] lltssal, hiszen az n szm valdi oszti csak itt helyezkedhetnek el. (Vlaszthatnnk a [2..n div 2] intervallumot is, ahol az n div 2 az n felnek egszrtke.) Ha az intervallum egy eleme osztja az n-nek, akkor valdi osztja is.

    Alkalmazzuk a d n jellst arra, hogy a d osztja az n-nek. Ennek megfelelen pldul azt az lltst, hogy a "d valdi osztja n-nek" gy

    is rhatjuk, hogy "d [2..n1] s d n". Aki otthonosan mozog az elsrend logika nyelvben, tmrebben is felrhatja a specifikci

  • 2. Specifikci

    34

    lltsait, ha hasznlja a logikai mveleti jeleket. Ez termszetesen nem vltoztat a specifikci jelentsn. (Az elfelttelnl kihasznljuk azt, hogy egy szm sszetettsge azt jelenti, hogy ltezik a szmnak valdi osztja.) Ennek megfelelen az el- s az utfelttelt az albbi formban is felrhatjuk:

    Ef = ( n = n k [2..n1]: k n )

    Uf = ( Ef d [2..n1] d n k [d+1..n1] : k n )

    Az el- s utfelttelben megjelen k a specifikci egy olyan eszkze (formula vltozja), amelyet lltsaink precz

    megfogalmazshoz hasznlunk. A k [a..b]:tulajdonsg(k) (van olyan, ltezik olyan k egsz szm az a s b kztt, amelyre igaz a tulajdonsg(k)) formula azt az lltst rja le, hogy a s b egsz szmok kz es egsz szmok egyike kielgti az adott tulajdonsgot. A

    k [a..b]:tulajdonsg(k) (brmelyik", "minden olyan" k egsz szm az a s b kztt, amelyre igaz a tulajdonsg(k)) formula azt jelenti, hogy a s b egsz szmok kz es mindegyik egsz szm kielgti az adott tulajdonsgot.

    A formulk helyes rtelmezshez rgzteni kell a kifejezsekben hasznlt mveleti jelek kztti precedencia sorrendet. Az ltalunk alkalmazott sorrend kiss eltr a matematikai logikban szoksostl, amennyiben az implikcit szorosabban kt mveletnek tekintjk, mint a konjunkcit (logikai s-t). Ennek az oka az, hogy viszonylag sokszor fogunk olyan lltsokat rni, ahol implikcis formulk lesznek sszeselve, s zavar lenne, ha kifejezseinkben tl sok

    zrjelet kellene hasznlni. Pldul a d n l d [2..n1] kifejezst a

    matematikai logikban a d n (l d [2..n1]) formban kellene

    rni.. A logikai mveleti jelek precedencia sorrendje teht: , , , ,

    , . A knyvben hasznlt jellseknl a kettspont a kvantorok ( , ) hatsnak lershoz tartoz jel. Ezrt alkot egyetlen sszetartoz

    kifejezst a k [2..n1] : k n .

    A kifejezsek tartalmazhatnak a logikai mveleteken kvl egyb mveleteket is. Ezek prioritsa megelzi a kt-argumentum logikai mveleti jelekt. Ilyen pldul a nem logikai rtk kifejezsek

    egyenlsgt vizsgl (=) opertor is, ezrt rhatjuk az x = y z = y

    kifejezst az (x = y) (z = y) kifejezs helyett. Az egyb, nem logikai mveletek kztt ez az egyenlsg opertor az utols a precedencia sorban, ezrt senki ne olvassa pldul az x+y = z kifejezst x + (y = z) kifejezsnek. Nem fogjuk megklnbztetni a nem logikai rtkek

  • 2.2. Feladatok specifikcija

    35

    egyenlsg opertort a logikai rtkek egyenlsg opertortl Erre a

    matematikai logikban az ekvivalencia ( ) mveleti jelet szoktk hasznlni. A szvegkrnyezetbl mindig kiderl, hogy melyik egyenlsg opertorrl van sz, legfeljebb zrjelezssel tesszk majd a formulinkat egyrtelmv. Ez egyben azt is jelenti az egyenlsg opertor precedencija jobb, mint az implikcij.

    Sokszor segt, ha a specifikci felrshoz bevezetnk nhny sajt jellst is. Br ezeket kln definilni kell, de hasznlatukkal olvashatbb, tmrebb vlik a formlis lers. Ha pldul az sszetett(n) azt jelenti, hogy az n termszetes szm egy sszetett szm

    (az sszetett(n) pontosan akkor igaz, ha k [2..n1]: k n), az LVO(n) pedig megadja egy sszetett n termszetes szm legnagyobb valdi osztjt, akkor az elz specifikci az albbi formban is lerhat.

    Ef = ( n = n sszetett(n) )

    Uf = ( Ef d = LVO(n) )

    Mdostsuk az elz feladatot az albbira: Keressk egy termszetes szm legnagyobb valdi osztjt. (Teht nem biztos, hogy van az adott szmnak egyltaln valdi osztja.) Itt az llapottrbe az elz feladathoz kpest egy logikai komponenst is fel kell vennnk, ami azt jelzi majd a clllapotban, hogy van-e egyltaln legnagyobb valdi osztja a megadott termszetes szmnak. Az elfelttel most nem tartalmaz semmilyen klnleges megszortst. Az utfelttel egyrszt bvl az l vltoz rtknek meghatrozsval (l akkor igaz, ha n sszetett), msrszt a d vltoz rtkt csak abban az esetben kell specifiklnunk, ha az l rtke igaz. Ha sszevetjk a specifikcit az elz feladat specifikcijval, akkor azt vehetjk szre, hogy az n sszetettsgt vizsgl llts ott az elfelttelben, itt az utfelttelben jelenik meg.

    A = (n:, l: , d:) Ef = ( n = n )

    Uf = ( n = n l = k [2..n1]: k n

    l ( d [2..n1] d n k [d+1..n1]: k n) )

    A fenti specifikci olvashatbb vlik, ha az elz feladatnl bevezetett sszetett s LVO jellseket hasznljuk:

  • 2. Specifikci

    36

    A = (n:, l: , d:) Ef = ( n=n )

    Uf = ( n=n l=sszetett(n) l d=LVO(n) )

    Ugyanazt a feladatot tbbflekppen is lehet specifiklni. Minl sszetettebb egy problma, annl vltozatosabb lehet a lersa. A kvetkez igen egyszer pldt hromflekppen specifikljuk: nveljnk meg egy egsz szmot eggyel. Az els kt vltozatban kln komponens kpviseli a bemen (a vltoz) s kln a kimen adatot (b vltoz). Az els vltozat nem tartalmaz semmi klnset a korbbi specifikcikhoz kpest. A bemeneti adat megrzi a kezd rtkt a clllapotban is, ezrt a kimeneti vltoz rtknek meghatrozsnl mindegy, hogy a bemeneti vltoz vagy a paramter vltoz rtkre hivatkozunk. A msodik specifikcinl nem kveteljk meg, hogy az a vltoz ne vltozzon meg, ezrt a b vltoz rtknek meghatrozsnl az a vltoz kezd rtkt jelz a' paramtert kell hasznlnunk. Egszen ms felfogson alapul a harmadik specifikci. Ez gy rtelmezi a feladatot, hogy van egy adat, amelynek rtkt helyben kell megnvelni eggyel. Ilyenkor az llapottr egykomponens s az utfelttel megfogalmazsnl elengedhetetlenl fontos, hogy a kezdrtket rgzt paramter hasznlata. Ez a specifikci rvilgt arra is, hogy egy feladatban nem felttlenl klnlnek el a bemeneti s a kimeneti adatok.

    A = (a:, b:) A = (a:, b:) A = (a:) Ef = ( a=a ) Ef = ( a=a ) Ef = ( a=a )

    Uf = ( a=a b=a+1 ) Uf = ( b=a+1 ) Uf = ( a=a+1 )

    Vgl egy bemeneti adat nlkli feladat: Adjunk meg egy prmszmot!

    A = (p:) Ef =( igaz )

    Uf =( p egy prmszm ) = ( k [2..p-1] : (k p) )

    Ez a specifikci az sszes llapotot kezdllapotnak tekinti, amelyek mindegyikhez az sszes prmszmot rendeli. Az elfelttel egy azonosan igaz llts, hiszen semmilyen korltozst nem kell bevezetni a p vltozra, az kezdetben tetszleges rtket vehet fel, amelytl nem fgg az eredmny. ( Az utfelttelben a [2..p-1]

    intervallum helyett rhatnnk a [2.. n ] intervallumot is.)

  • 2.3. Feladatok

    37

    2.3. Feladatok

    2.1. Mit rendel az albb specifiklt feladat a (10,1) s a (9,5) llapotokhoz? Fogalmazza meg szavakban a feladatot! (prm(x) = x prmszm.)

    A = (k:, p:) Ef = ( k=k k>0 )

    Uf = ( k=k prm(p) i>1: prm(i) k-i k-p )

    2.2. rja le szvegesen az albbi feladatot! (A perm(x') az x' permutciinak halmaza.)

    A = (x:n) Ef = ( x=x' )

    Uf = ( x perm(x') i,j [1..n]: i

  • 38

    3. Strukturlt programok

    Ebben a fejezetben azt vizsgljuk meg, hogy ha egy programot meglev programokbl ptnk fel meghatrozott szablyok alapjn, akkor hogyan lehet eldnteni rluk, hogy megoldanak egy kitztt feladatot. Ennek rdekben elszr meghatrozzuk az elemi program fogalmt, definilunk nhny nevezetes elemi programot, majd hromfle ptsi szablyt, gynevezett programszerkezetet (szekvencia, elgazs, ciklus) mutatunk az sszetett programok ksztsre. Ezekkel a szablyokkal fokozatosan pthetnk fel egy programot: elemi programokbl sszetettet, az sszetettekbl mg sszetettebbeket. Az ilyen programokat sajtos, egymsba gyazd, ms nven strukturlt szerkezetk miatt strukturlt programoknak hvjk.

    Strukturlt programokat tbbflekppen is le lehet rni. Mi egy sajtos, a program szerkezett, struktrjt a kzppontba llt, a fent emltett hrom szerkezeten kvl ms szerkezetet meg nem enged absztrakt lerst, a struktogrammokat fogjuk erre a clra hasznlni. Ez a programlers egyszer, knnyen elsajtthat, s termszetes mdon fordthat le ismert programozsi nyelvekre, azaz brmelyik konkrt programozsi krnyezetben jl hasznlhat; egyszerre illeszkedik az emberi gondolkodshoz s a magas szint programozsi nyelvekhez.3

    A struktogramm egy program lersra szolgl eszkz, de felfoghat a megoldand feladat egyfajta lersnak is. Egy program ksztsekor ugyanis a feladatot prbljuk meg rszfeladatokra bontani s meghatrozni, hogy a rszfeladatok megoldsait, hogyan, melyik

    3 A modellnkben bevezetett program fogalma annyira ltalnos, hogy

    nem minden ilyen program rhat le struktogramm segtsgvel. Ez nem a struktogramm-lers hibja, ugyanis ezen programok ms eszkzkkel (folyamatbra, C++ nyelv vagy Turing gp) sem rhatk le. A Church-Turing tzis szerint csak a parcilis rekurzv fggvnyeket kiszmt (megold) programok algoritmizlhatk. Ezek mind lerhatk folyamatbrkkal; a Bhm-Jaccopini ttele szerint pedig, brmelyik folyamatbrval megadott program struktogrammal is lerhat. A struktogramm teht azon tl, hogy a programokat egy jl ttekinthet szerkezetet segtsgvel adja meg, egy kellen ltalnos eszkz is: brmely algoritmizlhat program lerhat vele.

  • 39

    programszerkezet segtsgvel kell egy programm pteni. A programtervezs kzbls szakaszban teht egy struktogramm nem elemi programokbl, hanem megoldand rszfeladatokbl pti fel a programot. Ez azrt nem ellentmonds, mert elmletben minden feladat megoldhat egy elemi programmal (lsd 3.3. alfejezet), s ezrt csak nzpont krdse, hogy egy rszfeladatot feladatnak vagy programnak tekintnk-e.

    A programkszts sorn lpsrl lpsre jelennek meg az egyre mlyebben begyazott programszerkezetek, ami a feladat egyre finomabb rszletezsnek eredmnye. Ezltal a program kvlrl befel haladva, gynevezett fellrl-lefele (top-down) elemzssel szletik. A feladat finomtsnak vgn a struktogrammban legbell lev, szerkezet nlkli egysgeknek mr magtl rtetden megoldhat rszfeladatokat kell kpviselnik.

  • 3. Strukturlt programok

    40

    3.1. Elemi programok

    Elemi programoknak azokat a programokat nevezzk, amelyek vgrehajtsai nagyon egyszerek; mkdsket egy vagy kett hossz azonos llapotter llapotsorozatok vagy a kiindul llapotot vgtelen sokszor ismtl (abnormlisan) vgtelen sorozatok jellemzik.

    3.1.1. res program

    Az res program a legegyszerbb elemi program. Ez az gynevezett semmit sem csinl program brmelyik llapotbl indul is el, abban az llapotban marad; vgrehajtsai a kiindul llapotbl ll egyelem sorozatok. Az res programot a tovbbiakban SKIP-pel jelljk. Nyilvnval, ahhoz, hogy semmit sem csinlva eljussunk egy llapotba, mr eleve abban az llapotban kell lennnk.

    A gyakorlatban kitztt feladatok azonban jval bonyolultabbak annl, hogy azokat res programmal megoldhassuk. Gyakori viszont az, hogy egy feladat rszekre bontsnl olyan rszfeladatokhoz jutunk, amelyet mr az res programmal meg lehet oldani. Az res program teht gyakran jelenik meg valamilyen programszerkezetbe gyazva. (Szerepe a programban ahhoz hasonlthat, amikor a kmves egy res teret rak krbe tglval azrt, hogy ablakot, ajtt ksztsen az pl hzon. A semmi ezltal vlik az plet fontos rszv.)

    Nzznk most egy erltetett pldt arra, amikor egy feladatot az res program old meg. Legyen a feladat specifikcija az albbi:

    A = (a:, b:, c:) Ef = ( a=2 b=5 c=7 )

    Uf = ( Ef (c=a+b c=10) )

    Itt az Ef lltsbl kvetkezik az Uf llts (Ef Uf). Ez azt jelenti, hogy ha egy Ef-beli llapotbl (teht amire teljesl az Ef llts) elindulunk, akkor erre rgtn teljesl az Uf llts is: ezrt nem kell semmit sem tenni ahhoz, hogy Uf-ben tudjunk megllni, hiszen mr ott vagyunk. Ezt a feladatot teht megoldja a SKIP. ltalnostva az itt ltottakat azt mondhatjuk, ha egy feladat elfelttelbl kvetkezik az utfelttele, akkor a SKIP program biztosan megoldja azt.

  • 3.1. Elemi programok

    41

    3.1.2. Rossz program

    Rossz program a mindig abnormlisan mkd program. Brmelyik llapotbl indul is el, abnormlis vgrehajtst vgez: a kiindul llapotot vgtelen sokszor ismtl vgtelen vgrehajtst fut be. A rossz programot a tovbbiakban ABORT-tal jelljk.

    A rossz program nem tl hasznos, hiszen semmikppen nem terminl, gy sosem tud megllni egy kvnt clllapotban. A rossz programmal csak az res feladatot, azaz a sehol sem rtelmezett, teht rtelmetlen feladatot lehet megoldani: azt, amelyik egyik llapothoz sem rendel clllapotokat. A feladatok megoldsa szempontjbl az ABORT-nak teht nincs tl nagy jelentsge. Annak az oka, hogy mgis bevezettk az, hogy program lersunkat minl ltalnosabb tegyk, segtsgvel minl tbb programot, mg a rosszul mkd programokat is le tudjuk rni.

    3.1.3. rtkads

    A programozsban rtkadsnak azt hvjuk, amikor a program egy vagy tbb vltozja egy lpsben j rtket kap. Mivel a program vltozi az aktulis llapot komponenseit jelentik meg, ezrt az rtkads sorn megvltozik az aktulis llapot.

    Vegyk pldaknt az (x:, y:) llapottren azt a kznsges rtkadst, amikor az x vltoznak rtkl adjuk az x y kifejezs rtkt. Ezt az rtkadst brmelyik llapotra vgre lehet hajtani, s minden esetben kt llapotbl (a kiindul- s a vgllapotbl) ll sorozat lesz a vgrehajtsa. Pldul < (2,-5) (-10,-5) >, < (2.3,0.0) (0.0,0.0) >, < (0.0,4.5) (0.0,4.5) > vagy . Ezt az rtkadst

    az x:=x y szimblummal jelljk. Az x y kifejezs htterben egy olyan lekpezs (fggvny) ll, amely kt vals szmhoz (az aktulis llapothoz) egy vals szmot (az x vltoz j rtkt) rendeli s minden vals szmprra rtelmezett.

    Tekintsk most az (x:, y:) llapottren az x:=x/y parcilis rtkadst. Azokban a kiindul llapotokban, amikor az y-nak az rtke 0, az rtkads jobboldalon ll kifejezsnek nincs rtelme. A jobboldali kifejezs teht nem mindenhol, csak rszben (parcilisan) rtelmezett. Ebben az esetben gy tekintnk az rtkadsra, mint egy rossz programra, azaz a nem rtelmezhet kiindul llapotokbl

  • 3. Strukturlt programok

    42

    indulva abortl.4 Ezzel biztostjuk, hogy ez az rtkads is program legyen: minden kiindul llapothoz rendeljen vgrehajtsi sorozatot.

    A feladatok megoldsakor gyakran elfordul, hogy egy idben tbb vltoznak is j rtket akarunk adni. Ez a szimultn rtkads tovbbra is egy llapotbl egy msik llapotba vezet, de az j llapot tbb komponensben is eltrhet a kiindul llapottl.5 A httrben itt egy tbbrtk fggvny ll, amelyik az aktulis llapothoz rendeli azokat az rtkeket, amelyeket a megfelel vltozknak kell rtkl adni.

    Egy rtkads jobboldaln ll kifejezs rtke nem mindig egyrtelm. Ekkor a baloldali vltoz vletlenszeren veszi fel a kifejezs ltal adott rtkek egyikt. Erre plda az, amikor egy vltoznak egy halmaz valamelyik elemt adjuk rtkl. Ekkor az

    llapottr az (x:, h:2) (a h rtke egy termszetes szmokat tartalmaz halmaz), az rtkads sorn pedig az x a h valamelyik elemt kapja. Ezt az rtkadst rtkkivlasztsnak (vagy nem-

    determinisztikus rtkadsnak) fogjuk hvni s az x: h kifejezssel jelljk.6 Ez a plda radsul parcilis rtkads is, hiszen ha a h egy res halmaz, akkor a fenti rtkkivlaszts rtelmetlen, teht abortl. Ez rvilgt arra, hogy az rtkadsnak fent bemutatott ltalnostsai (parcilis, szimultn, nem-determinisztikus) egymst kiegsztve halmozottan is elfordulhatnak. A httrben itt egy nem-egyrtelm lekpezs (teht nem fggvny), egy relci ll.

    4 Ezzel a jelensggel a programoz pldul akkor tallkozik, amikor az

    opercis rendszer "division by zero" hibazenettel lelltja a program futst. 5 A szimultn rtkadsokat a kdolskor egyszer rtkadsokkal kell

    helyettesteni (lsd 6.3. alfejezet), ha a programozsi nyelv nem tmogatja ilyenek rst. 6 A nem-determinisztikus rtkadsokat a mai szmtgpeken

    determinisztikus rtkadsok helyettestik. Ez a helyettests azonban nem mindig a programoz feladata, hanem gyakran az a programozsi krnyezet vgzi, ahol a programot hasznljuk. Ez elrejti a programoz ell azt, hogyan vlik determinisztikuss egy rtkads, gy az kvzi nem-determinisztikus. Ez trtnik pldul a vletlenszm-genertorral trtn rtkads sorn. Habr ez a nevvel ellenttben nagyon is kiszmthat, az ellltott rtk a program szempontjbl mgis nem-determinisztikus lesz.

  • 3.1. Elemi programok

    43

    ltalnos rtkadsnak egy szimultn, parcilis, nem-determinisztikus rtkadst tekintnk. A nem-szimultn rtkadst egyszernek, a nem parcilist teljesnek (mindenhol rtelmezettnek) nevezzk, az rtkkivlaszts ellentte a determinisztikus rtkads. A kznsges rtkadson az egyszer, teljes s determinisztikus rtkadst rtjk.

    Az rtkads ktsget kizran egy program, amelyik az llapottr egy llapothoz az adott llapotbl indul ktelem vagy abnormlisan vgtelen llapotsorozatot rendel. (Nem-determinisztikus esetben egy kiindul llapothoz tbb vgrehajts is tartozhat.) Jellsekor a := szimblum baloldaln feltntetjk, hogy mely vltozk kapnak j rtket, a jobboldalon felsoroljuk az j rtkeket elllt kifejezseket. Ezek a kifejezsek az llapottr vltozibl, azok tpusainak mveleteibl, esetenknt konkrt tpusrtkekbl (konstansokbl) llnak. A kifejezs rtke a vltozk rtktl, azaz az aktulis llapottl fgg, amit a kifejezs egy rtkk alakt s azt a baloldalon ll vltoznak addik rtkl. Nem-determinisztikus

    rtkads, azaz rtkkivlaszts esetn a := szimblum helyett a : szimblumot hasznljuk.

    Az rtkadst nemcsak azrt tekintjk elemi programnak, mert vgrehajtsa elemi lpst jelent az llapottren, hanem azrt is, mert knny felismerni, hogy milyen feladatot old meg. Ha pldul egy x, y, z egsz vltozkat hasznl feladat utfelttele annyival mond tbbet az elfelttelnl, hogy teljesljn a z = x+y llts is, akkor nyilvnval, hogy ezt a z:=x+y rtkads segtsgvel rhetjk el. Ha a megoldand feladat az, hogy cserljk ki kt vltoz rtkt, azaz A =

    (x:, y:), Ef = (x=x y=y) s Uf = (x=y y=x), akkor ezt az x,y:=y,x rtkads oldja meg.

    3.2. Programszerkezetek

    A strukturlt programok ptsnl hrom nevezetes programszerkezetet hasznlunk: szekvencit, elgazst, ciklust.

    3.2.1. Szekvencia

    Kt program szekvencijn azt rtjk, amikor az egyik program vgrehajtsa utn feltve, hogy az terminl a msikat hajtjuk vgre.

  • 3. Strukturlt programok

    44

    Ez a meghatrozs azonban nem elegend a szekvencia pontos megadshoz. Ahhoz ugyanis, hogy egy szekvencia vgrehajtsi sorozatait ez alapjn felrhassuk, meg kell elbb llapodni abban, hogy mi legyen a szekvencia alap-llapottere. A tagprogramok alap-llapotterei ugyanis klnbzhetnek egymstl, s ilyenkor nyilvnvalan meg kell llapodni egy kzs alap-llapottrben, amely majd a szekvencia llapottere lesz. A tagprogramokat majd erre a kzs llapottrre kell tfogalmazni, azaz vltozik alap- illetve segdvltozi sttuszt ennek megfelelen kell megvltoztatni, esetleg bizonyos vltozkat t kell nevezni. (Emltettk, hogy az ilyen talakts nem vltozat egy program lnyegn.)

    A kzs alap-llapottr kialaktsa sorn elfordulhat az is, hogy az eredetileg kizrlag csak az egyik tagprogram alap- vagy segdvltozja a szekvencia kzs alapvltozjv vlik, vagy a szekvencia alap-llapotterbe olyan komponensek kerlnek be, amely az egyik tagprogramnak alap- vagy segdvltozi, a msik tagprogramban pedig segdvltozk voltak. (A segdvltozra vonatkoz ltrehoz s megszntet utastsok ilyenkor rvnyket vesztik.) A kzs alap-llapottr kialaktsa mg akkor sem egyrtelm, ha a kt tagprogram alap-llapottere ltszlag megegyezik. Elkpzelhet ugyanis pldul az, hogy egy mindkt alap-llapotrben szerepl ugyanolyan nev s tpus vltozt nem akarunk a szekvenciban kzs vltoznak tekinteni. Vgl szgezzk le, hogy a kzs alap-llapottr komponensei kizrlag a szekvenciba fztt tagprogramok vltozi kzl kerlhetnek ki. Egy azoknl nem szerepl vltozt nem vesznk fel a kzs alap-llapottrbe (ennek ugyanis nem lenne semmi rtelme).

    A szekvencia vgrehajtsi sorozatai, miutn mindkt tagprogramot a kzs alap-llapottren jrartelmeztk, gy kpzdnek, hogy az els tagprogram egy vgrehajtshoz amennyiben a vgrehajts vges hossz hozzfzdik a vgrehajts vgpontjbl a msodik tagprogram ltal indtott vgrehajts. A szekvencia is program, hiszen egyrszt a kzs alap-llapottr minden llapotbl indt vgrehajtst (hiszen az els tagprogram is gy tesz), msrszt ezeknek a vgrehajtsoknak az els llapota a kiindul llapot (ugyancsak amiatt, hogy az els tagprogram egy program). Harmadrszt minden vges vgrehajtsi sorozat a kzs alap-llapottrben ll meg, hiszen ezek utols szakaszt a msodik tagprogram generlja, amelynek vges vgrehajtsi sorozatai a kzs

  • 3.2. Programszerkezetek

    45

    alap-llapottrre val talaktsa utn ebben az llapottrben terminlnak (lvn a msodik tagprogram is program).

    Termszetesen ezen az elven nemcsak kett, hanem tetszleges szm programot is szekvenciba fzhetnk.

    Az S1 s S2 programokbl kpzett szekvencit az (S1;S2) szimblummal jellhetjk vagy az albbi rajzzal fejezhetjk ki. Ezek a jellsek rtelemszeren hasznlhatk a kettnl tbb tag szekvencikra is.

    S1

    S2

    Milyen feladat megoldsra hasznlhatunk szekvencit? Ha egy feladatot fel lehet bontani rszfeladatokra gy, hogy azokat egyms utn megoldva az eredeti feladat megoldst is megkapjuk, akkor a megold programot a rszfeladatot megold programok szekvencijaknt llthatjuk el. Formlisan: ha adott egy feladat (A,Ef,Uf) specifikcija, amelybl el tudunk lltani egy (A,Ef,Kf) specifikcij rszfeladatot, valamint egy (A,Kf,Uf) specifikcij rszfeladatot, ahol Kf az gynevezett kzbees felttel, akkor a rszfeladatokat megold programok szekvencija megoldja az eredeti feladatot. Ugyanis ekkor az els rszfeladatot megold program elvezet Ef-bl (egy Ef ltal kielgtett kezdllapotbl) Kf-be, a msodik a Kf-bl Uf-be, azaz sszessgben a szekvencijuk eljut Ef-bl Uf-be.

    Tekintsk pldul azt a feladatot, amikor kt egsz rtk adat rtkt kell kicserlni. (Korbban mr megoldottuk ezt a feladatot egy szimultn rtkadssal. Ha azonban az adott programozsi krnyezetben nem alkalmazhat szimultn rtkads, akkor mssal kell prblkozni.) Emlkeztetl a feladat specifikcija:

    A = (x:, y:) Ef = ( x=x y=y )

    Uf = ( x=y y=x )

    Bontsuk fel a feladatot hrom rszre az albbi, kicsit trkks Kf1 s Kf2 kzbees lltsok segtsgvel. Ezltal hrom, ugyanazon az llapottren felrt rszfeladat specifikcijhoz jutottunk. A rszfeladatok llapottere azonos az eredeti llapottrrel, az els feladat

  • 3. Strukturlt programok

    46

    elfelttele az Ef, utfelttele a Kf1, a msodik elfelttele a Kf1, utfelttele a Kf2, a harmadik elfelttele a Kf2, utfelttele az Uf.

    Kf1 = ( x=x y y=y )

    Kf2 = ( x= x y y=x )

    Elszr prbljunk meg az els rszfeladatot megoldani, azaz eljutni a Ef-bl a Kf1-be. Nyilvnval, hogy ezt a rszfeladatot az x:=xy megoldja, hiszen kezdetben (Ef) x az x, y az y rtket tartalmazza. A msodik rszfeladatban az y-nak kell az x eredeti rtkt, az x-t megkapni, ami (xy)+y alakban is felrhat. Mivel a Kf1 (ez a msodik feladat elfelttele) szerint kezdetben x=xy s y=y, az ami (xy)+y-t az x+y alakban is rhatjuk. A msodik feladat megoldshoz teht megfelel az y:=x+y rtkads. Hasonlan okoskodva jn ki, hogy a harmadik lpshez az x:=yx rtkads szksges. A teljes feladat megoldsa teht az albbi szekvencia lesz, amelyben mindhrom tagprogram s a szekvencia kzs alap-llapottere is a feladat llapottere:

    x:=xy

    y:=x+y

    x:=yx

    Oldjuk meg most ugyanezt a feladatot mskppen: segdvltozval. Bontsuk fel a feladatot hrom rszre gy, hogy

    elszr tegyk flre egy z: vltozba az x vltoz rtkt, (ezt a kvnsgot rgzti a Kf1), ezt kveten az x rtke az y vltoz rtkt vegye fel, mikzben a z vltoz rzi az rtkt (ezt mutatja a Kf2), vgl kerljn t a z vltozba flretett rtk az y vltozba. Mindhrom rszfeladat llapottere az eredeti llapottrnl bvebb: A = (x:, y:, z:).

    Kf1 = ( x=x y=y z=x )

    Kf2 = ( x=y y=y z=x )

    Az els rszfeladatot knny megoldani: a Kf1 a z=x lltssal mond tbbet az Ef-nl, s az x ppen az x vltoz rtke, ezrt a z:=x rtkads vezet el az Ef-bl a Kf1-be. Ennek a programnak a z egy eredmny (nem pedig segd) vltozja, az y pedig akr el is hagyhat az llapotterbl. Mivel a z vltoz a programban ennek az

  • 3.2. Programszerkezetek

    47

    rtkadsnak a baloldaln jelenik meg elszr, ezrt r a struktogramm els rtkadsa mellett kln felhvjuk a figyelmet a tpusnak megadsval. A msodik rszfeladatnl Kf1-bl a Kf2-be az x:=y rtkads visz t, hiszen itt az egyetlen klnbsg a kt llts kztt az, hogy az x vltoz rtkt az y-ban trolt y rtkre kell tlltani. A ksbbiek miatt fontos viszont, hogy ennek a programnak llapottere tartalmazza a z (bemen s eredmny) vltozt is. A harmadik rszfeladatban Kf2-bl a Uf-be kell eljutni. Itt az y-t kell megvltoztatni gy, hogy vegye fel az x eredeti rtkt, az x-t, amit a Kf2 szerint a z-ben tallunk. Teht: y:=z. Most a z egy bemen vltoz.

    Mindezek alapjn knny ltni, hogy az albbi szekvencia megoldja a kitztt feladatot. Ehhez azonban elszr a program alap-llapottert kell a feladathoz igaztani, leszkteni, amely hatsra a z vltoz szekvencia egy segdvltozjv vlik:

    z:=x z:

    x:=y

    y:=z

    A programtervezs sorn az a legfontosabb krds, hogy mirl lehet felismerni, hogy egy feladatot szekvencival kell megoldani, milyen lpsekbl lljon a szekvencia, hogyan lehet megfogalmazni azokat a rszclokat, amelyeket a szekvencia egyes lpsei oldanak meg, s mi lesz ezen lpseknek a sorrendje. Ezekre a krdsekre a feladat specifikcijban kereshetjk a vlaszt. Pldul, ha az

    utfelttel egy kapcsolatokkal felrt sszetett llts, akkor gyakran az llts egyes tnyezi szolglnak rszclknt egy szekvencihoz. (De

    vigyzat! Nem trvnyszer, hogy az utfelttel kapcsolata mindenkppen szekvencit eredmnyez.) A rszclok kztti sorrend azon mlik, hogy az egyes rszek utalnak-e egymsra, s melyik hasznlja fel a msik eredmnyt. Kijellve az utfelttelnek azt a rszt, amelyet elszr kell teljesteni, elll az a kzbls llapotokat ler logikai llts, amely az els rszfeladat utfelttele s egyben a msodik rszfeladat elfelttele lesz. Hozzvve ehhez a feladat utfelttelnek itt mg nem rintet felt vagy annak egy rszt, megkapjuk a msodik rszfeladat utfelttelt, s gy tovbb. Az

  • 3. Strukturlt programok

    48

    eredeti elfelttel az els rszfeladat elfelttele, az eredeti utfelttel az utols rszfeladat utfelttele lesz.

    3.2.2. Elgazs

    Amikor egy feladatot nem egyms utn megoldand rszfeladatokra, hanem alternatv mdon megoldhat rszfeladatokra tudunk csak felbontani, akkor elgazsra van szksgnk.

    Elgazs az, amikor kt vagy tbb programhoz egy-egy felttelt rendelnk, s mindig azt a programot gynevezett programgat ha