186
Írta: SIMON GYULA A PROGRAMOZÁS ALAPJAI Egyetemi tananyag 2011

A programozás alapjai

Embed Size (px)

DESCRIPTION

Egyetemi tananyag, Pannon Egyetem Műszaki Informatikai KarSzerző - Dr. Simon Gyula

Citation preview

  • rta:

    SIMON GYULA

    A PROGRAMOZS ALAPJAI Egyetemi tananyag

    2011

  • COPYRIGHT: 20112016, Dr. Simon Gyula, Pannon Egyetem Mszaki Informatikai Kar Rendszer- s Szmtstudomnyi Tanszk

    LEKTORLTA: Dr. Szebernyi Imre, Budapesti Mszaki s Gazdasgtudomnyi Egyetem Villamosmrnki s Informatikai Kar Irnytstechnika s Informatika Tanszk Creative Commons NonCommercial-NoDerivs 3.0 (CC BY-NC-ND 3.0) A szerz nevnek feltntetse mellett nem kereskedelmi cllal szabadon msolhat, terjeszt-het, megjelentethet s eladhat, de nem mdosthat. TMOGATS: Kszlt a TMOP-4.1.2-08/1/A-2009-0008 szm, Tananyagfejleszts mrnk informati-kus, programtervez informatikus s gazdasginformatikus kpzsekhez cm projekt kere-tben.

    ISBN 978-963-279-521-8 KSZLT: a Typotex Kiad gondozsban FELELS VEZET: Votisky Zsuzsa AZ ELEKTRONIKUS KIADST ELKSZTETTE: Juhsz Lehel KULCSSZAVAK: algoritmusok, programok, vezrlsi szerkezetek, adatszerkezetek, strukturlt program. SSZEFOGLALS: A jegyzet platform-fggetlen mdon igyekszik megismertetni a programozs alapjait, a struk-turlt programozst. Trgyalja az alapvet programozi httrismereteket s alapfogalmakat mind a hardver, mind a szoftver oldalrl. Bemutatja az algoritmusok s programok alapvet ptelemeit, valamint a strukturlt programok ksztsnek alapvet szablyait. Az algorit-musok s adatszerkezetek lersra tbbfle ler modellt is hasznl (folyamatbra, Jackson-bra, regulris kifejezsek s defincik), valamint a C programozsi nyelv segtsgvel ezek-re implementcis pldkat is mutat.

  • Fl a lbam, szemem fl, de n mgse flek, Falbbal s bekttt szemmel kalz mdra lek.

    Pisztolyommal tjutok minden akadlyon, Vllamon meg csrg szpen reg papagjom.

    Gryllus Vilmos

  • www.tankonyvtar.hu Simon Gyula, PE

    Tartalomjegyzk

    Elsz ......................................................................................................................................... 7

    1. Bevezets ............................................................................................................................. 9 1.1. A szmtgp felptse ............................................................................................. 9

    1.1.1. A CPU .......................................................................................................... 10 1.1.2. A memria .................................................................................................... 13 1.1.3. A perifrik ................................................................................................... 14

    1.2. A programok ............................................................................................................ 15 1.2.1. A programok kezelse, futtatsa .................................................................. 15 1.2.2. Programok ksztse ..................................................................................... 16 1.2.3. Alacsony s magas szint nyelvek ............................................................... 16 1.2.4. Fordts s rtelmezs .................................................................................. 19

    1.3. Httrismeretek ........................................................................................................ 22 1.3.1. Szmrendszerek, szmbrzols .................................................................. 22 1.3.2. Prefixumok ................................................................................................... 23 1.3.3. Az ASCII kdols ........................................................................................ 24

    2. Algoritmusok s programok ........................................................................................... 26

    3. Alapvet vezrlsi szerkezetek s a strukturlt program ............................................ 33 3.1. Tevkenysgsorozatok ............................................................................................. 33 3.2. Elgazsok ............................................................................................................... 35 3.3. Ciklusok ................................................................................................................... 40 3.4. Strukturlt program .................................................................................................. 46

    4. Konverzi pszeudo-kdok s folyamatbrk kztt .................................................... 54 4.1. Pszeudo-kd talaktsa folyamatbrv ................................................................. 54 4.2. Folyamatbra talaktsa pszeudo-kdd ................................................................ 57

    4.2.1. A folyamatbra trsa pszeudo-kdd ........................................................ 57

    5. Tovbbi eszkzk tevkenysg- s adatszerkezetek lersra ..................................... 65 5.1. Adatszerkezetek s tevkenysgszerkezetek ........................................................... 65

  • TARTALOMJEGYZK 5

    Simon Gyula, PE www.tankonyvtar.hu

    5.2. Jackson-brk .......................................................................................................... 65 5.3. Regulris kifejezsek s defincik ......................................................................... 72

    6. Szekvencilis adat- s programszerkezetek .................................................................. 77

    7. Szelekcit tartalmaz adat- s programszerkezetek .................................................... 92

    8. Iteratv adat- s programszerkezetek .......................................................................... 105

    9. Eljrsok, fggvnyek, vltozk................................................................................... 120 9.1. Eljrsok, fggvnyek ........................................................................................... 120 9.2. Vltozk lthatsga s lettartama ....................................................................... 137 9.3. Vltozk trolsa ................................................................................................... 140

    10. sszetett adatszerkezetek s manipull algoritmusaik ............................................ 144

    11. A rekurzi s alkalmazsa ............................................................................................ 160

    12. A programtervezs alapvet mdozatai ...................................................................... 168 12.1. Fellrl lefel tervezs ........................................................................................... 168 12.2. Alulrl felfel tervezs .......................................................................................... 170

    13. Irodalomjegyzk ............................................................................................................ 174

    F1. fggelk. ASCII kdols ............................................................................................... 175

    F2. fggelk. A printf fggvny legfontosabb formtumvezrli .................................. 176

    F3. fggelk. A C nyelv opertorai s ezek precedencii ................................................ 181

    F4. fggelk. Az elektronikus mellklet tartalma ............................................................. 186

  • www.tankonyvtar.hu Simon Gyula, PE

  • Simon Gyula, PE www.tankonyvtar.hu

    Elsz

    Ebben a jegyzetben a programozs alapjaival foglalkozunk: clunk, hogy a strukturlt progra-mozs alapfogalmaival megismertessk az olvast, megismerkedjnk a programtervezs alap-vet eszkzeivel s termszetesen gyakorlati ismereteket is nyjtsunk. A jegyzet nagyrszt a Pannon Egyetem Mszaki Informatikai Karn (PE-MIK) els ves hallgatknak meghirde-tett Programozs alapjai cm trgy anyagra pl.

    A programozs alapjaival amennyire ez lehetsges nyelv-fggetlen mdon igyeksznk megismerkedni. Ezrt tbbfle lerssal, modellel fogunk dolgozni. De termszetesen a prog-ramozs lnyege az igazi, futtathat kdot rsa, tesztelse. Ezrt a jegyzetben szksg van egy igazi programozsi nyelvre is: itt vlasztsunk a C nyelvre esett.

    A nyelv vlasztst tbbek kztt az indokolta, hogy a PE-MIK kpzsben a programo-zs oktatsa a C nyelven alapul, a Programozs alapjai trgyat kvet elmleti s gyakorlati trgyak zme is a C nyelvre pl. Jllehet a C nyelv nem minden elemben idelis a kezd programozk szmra, mgis szilrd alapot ad a tovbbi nyelvek elsajttshoz. A C nyelv sszes lehetsgt most mg nem fogjuk kihasznlni, csupn a legszksgesebb eszkzksz-lett fogjuk alkalmazni.

    A jegyzetben srga keretben talljuk a C nyelvre vonatkoz ismereteket. A nyelv szintak-tikjt, hasznlatt a szmunkra szksges mlysgig itt magyarzzuk el.

    Az elmleti ismeretek birtoklsn tl a programozs elsajttsnak legfontosabb lpse a gyakorls. Ennl taln csak egyetlen fontosabb dolog ltezik azok szmra, akik j programo-zk akarnak lenni: mg tbb gyakorls. Ezrt a fejezetek vgn az aktulis tmakr feldolgo-zst mindig pldkkal segtjk.

    A jegyzet elektronikus mellkletben megtallhatk a szvegben rszben vagy egszben kidolgozott programok, valamint nhny gyakorl feladat megoldsa is. Az elektronikus mel-lkletre [szgletes zrjelek kztt] utalunk.

    A jegyzet 1. fejezetben a programozs elsajttshoz szksges httrismereteket tr-gyaljuk: ebben a fejezetben mind a hardverekkel, mint a szoftverekkel kapcsolatos alapfogal-mak elkerlnek. A 2. fejezetben tisztzzuk, mik az algoritmusok s programok, majd a 3. fejezetben megismerkednk a strukturlt programok meglehetsen egyszer ptele-meivel s szablyaival. A 4. s 5. fejezetben az algoritmusok, programok lersnak eszkzei-vel ismerkednk meg. A 6., 7. s 8. fejezetekben a strukturlt programok egyes elemeivel:

  • 8 A PROGRAMOZS ALAPJAI

    www.tankonyvtar.hu Simon Gyula, PE

    a szekvencilis, a szelekcit tartalmaz, valamint az iteratv program- s adatszerkezetekkel, valamint ezek hasznlatval ismerkednk meg rszletesebben. A 9. fejezetben a fggvnyek s eljrsok, valamint a vltozk kezelsnek krdseivel foglalkozunk. A 10. fejezetben az sszetett adatszerkezetekkel foglalkozunk, mg a 11. fejezet a rekurzit s alkalmazsi lehet-sgeit mutatja be. A 12. fejezet rvid ttekintst ad a programtervezs alapvet mdszereirl.

    A szveget helyenknt szrke bettek szabdaljk. Itt nhny vendg-oktatval tallkozhatunk: Gonosz Gza, Kalz Karcsi, Fllb Ferk s kalz bartaik igyekeznek sznesteni a szraz szakmai tartalmakat.

    Vitorlt fel! ILH

  • Simon Gyula, PE www.tankonyvtar.hu

    1. fejezet Bevezets

    Krnyezetnkben nagyon sok fajta szmtgppel tallkozhatunk, nha taln fel sem merl bennnk, hogy az egyltaln nem szmtgp-szer berendezs is tulajdonkppen egy (vagy akr tbb) szmtgpet is rejthet magban. Ha a szmtgp szt halljuk, leginkbb egy asz-tali vagy laptop szmtgp kpe ugrik be, de telefonjaink, autink, jtkaink is mind-mind tartalmaznak szmtgpeket. Igaz, ezeknek nha nincs kpernyje s billentyzete sem, de azrt felptsk s funkcijuk nagyon hasonlt asztali testvreikre. Ezekben is van CPU, memria, kezelnek perifrikat, s ami a legfontosabb kzs vonsuk: programokat hajtanak vgre azrt, hogy minket segtsenek, szrakoztassanak. Tekintsk teht t elszr szmtg-peink felptst.

    1.1. A szmtgp felptse Valamennyi szmtgp, legyen az egy irodai asztali szmtgp, egy dik laptopja, egy mo-biltelefon, az autnk fedlzeti szmtgpe, vagy akr a Deep Blue szuper-sakkszmtgp,

    1.1. bra. A szmtgp felptse

  • 10 A PROGRAMOZS ALAPJAI

    www.tankonyvtar.hu Simon Gyula, PE

    tartalmaz nhny nagyon hasonl elemet. A programjainkat minden szmtgpben agy (vagy tbb) CPU hajtja vgre, fut programjainkat a memriban troljuk, s a programok a klvi-lggal (velnk, felhasznlkkal is) perifrikon keresztl kommuniklnak.

    A szmtgp fbb elemeit s azok kapcsolatt az 1.1. bra mutatja, ahol a kzponti egysg, a CPU a memrival s klnfle perifrikkal ll kapcsolatban. Az rn lthatunk jl ismert bemeneti perifrikat (pl. billentyzet), kimeneti perifrikat (pl. monitor), de a perifrik kz tartoznak a httrtrak s pl. a hlzati kapcsolatot biztost hlzati csatol egysg is.

    1.1.1. A CPU A CPU rvidts az angol Central Processing Unit (kzponti vgrehajt egysg) kifejezsbl szrmazik. Gyakran hasznlt elnevezs mg a processzor is. A nv jl kifejezi a CPU-k fel-adatt: ezen a helyen trtnik a programok vgrehajtsa. Nmi tlzssal szoks a CPU-t a szmtgp agynak is nevezni; a hasonlat kicsit sntt ugyan, hiszen a CPU nem gondolko-dik, viszont villmgyorsan, tveds nlkl, szolgai mdon vgrehajtja a programok utastsait. A programok vgrehajtsa kzben a CPU termszetesen kapcsolatot tart a memrival s a perifrikkal. A processzor a memribl olvassa be a program utastsait, rtelmezi ezeket, majd vgre is hajtja azokat. Az utastsok hatsra vltoztatsokat hajthat vgre krnyezetn is (a memrin, vagy valamelyik perifrin). A processzorutastsok nagyon egyszerek (pl. kt szm sszeadsa, egy memriacm olvassa/rsa), viszont cserben nagyon gyorsan vg-rehajthatk: egy kommersz processzor a jegyzet rsakor msodpercenknt tbb millird uta-stst is kpes volt vgrehajtani.

    A processzorok nagyon bonyolult eszkzk, felptskkel, mkdskkel ms trgyak foglalkoznak. Itt most rviden s a vgletekig leegyszerstve trgyaljuk a processzorok fel-ptsnek alapvet elemeit, amelyek szksgesek ahhoz, hogy a programok vgrehajtsnak folyamatt megrthessk.

    A processzorok szmtsi kpessgeit az aritmetikai-logikai egysg (az angol Arithmetic Logic Unit nvbl rviden ALU) biztostja. Ez az egysg kpes pl. sszeadni kt szmot, vagy pl. bitenknt logikai S mveletet vgrehajtani kt szmon. Az utastsokat a processzor utasts-beolvas egysge olvassa be memribl, majd azokat rtelmezve utastja pl. az ALU-t a megfelel mvelet vgrehajtsra. A processzorban helyet foglal regiszterek gyors bels memriaegysgek, melyek pl. az aritmetikai mveletek operandusait s eredmnyt trolhatjk. A processzor aritmetikai s logikai utastsai ltalban egy vagy kt regiszter k-ztt mkdnek s az eredmnyeket is valamelyik regiszterben troljk. (Vannak olyan pro-cesszorok is, amelyek kpesek a memribl, a regiszterek megkerlsvel is bizonyos mve-letek vgrehajtani, de nem ez a jellemz.) Tipikus aritmetikai/logikai mveletek lehetnek pl. a kvetkezk:

    Add ssze az R1 s R5 nev regiszterek tartalmt s tedd az eredmnyt az R3 nev re-giszterbe.

    Szorozd ssze a R1 s R2 regiszterek tartalmt, az eredmnyt helyezd az R8 nev re-giszterbe.

    Vgezz logikai kizr vagy (XOR) mveletet az R1 s R2 bitjei kztt, az eredmny az R3-ban kpzdjn.

  • 1. BEVEZETS 11

    Simon Gyula, PE www.tankonyvtar.hu

    A processzor a fentebb vzolt aritmetikai/logikai utastsokon kvl rendelkeznek mozgat utastsokkal is, amelyek segtsgvel a memribl a regiszterekbe lehet adatokat mozgatni, vagy a regiszterekbl lehet a memriba rni. Lteznek ezen kvl regiszterbl regiszterbe mozgat, valamint konstansokat a regiszterekbe tlt utastsok is. Ezen utastsok tipikus felhasznlsi terlete a memriban lev adatok elksztse a mveletvgzsre, illetve az eredmnyek trolsa a memriban. Ilyen mveletek lehetnek pl. a kvetkezk:

    Olvasd be a memria 15785-ik rekesznek tartalmt az R1 jel regiszterbe. Mozgasd az R3 tartalmt a memria 62734-ik rekeszbe. (Ezt direkt cmzsnek hv-

    juk, mert a memria cme szerepel az utastsban.) Mozgasd az R3 tartalmt arra a memriacmre, ami az R7-ben van. (Ezt indirekt cm-

    zsnek hvjuk, mert maga a memriacm nem szerepel az utastsban, hanem az egy az utastsban szerepl regiszterben tallhat.)

    Mozgasd t az R1 tartalmt az R2-be. Tltsd be a 45 szmot az R1 regiszterbe. Az aritmetikai/logikai s a mozgat utastsokon kvl a minden processzor megvalst

    bizonyos vezrlsi utastsokat, amelyek a program utastsainak vgrehajtsi sorrendjt befo-lysoljk. A program utastsait alapesetben egyms utn, sorrendben hajtja vgre a procesz-szor, kivve, ha ettl eltr vezrl utastst hajt vgre. Tipikus vezrlsi utastsok lehetnek pl. a kvetkezk:

    Folytasd a program vgrehajtst a 358-ik utastsnl. (Ugorj a 358-ik sorra.) Ha az elz aritmetikai/logikai utasts eredmnye 0, akkor hagyd ki (ugord t) a kz-

    vetkez utastst. Folytasd a program vgrehajtst 17 utastssal ksbb. (Ugorj 17 utastssal elre). Ugorj vissza 7 utastst.

    1.2. bra. A CPU felptse

  • 12 A PROGRAMOZS ALAPJAI

    www.tankonyvtar.hu Simon Gyula, PE

    A processzor mkdsnek illusztrlsra definiljunk egy egyszer (fiktv) processzort, majd valstsunk meg vele egy egyszer feladatot. A processzor szmunkra fontos tulajdon-sgai a kvetkezk:

    A processzornak 4 regisztere van, ezek: A, B, C, D Aritmetikai/logikai utastsok: A processzor tud aritmetikai s logikai mveleteket vgezni kt regiszter kztt, de az

    eredmnyt mindig az A regiszterbe teszi. Pl. az ADD B, C utasts sszeadja a B s C regiszterek tartalmt (az eredmnyt az A regiszterbe teszi), a SUB C, B utasts pedig kivonja a B regiszter tartalmbl a C regiszter tartalmt (majd az eredmnyt az A re-giszterbe teszi).

    Mozgat utastsok: A processzor a memria tetszleges cmrl be tud olvasni tetszleges regiszterbe,

    illetve tetszleges regiszterbl ki tud rni a memria tetszleges cmre. Pl. a MOVE A, (165) utasts kirja az A regiszter tartalmt a memria 165-ik cmre, a MOVE (165), B ugyanazon memriacmrl olvas be az B regiszterbe, mg a MOVE A, (B) utasts az A regiszter tartalmt mozgatja a memria B regiszter ltal mutatott cmre. (A zrjelek az utastsban arra utalnak, hogy a zrjelben lv rtk regiszter vagy szm egy cm.) A MOVE A, B utasts az A regiszter tartalmt mozgatja a B regiszterbe, mg a MOVE 23, A utasts 23-at tlt az A regiszterbe (nem pedig a 23-ik cm tartalmt, hiszen itt nincs zrjel).

    Vezrl utastsok A processzor a vezrlst tetszleges sorra t tudja adni (ugrs), pl. a JUMP 34 utasts

    a 34-ik programcmen folytatja a program vgrehajtst. Az elgazst egy feltteles ugrssal lehet megvalstani. Pl. JUMPNZ 34 utasts a 34-

    ik programsoron folytatja a vgrehajtst, ha az elz aritmetika vagy logikai utasts eredmnye nem 0 volt (itt az utasts rvid nevben (n. mnemonikjban) szerepl NZ karaktersorozat a nem zr-ra utal).

    A fenti utastsok termszetesen ezen a fiktv processzoron lteznek csak, de a valdi pro-cesszorok utastskszlete is hasonl elemekbl ll. Most ezen utastsok segtsgvel valst-suk meg a kvetkez feladatot.

    1.1. Plda: A memriban annak 20-ik cmtl kezdve 10 darab pozitv szm van elhelyez-ve, minden rekeszben egy. Adjuk ssze a szmokat s az eredmnyt rjuk a memria 30-ik cmre.

    A megvalstst a kvetkezkppen vgezzk: az sszeget a D regiszterben troljuk majd el, ennek tartalmt kezdetben nullra lltjuk. Ehhez hozzadjuk egyenknt a memria 20. s 29. cme kztt lv szmokat. Az sszeadshoz bemozgatjuk az aktulis adatot a C regisz-terbe, amelynek cmt a B regiszterben troljuk.

    Az egyszersg kedvrt a program kezddjn a memria 0-ik cmn s minden utasts egy memriacellt foglaljon el. A kvetkez program fiktv processzorunkon az sszeadsi feladatot oldja meg:

  • 1. BEVEZETS 13

    Simon Gyula, PE www.tankonyvtar.hu

    Cm Utasts Megjegyzs 0 MOVE 0, D ; a D regiszterben troljuk az sszeget, ez kezdetben legyen 0 1 MOVE 20, B ; a B regiszterben troljuk az adatok cmt, az els 20 2 MOVE (B), C ; beolvassuk az aktulis adatot a C regiszterbe 3 ADD C, D ; sszeadjuk az aktulis adatot az eddigi sszeggel 4 MOVE A, D ; eltroljuk az eredmnyt a D regiszterbe 5 MOVE A, 1 ; az A regiszterbe betltnk egyet a kvetkez sszeadshoz 6 ADD A, B ; a B regiszterben lev cmet megnveljk 1-el 7 MOVE A, B ; az eredmnyt visszatltjk a B regiszterbe 8 MOVE 30, A ; az A regiszterbe betltjk a utols adat utni cmet (ez ppen 30) 9 SUB A, B ; majd kivonjuk ebbl a B regiszterben lv cmet

    10 JMPNZ 2 ; ha nem 0 volt, akkor folytatjuk a kvetkez adattal (a 2-ik utasts-cmtl)

    11 MOVE D, (30) ; ha az eredmny 0, akkor vgeztnk, a D-ben lv eredmnyt elt-roljuk

    A program a memria 0-ik cmtl a 11-ig bezrlag foglal helyet. A fenti programlist-ban az utastsokat az emberek szmra is rthet s olvasmnyos mnemonikjaikkal jelltk, de a szmtgp memrijban termszetesen nem ezek, hanem az utastsok gpi kd meg-feleli foglalnak helyet. Erre majd ltunk konkrt pldt is a 1.2.3. fejezetben.

    Lthat, hogy ehhez az egyszer feladathoz is viszonylag sok utastsra volt szksg s a feladat megvalstsa nem volt trivilis, ksznheten a furcsa utastskszletnek. Jllehet ez mr emberi fogyasztsra sznt (mnemonikos) megjelents, a programra rpillantva nem egyszer megmondani, mit is csinl. Persze, aki sokat programoz alacsony szinten, annak egy ilyen utastskszlet termszetes. Akinek pedig a fenti kd els olvassra nem sokkal rthe-tbb, mint egy egyiptomi hieroglifa, az se keseredjen el: mi a tovbbiakban majd magasabb szint programozsi nyelveket fogunk hasznlni. De j, ha szben tartjuk, hogy minden prog-ram ilyen primitv gpi utastsok sorozatv alakul t, mieltt szmtgpnk vgrehajtan azt. s persze rtkeljk annak szpsgt is, hogy magas szint utastsokat hasznlhatunk a primitv gpi utastsok helyett...

    1.1.2. A memria A memria adatok s programok trolsra szolgl a szmtgpben. Egy korszer architekt-rj szmtgpben szmtalan helyen tallkozhatunk memrival, de mi most csak a sz-munkra fontos elemmel, az operatv trral foglalkozunk, a memria szt ezen rtelemben fog-juk hasznlni. (Ms, pl. cache memriknak is fontos szerepe van a hatkony, gyors mkds biztostsnl, de ezek nlkl is mkdhetnek szmtgpek, radsul a programozs szem-pontjbl ezek mintha nem is lteznnek, ezrt mi most ezeket nem trgyaljuk.)

    Az operatv trban foglalnak helyet az ppen fut programok s a program ltal hasznlt adatok. Az adatmemria trolja a bemeneti s kimeneti adatokat, a program futsa kzben hasznlt tmeneti adatokat; programjaink az adatmemrit futs kzben olvassk s rjk is. A programmemria tartalmazza a fut programot; ez is rhat s olvashat memria: a CPU

  • 14 A PROGRAMOZS ALAPJAI

    www.tankonyvtar.hu Simon Gyula, PE

    utasts-beolvas egysge a program futtatsa kzben a programmemribl olvassa be a program utastsait. A programmemria rst ltalban a program betltsre korltozzuk, a program futsa kzben nem clszer a programot fellrni (s szerencsre a legtbb oper-cis rendszer ezt nem is engedi meg).

    Vannak szmtgpek, ahol a program s adattrols feladatt lesen elklntik, vagyis kln adat- s programmemrit hasznlnak (radsul mg egynl tbb adatmemria is el-fordulhat). Ezeket a gpeket Harvard architektrj gpeknek nevezzk. A mindennapi let-ben gyakoribb architektrk a Neumann architektrk, ahol egyetlen memrit hasznlunk, amely trolhat egyszerre adatokat s programokat is. A legtbb szemlyi szmtgp Neu-mann architektrj.

    A mai korszer szmtgpekben megszokhattuk, hogy sok programot tudunk egyszerre (prhuzamosan) futtatni. Ezt knyelmesen az n. virtulis memriakezels segtsgvel lehet megvalstani. Ez azt jelenti, hogy a szmtgpnkn fut valamennyi program gy ltja, hogy egyedl birtokolja az egsz memrit, st a program akr tbb memrit is felhasz-nlhat, mint amennyi fizikailag jelen van a szmtgpben. A virtulis memria kezelsrl az opercis rendszer gondoskodik, ami a programoz szmra j (st remek!) hr, hiszen gy a memriakezels nehz krdseivel nem kell foglalkoznia, minden programot gy kszthet el, mintha a program egyedl futna a szmtgpen, ami ltszlag korltlan memrival ren-delkezik.

    A memria felfoghat rekeszek sorozatnak, ahol minden rekeszbe egy adatot trolunk. Minden rekesznek van egy sorszma: ha a memria N rekeszbl ll, akkor az els rekesz sor-szma a 0, a kvetkez rekesz az 1, mg az utols rekesz sorszma 1N lesz. A rekeszek sorszmt gyakrabban a memria cmnek nevezzk.

    A rekeszek mrete (szlessge) hatrozza meg, hogy mekkora adat trolhat benne. Ha a rekesz 8 bites (1 bjtos), akkor 28=256-fle rtk trolhat benne, mg egy 16 bites (2 bj-tos) rekesz 216=65536 klnbz rtket tartalmazhat. ltalban a memrik szlessge a bjt egsz szm tbbszrse. A mai szmtgpekben hasznlt memrik tbbsgnek szlessge 8 s 128 bit kztt vltozik.

    1.1.3. A perifrik A perifrik biztostjk, hogy vgrehajts alatt ll programjaink kpesek legyenek a klvi-lggal is kapcsolatot tartani, pl. bemen adatokat beolvasni vagy az eredmnyt kirni. Az egyik legfontosabb perifria a httrtr. A httrtr egy nem felejt memria (ellenttben az operatv trban alkalmazott memrival), gy a httrtrra rt informcik akkor is megr-zdnek, ha a gpnket kikapcsoljuk, vagy ppen laptopunkbl kifogy az akkumultor. A ht-trtrak tipikusan sokkal nagyobb kapacitsak, mint az operatv tr, gy lnyegesen tbb adat trolhat benne. A httrtrak azonban lnyegesen lassabbak is, mit az operatv tr. Tipikus httrtrak a merevlemezek, a szilrdtest meghajtk (SSD meghajtk), vagy a CD s DVD alap trolk. A httrtr szerepe teht az, hogy programjainkat s adatainkat arra az idre is trolja, amikor azok nem az operatv trban vannak.

    A httrtron kvl szmos perifrival tallkozhatunk a szmtgpnkn. Tipikus beme-neti perifrik pl. a billentyzet vagy az egr, kimeneti perifrik a monitor vagy a nyomtat, ki-bemeneti perifrik pldul a hangkrtyk vagy a hlzati csatol krtyk.

  • 1. BEVEZETS 15

    Simon Gyula, PE www.tankonyvtar.hu

    A perifrik gyakran maguk is bonyolult berendezsek, amelyek akr sajt beptett kis szmtgppel is rendelkezhetnek. A perifrik kezelse nem egyszer feladat, ezrt ennek terht az opercis rendszer s klnfle meghajt programok veszik le a vllunkrl, gy programjainkbl knyelmesen tudjuk ezeket kezelni, fggetlenl attl, hogy ppen milyen tpus s gyrtmny perifrit hasznlunk.

    1.2. A programok A szmtgpes program a szmtgp szmra rtelmezhet utastsok sorozata, melyek egy adott feladat megoldsra szolglnak. Egy szmtgpes rendszerben szmos programmal tallkozhatunk, ha figyelmesek vagyunk, de a legtbb felhasznl szerencsre tudomst sem szerez a gpn fut programok tbbsgrl. A felhasznl ltalban az n. felhasznli programok miatt hasznlja szmtgpt (ilyenek pl. a szvegszerkesztk, bngszk, mdia-lejtszk, stb.), de esetenknt az opercis rendszer szolgltatsait is ignybe veszi (pl. prog-ramokat elindt). Az alacsony szint eszkzkezel programokkal azonban szinte soha nem kell foglalkoznia, ha egy jl bekonfigurlt rendszert hasznl.

    1.2.1. A programok kezelse, futtatsa Egy szemlyi szmtgpen programjainkat a (nem felejt) httrtron troljuk. A program indtskor tltdik az operatv trba, ahonnan az utastsokat a processzor vgrehajtja. A futs befejezse utn a program trldik az operatv trbl (de megmarad a httrtron).

    A programok ltalban teleptssel kerlnek a szmtgpnkre. A telepts egy egyszer programnl lehet pusztn annyi, hogy a httrtrunkra msoljuk a programot s mris futtat-hatjuk. Bonyolultabb programok a telepts sorn egyb belltsokat is vgezhetnek. Ltez-nek olyan programok is, amiket a gyrt telept fel a szmtgpre s a felhasznl ezeket mr csak hasznlja (pl. a szemlyi szmtgpek BIOS-a vagy az egyszerbb mobiltelefonok szoftvere is ilyen).

    A programok indtsa tbbflekppen trtnhet. Egyes programok a szmtgp bekapcso-lsa utn automatikusan elindulnak s llandan futnak (ilyen pl. egy aut fedlzeti szmt-gpn fut program, vagy akr a szemlyi szmtgpnk opercis rendszere is). Ms prog-ramokat a felhasznlk indtanak el az opercis rendszer segtsgvel (pl. kivlasztjuk a programot a start menbl, vagy kettt kattintunk a program ikonjra, vagy akr parancs-sorba begpeljk a program nevt). Vgl programokat ms programok is elindthatnak (pl. egy bngsz elindt egy mdialejtsz alkalmazst).

    Ha a szmtgpes rendszernk rendelkezik opercis rendszerrel, akkor az ltalunk ksz-tett programok knny s knyelmes kezelsrl, azok biztonsgos futtatsrl (ms progra-mokkal egytt is) az opercis rendszer gondoskodik. Az opercis rendszer segtsgvel indul el a program (pl. ketts kattints utn), az opercis rendszer gondoskodik arrl, hogy progra-munk elegend processzoridhz jusson ms fut alkalmazsok mellett, vigyz arra, hogy eset-legesen hibs programunk ms programokban ne okozhasson krt (s persze a mi programunkat is megvdi ms hibs alkalmazsoktl). Mindezen szolgltatsok ignybevtele azonban telje-sen automatikus, ezek nem ignyelnek a felhasznl oldalrl semmilyen tevkenysget.

  • 16 A PROGRAMOZS ALAPJAI

    www.tankonyvtar.hu Simon Gyula, PE

    1.2.2. Programok ksztse Ha programot runk, akkor a szmtgp nyelvn, valamilyen programozsi nyelv szablyai szerint fogalmazzuk meg azon tennivalkat, amelyeket a szmtgppel vgre szeretnnk haj-tatni. Mint ahogy az emberi nyelvek, a szmtgpes nyelvek is klnbzk: egyes nyelvek bonyolultabbak, nehezen tanulhatk meg, de rnyaltabb megfogalmazst tesznek lehetv rvid mondatokban is (pl. ilyen a francia nyelv), ms nyelvek egyszer szerkezetek, rvid id alatt elsajtthatk, de esetleg hosszadalmasabb magyarzkods szksges egy elvontabb gondolat kifejezshez (ilyen pl. az eszperant). Egyes nyelvek kivlan alkalmasak pl. filo-zfiai eszmefuttatsokra, mg msok inkbb az orrszarvvadszat rszleteinek lersban je-leskednek. gy van ez a szmtgpes nyelvek esetn is: vannak gpkzeli (alacsony szint) s bonyolultabb (magas szint) programozsi nyelvek; vannak ltalnos cl nyelvek, de vannak egyes feladatokra specializldott nyelvek is (pl. gazdasgi szmtsokra, folyamatirnytsra, vagy jtkok ksztsre).

    Az emberi nyelvek tanulsnl kzismert jelensg, hogy aki mr beszl nhny nyelvet, az a kvetkezt mr sokkal gyorsabban sajttja el. Ez klnsen igaz a programozsi nyelvekre: a programozs egy gondolkodsi forma, ennek megjelentse egy adott programozsi nyelven mr csak ezen gondolkods kivetlse. Ha valamilyen programozsi nyelven mr jl tudunk programozni, akkor nagyon valszn, hogy egy j nyelv elsajttsa sem okozhat gondot.

    1.2.3. Alacsony s magas szint nyelvek A szmtgp processzornak nagyon egyszer utastskszlete van, ezt nevezzk gpi kdnak. Egy elkpzelt processzoron mr lttunk egy pldt egyszer gpi kd programra, most lljon itt egy valdi processzorra rt program, ami a Hello World szveget rja ki a kpernyre:

    section .text global _start _start: mov edx,len mov ecx,msg mov ebx,1 mov eax,4 int 0x80 mov eax,1 int 0x80 section .data msg db 'Hello, world!',0xa len equ $ - msg

  • 1. BEVEZETS 17

    Simon Gyula, PE www.tankonyvtar.hu

    Ezt a nyelvet assembly nyelvnek nevezzk, ez a gyakorlatban hasznlt legalacsonyabb szint nyelv. Az assembly programot az assembler nev fordt program alaktja t valdi gpi utastsokk. A fenti Hello world program gy nz ki gpi kdban:

    ba66 000e 0000 b966 0024 0000 bb66 0001 0000 b866 0004 0000 80cd b866 0001 0000 80cd 0000 6548 6c6c 2c6f 7720 726f 646c 0a21

    A fordts sorn az egyes utastsokat klcsnsen egyrtelmen lehet a gpi kd repre-zentcihoz rendelni, ezrt termszetesen az assembly nyelv mindig egy adott processzorhoz (vagy kompatibilis processzorcsaldhoz) van rendelve. A megrt program radsul csak az adott szmtgpes krnyezetben fut csak. A fenti plda egy Intel Pentium kompatibilis processzorra rdott (ezen processzor utastsait hasznlja), de hasznl Linux rendszerhvso-kat is, teht ez a program kizrlag egy Linux opercis rendszert futtat PC-n fog mkdni. Nem tudjuk futtatni a programot sem egy Windows alap PC-n, sem egy Linux alap okostelefonon.

    Az ember szmra rtelmezhetetlen gpi kdhoz kpest az assembly nyelv jl olvashat, t-tekinthet. De az assembly nyelv egyszer szerkezete s utastskszlete nehezen teszi lehetv bonyolultabb programok rst. Assemblyben gyakran runk eszkzmeghajtkat, de egy sz-vegszerkeszt vagy adatbzis-kezel alkalmazshoz magasabb szint nyelveket hasznlunk.

    Egy programozsi nyelvet annl magasabb szintnek tekintnk, minl kzelebb ll a nyelv formalizmusa az emberi gondolkodshoz. Ms megkzeltsben annl magasabb szint egy nyelv, minl sszetettebb, bonyolultabb utastsokat lehet benne lerni. Egy magas szint programozsi nyelven knnyebb az algoritmusokat megfogalmazni, knnyebb a programban a hibkat megtallni, a programot a ksbbiekben karban tartani. Minl magasabb szint azonban egy nyelv, annl tvolabb ll a gpi nyelvtl, ezrt annl nehezebb hatkony (gyors, kismret kdot produkl) fordtt vagy rtelmezt kszteni hozz.

    Az albbi pldk nhny gyakran hasznlt magas programozsi nyelven mutatjk be a Hello World program szerkezett: C:

    #include int main(void){ printf("Hello, World!"); return 0; }

    Java:

    public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }

    Perl:

    print "Hello, World!\n";

  • 18 A PROGRAMOZS ALAPJAI

    www.tankonyvtar.hu Simon Gyula, PE

    Aki nem tud a fenti nyelveken programozni, az is kis angol nyelvismerettel valsznleg megrti a print szbl, hogy itt kirsrl van sz. Aki pedig mr ltott valamilyen programo-zsi nyelvet, az az tadott paramterbl azt is kitallja, hogy itt a Hello, World karakterso-rozatot ratjuk ki. Az egyes nyelvek tartalmaznak mg tbb-kevesebb, a feladat szempontjbl felesleges kdrszletet (a Perl a legkevesebbet), de ezek rvid nyelvtan-tanuls utn rt-hetv vlnak.

    Eddig a programozsi nyelvek kapcsn rtekeztnk alacsonyabb s magasabb szintekrl. Vizsgljuk meg most ezt a gondolatkrt egy meglehetsen htkznapi pldn keresztl: A rettegett kalzvezr, Morc Misi elsott egy kincses ldt egy lakatlan szigeten. Egy trk-pen bejelli a kincs lelhelyt. Vannak azonban kiss kpzetlen kalzai is, akik nem tudnak trkpet olvasni. Ezrt egy paprra feljegyzst kszttet a kincskeress mikntjrl. Segdje s bizalmasa, Fllb Ferk a trkp alapjn a kvetkez listt rja fel:

    1. Szllj ki a tekns alak sziklnl 2. Haladj 50 mtert a part mentn kelet fel 3. Fordulj a sziget belseje fel 4. Haladj 30 mtert a plmafk irnyba 5. Fordulj nyugat fel 30 fokkal 6. Haladj 10 mtert elre 7. ss 5 mter mlyre

    A lista elksztsekor Fllb Ferknak fontos szempont volt, hogy csak olyan elemi uta-stsokat alkalmazzon, amit az egyszer kalzok is megrtenek s vgre is tudnak hajtani: pl. haladj x mtert elre, fordulj el x fokkal, stb. A kincskeresst vgrehajt kalznak nem kell gondolkodnia, csak pontosan egyms utn vgre kell hajtania az utastsokat.

    Mivel a kalzok gondolkodsa a tetemes rumfogyaszts miatt elg cskevnyes, ezrt Fl-lb Ferknak gyelnie kell arra, hogy az utastsokat pontosan, megfelel sorrendben rja le. Nem kvethet el olyan hibt, hogy a haladj helyett azt rja, hogy adj halat, mert a buta kalz nem tudja kitallni Ferk szndkt. Ugyancsak a kincs elvesztshez vezet, ha Ferk 5 mter mly ss helyett vletlenl 5 lb mly sst r el. Ha vletlenl felcserl kt utas-tst, akkor a kincskeres kalz rossz helyen fog kutatni (nem mindegy, hogy Fordulj nyugat fel 30 fokkal s utna Haladj 10 mtert elre, vagy Haladj 10 mtert elre s utna Fordulj nyugat fel 30 fokkal). Analgik (csak annyira snttanak, mint Fllb Ferk):

    A paprra rt utastssorozat egy szmtgpes programra hasonlt. Fllb Ferk programja a papron, a szmtgpes programok a memriban trold-

    nak (amikor futtatjuk). Fllb Ferk programjt egy egyszer kalz hajtja vgre, a szmtgpes programot

    a CPU. Az egyszer kalz felel meg a CPU-nak (egyik sem gondolkodik, csak parancsot hajt

    vge). Itt azonban meg jegyezni, hogy mg a CPU mindig gyorsan s pontosan hajtja vgre a parancsot (nem tved), addig a kalz az elfogyasztott rum mennyisgtl fg-g sebessggel s minsgben hajtja vgre az utastsokat.

    Fllb Ferk utastsai a CPU gpi nyelvnek utastsainak felelnek meg.

  • 1. BEVEZETS 19

    Simon Gyula, PE www.tankonyvtar.hu

    Ferk ltal a lista ksztsekor elkvetett hibk a programban szintaktikai vagy sze-mantikai hibknak felelnek meg. A szintaktikai hibk kiszrse egyszerbb (akrki lthatja, hogy az adj halat rtelmetlensg), mg a szemantika hibk (pl. a felcserlt utastsok, mter-lb sszekeverse) csak gy lehetsges, ha Ferk sszeveti a listt a trkppel s ellenrzi, hogy helyes-e a lert utastssorozat.

    1.2.4. Fordts s rtelmezs A magas szint programnyelven lert utastsokat a processzor nem tudja rtelmezni, ezeket elbb a processzor gpi nyelvre t kell alaktani. A gpi nyelv reprezentcit mr a procesz-szor kpes futtatni. Ha az talakts a futtats eltt trtnik, akkor ezt fordtsnak nevezzk, az talaktst vgz segdprogram pedig a fordt (vagy compiler). Fordtst ltalban a program megrsa utn vgezzk, az elkszlt gpi kd llomnyt pedig ezek utn brmikor futtathat-juk. Mivel a fordtst csak egyszer vgezzk el, mgpedig ltalban jval a futtats eltt, gy nem kritikus, hogy mennyi ideig tart a fordtsi folyamat. Ezrt gyakran a fordt programok inkbb lassabban dolgoznak, hogy minl hatkonyabb gpi kd programot tudjanak generlni. 1.2. Plda: A C nyelv forrskdot le kell fordtani, mieltt futtatni tudjuk a programot. A programunkat C nyelven rjuk, pl. a hello.c fjlba. Ezutn a forrskdot lefordtjuk (pl. Li-nux alatt a gcc -o hello hello.c paranccsal), aminek eredmnyekpp elll a futtathat llomny

    (pldnkban hello nven). A fordt a fordtsi folyamat sorn a forrskdunkat tbb lps-ben alaktja t futtathat llomnny: elszr a preprocesszor egyszer elfeldolgozst vgez a forrskdon (pl. a #define direktvkat behelyettesti), majd a fordt a C forrskdbl assembly programot kszt. (Az assembly programot meg is nzhetjk, ha a fordtst a gcc -S hello.c paranccsal vgezzk; ekkor pl. a hello.s llomnyban megtalljuk az assembly kdot.) Az assembly llomnybl az assembler kszt trgykdot. (A trgykd pldnkban a gcc -c hello.c paranccsal llthat el, de a hello.o llomny mr emberi szemnek nem tl olvasmnyos.) Vgl a trgykdbl a felhasznlt knyvtri elemekkel a szerkeszt (vagy linker) lltja el a vgleges futtathat llomnyt (pldnkban hello n-ven). A fordts vagy szerkeszts kzben tallt hibkrl termszetesen hibazeneteket kapunk. A fordts folyamatt az 1.3. bra illusztrlja.

    1.3. bra. A C forrskd fordtsi folyamata

  • 20 A PROGRAMOZS ALAPJAI

    www.tankonyvtar.hu Simon Gyula, PE

    A fordtst vgezhetjk a plda szerint parancssorbl, vagy hasznlhatunk knyelmes in-tegrlt fejleszti krnyezeteket is, ahol a fordtst egyetlen egrkattintssal indthatjuk. Az integrlt krnyezetek tovbbi nagy elnye, hogy a hibakeresshez hatkony s knyelmes eszkzket adnak.

    Ha az forrskd futtathat formra trtn talaktst futtats kzben vgezzk, akkor r-telmezsrl beszlnk, az talaktst vgz programot pedig rtelmez programnak, vagy interpreternek nevezzk. Az interpreter a magas szint programkdot a futtats kzben ellen-rzi, rtelmezi s hajtja vgre. . Az interpretlt programok ltalban lassabban futnak, mint a fordtott programok, hiszen az rtelmezs idejvel megn a futtats ideje. 1.3. Plda: A perl nyelven rt forrskdot nem kell lefordtani, mert azt a perl interpreter se-gtsgvel azonnal futtatni tudjuk. Pl. Linux alatt a hello.perl nev forrsprogram a perl hello.perl paranccsal futtathat. Itt a perl parancs magt a perl interpretert indt-ja, amely futs kzben rtelmezi a hello.perl llomnyban tallt forrskdot s azonnal vgre is hajtja azt.

    A fordts nagy elnye, hogy a futtathat llomny a program ksztsekor elkszl, a fut-tats mr gyorsan trtnik. A fordts kzben azonban gpfgg kd keletkezik, gy az egyik platformra fordtott futtathat llomnyt egy msik platformon nem lehet futtatni (pl. a Linux alatt fordtott hello program nem fog futni Windows alatt). Ezrt a fordtott programok ersen platformfggk, ha hordozni kvnjuk programjainkat, akkor minden platformra kln le kell fordtani azokat (az adott platformra rott fordtprogrammal). Az rtelmezett nyelvek-nl nincs ilyen problma, ott magt a forrskdot hordozhatjuk, ami valamennyi platformon ahol az adott nyelvre elksztettk az rtelmez programot ugyangy fog futni. Pl. a hel-lo.perl program Windows s Linux alatt is ugyanazt az eredmnyt adja (termszetesen Windows alatt ms perl parancsrtelmez program fut, mint Linux alatt). Az rtelmezett nyelveken rt programok azonban ltalban lnyegesen lassabban futnak, mint a fordtottak. Hogy a fordts nagy sebessgt a hordozhatsggal tvzni lehessen, ltrejttek kzbls megoldsok, amelyek tartalmaznak mind fordtsi, mint rtelmezsi fzisokat. Ezen nyelve-ken rt forrskdot nem a gpi nyelvre, hanem egy kzbls kdra fordtjuk le. A fordts sorn megtrtnik a szintaktikai ellenrzs, s gy elll egy platformfggetlen kzbls kd. Ezt a kdot minden platformon egy rtelmez dolgozza fel, ami rtelmezi, vagy egyes megva-lstsokban futs kzben lltja el a platformfgg gpi nyelv kdot. Ilyen tpus nyelv pl. a Java.

    1.4. Plda: A java nyelv HelloWorld.java nev forrskdunkat elszr bjtkdra fordt-juk le (a Java esetn bjtkdnak nevezzk a platformfggetlen kzbls kdot). A fordtst pl. a javac HelloWorld.java paranccsal vgezhetjk el. A fordts eredmnye a HelloWorld.class nev llomnyban tallhat. Ezt a bjtkdot akr Windows, akr Li-nux alatt a java HelloWorld paranccsal futtathatjuk.

  • 1. BEVEZETS 21

    Simon Gyula, PE www.tankonyvtar.hu

    Morc Misi reggel napiparancsot hirdet alvezreinek: Gonosz Gza, hozztok el a szigetrl az elrejtett kincset.

    Kalz Karcsi, raboljtok el s hozztok ide Lady Gagt, koncertet adunk a szlets-napomon. Vak Viki, ha lve hazartek, etesd meg a papagjt. ...

    A kalzvezrek csapatukkal elindulnak vgrehajtani a parancsokat. Gonosz Gza pl. a kvet-kez utastsokat kiltja emberinek:

    Horgonyt fel! Vitorlt fel! Irny dl-dlkelet!

    Mikor a szigethez rnek, a kvetkez utastsokat harsogja: Vitorlt le! Horgonyt le!

    Vgl kikld egy csnakot a tekns alak szikla fel Fllb Ferk utastsaival: Szllj ki a tekns alak sziklnl Haladj 50 mtert a part mentn kelet fel ...

    A kincs sikeres kissa utn pedig hazahajzik: Horgonyt fel! Vitorlt fel! Irny szak-szaknyugat! ...

    A napiparancsok lnyegesen bonyolultabbak, mint a menj x mtert elre tpus egysze-r utastsok, ezeket az egyszer kalz nem tudn vgrehajtani. Amikor Gonosz Gza csapa-tval elindul a kincsrt, Gza lebontja a bonyolult parancsot egyszer utastsokk, amit az emberei is megrtenek: pl. Horgonyt fel!, vagy Szllj ki a tekns alak sziklnl. Ebben a pldban a kvetkez analgikat fedezhetjk fel:

    Morc Misi napiparancsa egy magas szint nyelven megrt programnak felel meg. A napiparancsbeli parancsok a magas szint nyelv utastsai (ezeket a vgrehajt egy-

    sg egyszer kalz vagy a CPU mg nem tudja rtelmezni) Gonosz Gza (s a tbbi alvezr) egy parancsrtelmeznek felel meg. fordtja le

    a magas szint utastsokat a vgrehajtk szmra is rthet s vgrehajthat alacsony szint utastsok sorozatra.

    Ha kalzos pldnkban tovbbi analgikat keresnk, Fllb Ferk listjt tekinthetjk a magas szint sstok ki a kincset utasts gpi nyelvre lefordtott vltozatnak. Itt a ford-t Fllb Ferk volt, aki kpes volt a bonyolult parancsot egyszer utastsokk alaktani. Persze lehetsg van msfle rtelmezsre is: Fllb Ferkt tekinthetjk egy assembly nyel-vet hasznl programoznak is, aki maga kszti el a programot alacsony gpi szint uta-stsok segtsgvel.

  • 22 A PROGRAMOZS ALAPJAI

    www.tankonyvtar.hu Simon Gyula, PE

    1.3. Httrismeretek

    1.3.1. Szmrendszerek, szmbrzols A mai digitlis eszkzeink ktllapot logikval mkdnek. Ez rszben fizikai, rszben trt-nelmi-technolgiai okokra vezethet vissza: knny olyan rendszereket kszteni, amelyek-ben az elemek kt jl definilt llapot valamelyikben vannak. A legalapvetbb ktllapot eszkz a kapcsol, illetve az ehhez tartoz lmpa: a kapcsol vagy fel van kapcsolva, vagy le van kapcsolva, kztes llapot nem lehetsges (a villanykapcsolkban pl. egy egyszer rugs szerkezet biztostja, hogy ne lehessen a kapcsolt flton meglltani, az elengedett kapcso-l az mindig az egyik vgllapotba billen). Az digitlis elektronikus eszkzk szintn ktlla-pot, binris elemekbl plnek fel, ahol a kt llapotnak pl. egy az alacsony vagy magas feszltsg felel meg. Az ilyen rendszerekben trolt informci is ktllapot, ahol az egysg a bit. Egy bit rtke lehet 1 vagy 0, igaz vagy hamis. A binris rendszerekben termszetszer-en a kettes szmrendszeren alapul szmbrzolst hasznljuk.

    1.5. Plda: 112 = 1*2 + 1*1 = 3 10012 = 1*8 + 0*4 + 0*2+ 1*1 = 9 1100101012 = 1*256 + 1*128 + 0*64 + 0*32 + 1*16 + 0*8* 1*4 + 0*2 + 1*1 = 405

    Nagyobb mennyisgek lersra gyakran hasznlunk a bit helyett bjtokat. A bjt nyolc bitbl ll, ezrt egy bjton 28=256 rtk brzolhat (0, 1, 2, 3, ..., 253, 254, 255).

    Mivel szmok kettes szmrendszerbeli brzolsa hossz, a gyakorlatban nem szoktuk azt mondani, hogy a bjt rtke 10010101, hanem helyette vagy a tzes szmrendszerbeli (deci-mlis) rtkt kzljk (149), vagy helyette a hexadecimlis szmbrzolst hvjuk segts-gl, ami a 16-os szmrendszeren alapul.

    Egy bjtot kt ngyes csoportra bonthatunk (fels ngy bit, als ngy bit). Ezen bitngye-seken sszesen 24=16 szmrtk brzolhat (0, 1, 2, ..., 15). Sajnos a 9-nl nagyobb rtkek-hez a decimlis brzolsban mr kt szmjegyre van szksg, ezrt ezt a hat szmot helyette-stsk az A, B, C, D, E s F karakterekkel, a kvetkezk szerint:

    Decimlis: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 hexadecimlis: 0 1 2 3 4 5 6 7 8 9 A B C D E F

    gy egy bjtot kt hexadecimlis karakterrel lehet jellemezni, pl. 6A, vagy 44. A 6A-rl azonnal sejtjk, hogy hexadecimlis szm, de a 44 karaktersorozatrl nem lehet eldnteni, hogy az a negyvenngy decimlis szmot jelenti, vagy a ngy-ngy hexadecimlis szmot. Ezrt a hexadecimlis szmokat megegyezs szerint valamilyen mdon jelljk, pl. rhatunk mg egy h karaktert (6Ah, 44h) , vagy rhatunk el egy 0x karaktersorozatot (0x6A, 0x44).

    Termszetesen nem csak bjtokat brzolhatunk hexadecimlis formban, hanem brmi-lyen szmot is. A hexadecimlis szmbrzols nem ms, mint a szm 16-os szmrendszerbe-li reprezentcija.

  • 1. BEVEZETS 23

    Simon Gyula, PE www.tankonyvtar.hu

    1.6. Plda: 3Eh = 0x3E = 3*16 + 14 = 62 E4CAh = 0xE4CA = 14*163 + 4*162 + 12*16 +10 = 58570 25h = 0x25 = 2 * 16 + 5 = 37 ( 25!) FFh = 0xFF = 15*16 +15 = 255 FFFFh = = 0xFFFF = 15*163 + 15*162 +15*16 +15 =65535

    1.3.2. Prefixumok A mindennapi letben gyakran hasznlunk vltszmokat (prefixumokat). ltalban a boltban egy kilogramm kenyeret krnk s nem ezer gramm kenyeret. Kt vros tvolsgt kilomter-ben adjuk meg, a csavarok mrett millimterben, mg a fny hullmhosszt nanomterben. Az SI prefixumok jelentst a legtbb ember alapfok tanulmnyaibl ismeri. Azt is tudjuk, hogy az SI prefixumok a nagysgrendeket az ezer (103) hatvnyai szerint mdostjk. Teht a milli jelentse egy ezred, a kilo ezerszeres, mg a mega egymilliszoros szorzt jelent.

    Az informatika terletn sajnlatos mdon ugyanezeket a prefixumokat kicsit ms rte-lemben hasznljuk, ami bizony flrertsekre adhat okot. Itt a tz (illetve az ezer) hatvnyai helyett a kett (illetve a 210=1024) hatvnyait hasznljuk.

    Az informatikai prefixumok az SI prefixumokhoz kzeli arnyokat jeleznek (pl. a kilo 1000 helyett 1024-et), de az eltrs a nagyobb prefixumok fel egyre nagyobb. A flrertsek elkerlsre az IEC (International Electrotechnical Commission) 1998-ban javasolta, hogy az SI prefixumokat kizrlag decimlis alap rtelemben hasznljuk. Binris rtelemben (2 hat-vnyainak jellsre) j elnevezst s jellst javasolt. Ennek lnyege, hogy a jellsben az SI prefixumhoz egy i bett illesztnk, a kiejtsben pedig az SI prefixum els kt betjt kieg-sztjk a bi (binary) vgzdssel. Ezt a javaslatot az ISO/IEC szabvnygyi testlete 2000-ben elfogadta, majd 2005-ben s 2008-ban megerstette s kiegsztette. A javaslatot a Ma-gyar Szabvnygyi Testlet 2007-ben MSZ EN 60027-2 szm alatt honostotta.

    SI (decimlis) IEC (binris)

    Prefixum rtke

    Prefixum rtke

    jele neve jele neve

    k,K kilo 103 1.000 Ki kibi 210 1.024

    M mega 106 1.000.000 Mi mebi 220 1.048.576

    G giga 109 1.000.000.000 Gi gibi 230 1.073.741.824

    T tera 1012 1.000.000.000.000 Ti tebi 240 1.099.511.627.776

    P peta 1015 1.000.000.000.000.000 Pi pebi 250 1.125.899.906.842.624

    E exa 1018 1.000.000.000.000.000.000 Ei exbi 260 1.152.921.504.606.846.976

    Megjegyzs: az informatikban nem hasznlunk egynl kisebb prefixumokat, teht nincs millibjt, de van terabjt.

  • 24 A PROGRAMOZS ALAPJAI

    www.tankonyvtar.hu Simon Gyula, PE

    1.7. Plda: Ha egy 4 GiB-os (4 gibi bjtos) memria modulunk van, akkor abban 4096 megabjt, azaz

    4.194.304 kilobjt, azaz 4.294.967.296 bjt informcit tudunk trolni. Ezzel szemben 4 TB-os httrtroln 4000 gigabjt, azaz 4.000.000 megabjt, azaz 4.000.000.000 kilobjt, azaz 4.000.000.000.000 bjt informcit tudunk trolni.

    1.3.3. Az ASCII kdols Programjainkban gyakran elfordul, hogy karaktereket olvasunk be, dolgozunk fel, vagy jelen-tnk meg. Ezrt rdemes megismerkedni a karakterek szmtgpes brzolsval, kdolsval.

    Az egyik leggyakrabban hasznlt karakterkdolsi szabvny az ASCII (American Stan-dard Code for Information Interchange), ahol karaktereket egy bjton kdoljk. A szabvnyos ASCII karakterek az als ht bitet foglaljk el, az F1. fggelkben tallhat tblzat szerint.

    A tblzatban a sttebb mezk az n. vezrl karaktereket jellik, amelyek nagy rsze mr csak trtneti jelentsggel br (pl. a 8-es kd BEL karakter,aminek kirsa egy cseng hangot szlaltat meg), de mg nhnyat aktvan alkalmazunk (pl. ilyen a 9-es kd tabultor vagy a 10-es (0xA) kd soremels).

    1.8. Plda: Az A karaktert a 0x41 = 65 szm jelli. A kis a karakter kdja a 0x61 = 97. A b kdja a 0x62 = 98. Az egyes szmjegy 1 kdja a 0x31 = 49.

    Figyelem: az 1 karakter nem azonos az 1 szmmal! Az 1 egsz szmot pl. a szmtgp gy kdolhatja egy bjton: 0000 0001, mg az 1 karakter ASCII kdja 0011 0001.

    Az ASCII kdols csak igen korltozott mennyisg karakter kdolsra elegend. Sajnos az ASCII kd nem tartalmazza a magyar bc sszes betjt, nem is beszlve a nem latin betket hasznl nyelvek karaktereirl. gy szmos ms kdolsi szabvnyt is kidolgoztak, aminek segtsgvel (hosszabb kdokat) alkalmazva ezen karaktereket is brzolni lehet.

    Az ASCII tblzatot (vagy egyb kdokat) termszetesen nem kell fejbl tudni, st egy ma-gas szint programozsi nyelvnl egyltaln nem is kell hasznlni (Pl. egyes nyelvekben pl. a Q karakterre gy hivatkozhatunk, hogy Q, a tabultor karakterre pedig gy: \t). De mindenkp-pen hasznos, ha szben tartjuk azt, hogy a karaktereket is egy bitsorozatknt trolja a szmt-gp. Minl alacsonyabb szint nyelvet hasznlunk, annl inkbb tisztban kell lennnk azzal, hogy milyen kdolst (pl. hny bjt hosszt) alkalmazunk karaktereink kdolsra.

  • 1. BEVEZETS 25

    Simon Gyula, PE www.tankonyvtar.hu

    Feladatok: 1.1. Tltsk ki a kvetkez tblzat hinyz elemeit a plda szerint. Minden sorban ugyan-

    azon szm klnbz szmrendszerbeli brzolsai szerepeljenek.

    Decimlis Binris Hexadecimlis

    143 10001111 8F

    17

    149

    43690

    61937

    1011000

    11110011100

    10011100001111

    1101010000110001

    FA

    1234

    F0C1

    ABCDE

    1.2. Prbljuk meg a fejezetben szerepl C, Java s Perl nyelv Hello World programok valamelyikt (esetleg mindet) futtatni.

    1.3. Fejtsk meg az albbi ASCII-kdolt szveget: 69h, 70h, 61h, 66h, 61h, 69h, 20h, 70h, 61h, 70h

    1.4. Egy httrtron filmeket trolunk tlagosan 700MiB hossz llomnyokban. A httr-tr mrete 20TiB. Hny filmet tudunk rajta eltrolni?

  • www.tankonyvtar.hu Simon Gyula, PE

    2. fejezet Algoritmusok s programok

    Az algoritmus sz valsznleg Muhammad ibn Musa Al-Khwarizmi perzsa matematikus (s polihisztor) nevbl szrmazik, de a legismertebb algoritmus mgis Eukleidsz nevhez kt-dik. Ez a hres mdszer alkalmas kt termszetes szm legnagyobb kzs osztjnak megha-trozsra. Az algoritmus egy lehetsges megfogalmazsa a kvetkez:

    ALG2.1. Legyen x s y kt szm gy, hogy 0x y > . Keressk a legnagyobb kzs osz-tjukat.

    1. Legyen r az x s y maradkos osztsnak maradka. 2. x helybe tegyk az y-t, y helyre az r-t. 3. Ha 0y = , akkor x a legnagyobb kzs oszt, klnben ismteljk az 1. lpstl.

    Egy msik, ugyancsak ismert algoritmus a msodfok egyenlet vals gykeinek meghatro-zsra szolgl:

    ALG2.2. Keressk az 02 =++ cbxax egyenlet vals megoldsait. 1. Az albbi kpletekbe helyettestsk be az egyenlet egytthatit:

    aacbbx

    242

    1+

    = , a

    acbbx2

    422

    = .

    2. Ha a ngyzetgyk alatti kifejezs nem negatv, akkor az egyenlet gykei 1x s 2x , egybknt az egyenletnek nincs vals gyke.

    Egy harmadik algoritmus a koca-motorosoknak segt a hiba javtsban. ALG2.3. Nem indul a motor. Keressk meg s javtsuk ki a hibt.

    1. Ellenrizd a benzintankot. Ha nincs benne benzin, akkor tltsd tele. 2. Ha mg mindig nem indul, akkor ellenrizd az akkumultort. Ha nincs megfelel-

    en feltltve, akkor tltsd fel. 3. Ha mg mindig nem indul, ellenrizd a gyertyt. Ha szksges, cserld ki. 4. Ha mg mindig nem indul, vidd el szerelhz.

    Az algoritmusnak szmos lehetsges meghatrozsa, defincija ltezik, mi most alkal-mazzuk a kvetkez defincit:

    Az algoritmus vges szm utastsbl ll, amelyek egy feladat vgrehajtsra szolglnak. Az algoritmus egy bemen llapotbl indulva az utastsokat jl definilt sorrendben vgre-

  • 2. ALGORITMUSOK S PROGRAMOK 27

    Simon Gyula, PE www.tankonyvtar.hu

    hajtva a vgllapotba kerl (megll). Az algoritmustl megkveteljk, hogy minden utasts vgrehajtsa utn a kvetkez utasts egyrtelmen meghatrozott s korltozs nlkl vg-rehajthat legyen, valamint azt is, hogy vges szm lpsben befejezdjn.

    Vizsgljuk meg, hogy a fenti defincit kielgti-e ALG2.1. Az ALG2.1 utastsai az 1, 2 s 3 jel lpsekben vannak lerva (teht valban vges szm pontosan hrom utastsbl ll). Ezen utastsok sorrendje is egyrtelmen meg van hatrozva (az 1. s 2. lpseket ism-teljk, amg meg nem talljuk a legnagyobb kzs osztt). Ezen utastsok egyms utn min-dig vgrehajthatk, amg az algoritmus meg nem ll (vagyis y nem nulla). Az algoritmus ga-rantltan vges lpsben befejezdik (hiszen y rtke minden lpsben cskken, vagyis y v-ges lpsben szksgszeren 0 lesz, ami az algoritmus megllshoz vezet).

    Hasonlan a fenti definciminden kritriumnak megfelelnek ALG2.2 s ALG2.3 is, te-ht ezek is algoritmusoknak tekinthetk.

    Vizsgljuk meg, hogy a kvetkez lers algoritmus-e: ALG2.4. Keressk az 02 =++ cbxax egyenlet vals megoldsait.

    1. Oldd meg az 02 =++ cbxax egyenletet ALG2.4 hasonl problmt old meg, mint ALG2.2, de ALG2.4-ben csak egyetlen nagyon

    tmr utasts tallhat (Old meg az 02 =++ cbxax egyenletet). Ha ezen utasts a definci szerint egyrtelmen meghatrozott, illetve korltozs nlkl vgrehajthat, akkor a defin-ci minden tovbbi kvetelmnye is trivilisan teljesl, teht ALG2.4 is algoritmus. Ha az egy-rtelm meghatrozottsg felttele nem teljesl, akkor ALG2.4 nem algoritmus.

    Az utasts egyrtelm meghatrozottsga s korltozs nlkli vgrehajthatsga azt je-lenti, hogy az utasts vgrehajtja pontosan rti s vgre is tudja hajtani az utastst. Egy k-zpiskolt vgzett ember rti, mit jelent az Oldd meg az 02 =++ cbxax egyenletet utasts, be tudja helyettesteni az egytthatkat a megold kpletbe, tudja, hogy mikor van vals gyk s mikor nincs, anlkl, hogy ezt rszletesebben elmagyarznnk neki: szmra ALG2.4 algo-ritmus. Egy ltalnos iskols dik azonban mg nem rt a msodfok egyenletekhez, gy sz-mra ALG2.4 nem rtelmezhet, neki ez ilyen formban nem algoritmus. Azonban ha rszle-tesebben elmagyarzzuk neki, mit is jelent a msodfok egyenlet megoldsa, szmra rthet mdon kifejtjk neki a bonyolult utastst mint azt ALG2.2-ben tettk akkor egy zseb-szmolgp segtsgvel is meg tudja oldani a feladatot. A fenti tanulsgok alapjn definil-juk az elemi s sszetett tevkenysgek fogalmt:

    Elemi tevkenysgnek nevezzk azt a legbonyolultabb tevkenysget, amely a vgrehajt szmra kzvetlenl rthet s egyrtelmen vgrehajthat anlkl, hogy azt tovbbi rszekre bontannk. Az sszetett tevkenysgek ezzel szemben tbb elemi tevkenysgbl llnak. Korbbi kalzos pldnkban a napiparancs a kvetkez utastsokbl llt:

    Gonosz Gza, hozztok el a szigetrl az elrejtett kincset. Kalz Karcsi, raboljtok el s hozztok ide Lady Gagt, koncertet adunk a szletsna-

    pomon. Vak Viki, ha lve hazartek, etesd meg a papagjt.

    A napiparancsban minden utasts egy elemi utasts volt az alvezrek (Gonosz Gza, Ka-lz Karcsi s Vak Viki) szmra. k ezeket a parancsokat rtettk s vgre tudtk hajtani anlkl, hogy Morc Misinek tovbb kellett volna magyarznia. Gonosz Gza tudta, hogyan

  • 28 A PROGRAMOZS ALAPJAI

    www.tankonyvtar.hu Simon Gyula, PE

    kell a szigetig elhajzni s ott kisni a kincset. Kalz Karcsi is tisztban volt azzal, hogy ki az a Lady Gaga s hogyan kell elrabolni t. Vak Viki pedig szakrtje a papagjetetsnek, gy neki sem okoz gondot a parancs rtelmezse s vgrehajtsa.

    Az egyszer matrzok szmra ezen utastsok nem elemi utastsok, teht ezeket tovbb kell rszletezni szmukra. gy Gonosz Gza is egyszerbb parancsok sorozatra bontotta a tevkenysget (Vitorlt fel, vagy Szllj ki a tekns alak sziklnl). Ezen parancsok mr elemi parancsok a matrzok szmra, gy azokat pontosan vgre is tudjk hajtani. Az alvezrek intelligensebb emberek, ezrt jobban is fizetik ket, mit a matrzokat. A vezr ezrt el is vrja tlk, hogy legyenek kpesek bonyolultabb, magasabb szint feladatokat megoldani.

    Eddigi algoritmusainkat klnfle szemlyek hajtottk vgre. Ha az algoritmus vgrehaj-tst egy gpre bzzuk, akkor elrkeznk a program fogalmhoz:

    A szmtgpes program olyan algoritmus, amelynek minden elemi tevkenysge a szmtgp szmra rtelmezhet.

    Hasonlan a kalz alvezrekhez s egyszer matrzokhoz, programjaink vgrehajt esz-kzei is lehetnek intelligensebbek vagy egyszerbbek. Amint lttuk, a szmtgp vgrehajt egysge szmra rtelmezhet legelemibb utasts a gpi kd utasts. Egy ilyen utasts assembly nyelvi megfelelje pl. a kvetkez utasts: U1: mov ebx,1

    Ez az utasts egy x86 architektrj processzoron az ebx nev regiszterbe mozgat 1-et. Ez egy nagyon alacsony szint utasts, ilyenekbl elg fradsgos megrni a msodfok egyenlet megold kplett. Az assembly nyelv alacsony szint programozsi nyelv. A kvetkez utasts mr magasabb szint elemekbl ptkezik, a lert utasts hasonlt ahhoz, amit matematikarn rnnk (az sqrt jelenti a gykvonst): U2: x1=(-3+sqrt(3^2-4*2*1))/(2*2);

    A gp a parancs vgrehajtsa utn az x1 vltozba betlti az egyenlet egyik gykt (x1=-0.5). Ilyen tpus utastsokat szinte minden ltalnos cl programozsi nyelven megadhatunk (pl. C-ben is). Ezeket a nyelveket magas szint programozsi nyelveknek ne-vezzk. Persze a magas szint nyelvek kztt is vannak klnbsgek, egyes nyelvek bizonyos problmkra igen magas szint utastsokat tartalmazhatnak. Pl. a kvetkez MATLAB pa-rancsban csak a megoldand egyenletet kzljk a gppel, a megold kplettel mr nem kell bajldnunk: U3: x=solve('2*x^2+3*x+1=0')

    A gp vlasza itt mr tartalmazza mindkt megoldst, st a -0.5 lebegpontos formtum helyett az eredmnyt a pontos trt-formtumban kaptuk meg.

    x = -1/2 -1

    Nyilvnvalan az U3 pldban jutottunk el a legmagasabb absztrakcis szintre, ahol az adott feladat a msodfok egyenlet megoldsa kzvetlen megfogalmazsra alkalmas na-gyon magas szint parancs is rendelkezsre llt. Ezen a nyelven nem kellett a megolds mi-kntjn gondolkodni, csak a feladatot kellett az adott nyelven megfogalmazni (solve Oldd meg a kvetkez egyenletet). Itt a program rsa kzbeni tvedsek lehetsge kicsi, a program jl ttekinthet s egyrtelm. Az U2 pldban egy ltalnos matematikai appar-

  • 2. ALGORITMUSOK S PROGRAMOK 29

    Simon Gyula, PE www.tankonyvtar.hu

    tus llt rendelkezsnkre, ahol neknk kellett a megolds mikntjt a megold kpletet leprogramozni, de mg mindig elg magas absztrakcis szinten: voltak vltozink, a matema-tikai mveletek jellse ismers volt. A kd olvassa kzben viszonylag hamar rjvnk, hogy mit is csinl a program, de mr a programunk bonyolultabb, terjengsebb, a hibk elk-vetsre is tbb lehetsgnk van. A U1 pldban az absztrakcis szint nagyon alacsony volt, a megolds sorn hasznlt appartusnak alig volt kze a feladathoz: nincsenek vltozk, az aritmetikai mveletek nehezen ttekinthetk, a program nem olvasmnyos. Ilyen alacsony szint nyelven nagyon knny hibkat vteni s ezen hibk megtallsa is nehzkes.

    Tegyk fel, hogy egy szmtgpes rendszerben a kvetkez elemi utastsok lteznek: beolvas: X: beolvassa az X nev vltoz rtkt kir: X kirja az X nev vltoz rtkt kir: szveg: kirja a szveg karaktersorozatot Aritmetikai mveletek (sszeads, szorzs, gykvons, stb.) vltozk segtsgvel Oldjuk meg ezzel a gppel a msodfok egyenletet (azaz adjunk olyan msodfok egyen-

    let megoldsra alkalmas algoritmust, aminek elemei mveletei a gp elemi mveleteivel egyeznek meg).

    A felhasznlt vltozink legyenek a, b, c, D, x1 s x2, amelyeket rendre az egyenlet egytt-hatinak, a diszkriminnsnak, valamint a kt gyk rtkeinek trolsra hasznlunk. Az algoritmus pldul a kvetkez lehet:

    beolvas: a beolvas: b beolvas: c legyen D rtke acb 42 ha D negatv akkor

    kir: Nincs vals gyk klnben

    legyen 1x rtke aDb

    2+ , legyen 2x rtke a

    Db2

    kir: az els gyk x1 kir: a msodik gyk x2

    Az algoritmus fenti lersa az emberi nyelvhez kzeli, mgis formalizlt nyelven trtnt. Pl. a ha ... akkor ... klnben ... fordulatot vltozatlan formban talljuk meg a lersban, mg a beszlt nyelvi olvasd be a-t parancs helyett a ragozatlan, tmrebb beolvas: a pa-rancsot alkalmaztuk. Az ilyen tpus lersokat pszeudo-kdnak nevezzk. A pszeudo-kd tovbbi trgyalsra, a nyelvi szablyok rszletes ismertetsre s finomtsra a 3. fejezetben kerl majd sor.

    Algoritmusainkat gyakran szemlletes, grafikus formban is megfogalmazzuk. Az egyik ilyen gyakran hasznlt lersi md a folyamatbra. A folyamatbra nhny egyszer elembl amelyek klnfle tevkenysgeket szimbolizlnak , valamint ezen elemeket sszekt nyilakbl llnak. A nyilak az elemek egyms utni vgrehajtsi sorrendjt mutatjk. Minden tevkenysgbl pontosan egy nyl vezet a kvetkez vgrehajtand tevkenysghez kivve

  • 30 A PROGRAMOZS ALAPJAI

    www.tankonyvtar.hu Simon Gyula, PE

    az elgazst, ahonnan kt nyl is vezet tovbb. A folyamatbra vgrehajtsi szablya egysze-r: olyan sorrendben kell a tevkenysgeket vgrehajtani, ahogyan azt a nyilak mutatjk.

    A folyamatbra elemeit a 2.1. bra mutatja. A folyamatbra vgrehajtsa mindig a start szimblumnl kezddik s a stop szimblumnl vgzdik. A folyamatbrban az utastsokat amelyek lehetnek sszetett utastsok is tglalapba rjuk. Kt specilis utastsnak kln

    szimbluma van, ezek az adatbevitel (trapz) s a kirs (lekerektett sark tglalap). A fo-lyamatbrban ezen kvl hasznlhatunk elgazst is (rombusz). Az egyes elemek kztt a vgrehajtsi sorrendet nyilak jelzik. A start szimblumbl csak kifel, mg a stop szimb-lumba csak befel vezet nyl. Az utastsokba mindig egy nyl vezet befel s egy nyl vezet kifel. Az elgazsba egy nyl vezet befel s kt nyl vezet kifel: a vgrehajts a felttel kirtkelse fggvnyben folytatdhat az egyik vagy msik gon.

    Megjegyzs: a folyamatbrk jellsre tbbfle irnyzat ltezik, ezekben kiss eltr mdon jellik az egyes tevkenysgeket. Termszetesen brmelyik jells megfelel; mi most hasznljuk a 2.1. brn lthat kszletet.

    A msodfok egyenlet megoldst az 2.2. brn lthat folyamatbra rja le. A program vgrehajtsa a start szimblumnl kezddik, majd a hrom beolvas utasts kvetkezik egy-ms utn. Ezek utn a diszkriminns kiszmts trtnik meg, majd az elgazsnl folytatdik a vgrehajts. Ha a felttel (D < 0) igaz, akkor program a felttel szimblum igaz felirat nyilnl folytatdik az zenet kirsval. Ha a felttel hamis, akkor a vgrehajts a gykk kiszmtsval s a kt gyk kirsval folytatdik. A program mindkt ga a stop szimb-lumba torkollik, itt r vget a program vgrehajtsa.

    A folyamatbrt termszetesen nem csak szmtgpes programok, hanem brmilyen al-goritmus lersra is alkalmazhatjuk. Az ALG2.3 jel motorjavt algoritmus lersa a 2.3. brn lthat. A folyamatbra pontosan azokat a tevkenysgeket rja, mint az ALG2.3 szveges (pszeudo-kdos) vltozat, de a vizulisabb tpus emberek taln jobban tltjk a tevkenysgeket s azok sorrendjt.

    2.1. bra. A folyamatbra elemei

  • 2. ALGORITMUSOK S PROGRAMOK 31

    Simon Gyula, PE www.tankonyvtar.hu

    Feladatok: 2.1. rjuk fel a dleltti tevkenysgeinket szvegesen, majd folyamatbrval is.

    A tevkenysgek az bredssel kezddjenek s az ebddel fejezdjenek be. Vegyk figyelembe, hogy htkznapokon mst csinlunk, mint a htvgn.

    2.2. rjuk le kedvenc receptnk (pl. palacsinta) elksztsi mdjt folyamatbrval. Az algoritmus gyeljen arra is, hogy egyes hozzvalk esetleg nincsenek otthon, ezeket a sts-fzs eltt be kell szerezni. A hozzvalkat ltalban a kzeli boltban meg lehet vsrolni, de sajnos nha itt nem minden kaphat: ilyenkor el kell menni a tvolabbi szupermarketbe is.

    2.2. bra. A msodfok egyenlet megoldsnak folyamatbrja

    2.3. bra. A motorkerkpr-pols kocknak (ALG2.3) folyamatbrval

  • 32 A PROGRAMOZS ALAPJAI

    www.tankonyvtar.hu Simon Gyula, PE

    2.3. rjuk le az ltzkds folyamatt folyamatbra segtsgvel. ltzetnk vltozzon az idjrsnak s az alkalomnak megfelelen. Viseljnk btran nadrgot s szoknyt (urak kiltet) is.

    2.4. rjuk le az ALG2.1 (kt szm legnagyobb kzs osztjt keres) algoritmust folyamat-brval. Egsztsk ki az algoritmust a kt szm (x s y) beolvassval s az eredmny kirsval is. gyeljnk arra, hogy ALG2.1 felttelezi, hogy x y . Ezt ellenrizzk s ha nem gy van, rjunk ki hibazenetet. Egsztsk ki az algoritmust gy, hogy az x y< esetn is mkdjn. Tipp: ilyenkor cse-rljk meg a kt szmot beolvass utn. (A megoldst a 3. fejezetben ismertetjk.)

  • Simon Gyula, PE www.tankonyvtar.hu

    3. fejezet Alapvet vezrlsi szerkezetek s a strukturlt program

    Algoritmusainkat, programjainkat nem gpek, hanem emberek rjk, tartjk karban. Ezrt a programok ksztsnl figyelembe kell venni emberi mivoltunkbl ered korltainkat. Ez irnyba mutat nyilvnval trekvs a magas szint programozsi nyelvek hasznlata: az em-berek sokkal knnyebben tltnak olyan tpus lersokat, amelyek kzelebb llnak az emberi gondolkodshoz, kifejezsi formkhoz, mint mondjuk egy gpi kdban lert szmsorozatot.

    Az emberi korltok kzl egy fontos tnyez korltozott memrink. Egyszer tesztekkel igazolhat, hogy az emberek tlagosan egyszerre krlbell 7 dolgot tudnak szben tartani. Ennl sokkal tbb elem rendszereket mr nehezen ltunk t. Ez a korlt termszetesen a programozsra is igaz: ha egy olyan algoritmust ksztnk, amely igen sok alkotrszbl ll, akkor ez elbb vagy utbb ttekinthetetlenn vlik, mind a ksztje, de klnsen ms olva-sk szmra. Clszer teht trekedni arra, hogy algoritmusaink viszonylag kevs ptelem-bl lljanak.

    Az emberi gondolkods ersen smkon alapul, szeretnk jl ismert elemekbl ptkezni. A programozsi tevkenysgek esetben ez azt jelenti, hogy egy jl kezelhet programban (az egybknt kevs szm) rszegysg kapcsolata jl definilt smkon alapuljon. Ezen kapcso-lati smkat tevkenysgszerkezeteknek nevezzk s sszesen hrom alapvet tevkenysg-szerkezetet hasznlunk. Ezek a kvetkezk:

    sorozat (vagy szekvencia), elgazs (vagy szelekci), ciklus (vagy iterci).

    3.1. Tevkenysgsorozatok A tevkenysgsorozat (szekvencia) a legegyszerbb tevkenysgszerkezet: egyszeren azt jelenti, hogy klnfle tevkenysgeket vgznk, mgpedig egyiket a msik utn. Szekvenci-k elfordulnak a leghtkznapibb helyzetekben: pl. vizet engedek a pohrba, majd belefacsa-rom egy citrom levt, majd kevs cukorral zestem. Egy ilyen logikailag egysgbe tartoz

  • 34 A PROGRAMOZS ALAPJAI

    www.tankonyvtar.hu Simon Gyula, PE

    tevkenysgsorozatot kezelhetnk egyetlen sszetett tevkenysgknt is, az elbbi pldnk-ban pl. hvhatom ezt az sszetett tevkenysget limondksztsnek is. Tovbbi pldk htkznapi szekvencikra:

    Htf reggel magyar ra van, aztn trtnelem, utna angol, majd matek kvetkezik. A hst jl megmossuk, apr darabokra szeleteljk. A hagymt aprra vgjuk, a fstlt

    szalonnt feldaraboljuk. Felszeletelnk egy paradicsomot s egy paprikt is... (Gulys recept)

    A pohr szjt nedvestsk be egy citromdarabkval majd mrtsuk egy tl sba. Kt rsz tequilt, egy rsz Triple Sec-et, egy rsz lime-levet sok jggel jl rzzunk ssze egy shakerben, majd szrjk az elksztett pohrba. Dsztsk egy lime-darabbal. (Margarita)

    Elmegyek a boltba. Megveszem a gymlcst, zldsget, a kenyeret, majd a felvgot-tat. Hazaviszem az rukat. Megtertek a vacsorhoz. Jzen falatozunk.

    Amennyiben tevkenysgsorozatot pszeudo-kddal szeretnnk lerni, akkor egyszeren a tevkenysgeket egyms al rjuk. Egy hrom elem szekvencia esetn pl. gy nzhet ki a pszeudo-kd:

    Tevkenysg 1 Tevkenysg 2 Tevkenysg 3

    Ha folyamatbrt szeretnnk hasznlni a szekvencia lersra, akkor a tevkenysgeket (pl. egyms al rajzolva, de ms topolgia is ppen ilyen j) nyilakkal sszektve brzoljuk, mint azt a 3.1. bra mutatja.

    3.1. bra. Szekvencia jellse folyamatbrval

    A 3.1. brn lthat folyamatbrnak nem rsze a kt kis kr: ezek azt hangslyozzk csu-pn, hogy a szekvencinak, mint sszetett vezrlsi szerkezetnek egyetlen belpsi pontja (bejrata) s egyetlen kilpsi pontja (kijrata) van, fggetlenl attl, hogy a szekvencia belsejben mi trtnik. Mindig egyetlen ponton kezdjk a szekvencia vgrehajtst s mindig egyetlen ponton fejezzk azt be, akrmennyi s akrmilyen tevkenysget is vgznk el egy-ms utn a kezdet s befejezs kztt. Ez a tulajdonsg nagyon fontos kzs tulajdonsga lesz valamennyi vezrlsi szerkezetnek: akrmilyen is a vezrlsi szerkezet, annak mindig egyet-len belpsi s egyetlen kilpsi pontja lesz.

  • 3. ALAPVET VEZRLSI SZERKEZETEK S A STRUKTURLT PROGRAM 35

    Simon Gyula, PE www.tankonyvtar.hu

    Fontos megjegyezni, hogy egy tevkenysgszerkezetben gy a szekvenciban is hasz-nlt tevkenysgek lehetnek akr elemi tevkenysgek, vagy lehetnek sszetett tevkenys-gek, ms tevkenysgszerkezetek is.

    3.2. Elgazsok Gyakran tevkenysgeink valamilyen felttel kirtkelsnek eredmnytl fggenek. Prog-ramjainkban az elgazs (szelekci) tevkenysgszerkezet egy felttel kirtkelsnek fgg-vnyben alternatv vgrehajtsi mdokat r le. A szelekci egyik fontos eleme a felttel, ame-lyet kirtkelnk a szelekci vgrehajtsa eltt. Ennek eredmnytl fgg, hogy a lehetsges tevkenysgek kzl melyik tevkenysget hajtsuk vgre. A szelekci tbbi eleme a lehets-ges vgrehajtand tevkenysgek halmaza, amelybl mindig legfeljebb egy hajtdik vgre. A htkznapi letben a vlasztsok, dntsek mind szelekcival rhatk le. Pldk a mindennapi letben hasznlt elgazsokra:

    Ha j meleg id lesz, rvid nadrgban s plban strandra megyek, klnben pedig farmert s inget fogok viselni a kertszkedshez.

    Ha jl sikerl a vizsga, a bartaimmal elmegynk megnnepelni. (Klnben nem me-gynk...)

    Htkznapokon fl htkor, szombaton nyolc rakor, vasrnap pedig fl kilenckor kelek.

    Ha a pincr bss borravalt kap, elveszi a legszebb mosolyt. Ha a heti lott nyeremny 100 milli fltt van, a szenvedlyes jtkosok mg tbb

    lottszelvnyt vesznek. Ha ebd kzben cseng a telefon s valamelyik csaldtagom hv, akkor felveszem, k-

    lnben nem. Nyron meleg van, tlen hideg van. Ha a vilg rig lenne, / ktnyemben ftylne, / jjel-nappal szpen szlna, / ha

    a vilg rig volna.

    A legegyszerbb elgazst pszeudo-kddal a kvetkezkppen jellhetjk: ha felttel akkor Tevkenysg elgazs vge

    Ez az elgazs a felttel fggvnyben vagy vgrehajtja a tevkenysget, vagy nem. Egy plda ezzel a formalizmussal lerva:

    ha jl sikerl a vizsga akkor a bartaimmal elmegynk nnepelni elgazs vge

    A fenti jellsekben a ha, akkor s elgazs vge gynevezett kulcsszavak, megl-lapods szerint ezeket hasznljuk jellsrendszernkben. A kvetkezkben mg a kulcsszavak

  • 36 A PROGRAMOZS ALAPJAI

    www.tankonyvtar.hu Simon Gyula, PE

    listjt kicsit bvtjk majd a klnben kulcsszval. Azrt ppen ezeket a kulcsszavakat vlasztottuk, mert ezek hasonltanak a beszlt nyelvben hasznlt fordulatokra, ezrt jl tte-kinthetv, knnyen olvashatv teszik a pszeudo-kdot. Termszetesen hasznlhatnnk akr angol kulcsszavakat is (pl. if, then, else, end), vagy akrmilyen megllapods szerinti szimblumokat (pl. kismacit a ha helyett, egrkt az akkor helyett, stb.), de most marad-junk ennl a logikus, magyar szavakbl ll kulcsszkszletnl. A tovbbi tevkenysgszer-kezetek jellsre is magyar nyelv kulcsszavakat fogunk hasznlni a pszeudo-kdokban.

    Az elgazsban hasznlt felttel egy logikai kifejezs, amelynek rtke igaz vagy hamis lehet. Helyes felttel teht a pldban ltott jl sikerl a vizsga, hiszen egy vagy teljesl, vagy nem. Tovbbi helyes felttelek lehetnek pl.: szp id lesz holnap, htkznap van, szom-jas vagyok, az A vltoz rtke pros, a D vltoz rtke nagyobb nullnl, A nagyobb B-nl, stb. Nem helyes felttelek a kvetkezk: hny ves Zoli (nem eldntend krds), R ngyzet (ez sem eldntend krds).

    Az elgazsok jellsre a folyamatbrban mr tallkoztunk egy specilis szimblummal (rombusz), amely az egyetlen olyan szimblum a folyamatbrban, amelynek kt kimenete van. A folyamatbra elgazs-szimbluma azonban nem azonos a elgazs tevkenysgszer-kezettel! A folyamatbra elgazs-szimbluma csupn egy ptelem lesz az elgazs tev-kenysgszerkezetben, s ugyanezt a szimblumot fogjuk alkalmazni majd a ciklusok jells-re is. Teht a tevkenysgszerkezetet nem maga a szimblum, hanem a szimblumbl ptett struktra hatrozza meg. A legegyszerbb elgazs tevkenysgszerkezet jellse a 3.2. b-rn lthat: amennyiben a felttel igaz, vgrehajtjuk a tevkenysget, klnben pedig a prog-ram vgrehajtsa a tevkenysg kihagysval folytatdik. Fontos megfigyelni egy nagyon fontos ktttsget az brn: a hamis g nem akrhova vezet, hanem pontosan az igaz g befe-jezse utni pontra mutat. Ms szavakkal: az elgazs tevkenysgszerkezet elejn a felttel fggvnyben a vgrehajts elgazdik, de a tevkenysgszerkezet vgn a kt vgrehajtsi szl ismt sszefondik. Az elgazs tevkenysgszerkezet kvlrl teht ismt a mr ismert minden tevkenysgszerkezetre jellemz kpet mutatja: egy belpsi pontja s egy kilpsi pontja van.

    3.2. bra. A legegyszerbb elgazs tevkenysgszerkezet jellse folyamatbrval

  • 3. ALAPVET VEZRLSI SZERKEZETEK S A STRUKTURLT PROGRAM 37

    Simon Gyula, PE www.tankonyvtar.hu

    Egy kicsit sszetettebb elgazs kt tevkenysg kzl vlaszt: ha felttel akkor Tevkenysg1 klnben Tevkenysg2 elgazs vge

    Ebben az elgazstpusban mg mindig csak egy felttel van, de mr kt tevkenysg k-zl vlaszthatunk (az elz esetben az egyik tevkenysg a semmittevs volt). Gyakorlat pl-dink kzl pl. ilyen a kvetkez:

    ha j meleg id lesz akkor rvid nadrgot s plt veszek fel strandra megyek klnben farmert s inget veszek fel kertszkedek elgazs vge

    A fenti pldban lthatjuk, hogy az elgazs tevkenysgei lehetnek sszetett tevkenys-gek is: jelen esetben minden gon kt egymst kzvet egyszerbb tevkenysg tallhat vagyis egy-egy szekvencia. Az elgazsra is igaz, hogy az egyes gak tevkenysgei tetszle-gesen bonyolult tevkenysgszerkezetek is lehetnek. A fenti pldban szekvencikat ltunk, de ezek lehetnek akr tovbbi elgazsok, ciklusok is, illetve ezekbl sszelltott brmilyen tevkenysgszerkezet. Az ilyen elgazs folyamatbrs jellst a 3.3. brn lthatjuk. Itt is jl megfigyelhet a tevkenysgszerkezet belsejben sztvlt vezrls (vagy Tevkenysg1, vagy Tevkenysg2), ami a egyetlen szll fut ssze a tevkenysgszerkezet vgn, hogy az egy belpsi-, egy kilpsi pont szerkezet megmaradjon.

    3.3. bra. Ktg elgazs jellse folyamatbrval

  • 38 A PROGRAMOZS ALAPJAI

    www.tankonyvtar.hu Simon Gyula, PE

    Amennyiben az elgazs sorn tbb lehetsg kzl vlaszthatunk, a kvetkezkppen r-hatjuk le pszeudo-kddal:

    ha felttel1 akkor Tevkenysg1 klnben ha felttel2 akkor Tevkenysg2 klnben ha felttel3 akkor Tevkenysg3 klnben Tevkenysg4 elgazs vge

    Egy vals plda ilyen bonyolultabb elgazsra a kvetkez ha htkznap van akkor breszt 6:30-kor klnben ha szombat van akkor breszt 8:00-kor klnben breszt 8:30-kor elgazs vge

    Megjegyzsek: 1. A tbbg elgazsra bevezetett jells nem felttlenl szksges, pl. ktg elgaz-

    sokbl is mindent meg lehet oldani. Az ttekinthetbb kd miatt azonban mgis alkalmazzuk a tbbg elgazsokra szolgl egyszerbb jellst. Nzzk meg, hogy nzne ki egy tbbg elgazs egymsba gyazott ktg elgazsokkal megoldva: Tbbg elgazssal Ktg elgazsokkal Ha felttel1 akkor Tevkenysg1 klnben ha felttel2 akkor Tevkenysg2 klnben ha felttel3 akkor Tevkenysg3 klnben Tevkenysg4 elgazs vge

    ha felttel1 akkor Tevkenysg1 klnben ha felttel2 akkor Tevkenysg2 klnben ha felttel3 akkor Tevkenysg3 klnben Tevkenysg4 elgazs vge elgazs vge elgazs vge

  • 3. ALAPVET VEZRLSI SZERKEZETEK S A STRUKTURLT PROGRAM 39

    Simon Gyula, PE www.tankonyvtar.hu

    A tbbg jellsmd szemmel lthatan tmrebb, jobban ttekinthet lerst tesz lehe-tv. A ktg elgazsokkal megvalstott megolds plda arra, hogy egy elgazs tevkeny-sge bonyolultabb tevkenysgszerkezet is lehet jelen esetben pl. a kls elgazs kln-ben ga maga is egy elgazs, amelynek klnben ga szintn egy elgazs.

    2. A tabultor (vagy szkzk) kvetkezetes alkalmazsa ugyan nem ktelez, de ennek hinya egy kzepes nagysg programot is mr olvashatatlann tesz. A megfelelen tabullt s jl olvashat kddal elssorban magunknak tesznk jt, de ha kdunkat kzz is akarjuk tenni, akkor felttlenl alkalmazni kell. Ez vonatkozik minden rott kdra, akr pszeudo-kdban rt algoritmusrl, akr valamilyen programozsi nyelven rott kdrl van sz. Ez utbbi esetben az intelligensebb kdszerkeszt programok ltalban segtsget is adnak (au-tomatikus kdformzs). Azonban brmely egyszer editorban rt kdnak is megfelelen formzottnak kell lennie: a formzs alapveten a programoz feladata. ltalnos irnyelv: egy formzatlan program olyan fok ignytelensgrl tanskodik, mintha egy tteremben csorba, rzsos szl pohrban hoznk ki az 1982-es Chteau la Mission Haut-Brion-t.

    A tbbg elgazsok folyamatbrs jellse a 3.4. brn lthat. ltalnossgban K g megvalstshoz K 1 elgazs-szimblum hasznlata szksges.

    3.4. bra. Tbbg elgazs megvalstsa folyamatbrval

    A tbbg elgazs folyamatbrs megvalstshoz az egyetlen ltez eszkzt, a folya-matbra elgazs-szimblumt hasznltuk, nincs specilis jells erre az esetre. gy nem meg-lep, hogy a ltrejtt struktra pontosan megegyezik az 1. megjegyzsben ktg elgazsok-bl ltrehozott struktrval: valjban itt is egymsba gyazott, egyszer ktg elgazsokkal van dolgunk, ami azonnal nyilvnvalv is vlik, ha egy kicsit trajzoljuk a 3.4. brt. A 3.5. brn a szemlletesebb jells kedvrt bekereteztnk egyes elemeket: lthatunk egy nagyobb, szaggatott vonallal hatrolt tglalapot s egy kisebb, pont-vonallal hatrolt tglalapot is. Ha elszr a nagyobb tglalap belsejt gondolatban kitrljk (s esetleg a tglalapot kicsit kis-sebre is zsugortjuk), akkor az bra pontosan azt a kpet tkrzi, ami a 3.3. brn lthat: egy ktg elgazst ltunk, amelynek felttele a Felttel1, az igaz gon a Tevkenysg1 nev te-

  • 40 A PROGRAMOZS ALAPJAI

    www.tankonyvtar.hu Simon Gyula, PE

    vkenysget hajtjuk vgre, mg a hamis gon azt a tevkenysget, ami a szaggatott vonallal jellt tglalapban van (emlkezznk r: megengedtk, hogy az elgazs tevkenysgei ssze-tett tevkenysgek is lehessenek). Egy nagyon fontos momentum: a szaggatott vonallal jellt tglalapba egy nyl vezet be s abbl egy nyl vezet tovbb. Ha most figyelmnket a szaggatott vonallal jellt tglalap belsejre fordtjuk amelynek egyetlen belpsi pontja s egyetlen ki-lpsi pontja van akkor itt most hasonl mdon a kisebbik, pont-vonalas tglalapot gondolat-ban kitrlve ismt az ismers brt ltjuk: a szaggatott vonallal jelzett tglalap belseje nem ms, mint egy ktg elgazs, felttele a Felttel2, igaz gn a Tevkenysg2, hamis gn pedig a pont-vonallal jelzett (sszetett) tevkenysget hajtjuk vgre. Ismt fontos: a pont-vonallal jelzett tglalapba egyetlen nyl vezet be s egyetlen nyl vezet ki, ezrt ezt kezelhetjk egyetlen sszetett tevkenysgnek is. Az brt tovbb boncolgatva szrevesszk, hogy a pont-vonallal jelzett tglalapban ismt egy ktg elgazs van elrejtve. Vagyis a ngyg elgazst megvalst folyamatbrnk nem ms, mint hrom darab, egymsba gyazott ktg elgazs. A kls (Felttel1 felttel) elgazs hamis gban van egy jabb elgazs (ennek felttele Felttel2), amelynek hamis ga tartalmazza a harmadik elgazst (Felttel3 felttellel). A struktra sz szerint tkrzi az 1. megjegyzsben lert pszeudo-kd szerkezett.

    3.5. bra. Tbbg elgazs. A begyazott sszetett tevkenysgeket tglalapok hatroljk.

    3.3. Ciklusok A ciklusok szolglnak programjainkban az ismtld tevkenysgek lersra. Az egyszerbb ismtld tevkenysgeket lerhatjuk ciklusok nlkl is, pl. szekvencia formjban (a kiltsd tszr, hogy hah algoritmus helyett pl. rhatjuk azt is, hogy kiltsd, hogy hah, kiltsd, hogy hah, kiltsd, hogy hah, kiltsd, hogy hah), de ez nem tl elegns megolds. Radsul lehetnek bonyolultabb esetek, ahol ezzel az egyszer trkkel nem boldogulunk (ko-pogtass, amg ajtt nem nyitnak).

  • 3. ALAPVET VEZRLSI SZERKEZETEK S A STRUKTURLT PROGRAM 41

    Simon Gyula, PE www.tankonyvtar.hu

    A mindennapi letben is gyakran alkalmazunk ismtelt tevkenysgeket: ssz, amg a partot el nem red! A tojsfehrjt addig keverjk, amg kemny habot nem kapunk. Addig jr a kors a ktra, amg el nem trik. Kacagj, amg a hajnal eljn Vrj, amg kinyitom az ajtt! Foglaljon helyet, amg az gyintz felszabadul. Addig igyl, amg szomjas vagy! A ciklusok mindig tartalmaznak egy tevkenysget, valamint egy felttelt, aminek fgg-

    vnyben tovbb folytatjuk vagy abbahagyjuk a tevkenysg ismtlst. Attl fggen, hogy mikor vgezzk el a felttel kirtkelst, elltesztel s htultesztel ciklusokrl beszlnk. A felttelnek is kt tpusa lehetsges, megklnbztetnk bennmaradsi s kilpsi felttele-ket. A fentiek sszes lehetsges varicija sszesen teht ngy klnfle ciklust eredmnyez:

    Elltesztel ciklus bennmaradsi felttellel Elltesztel ciklus kilpsi felttellel Htultesztel ciklus bennmaradsi felttellel Htultesztel ciklus kilpsi felttellel Az elltesztel ciklusok elszr megvizsgljk, hogy kell-e (tovbb) ismtelni a tevkeny-

    sget, s ha igen, akkor egyszer megismtlik, majd jra ellenrzik a felttelt. A htultesztel ciklusok ezzel ellenttben egyszer mindenkppen vgrehajtjk a tevkenysget, majd ezek utn ellenrzik, hogy szksges-e tovbb ismtelni. Ha igen, akkor ismt vgrehajtjk azt s jra ellenriznek. Vizsgljuk meg egy pldn, mit is jelent ez a kt megkzelts.

    Morc Misi ezt a j tancsot adja Fllb Ferknak: Amg szomjas vagy, igyl rumot! Ha Fllb Ferk elltesztel ciklust futtat a fejben, akkor elszr felteszi a krdst:

    szomjas vagyok? Amennyiben a vlasz igen, iszik egy pohr rumot, majd ismt megkr-dezi magtl: szomjas vagyok? s ezt addig folytatja, amg egyszer azt nem tallja, hogy nem szomjas: ekkor nem iszik tbb rumot (egyelre), vgrehajtotta a tancsot.

    Ha Ferk htultesztel ciklust futtat a fejben, akkor elszr iszik egy pohr rumot, majd felteszi a krdst: szomjas vagyok? Amennyiben a vlasz igen, iszik egy jabb pohrral, majd ismt megkrdezi magtl: szomjas vagyok? Az ivst-krdezst addig folytatja, amg egyszer azt a vlaszt nem adja, hogy nem szomjas: ekkor abbahagyja az ivst, a ta-ncsot ismt vgrehajtotta.

    A f klnbsg teht az volt, hogy a htultesztel ciklus esetn Ferk mindenkppen ivott egy pohr rumot (fggetlenl attl, hogy szomjas volt-e vagy sem), majd ezutn tette csak fel a szomjas vagyok-e krdst. Az elltesztel ciklus esetn mr az els pohr eltt feltette a krdst, gy elfordulhatott az az eset is, hogy nem ivott egy pohrral sem, mert egyltaln nem volt szomjas (ez persze a kalzok esetn pusztn elmleti lehetsg, k a tapasztalatok szerint mindig szomjasak).

    A bennmaradsi s a kilpsi felttel kzti klnbsget a kvetkez pldval illuszt-rlhatjuk:

  • 42 A PROGRAMOZS ALAPJAI

    www.tankonyvtar.hu Simon Gyula, PE

    Morc Misi, a rettegett kalzvezr egy sikeres zskmny utn a kvetkez sznoklattal indtja a lakomt:

    Cimbork, egyetek, amg hesek vagytok! A fedlzetmester a kvetkezkppen fordtja le ezt rthetbb nyelven a matrzoknak:

    Naplop npsg, ha jllaktatok, abbahagyni a zablst!

    Mindkt utasts ugyanazt jelenti: amg hes a matrz, egyen, ha mr nem hes, ne egyen. Morc Misi megfogalmazsban egy bennmaradsi felttelt hasznlt: addig kell az evs tev-kenysget folytatni (vagyis a ciklusban maradni), amg az hsg llapota fennll. A fedlzet-mester ezzel ellenttben azt fogalmazta meg, mikor kell abbahagyni a ciklust (az evs folya-matt): akkor, ha a jllaks llapota bekvetkezik. Ezt kilpsi felttelnek nevezzk.

    Ha megvizsgljuk a bennmaradsi s a kilpsi felttel kzti sszefggst, akkor azt tall-juk, hogy ezek egyms logikai negltjai: hes vagyok = NEM vagyok jl lakva, vagy: jl va-gyok lakva = NEM vagyok hes. A bennmaradsi s a kilpsi felttelek teht igen knnyen talakthatk egymsba.

    Az elltesztel ciklusokat pszeudo-kddal a kvetkez mdokon lehet lerni: Elltesztel ciklus, bennmaradsi felttellel:

    ciklus amg felttel1 tevkenysg ciklus vge

    A pszeudo-kdos lersban az elltesztel ciklust a ciklus kulcssz nyitja s a ciklus vge kulcssz zrja. A bennmaradsi felttel jelzsre az amg kulcsszt alkalmazzuk. A tevkenysg itt is termszetesen lehet sszetett tevkenysg is (pl. egy szekvencia, elgazs, egy msik ciklus, vagy ezek kombincii). Az ismtelt tevkenysget a ciklus magjnak ne-vezzk. Ebben a lersban a ciklusmagot mindaddig vgrehajtjuk, amg felttel1 igaz. A felt-telt a mindig a ciklusmag vgrehajtsa eltt rtkeljk ki. Amint felttel1 hamiss vlik, a ciklusbl kilpnk.

    Elltesztel ciklus, kilpsi felttellel: ciklus mgnem felttel2 tevkenysg ciklus vge

    Itt az amg kulcssz helyett a kilpsi felttel jelzsre a mgnem kulcsszt alkalmaztunk. Ebben a ciklusban a ciklusmag mindaddig jra s jra vgrehajtdik, amg a felttel2 hamis (a felttel kirtkelse itt is a ciklusmag vgrehajtsa eltt trtnik). Amint felttel2 igazz vlik, a ciklusbl kilpnk. Termszetesen itt is igaz, hogy felttel1 = NEM felttel2.

    Az elltesztel ciklusok folyamatbrs reprezentciit a 3.6. bra mutatja. Jl lthat, hogy a bennmaradsi felttel esetben a felttel igaz ga mutat a ciklusmag fel, mg a kilp-si felttel esetben a felttel igaz ga a ciklusbl val kilpsre mutat. A folyamatbra jl mu-tatja, hogy a vgrehajts sorn elszr trtnik meg a felttel kirtkelse, majd ezutn kvet-kezhet a ciklusmag vgrehajtsa vagy a ciklusbl val kilps. A folyamatbrbl az is vil-gosan ltszik, hogy van olyan lehetsges vgrehajtsi t, ami elkerli a ciklusmagot:

  • 3. ALAPVET VEZRLSI SZERKEZETEK S A STRUKTURLT PROGRAM 43

    Simon Gyula, PE www.tankonyvtar.hu

    az elltesztel ciklus akr 0-szor is lefuthat (abban az esetben, ha mr a ciklus indulsakor hamis a bennmaradsi, vagy igaz a kilpsi felttel).

    3.6. bra. Elltesztel ciklus bennmaradsi (Felttel1) s kilpsi (Felttel2) felttellel

    A htultesztel ciklusokat pszeudo-kdos lersai a kvetkezk: Htultesztel ciklus, bennmaradsi felttellel:

    ciklus tevkenysg amg felttel1

    A htultesztel ciklust szintn a ciklus kulcssz nyitja de a ciklus zrsa az s az amg kulcsszval s a hozz tartoz bennmaradsi felttel megadsval trtnik (itt teht nincs szksg a ciklus vge kulcsszra). A ciklusmagot mindaddig vgrehajtjuk, amg felttel1 igaz, de itt a felttelt a ciklusmag vgrehajtsa utn rtkeljk ki. Amint felttel1 hamiss v-lik, a ciklusbl kilpnk. Htultesztel ciklus, kilpsi felttellel:

    ciklus tevkenysg mgnem felttel2

    A ciklus zrsa itt is a felttel megadsval trtnik, de itt mivel kilpsi felttelt hasz-nlunk a mgnem kulcsszt hasznljuk. A ciklusban a ciklusmagot mindaddig jra s jra vgrehajtjuk, amg a felttel2 hamis. A felttel kirtkelse itt is a ciklusmag vgrehajtsa utn trtnik meg. Amint felttel2 igazz vlik, a ciklusbl kilpnk. Termszetesen itt is igaz a bennmaradsi s kilpsi felttelek kztti felttel1 = NEM felttel2 sszefggs.

    Az htultesztel ciklusok folyamatbrs lersai a 3.7. brn lthatk. Itt a ciklus vgrehaj-tsa a ciklusmaggal kezddik, majd a felttel kirtkelsvel folytatdik. A bennmaradsi s kilpsi felttelek itt is egyms negltjai: a bennmaradsi felttel igaz ga marad a ciklusban, mg a kilpsi felttel igaz ga lp ki a ciklusbl. A jellsbl jl ltszik, hogy a ciklusmagot mindig legalbb egyszer vgrehajtjuk, hiszen az els vizsglat csak a ciklusmag els vgre-hajtsa utn trtnik meg, a ciklust elhagysra itt nylik elszr lehetsg.

    Fontos ismtelten hangslyozni, hogy hasonlan a szekvencia s elgazs tevkenysg-szerkezetekhez, a ciklusnak is egyetlen belpsi pontja s egyetlen kilpsi pontja van. Ezen belpsi s kilpsi pontokat a folyamatbrn kis krk jelzik.

  • 44 A PROGRAMOZS ALAPJAI

    www.tankonyvtar.hu Simon Gyula, PE

    3.7. bra. Htultesztel ciklus bennmaradsi (Felttel1) s kilpsi (Felttel2) felttellel

    Felmerlhet a krds: mirt van szksg ennyifle ciklusra? Nem hasznlhatnnk a ngy-fle ciklus helyett csak egyet, esetleg kettt? Ha igen, akkor melyik ciklust, vagy ciklusokat vlaszuk ki a ngy kzl egy minimalista programozsi nyelvhez? Elszr vizsgljuk meg a bennmaradsi-kilpsi felttelek krdst. Azt mr megllaptottuk, hogy ezek mindig egy-ms negltjai. Teht ha programozsi nyelvnk ezek kzl pl. csak a bennmaradsi felttelt alkalmazza, akkor azt olyan algoritmusokat, amikben kilpsi felttelt alkalmaz ciklus van, knnyszerrel talakthatjuk bennmaradsi feltteles cikluss gy, hogy kzben a felttelt negljuk. s ez fordtva is igaz. gy valjban elg vagy egyik, vagy msik felttel, s az is mindegy, hogy melyiket alkalmazzuk.

    Vajon az ell s htultesztel ciklusok kzl elg-e csak az egyik? Ha igen, melyiket kell alkalmazni? A f klnbsg az, hogy hol trtnik a felttel vizsglata. Ennek egyik jl lthat hatsa az volt, hogy a htultesztel ciklusnl mindig vgrehajtdik legalbb egyszer a ciklus-mag, mg az elltesztel ciklusnl elfordulhat, hogy egyszer sem hajtjuk azt vgre. Ha csak elltesztel ciklusunk van, akkor egy htultesztel ciklust knnyszerrel szimullhatunk gy (pl. bennmaradsi felttellel):

    tevkenysg ciklus amg felttel1 tevkenysg ciklus vge

    A ciklusmag megismtlsvel az elltesztel ciklus eltt pontosan ugyanazt a hatst rtk el, mint a htultesztel ciklus esetn. Prbljuk meg a fordtott esetet: helyettestsk az elltesztel ciklust egy htultesztel segtsgvel. Az albbi megolds egy elgazs segt-sgvel oldja meg a problmt:

  • 3. ALAPVET VEZRLSI SZERKEZETEK S A STRUKTURLT PROGRAM 45

    Simon Gyula, PE www.tankonyvtar.hu

    ha felttel1 akkor ciklus tevkenysg amg felttel1 elgazs vge

    Teht az ell- vagy htultesztel ciklusokbl is elg lenne az egyik (a pldk tansga sze-rint taln egyszerbb az let egy elltesztel ciklussal). Vagyis elegend egyetlen egy ciklust megvalstani a programozsi nyelvben s ennek segtsgvel kis gyeskedssel az sszes lehetsges ciklusfajtt mr meg tudjuk valstani. Ennek ellenre a legtbb programozsi nyelv tipikusan nyjt egy elltesztel s egy htultesztel ciklust is, hogy a programoz a feladathoz leginkbb illeszked fajtt vlaszthassa. Az albbi tblzat pldkat ad a ngy lehetsges ciklusra k