Programming | Comenius Logo » Takács Gábor - Ismerkedjünk az algoritmusokkal a Comenius Logo segítségével

Datasheet

Year, pagecount:2008, 191 page(s)

Language:Hungarian

Downloads:997

Uploaded:March 18, 2008

Size:862 KB

Institution:
-

Comments:

Attachment:-

Download in PDF:Please log in!



Comments

No comments yet. You can be the first!

Content extract

Takács Gábor a Comenius Logo segítségével! 1 Bevezetés Miért tanulunk programozni? Ezt a kérdést jogosan teheti fel bárki. A számítógép használatával megismerkedni hasznos dolog, ezt már mindenki belátja. Szövegek megszerkesztésére, egy-egy táblázat elkészítésére az iskola befejeztével is sokaknak lesz szüksége. A programozói pályára azonban biztos kevesebben lépnek. Miért kell akkor megismerkedni a programírás alapjaival? A válasz: nem is programozókat képez az elsı tíz osztály. Az itt leírtak elsajátítása után még senkibıl sem lesz programozó. Az elsı lépéseket jelenti csak ez a könyv. Remélhetıleg érdekes, élvezhetı elsı lépések lesznek Talán kedvet csinálnak a továbbiakhoz. Ezért a kedvcsinálásért mégsem kellene mindenkit bevezetni a szakma kapujába. Meggyızıbb érvekre van szükség Ezeket az érveket korunk szolgáltatja. A harmadik évezred küszöbén olyan világ tárul elénk, amelyet

keresztül-kasul átszı az informatika. Programok támogatják számtalan területen az életünket. Ebben a világban az általános mőveltség fogalmát is át kell értékelni. Nem jelentheti most már pusztán a helyesírás, a nemzeti klasszikusok, a számtani szabályok, az alapvetı földrajzi ismeretek, stb. elsajátítását Ezeket mind jelenti, sıt még az itt fel nem sorolt egyéb ismereteket is, de jelent egy újfajta gondolkodásmód terjedését is. A sok tárgyi ismeret megtanulása helyett sokkal inkább azt kell megtanulnunk, hogy hogyan használhatjuk eredményesebben, hatékonyabban az eszünket. A logikus gondolkodásra és emellett az ötletességre a ma és a holnap emberének egyre nagyobb szüksége van. Értékes, bonyolult berendezéseket kell kezelni az élet, a munkavégzés számtalan területén. Csak azok az emberek képesek eléggé intelligensen kezelni ezeket az eszközöket, akiknek van valamilyen fogalmuk a mőködésük alapelveirıl is. Az

általános mőveltségnek legalább annyira tartalmaznia kell néhány alapvetı algoritmus ismeretét, mint pl. az Archimédesz-törvényt vagy a Püthagorasz-tételt Az algoritmusok és megtervezésük megismerése azonban a fentieknél sokkal több haszonnal is jár. Egy újfajta logikus gondolkodásmódot igényel Ez bizony eleinte szokatlan mindenkinek, aki elsı ízben találkozik vele. Komoly szellemi energiát igényel az elsajátítása. Ha vesszük a fáradságot, és addig gyakoroljuk, amíg kezdjük átlátni a teendıket egyszerre rá fogunk jönni, hogy nagyon egyszerő dologról van szó. Az algoritmustervezés megajándékoz minket azzal az örömmel, hogy kezdünk élvezetet lelni saját 2 eszünkben. Olyan ez, mit a hosszú edzések után egy magabiztos, szépen ívelı kosárra dobás vagy gól öröme. Mindenesetre az algoritmusok rászorítanak minket a fegyelmezett gondolkodásra, aminek megjön a haszna egyéb természettudományos tantárgyak tanulásában

is. Ha valaki veszi a fáradságot, és ilyen módszerrel próbálja tanulni a matematikát, geometriát, akkor a javuló tanulmányi eredmények fogják meggyızni arról, hogy nem volt hiábavaló a fáradság. Miért éppen a Comenius Logo nyelvet tanuljuk? Ez a kérdés legalább annyira jogos, mint az elızı. Igen sok programozási nyelv van manapság használatban. Az iskolákban is különféle nyelveken folyik az ismerkedés a programozással. Az elsı találkozás ezzel a témakörrel bizony próbára tesz mindenkit. Célszerő olyan megoldást választani, ami nem nehezíti meg a dolgunkat a szükségesnél jobban. Éppen erre kiválóan alkalmas a Comenius Logo nyelv. Rendelkezik egy igen jelentıs elınnyel a többi közhasználatú nyelvhez képest: magyar nyelvő utasításkészlete is van. Pontosabban: létezik igen sok európai nyelven nemzeti nyelvő változata. A spanyolok spanyolul, a szlovákok szlovákul, az olaszok olaszul stb. használhatják a Comenius Logot

Ezzel azt is elárultam, hogy igen elterjedt ez a nyelv Európában az iskolai oktatás területén. Talán már ismert az a tény, hogy a Logo nyelvet 1968-ban Seymur Papert dolgozta ki és fejlesztette tovább kifejezetten gyermekek számára. Azóta igen sok változata született ennek a nyelvnek. A Comenius Logo egy Windows alatt futó változat és sok olyan utasítást is magába győjtött, amelyek inkább a Pascal programozásra jellemzıek. Ezek eredetileg nem voltak a Logoban, de hasznosnak bizonyult kiegészíteni velük a nyelvet. Mi most fıként a Comenius Logonak éppen ezzel a részével fogunk megismerkedni. Ez azzal az elınnyel jár, hogy nem kell a Pascal nyelv angol utasításkészletével bajlódni, viszont az itt megtanultakat nem túl sok hozzáolvasással alkalmazni lehet a Pascal nyelv elsajátításakor is. A Pascalban, a Quick Basic-ben, a C nyelvben (hogy csak a leggyakrabban tanított nyelveket említsem) elég sok elıkészület kell, hogy nekilássunk a

program leírásához. Ez a Logoban lényegesen egyszerőbb. A Logo nem foglalkozik azzal, hogy egy adat szám-e avagy szöveg. Ha szám, akkor egész vagy tizedes tört Mindezzel más nyelvekben bajlódni kell. Ezért a Comenius Logo az idegen nyelvőségen túl ezt a gondot is leveszi a vállunkról. Azt pedig nem lehet eléggé kiemelni, hogy Windows alatt futó grafikus felületet használhatunk és hozhatunk létre programjainkban, ami a fent említett három programnyelvrıl nem mondható el. Azért esett tehát a Comenius Logora a választás, mert sok területen megkönnyíti a kezdı dolgát. Az itt tanultakat azonban jól fel lehet majd 3 használni egyéb programnyelvek második nyelvként való tanulásánál. Azt is el kell még mondani, hogy bár a Logo kezdetben gyerekeknek készült, ma már egy teljes értékő programnyelv, amelyet felnıttek is szívesen használnak. A könyv használata Ez a könyv abban szeretne segítséget nyújtani, hogy az algoritmusok

megismerésén keresztül némi programírási, program értési ismereteket is nyújtson. Ha értjük az algoritmusokat, akkor könnyebb eredményt elérni a programírás terén is. Könyvünk az algoritmusokra összpontosít, és azok segítségével vezet be a gép algoritmusának a világába. Segíteni szeretne azoknak is, akik nem kívánnak igazán elmélyülni ebben a világban és azok számára is kíván továbblépést biztosítani, akik jobban meg szeretnék ismerni a programozás, a programírás területét. Ezért aztán a feltétlenül szükségesnél mindig alaposabb ismeretszerzésre is mód nyílik. Vannak olyan fejezetei a könyvnek, amelyeket csak az érdeklıdı, továbbtanulni kívánó kezdıknek ajánlhatunk. Néhány fejezet csak azt a célt szolgálja, hogy segítséget nyújtson a Comenius Logo program használatában. Ezek nem arra valók, hogy megtanuljuk, hanem, hogy segítségükkel utánanézzünk valaminek. Általában kevés dolgot kell megtanulni,

azaz emlékezetben tartani. Annál inkább kell az itt leírtakat érteni, elsajátítani az itt bemutatott gondolkodási, problémakezelési módot. A könyv az elsı két fı fejezet minden alfejezete után vastag betővel szedve még egyszer összefoglalja az ott tanultakat. A fejezetek után található egy kérdéssor Ellenırizd tudásod! címmel. Ezek különbözı nehézségő, gyakran a témakörrel kapcsolatos inkább gondolkodtató kérdések. Aki meg tudja válaszolni mindet, az biztosan érti is az ott tanultakat. A kérdéseket egy feladatsor követi. Ezek vagy algoritmusírási, vagy programkészítési feladatok. Ezek is különbözı nehézségőek A feladatok nehézségét az elıttük álló jel mutatja: ☺ Könnyő feladat. Gyakorlásra való  Közepesen nehéz feladat. Kicsit gondolkodtat Nem biztos, hogy a fejezetben leírtak automatikus használatával megoldható.  Nehéz feladat. Azok próbálkozzanak vele, akik már biztosan mozognak a tanultak területén,

akik a késıbbiekben is tovább szeretnék fejleszteni a tudásukat. A kérdések megválaszolásával, a feladatok egy részének megoldásával már elegendı gyakorlatra lehet szert tenni. Irány a haladó ismeretek! Jó munkát, jó tanulást mindenkinek! 4 5 Alapfogalmak 6 Az algoritmusok fogalma Bármilyen ijesztıen is hangzik ez a szó, valójában egy igen egyszerő dolgot takar. Nap mint nap találkozunk algoritmusokkal, élünk velük, és fogalmunk sincs róla, hogy ezek algoritmusok. A szó valamilyen célra irányuló tevékenységek sorozatát, elıre meghatározott sorrendjét jelenti. Ha ezeket a tevékenységeket az ott megadott sorrendben végzik el, akkor a kitőzött célt el is lehet érni. Természetesen lenni kell valakinek vagy valaminek, aki (ami) végre is képes hajtani ezeket a tevékenységeket. Hétköznapi életünkben, ha elmagyarázzuk valakinek, hogy valamit hogyan tegyen, akkor egy algoritmust közlünk véle. Ha egy idegent

útbaigazítunk, ha egy használati utasítást követünk az is mind egy-egy algoritmus. A fogalom mégis a kibernetika, a számítástechnika, a modern matematikai kutatások fejlıdésével vált ismét különlegesen fontossá. Köznapi beszélgetéseinkben ezektıl az algoritmusoktól nem várunk túl nagy pontosságot. Többé-kevésbé megértjük, mirıl van szó, nagyjából értjük az útbaigazítást, követni is tudjuk, de nincsenek messzemenı következményei a tévesztésnek. Ha azonban gépekkel kell közölnünk a teendık meghatározott sorrendjét, akkor nem támaszkodhatunk az emberi intelligenciára, hanem a gép számára egyértelmően kell megadni, hogy mit és milyen sorrendben tegyen. Fontos, hogy az általunk adott leírás teljes legyen, azaz a helyes végrehajtáshoz szükséges összes lépést tartalmazza. Ez képezi az alapját a gépek programozásának. Egyértelmő közlési mód szükséges, valamint még egy feltételt is ki kell elégíteni egy

ilyen tevékenységi sorozatnak: valamikor véget kell, hogy érjen. Ez most talán komikusan hangzik, de a késıbbiekben látni fogjuk, hogy nem is olyan nehéz elkövetni azt a hibát, hogy egy elıírt tevékenység sorozat sohase álljon le. (A matematikai kutatások közt is jelentıs helyet foglalt el az a kérdés, hogy hogyan állapítható meg egy algoritmusról, hogy véges számú lépésbıl áll-e?) A mesterséges intelligencia kutatásával ismét nagy fontosságot kapott az algoritmusok fogalma. Egyes kutatók úgy vélik, hogy az emberi intelligencia is az agyunkban tárolt nagyszámú és megbízható algoritmuskészlettıl függ. Amikor "intelligensen" cselekszünk, akkor a legmegfelelıbb algoritmusokat hajtjuk végre. Más kutatók élesen vitába szállnak ezzel a nézettel, és az emberi intelligenciát másnak és lényegesen többnek tartják egy algoritmus-győjteménynél. A kérdés még távolról sincs lezárva. Mindenesetre korunk egyik

legizgalmasabb kutatási területe a mesterséges intelligenciák kutatása. Hogy egészen pontosan megértsük, hogy milyenek az algoritmusok, képzeljünk el egy robotot, amely mindent végrehajt, amit mondunk neki, de csak azt és semmi egyebet. A teendıket utasítások formájában fogalmazzuk 7 meg. Az utasítások végrehajtásán kívül a robot képes még eldöntendı kérdésekre is válaszolni. (Az olyan kérdéseket nevezzük eldöntendıeknek, amelyekre igennel vagy nemmel lehet felelni.) Ennek a robotnak kell egyértelmően megadni, hogy mit tegyen, hogy elérkezzünk az általunk megkívánt végeredményhez. Robotunk tehát képes valamilyen feltételektıl függı döntésre is, így igen bonyolult tevékenységeket is el tud végezni. Az algoritmus akkor lesz helyes, ha a robotunk a megadott tevékenységsorozat eredményeképpen valóban azt a célt éri el, amit megkívántuk tıle. Egy algoritmustól elvárható, hogy legyen végrehajtója, vagyis létezzen

olyan személy vagy eszköz (robot, gépezet, számítógép, stb.) aki, vagy ami képes az ott megfogalmazott utasítások végrehajtására. Az algoritmus végrehajtóját idegen szakkifejezéssel processzornak nevezzük. Ne tévesszük ezt össze a számítógép mikroprocesszor nevő alkatrészével! A processzor szó mindössze folyamat-végrehajtót jelent. Az "algoritmus" szó arab-perzsa eredető, mint nem egy matematikai kifejezés. Egy 9. századi perzsa matematikus, Ab Dzsáfár Mohammed ibn Músza al-Hvárizmi nevének eltorzításából ered, aki 825 körül egy könyvet írt, amely számítási eljárásokat is tartalmazott. Maguk az algoritmusok azonban sokkal régebbiek Már az ie II évezred derekáról ismerünk babilóniai agyagtáblákat, amelyek számítási módszereket írnak le, pl. kamatos kamat vagy téglatestek oldalainak kiszámításáról, ha a térfogat adott, stb. Az ókori görög idıkbıl is ismerünk egynéhányat A legismertebb euklideszi

algoritmus néven egy eljárás két szám legnagyobb közös osztójának meghatározására. Algoritmusnak utasítások véges számú lépésbıl álló olyan rendezett sorozatát nevezzük, ahol ez biztosan elvezet a kitőzött célhoz. Az algoritmushoz hozzátartozik az utasításokban megfogalmazott tevékenységek jellege és a rögzített sorrendje. Követelmény: - az egyértelmőség - a teljesség - a véges számú lépésben végrehajthatóság - legyen végrehajtója (processzora). Ellenırizd tudásod! 1. 2. 3. 4. 5. 8 Hol találkozunk a köznapi életünkben algoritmusokkal? Mit nevezünk algoritmusnak? Milyen követelményeket kell kielégítenie egy algoritmusnak? Minden tevékenységsorozat leírása algoritmusnak tekinthetı? Miben különbözik, ha egy embernek, illetve egy gépnek kell "elmagyarázni" az elvégzendı feladatot? Feladatok ☺ ☺ 1. Győjts a köznapi életbıl algoritmus leírásokat 2. Milyen formákban találkozol a köznapi

életben algoritmus leírásokkal? Győjts néhányat!  3. Győjts a hétköznapi élet különbözı területeirıl különbözı módszerrel lejegyzett algoritmusokat! 9 Algoritmusok grafikus ábrázolása blokkdiagrammal Az elızı fejezetben az algoritmusok fogalmával ismerkedtünk meg. Ideje most már annak is utánanézni, hogy milyen módon jegyezhetı le egy algoritmus. A válasz: igen sokféleképpen Több módszer is született Mindegyiknek vannak elınyei és hátrányai. Léteznek szöveges és grafikus lejegyzési módok. A grafikus leírási módoknak általában a szemléletesség az elınye, azaz a látvány próbál segíteni a folyamat áttekintésében. Egy nem komoly, de a köznapi életben néha alkalmazott grafikus módszer a rajzos (azt is mondhatnánk, hogy képregényszerő) változat. Ilyet látunk például az utcai telefonkészülékek oldalán, amikor rajzosan próbálják meg elmagyarázni, hogy mit kell tenni, amikor a készülékkel telefonálni

szeretnénk. Vannak szöveges leírási módok is. Elıfordult már az is, hogy külön „nyelvet” próbáltak meg kidolgozni algoritmusok lejegyzésére. Ezek a módszerek rövidebb leírást, tömörebb formát tesznek lehetıvé, de nem olyan szemléletesek, mint néhány grafikus változat. Ez a könyv két módszert fog ismertetni: egy grafikus algoritmus lejegyzési módot, a blokkdiagramok tervezését és a késıbbiekben alkalmazni fogjuk a magyar nyelvő szöveges leírási módot is. A blokkdiagramos leírási módszert azért választottuk, mert a kezdık számára ez a legszemléletesebb. Szokás még folyamatábrának is nevezni azért, mert egy folyamatot próbál meg lépésekbıl felépítve ábrázolni. Ezeken az ábrákon jól követhetı, hogy melyik utasítást melyik követ. Olyan az egész, mint egy jól bejárható egyirányú utakat tartalmazó vasúti pálya térképe. Azért nevezik blokkdiagramnak, mert minden utasítás úgynevezett cellákban

(blokkokban) foglal helyet. Három alapvetı cellatípus van Kezdete és vége: Jelölni kell, hogy hol van az ábrán a folyamat kezdete és a vége. Erre az ellipszis formájú cella szolgál: 1. ábra: Kezdet és vége cella 10 Utasítások: Az utasítások számára a téglalap formájú cella szolgál. Jelezni kell egy egyenes vonallal, hogy honnan jutottunk el az utasításhoz és azt is, hogy merre megyünk tovább. A vonalon egy nyíllal tőntetjük föl a haladás irányát 2.ábra: Utasítás cella Elágazások: Tetszıleges algoritmusok azonban nem írhatók le pusztán utasítások egymásutánjaként. Emlékezzünk! Az elızı fejezetben az algoritmust végrehajtó robotunknak nem csak arra kellett képesnek lennie, hogy az utasításokat végre tudja hajtani, hanem, ha választás elé állítják, azaz egy feltétel teljesülésére rákérdeznek, akkor azt is el kellett döntenie, hogy a feltétel valóban teljesült-e avagy sem és ettıl függıen más-más

irányba kellett továbbhaladnia. Ez azt jelenti, hogy az algoritmusok tartalmazhatnak elágazásokat is. Az elágazásokban egy feltétel szerepel A feltételtıl függıen ágazik el a folyamat. Ha teljesül, akkor egyik, ha nem teljesül, akkor a másik irányba kell továbbhaladni. Ezeket az elágazásokat egy rombusz formájú cellával jelöljük. A tetejébe futó vonal a bemenete Mivel elágazás, ezért két kimenete van. Nyilakat rajzolunk a kimenı vonalakra (élekre) és fölé írjuk, hogy „igen” és a másik élre, hogy „nem”. 3.ábra: Elágazás cella Ennek a három cellatípusnak a felhasználásával tetszıleges egyedi folyamatok algoritmusa ábrázolható. 11 Az algoritmusok grafikus ábrázolásának egyik eszköze a blokkdiagram. Ellipszis formájú cella jelzi a folyamat kezdetét és végét. Téglalap formájú cellába írjuk az utasításokat, rombusz formájúba az elágazást. A cellákat vonal köti össze A haladás irányát nyíllal

jelezzük. Ellenırizd tudásod! 1. Osztályozd a blokkdiagram celláit a bemenetek száma és a kimenetek száma szerint! 2. Miért vannak nyilak a cellákat összekötı vonalon? 3. Az elágazás-cellában mi szerepel? 4. Van-e olyan eset, amikor a vonalakra is kell írni valamit? 12 Hogyan kezdjünk hozzá egy algoritmus megtervezéséhez? Talán ez az algoritmustervezı munka és ezzel együtt a programírás legkényesebb része. Ha elég gondosan kezdünk munkához, akkor esetleg nagyon sok késıbbi fáradságot takaríthatunk meg a hibák kijavításából. Itt az ideje ugyanis azzal a gondolattal megbarátkozni, hogy mivel emberek vagyunk, követünk el hibákat. Ezek majd a kész programban köszönnek ránk vissza és okoznak nem kevés fejtörést, amíg csak ki nem javítjuk ıket. Az elkövetett hiba nem katasztrófa, csak bosszúság és sok-sok további munka. Érdemes az elején észnél lenni. Ebben a fejezetben azt tekintjük át, hogy milyen munkamódszerhez

érdemes tartani magunkat, hogy minél eredményesebbek lehessünk. Probléma és feladat A mindennapi életünkben leggyakrabban problémákkal találkozunk. Hogy közelebb jussunk valamilyen célunkhoz, úrrá kell lennünk valamilyen problémán. Kezdetben csak azt tudjuk, hogy ezzel a problémával valamit kezdeni kellene, de ekkor még nem biztos, hogy az is világos, hogy mit és hogyan kell megoldani. Vegyünk egy egyszerő példát: Késı délelıtt van és kezdünk éhesek lenni. Kész étel nincs a hőtıszekrényben. A konyhában rettenetes a rendetlenség Mosatlan edények a mosogatóban. Valamit kellene tenni! Idáig terjed a probléma. Ekkor elkezdünk gondolkodni, hogy hogyan segíthetnénk magunkon. Két út áll elıttünk: – rendet csinálni és fızni – elmenni valahova, és ott megebédelni. Ha valamelyik mellett döntünk és elhatározzuk, hogy hogyan akarjuk végrehajtani, akkor egy feladatot tőzünk ki magunk elé. Például elhatározzuk, hogy alaposan

el kell mosogatni a mosatlant mosogatószerrel és jó meleg vízzel, leöblíteni, eltörölgetni, majd mindent a helyére visszatenni. Ezután tojásrántottát sütünk magunknak az otthon található három tojásból. A probléma és a feladat között jelentıs különbség van. A probléma még nem tartalmazza a megoldás mikéntjét, a feladat azonban kijelöli, hogy mit 13 kell tenni, hogy közelebb jussunk a célunkhoz. A fenti problémának megoldása a hamburgeres is, meg a fızés is. Célunkat, hogy éhségünket csillapítsuk, mindkettıvel elérhetjük. Ha azonban döntünk egy módozat mellett és azt is megmondjuk, hogy milyen úton induljunk el a célunk felé (pl. rendcsinálással és fızéssel) akkor az már egy feladat A feladat is sokféleképpen oldható meg, de ez már a következı lépés. Az algoritmustervezésnek az egyik legfontosabb lépése, hogy feladatot tőzzünk ki. Gyakran már kész feladatot kapunk, így nem nekünk kell bajlódnunk azzal,

hogy problémánkra milyen feladat volna a legkedvezıbb megoldás. A feladat megértése, pontosítása Ha mi alakítjuk feladattá a problémánkat, akkor ügyeljünk rá, hogy megoldható legyen a feladat! Ha kész feladattal találkozunk, elsı lépés, hogy próbáljuk megérteni. Próbáljunk olyan oldalát találni a feladatnak, ami esetleg nem világos. Ha találtunk nehezen érthetı részt a feladatban, akkor vissza kell kérdezni! Ha ez nem lehetséges, akkor próbáljuk meg mi körülírni, hogy hogyan értjük. Ha pl. Csak annyi a feladat, hogy „süss rántottát!”, akkor visszakérdezéssel, vagy magunknak (komolyabb esetben írásban) tisztázzuk, hogy hány tojásból, zsírral vagy olajjal? Melyek a feladat bemenı adatai? Írásban célszerő rögzíteni, hogy a feladat megoldásához milyen adatok állnak rendelkezésünkre, ill. milyen eszközeink vannak Tisztázni kell, hogy mire van szükség a feladat végrehajtásához, és az rendelkezésre áll-e. A

fenti példában kell három tojás, néhány evıkanálnyi olaj, serpenyı, valamilyen tőzhely. Ha ezek nem állnak rendelkezésre, akkor a feladat az eredeti formájában nem oldható meg. Ha háromszög rajzolása a feladat és pontosítottuk, hogy az alap, a hozzá tartozó magasság és még egy oldal ismeretében, akkor ezeknek az adatoknak rendelkezésre kell állniuk. Elıfeltételek Milyen körülmények között oldható meg a feladat a rendelkezésre álló adatokkal. A rántottasütésnél ez pl. az lehet, hogy nem romlottak a tojások, van serpenyı és mőködıképes tőzhely. 14 A háromszögszerkesztésnél, hogy b oldal nagyobb vagy egyenlı legyen, mint a magasság. Kimenı adatok Tisztázni kell, hogy a feladat megoldásnak mit kell produkálni végeredményképpen. A rántottás példánál ez egy adag rántotta. A háromszög-példánál a háromszög megszerkesztett rajza a papírlapon (vagy táblán). Utófeltétel Meg kell adni, hogy mikor kielégítı

a feladat megoldása. A rántotta esetében, ha az jól sült, nem égett, nem folyós. A háromszögnél, ha a kész rajz oldalai és magassága valóban megfelelnek a bemenı adatoknak és a rajz valóban háromszög. A fenti lépéseket hívják idegen szakkifejezéssel a feladat specifikációjának. Csak most jutottunk odáig, hogy elkezdjük ábrázolni az algoritmust, amely elvezet a célunkhoz. Mi a blokkdiagramos ábrázolást választjuk, majd késıbb megismerkedünk az egyszerőbb, de kevésbé szemléletes szöveges leírási móddal is. Az algoritmus ábrázolása Itt végig kell gondolni, hogy milyen lépéseken keresztül valósíthatjuk meg a célunkat. Ha programot akarunk majd készíteni az algoritmusból, akkor azt kell szem elıtt tartani, hogy mire képes a számítógép ill. a programnyelv. Ha valamilyen egyszerő hétköznapi tevékenységet írunk le, mint pl. a rántottasütés, akkor próbáljunk elképzelni egy eléggé ostoba robotot, aminek nagyon a

szájába kell rágni lépésrıl lépésre, hogy mit csináljon. Az egyes lépéseket főzzük fel a blokkdiagramra Az eredményes munka érdekében - meg kell fogalmazni a feladatot - meg kell érten vagy értelmezni kell a feladatot - tisztázni kell, hogy milyen adatokra van szükség - tisztázni kell, hogy milyen feltételek mellett oldható meg a feladat - milyen adatokat várunk eredményképpen - mikor tekintjük helyesnek a megoldást - végül ábrázolni kell valamilyen módon az algoritmust. 15 Néhány egyszerő példa Következzék itt három példa. A már ismert kettı között egy harmadik is segítségünkre lesz, hogy gyakoroljuk az egyes lépéseket. I. FELADAT: Adott egy háromszög alapja, a hozzá tartozó magasság és a b oldal. Hogyan szerkeszthetı meg a háromszög? • • • • • Értelmezés: A feladat egyszerő és világos. Az adatok lehetnek számokkal megadva vagy megrajzolt szakaszhosszakkal. Bemenet: a alap b egy oldal m az alaphoz

tartozó magasság. Mindhárom szükséges bemenı adat rendelkezésre áll. Elıfeltétel: A háromszög csak akkor szerkeszthetı meg, ha b ≥ m. Ellenkezı esetben nincs megoldás. (Figyelem! Ha egy feladat kaphat olyan bemenı adatokat, amelyekkel nem lehet megoldani, akkor az algoritmusnak erre fel kell készülnie és ki kell szőrnie ezeket az eseteket.) Kimenet: A megrajzolt háromszög. Utófeltétel: A háromszögnek a az alapja, m a hozzá tartozó magassága és van egy b oldala. Nézzük milyen lépésekbıl áll a szerkesztés: – Döntsük el, hogy a rendelkezésre álló adatokból egyáltalán rajzolható-e háromszög. Ha nem, nincs mit tovább dolgozni – Félegyenest felvenni. – Egy párhuzamost kell rajzolni a félegyenessel. – A félegyenesen felvenni az a szakasz hosszát (pl. Körzıvel) – A félegyenes kiindulópontjából körzıvel körívet rajzolni. – A körív és a párhuzamos metszéspontját összekötni a félegyenes kiinduló pontjával

– Ugyanezt a pontot összekötni az a szakasz végpontjával. 16 • A szerkesztési algoritmus blokkdiagramja: 4.ábra: Háromszög szerkesztés blokkdiagramja az I feladat szerint A fenti algoritmusban van néhány olyan utasítás, amelyeket más sorrendben is megadhattunk volna. Például: a félegyenes felrajzolása után rögtön rámérhettük volna az a szakasz hosszát. Barátkozzunk meg a gondolattal, hogy egyes utasítások egymásutánja felcserélhetı. Ettıl az eredmény ugyan olyan jó marad. Egyes jelölési módokban ezeket külön feltőntetik. Mi nem fogunk a dologgal a továbbiakban foglalkozni Mindenkire rábízzuk, hogy józan belátása szerint rakja sorrendbe az utasításokat. A fontos az, hogy a végeredmény helyes legyen (Pl mindenki számára nyilvánvaló, hogy az AC szakaszt addig nem lehet megrajzolni, amíg a körívvel ki nem metszettük a párhuzamos egyenesen, ezért ez nem cserélhetı fel a körív megrajzolásával.) II. FELADAT:

Készítsd el a fogmosás algoritmusát és ábrázold blokkdiagramon! 17 • A feladat értelmezése: Szerencsére a fogmosás eléggé mindennapos feladat, ezért remélhetıleg mindenki számára elég világos, hogy hogyan kell tenni. • Bemenet: langyos fogmosó víz egy pohárban, fogkefe, fogkrém. (Szájvíz használatától most eltekintünk.) • Elıfeltétel: A fentiek rendelkezésemre állnak, van elég fogkrém, alkalmas a fogkefe fogmosásra, sıt rendelkezésre áll egy fürdıszobai tükör is, ahol megnézhetem, hogy jól megmostam-e már. Az algoritmusban az elıfeltételek meglétével most nem foglalkozunk, hiszen itt leszögeztük, hogy ezek rendelkezésre állnak. • Kimenet: Tiszta fogak. • Utófeltétel: A fogak közt nem maradt ételmaradék. (Ekkor kielégítı a fogmosás) Az algoritmus lépései: – Langyos vizet a fogmosó pohárba. – Megnedvesíteni a fogkefét és kb. babszemnyi fogkrémet nyomi rá a tubusból. – Vízszintes irányú

mozgással dörzsölni a fogakat a fogkefével. – Függıleges irányú és körkörös mozgással dörzsölni a fogakat. – Ha még nem elég tiszta, akkor a fenti két lépést addig ismételni, amíg el nem tőnik minden ételmaradék a fogak közül. – Öblögetni, amíg van víz a pohárban. Látjuk, hogy van néhány összetettebb lépés, amit kezdetben nem is olyan egyszerő ábrázolni. Ha jól meggondoljuk, az addig amíg kifejezéseket tartalmazó mondatoknál valahogy vissza kell lépni és ismételni valamilyen utasításokat a feltétel teljesültéig. Nézzük, hogyan is van ez? 18 •A fogmosási algoritmus blokkdiagramja: 5. ábra: A fogmosás blokkdiagramja III. FELADAT: Készítsd el a rántottasütés algoritmusát és blokkdiagramját! • Értelmezés: Ennek az algoritmusnak a születését a probléma felmerülésétıl nyomon követjük. Úgy vált feladattá, hogy ezt a feladatot tőztük magunk elé, hogy úrrá legyünk a problémán. A feladat

azonban pontosításra szorul: – hány tojásból készüljön? – zsírral vagy olajjal? Mivel a feladatot mi tőztük magunk elé, ezért a pontosítást is elvégezhetjük. Benézünk a hőtıszekrénybe, és csak három tojást találunk Ez elég is. A zsírt pedig nem szeretjük Egyértelmő, hogy olajjal készüljön. Ezzel tisztáztuk a körülményeket, és be is építhetjük a bemenetek közé. 19 • • • • Bemenet: 3 db tojás, 2 evıkanálnyi olaj. Elıfeltétel: A tojás friss legyen. Álljon rendelkezésre serpenyı és tőzhely (Az algoritmusban nem tekintjük magától értetıdınek, hogy friss a tojás. A mindennapi életben sem az.) Kimenet: A kész rántotta. Utófeltétel: Jól sült, nem égett, nem folyós az étel. Hogyan kell rántottát sütni? – fel kell törni egyenként a tojásokat, és meg kell gyızıdni róla, hogy nem romlott-e? – a feltört friss tojásokat egy tálkába tenni, a romlottakat (ha vannak ilyenek) kidobni. – ha

egyáltalán maradt friss tojás a tálkában (az is meglehet, hogy mind romlott volt), akkor habosra verni egy villával. – olajat kell önteni egy serpenyıbe. – begyújtani a tőzhelyt. (Ez a két lépés akár fel is cserélıdhet) –a tőzre tenni serpenyıt, –ha már elég meleg az olaj, akkor beleönteni a tálkából a felvert tojást, –óvatos kevergetéssel addig várni, amíg jól meg nem sül, – levenni a tőzrıl és feltálalni. Ezt ábrázoljuk most blokkdiagramon. Ezen a ponton, a blokkdiagram átböngészése után valószínőleg többen is megjegyzik, hogy nem is gondolták, hogy ilyen bonyolult dolog egy rántottát megsütni. Valóban! Ilyen bonyolult De azért nem kell kétségbeesni, a késıbbiekben egyre nagyobb rálátást szerzünk az algoritmusokra és akkor a ma bonyolultnak tőnı dolgok is áttekinthetıbbek lesznek. 20 • A rántottasütési algoritmus blokkdiagramja: 6. ábra: A rántottasütés blokkdiagramja 21 Ellenırizd

tudásod! 1. 2. 3. 4. 5. 6. Mi a különbség probléma és feladat között? Hogyan lesz a problémából feladat? Miért kell pontosítani a feladatot, ha a szöveg nem elég egyértelmő? Mik a bemenı és melyek a kimenı adatok? Miért kell tisztázni a feladat bemenı és kimenı adatait? Milyen feltételekre kell ügyelni, mielıtt belekezdenénk a feladat megoldásába és utána? Feladatok ☺ ☺ ☺   ☺ ☺    22 1. Hogyan szerkesszünk háromszöget, ha adott mindhárom oldal? Készítsd el az algoritmusát! 2. Hogyan szerkesszünk derékszögő háromszöget, ha adott az átfogó és az egyik befogó? Készítsd el a szerkesztés algoritmusát! 3. Hogyan szerkesszünk egyenlıszárú háromszöget, ha adott az egyenlı oldal és a közrezárt szög? Készítsd el a szerkesztés algoritmusát! 4. Hogyan szerkesztünk rombuszt, ha adott az oldal hossza és az egyik átló? Készítsd el a szerkesztés algoritmusát! 5. Hogyan szerkesztesz trapézt, ha adott a

két párhuzamos oldal, a magasság és az egyik oldal alappal bezárt szöge? Készítsd el a szerkesztés algoritmusát! 6. Készítsd el a hajmosás algoritmusát! 7. Készítsd el a teafızés algoritmusát! 8. Mi a telefonálás algoritmusa nyilvános telefonfülkébıl, kártyával? 9. Hogyan jutsz el otthonról az iskolába? Írd le az algoritmusát! 10. Hogyan végzed el egy mondat mondattani elemzését? Írd le az algoritmusát! 23 A Comenius Logo programozás alapjai 24 A Comenius Logo program használata Az ebben a fejezetben található áttekintés nem azt a célt szolgálja, hogy tövirıl hegyire megtanuljuk, hanem segítséget kíván nyújtani a Comenius Logo fejlesztıi környezet használatához és megismeréséhez. Használjuk ezt a fejezetet kézikönyvként. Ha probléma merül föl a program használatával kapcsolatban, akkor nézzünk bele, próbáljunk meg választ kapni a megfelelı rész átfutása után. Az algoritmusokat a Comenius Logo

programnyelv és programfejlesztıi környezet segítségével formálhatjuk programmá, hogy a számítógép számára is végrehajtható legyen. Tekintsük át ebben a fejezetben a Comenius Logo környezetet. Bizonyára már nem ismeretlen, de a biztonságos munka érdekében magabiztosan kell használnunk a lehetıségeinket. A program indítása: A program ikonjára kettıt kattintva elindul a program. A Comenius Logo képernyı: Felül egy menüsor látható, amelynek segítségével minden olyan tevékenység elvégezhetı, amelyet egyszerőbben az ikonok használatával szoktunk végezni. Ez az ikonsor a menüsor alatt látható A Fájl menüpontban találhatóak az összes munka-fájlok megnyitásával és mentésével kapcsolatos lehetıségek. Lehetıségünk van a munkafájlokon kívül „demót” is megnyitni vagy rajzlapot betölteni (a „rajzlap” munkaterület hátteréül szolgálhat). A programjainkat természetesen elmenthetjük, de menthetjük külön csak a

rajzlapon található ábrát is. Innen kezdeményezhetjük a memória (programszöveg), az írólap vagy a rajzlap tartalmának a kinyomtatását is. 25 A Szerkesztés menüpont alatt a már remélhetıleg jól ismert kivágási, másolási és beillesztési kínálatot találjuk. Az Ablak menüpont lehetıséget nyújt a különbözı munkaterületek közti választásra (rajzlap, írólap, emlékezet), valamint ezek törlésére. Ritkán használjuk, mert a választás ikonok segítségével, a törlés pedig kiadott parancsokkal is könnyen elvégezhetı. A Beállítások fımenü-ponttal kicsit bıvebben foglalkozunk, mert ez sok bosszúság forrása is lehet: • Ablakok beállítása: Az ablak felosztásával kapcsolatos beállításokat enged meg. • Hibaüzenet ablakba: Ha ezt kipipáljuk (azaz rákattintással kijelöljük), akkor a hibaüzenetek nem az írólapon jelennek meg, hanem a rajzlap közepén elıugró ablakban. • Segítség gyerekeknek: Ez a magyar

változatban nem mőködik! Még véletlenül se állítsuk be, mert úgy felejtjük és késıbb sok bosszúságot okozhat, hogy mőködésképtelenné teszi a Súgót. • Magyar alapszavak: Comenius Logonk csak akkor érti a magyar nyelvő utasításokat, ha ezt a pontot kijelöljük. Különben csak az eredeti angol nyelvő utasításokat fogadja el. (Ha egyszer csak egyszerő, sokat használt utasításokra „érthetetlenül” hibaüzenetekkel kezd válaszolni a Logo, akkor elsıként gyızıdjünk meg róla, hogy véletlenül nem kapcsoltuk-e ki a magyar alapszókészletet.) • Útvonal automatikus: A Comenius Logo gondoskodik róla , hogy rendet tartsunk a munkavégzés során, és különbözı típusú fájlokat különbözı helyekre ment: a programokat a PROJEKT könyvtárba, a háttereket rajzként a RAJZLAP könyvtárba, a képsorokat (teknıcöt helyettesítı figurák) a KEPSOR könyvárba menti, ill. ott keresi ıket programból kezdeményezett betöltéskor •

Lépésenkénti végrehajtás: Ha beállítjuk, akkor minden sor végrehajtása elıtt egy ablak ugrik elı és megerısítést kér, hogy végrehajtsa-e az utasításokat. Programírásnál hibakeresésre igen hasznos eszköz lehet, de egyébként csak akadályoz a munkában. (Szinte minden programfejlesztıi környezetnek van egy ilyen szolgáltatása. Ezt hívják „debug”-nak, azaz poloskátalanításnak.) • Alapszókiemelés: Igen hasznos és figyelmes szolgáltatás. Amikor programot írunk, akkor minden felismert ComLogo utasításszó türkiz színőre vált, így a hibakeresést elsıként azzal kezdhetjük, hogy átfutjuk szemmel a megírt programszöveget, és ahol valamilyen utasításszót használtunk, de továbbra is feketének látjuk, akkor azt biztosan elírtuk. 26 Ez azonban csak a memóriaablakban mőködik, amikor programszöveget szerkesztünk. • Tördelés: A programszöveget automatikusan új sorba tördeli az ablak végén, mint bármelyik

szövegszerkesztı. Gondoskodik róla, hogy a következı sor ott kezdıdjék, ahol az elızı. A Segítség fımenü-pont valóban gyakran lehet segítségünkre, ha nem tudjuk valamelyik utasítás használatának a módját, vagy valami új lehetıség után kutatunk. Használatával bıvebben a Függelékben foglalkozunk A Comenius Logo munkaterületei Az összes Logo változatnak általában két munkaterülete van. A rajzlap, ahol a teknıs segítségével grafikus képernyın rajzokat készíthetünk és az írólap, ahonnan a teknıs ki van tiltva. Mi az írólapra írjuk a parancsainkat és lehetséges, hogy a program is oda írja a végeredményt. Az írólapra nem lehet rajzolni, nem lehet betőformát, betőméretet választani. Csak azzal az egy betőtípussal és mérettel dolgozhatunk, amelyet ott látunk. Gyakran dolgozunk az írólapon, ha a program nem igényel grafikus felületet. Ezen a két „lapon” kívül van még a memóriaablak. Ez szolgál a

programeljárások írására Az ikonsor: A Segítség (Súgó) ikonja. A Segítség fıablakát hozza be Bıvebb leírás a Függelékben található. A program mentésének az ikonja. Ha rákattintunk, akkor elıugrik a mentés ablaka, ahol megadhatjuk a fájlunk nevét, esetleg azt is, hogyha nem a PROJEKT könyvtárba, hanem más helyre kívánjuk menteni, pl. floppy lemezre Beállítható még, hogy mi mindent mentsen el a program szövegén kívül, pl. a rajzlap tartalmát, a változók tartalmát is. Itt állítható be, hogy a program önálló Windows felhasználásként legyen elmentve. Bıvebb információért kattintsunk a jobb alsó sarokban a Segítség! gombra. Az elég szabatosan elmagyarázza a tennivalókat és a lehetıségeinket is. Programbetöltés ikonja. Ha rákattintunk, akkor elıugrik a Projekt megnyitás ablaka, ami a Fájl menüpont alatt egyszerően csak Megnyitás néven található. Mint már említettük, elsıként a PROJEKT alkönyvtárt nyitja meg

és az ott elmentett programokat lehet megnyitni. Amennyiben egyéb helyrıl akarunk betölteni, akkor éppen úgy kell 27 eljárnunk, mint a már jól ismert programok többségénél, vagyis az ablak közepén lent meghajtót választani, majd a fölötte levı dobozban a könyvtárfán kikeresni a szükséges könyvtárat, kattintással megnyitni. Csak ezután választhatjuk ki a bal alsó listából a megnyitni kívánt fájlt. Dupla rákattintással vagy az OK gombbal nyitható meg. A Beállítások gombra kattintva azt is beállíthatjuk, hogy a teljes programot kívánjuk-e betölteni, vagy csak egyes elemeit (pl. csak az eljárásokat, hátteret is, ill. teknısöket is) Az is megoldható itt, hogy az éppen betöltött programhoz tölti hozzá az újonnan megnyitott program elemeit. Ez nagy segítséget jelenthet majd az elıre megírt eljárások különféle összeépítésénél, továbbfejlesztésénél. A Súgó itt is sok segítséget nyújt, ha nem igazodunk el

valamelyik lépésnél. A Memória ablak ikonja. Ha rákattintunk, akkor egy önálló menüvel rendelkezı ablak, a memória ablak nyílik meg. Az ablak függılegesen két részre van osztva. Bal oldalt az egyes elemek (eljárás, változó) nevei láthatók egy-egy apró ikonocskával. Ha ezek közül rákattintunk valamelyikre, akkor az megnyílik jobboldalt, és tartalma megtekinthetıvé válik ill. tovább szerkeszthetjük ıket. A memória ablak Fájl menüje semmiben sem különbözik a már ismertetett Fájl menütıl. Ugyan ez mondható el a Szerkesztés menürıl is Az Elemek menüjével fogunk a legtöbbet találkozni, hiszen itt nyitható meg új ablak az új eljárás szerkesztésére. Ha új programeljárást kívánunk szerkeszteni, akkor az Új eljárás menüpontra kattintunk. Ekkor egy ablakocska ugrik elı, ahol be kell írni az eljárás nevét. Az OK gombra kattintva megnyílik a programíráshoz szolgáló szövegszerkesztı ablak, ahol már elsı sorként ott

szerepel a tanuld eljárásnév sor, alatta pedig a vége sor. 28 A rajzlap ikonja. Ha erre kattintunk, akkor csak a rajzlap látható, megszőnik az osztott ablak, eltőnik a parancs sor a képernyı aljáról. 29 Az osztott ablak ikonja. Akkor használjuk, ha rajzlapra vagy írólapra váltottunk korábban és most vissza szeretnénk térni a jól megszokott osztott ablakhoz, ahol a képernyı alján a parancs sor látszik, amely nem más, mint az írólap egy keskeny darabkája. Magassága állítható, ha a határvonalat lenyomott egér bal gombbal elhúzzuk. Az írólap ikonja. Erre kattintva eltőnik a teknıs rajzlapja és csak a szöveges írólap marad. Programok írásánál gyakran használjuk, ha a programunk nem igényli a grafikus felületet. 30 Néhány szó a programozásról A programok a számítógép számára készült algoritmusok. Olyan algoritmusok, amelyeknek a végrehajtója (processzora) a számítógép. Számunkra már mindez természetes, de

ha egy kicsit belegondolunk, hogy milyen feladat elé állítjuk a számítógépet, akkor rá kell jönnünk, hogy ez egy igen bonyolult dolog. Az egyik oldalon van a számítógép a maga meglehetısen bonyolult áramköreivel. Ez az elektronika gyakorlatilag nem tud mást, mint bitenként manipulálni a számítógép memóriáját. Ezt kettes számrendszerben végzi. Egyszerő hétköznapi emberek számára ez nem egy jól áttekinthetı terep. Ha nekünk kellene közvetlenül arról gondoskodni, hogy melyik bittel mi történjék, akkor a programozás igen kevés beavatott szakember feladata lehetne csak. A másik oldalon állunk mi egyszerő emberek, akikrıl feltételezhetı, hogy nem látják át a gép elektronikájának a mőködését, de vannak problémáink, amelyekre a megoldást a számítógéptıl várjuk. Mind a két oldalnak kell lépéseket tenni, hogy valahol középen összetalálkozzanak. Nekünk feladattá kell alakítani a problémánkat Az elızı fejezetekben

már azt is tisztáztuk, hogy el kell készíteni a feladat algoritmusát, hogy a „buta, de szorgalmas” gép el tudja végezni a teendıket. Azt azonban nem várhatjuk el a géptıl, hogy egy egyszerő magyar (vagy angol, stb.) nyelven megfogalmazott algoritmus leírást rögtön kezelni tudjon A gépre viszont olyan programot kell írni és telepíteni, ami a gépinél magasabb szinten megfogalmazott utasításokat legyen képes értelmezni és végrehajtani. Ezt a célt szolgálják a programozási nyelvek Ez az a középsı „felület”, amelyet még az egyszerő ember is képes megérteni és átlátni, a gép számára pedig lehetıséget ad, hogy fel tudja dolgozni a saját mőködési elve szerint. 31 7. ábra: A problémától a programig A programnyelv korlátozza a programozót, hiszen csak meghatározott parancsszavakat használhat szigorú formai szabályok betartása mellett. Ez egyszerősíti a nyelvet annyira, hogy olyan programot lehessen készíteni, amely a

gép „nyelvére” lefordítja a teendıket. Két módszer terjedt el. Az egyik szerint soronként végzi el a nyelvi program a programsor értelmezését, és azonnal végre is hajtja. Az ilyen rendszereket hívják interpreteres (értelmezıs) megoldásoknak. Az összes Logo változat ilyen. Az jellemzı erre a megoldásra, hogy a megírt program lefuttatásához elıbb egy értelmezı programot kell betölteni. Az ilyen nyelven elkészült program önmagában nem futtatható le. A Comenius Logo nyelven írt programok lefuttatásához elıbb be kell tölteni a Comenius Logo programot. Vannak azonban olyan nyelvek is, ahol elıbb megírják a „program szövegét” az adott nyelven, majd egy fordítóprogrammal (compiler) ezt egy futtatható programmá alakítják át. Ezt a módozatot nevezik compileres változatnak. Ilyenek pl a Pascal, a C nyelvek Elıfordul az is, hogy egy eredetileg interpreteresnek szánt nyelvhez írnak késıbb fordítóprogramot. A program fejlesztésekor

általában az interpretált módot használják, majd a kész, jól mőködı programot le lehet fordítani végrehajtható állománnyá. A Quick Basic magasabb verziói pl mindkét módon használhatóak. Minden programnyelvnek fontos tulajdonsága, hogy szigorú formai szabályokat tartalmaz. Azt is mondhatnánk, hogy szigorú szabályok rögzítik a programnyelv „helyesírását” és „nyelvtanát”. Ezeket a betartandó formai szabályokat nevezik szintaktikai szabályoknak. Ilyen például, hogy minden Logo parancs, vagy parancs és annak paramétere között legalább egy helyközt ki kell hagyni. A teknıc-Logo próbálgatásakor mindenki követett már el olyan hibát, hogy pl. azt írta be, hogy ELİRE100 Ilyenkor a teknıs nem lépett elıre 100 lépést, hanem azt az üzenetet kaptuk, hogy Hiba:Nem tudom hogyan csináljam a(z)elıre100-t. Az ilyen hibákat hívják szintaktikai hibáknak. Ezek a kevésbé súlyosak, hiszen a gép figyelmeztet rá. Lehetnek azonban

tartalmi hibák is a programban. Ilyenkor a gép végre tudja hajtani az utasításokat, csak nem az lesz a végeredmény, amit vártunk. Például (10 + 5) * 2 értékét szeretnénk kiszámítani és lefelejtjük a zárójelet: 10 + 5 * 2 és a végeredmény 30 helyett 20 lesz. Ha ez valahol a program közepén elrejtve lapul, akkor esetleg elég sok veszıdséget jelent, amíg észrevesszük és kijavítjuk. Az ilyen tartalmi hibákat nevezik szemantikai hibáknak. Talán meglepı, hogy még el sem kezdtünk ismerkedni a programozással, máris a hibákról esik szó. Ezek azonban olyan alapfogalmak, amelyekkel 32 idıben meg kell ismerkedni. Az sem baj, ha idejekorán hozzászokunk, hogy bizony követünk el hibákat. Nem a hibától kell rettegni, hanem meg kell tanulni felfedezni, és kijavítani ıket. Ahhoz, hogy egy problémából program legyen két irányból kell lépéseket tenni. A problémát feladattá kell alakítani, azt tovább pontosítani, egy gép számára

érthetı nyelven az algoritmust megfogalmazni. A számítógépet fel kell készíteni, hogy legyen egy nagyon leegyszerősített mesterséges nyelv, amelyen képes értelmezni az algoritmikus teendıket. Ez egy programnyelv A programnyelveknek van nyelvtana, azaz használati szabálya: ezek a szintaktikai szabályok. Az algoritmus helyességét nevezik az algoritmus szemantikájának. Ellenırizd tudásod! 1. Miért kell a számítógép felıl és a probléma felıl is lépéseket tenni, hogy megoldhatóvá váljék egy feladat? 2. A programnyelvek szigorúbbak vagy engedékenyebbek a beszélt nyelvnél? 3. Milyen szabályokat kell a programnyelvre írásnál betartani, hogy mőködıképes programot kapjunk? 4. Mi a különbség a formai és a tartalmi szabályok között Hogy hívják egyiket és a másikat? 5. Mi történik, ha formai hibát vétünk egy programban? 6. A futtathatóság szempontjából milyen csoportokba sorolhatók a programnyelvek? 33 Fıbb

algoritmusépítı szerkezetek Utasítás sorozatok Az alábbiakban néhány egyszerő utasítással ismerkedünk meg. Olyanokkal, amelyek elengedhetetlenek a programírásnál. Elsı dolgunk azonban az legyen, hogy megismerkedünk az eljárások szerkesztésének a módjával. Bizonyára sokan találkoztak már mindezzel a teknıc-Logonál, de célszerő átismételni mindenkinek. Eljárások szerkesztése Eljárásoknak egy-egy önálló névvel rendelkezı részprogramot nevezünk, amely magában megold egy részfeladatot. Állhat egy program egyetlen eljárásból is, de sokkal inkább az a jellemzı hogy egy valódi nagyobb feladatot kezelı program több eljárásból épül fel. Ezek egymás eredményeit használják fel. Mi kezdetben egy eljárásos programokat írunk, hiszen most ismerkedünk a programírás csínja-bínjával. Kattintsunk a memóriaablak ikonjára. Ekkor megnyílik a memóriaablak Ennek külön menüje van. A menübıl válasszuk ki az Elemek menüpontot és

kattintsunk rá az egérrel. Ekkor legördül egy almenü, ahonnan az Új eljárás almenüpontot válasszuk. Ha rákattintottunk, (helyette a Ctrl E billentyőkombinációt is lenyomhatjuk), akkor egy ablakocska ugrik elı, ahol beírhatjuk az eljárás nevét. Az eljárás neve csak betővel kezdıdhet, és egyetlen szó lehet. Jó tanács, hogy ésszerő hosszúságú szót válasszunk. Lehet hosszabb szó is, de nekünk 34 győlik meg a bajunk a begépelésével és esetleg elgépelésével is. Nincs különbség a nagy- és a kisbetők között. Ha az OK-ra kattintunk, akkor megnyílik a szerkesztı ablaka és már ott látjuk az elsı sorban, hogy tanuld eljárásnév vége A dılt betővel írt „eljárásnév” helyett természetesen az eljárás tényleges neve szerepel. Ilyenkor már „csak” az a dolgunk, hogy a két sor közé beírjuk a tényleges programszöveget. Minden eljárás a tanuld szóval kezdıdik Kiíratási utasítások Programjaink többsége

(legalábbis az egyszerőbbek, amelyekkel ismerkedni fogunk) valamilyen értéket határoz meg, valamilyen szöveges választ ad a feladatban meghatározott problémára. Mi azonban csak akkor tudjuk meg, hogy mi a megoldás, ha ezt a gép nem tartja meg magának, hanem a tudtunkra hozza. Ennek egyik legfıbb eszköze a képernyıre való kiíratás. Nem csak a képernyıre írhat egy program. Régen, a nagygépes idıszakban a programfutás eredménye általában rögtön egy nyomtatón jelent meg. Az eredmények általános kiíratási formája a nyomtatóra írás volt. Ma inkább mi kezdeményezhetjük, hogy az eredményt nyomtassa is ki a program, de elıbb látni akarjuk a képernyın. A korábbiakban már tisztáztuk, hogy a Comenius Logonak két fı munkaterülete van: a rajzlap és az írólap. Ennek értelmében külön-külön írhatunk mindkettıre. Kiíratás rajzlapra: Kezdjünk most egy rövid kis eljárást, amelynek segítségével kipróbálhatjuk a kiíratási

módokat. A fenti módon nyissuk meg a szerkesztıt Az eljárás címe legyen: szövegek. Ha rajzlapra szeretnénk szöveget vagy számszerő eredményeket kiíratni, akkor tudnunk kell, hogy itt megválaszthatjuk a bető formáját és méretét. A legegyszerőbb, ha a választáshoz igénybe vesszük a Comenius Logo segítségét. Ehhez kattintsunk a szerkesztı menüjébıl az Alapszavak menüpontra. Ekkor legördül egy lista, amely a leggyakrabban használt Logo alapszavakat tartalmazza. (Mi ugyan azt fogjuk tapasztani, hogy pont az általunk leggyakrabban használatos alapszavak nem szerepelnek a listán. Ennek az az oka, hogy a teknıc-Logo gyakori alapszavait válogatták ki ide.) 35 Válasszuk ki a bető! alapszót és kattintsunk az Adatai gombra. Ekkor elıugrik egy ablak, amely erısen emlékeztet a Word bető beállító ablakára. Válasszunk egy betőtípust és méretet. Mondjuk, legyen ez a script betőtípus és a 20 -as méret. Ezután Írd! gombra kattintunk

Ekkor a szükséges programsor bekerül a szerkesztı lapjára. Ezzel még csak azt állítottuk be, hogy hogyan, de azt még nem, hogy mit írjon a program. A rajzlapra a betőzd parancs használatával lehet írni. Ha csak egyetlen szót akarunk kiíratni, akkor tegyünk elé idézıjelet. FIGYELEM! Utána nem kell tenni! Ha több szóból álló szöveget akarunk a képernyıre íratni, akkor szögletes zárójelek közé kell tenni. A szöveg mindig a teknıc pozíciójától kezdve íródik ki. Ha nem jelöljük ki a Teknıc a bázisvonalon igazoló négyzetét, akkor a teknıc hasának közepe a szövegtıl bal fent lesz, ha kijelöljük, akkor bal lent. Próbáljuk ki mindkét módon! Itt a rajzlapon nem csak vízszintesen, hanem tetszıleges irányban helyezhetünk el szöveget. Az itt következı kipróbáló programocskánál elforgatjuk két különbözı szögben a teknıcöt és láthatjuk, hogy a szövegsor is olyan szögben fordul el. A szöveg színe megegyezik a

teknıc tollszínével 36 Ezt is átállítjuk, rendelkezésünkre. hogy látható legyen, milyen eszközök állnak tanuld Szövegek bető! [Script][20 700 0 0 0] betőzd [Így is lehet rajzlapra írni!] tollatfel balra 90 elıre 200 tollszín! 4 jobbra 30 betőzd [Most a 4 színkódú piros színnel írok] jobbra 90 tollszín! 2 betőzd [Most a 2 színkódú zöld színnel írok] vége Ha nem ismerjük a színek kódjait, akkor szintén az alapszavak menüponthoz fordulhatunk és ott a listáról a tollszín! alapszót kiválasztva egy palettát kapunk, ahonnét egérrel is választhatunk írószínt magunknak. A tollszín! színkód parancs rövidíthetı is: tsz! színkód. Bizonyára feltőnt mindenkinek, hogy a szerkesztı ablakban, amikor éppen meg van nyitva, akkor az alapszavak más színnel íródnak, mint a szám és szöveg paraméterek. Ez megint a Comenius Logo fejlesztıi környezet figyelmessége. Mutatja, hogy felismerte az alapszót, ezért át is

színezi Ezzel segít az elgépelési hibákat felfedezni. Ha egy alapszó nem szürkéskék színnel jelenik meg, akkor valószínőleg elgépelünk valamit, esetleg nem tettünk közé helyközt. Kiíratás írólapra: Sokkal gyakrabban fogjuk használni az írólapot eredményeink megjelenítésére. Itt nem lehet betőtípust és méretet választani Az írólapra mindig egyfajta mérető és formájú betővel lehet csak írni. Gyakran szükségünk van rá, hogy letöröljünk mindent a lapról, ahova a program ki kívánja írni a futás eredményeit. Erre a törölírólap utasítás szolgál, amelyet rövidíteni is lehet: tí Az írólapra írni a ”szöveg utasítással lehet. A következı ki ”szöveg majdnem ugyanazt teszi, mint a kiír, de itt ha szögletes zárójelbe teszzük a szöveget, akkor a kiírt szöveg is úgy fog megjelenni, míg a kiír -nál nem. kiír 37 A több szó kiírása tehát itt is megvalósítható szögletes zárójellel. Gyakrabban

használjuk viszont kerek zárójellel körülvéve, mert ekkor nem csak szavak, de például számítások is egymás után írhatók egy sorba: ( ki ”szó1 ”szó2 ”szó3 ) Minden újabb ki vagy kiír utasítás új sorba ír. Az írólap törlése után a kiíratási utasítások a lap elsı sorában kezdenek írni a lap elején, ahogy ezt el is várjuk. Arra is van lehetıségünk, hogy az írólap meghatározott helyére írjunk. Ekkor a kurzorhely! oszlop sor utasítással lehet a kiíratás helyét kijelölni. Az írólapon 26 sor fér el és 80 oszlopban helyezkedhetnek el a karakterek. Gyakran olyan kiíratásokra is szükségünk van, ahol a kurzor a kiíratás után nem ugrik új sorba, hanem a kiírt szöveg végén marad. Erre szolgál a kiírbelsı [ akár több szóból álló szöveg ] illetve: (kiírbelsı ”szó1 ”szó2 ”szó3 ) A betők méretét és formáját nem lehet megváltoztatni, de a színüket és a hátterük színét igen. Ezt megint az

Alapszavak menüpont segítségével a legegyszerőbb megoldani. Válasszuk ki az írószín! alapszót. Ekkor megnyílik egy ablak, amelyen külön palettából választhatunk betőszínt és háttérszínt. Az elsı paletta a bető színét, a második a háttérét állítja be. A háttérszín csak a kiírt szöveg mögött látszik egy csíkban. ha azonban egy ilyen betőszín beállítás után adjuk ki a törölírólap utasítást, amikor a bető háttérszínét is beállítottuk, akkor az egész írólapot átszínezi. 38 A következı eljárás a kurzor helyének megválasztására, az írószín beállítására, a szöveg háttérszínének beállítására és arra mutat példát, hogy úgy is írhatunk egy sorba, hogy a végén ott marad a kurzor: tanuld Írólap szöveg tí kiír "Üdvözöllek ( kiír "Dicsı "lovag! ) kurzorhely! [20 6] ( ki "Szép "a "ruhád, ) kurzorhely! [20 7] kiír [Szép a lovad ] kurzorhely! [10 10]

kiírbelsı [Mi szél hozott mondsza erre?] írószín! 228 ( ki "Mi "vagyon "a "szíved "terhe? ) vége Az eljárásunk letakarítja az írólapot. Rögtön az elsı sor elsı karakterétıl kiírja, hogy „Üdvözöllek”. A kerek zárójelbe tett következı kiírást már a következı sorban kezdi, de éppen, mert kerek zárójelekkel van körülvéve, azért több szót is tud egymás után írni. Az ezt követı kurzorhely! [ 20 6] utasítás a 6. sor 20 oszlopába ugratja a kurzort A következı kiíratás már itt jelenik meg. A "Szép a lovad" szöveg szögletes zárójelben van, ezért nem kell kívülrıl kerek zárójelekkel körülvenni és minden szó elé idézıjelet tenni . A harmadik kurzorhely kijelölés [10 10 ] után a kiírbelsı utasítással egy egész mondatot tudunk a képernyıre íratni, viszont utána a kurzor nem ugrik a következı sorba, hanem a kiírt szöveg végén marad. Ezért látjuk azt, hogy az írószín

beállítása után a kiírató utasítás tovább folytatja a sort (most már más író- és háttérszínnel). Számtani mőveletek Az itt következı részben sok újdonsággal ugyan nem találkozunk, de célszerő összefoglalni, hogy milyen számtani mőveleteket végezhetünk Comenius Logoban. Tekintsük át a mőveleti jeleket: * szorzás / osztás + összeadás kivonás. A számtani mőveleteknek rangsora van. Ez megegyezik a matematikában már megismert mőveleti rangsorral, azaz elsıként a szorzás-osztásokat végzi el a gép, majd a kivonás-összeadásokat. Szabadon zárójelezhetünk, ha nem vagyunk biztosak a mőveletek sorrendjében. 39 Nincs külön mőveleti jele a hatványozásnak. Szorzásokkal helyettesíthetı. Meg kell még említeni két fontos mőveletet, amelyre a Comenius Logoban szintén nincsen mővelei jel, de vannak un. függvények Ez a két mővelet az egész számok osztása egész számmal, ahol keletkezhet maradék is. Ilyenkor ez a mővelet

azt adja meg eredményül, hogy hány egész számszor van meg az osztandóban az osztó pl. 23-ban az 5 4 egész számszor van meg ( és marad 3 ). Erre szolgál az egészhányados osztandó osztó függvény. Rövidítése: eh osztandó osztó Az osztási maradékot a maradék osztandó osztó függvény segítségével kaphatjuk meg. A függvény két paramétere az osztandó és az osztó. Eléjük mindig egy helyköz karaktert kell leütni Nézzünk néhány példát! Most az egyszerőség kedvéért elég, ha csak közvetlen parancsként gépeljük be az írólapra: ki 144 - 5 * 3 + 1 Az eredmény: 130 a következı sorban jelenik meg. Azt is látjuk, hogy kiíratási utasításban szerepelhet számítási mővelet, a kiíratás a végeredményt jeleníti meg. FIGYELEM! Itt is helyközökkel kell tagolni a számokat és a mőveleti jeleket! Ha azt szeretnénk látni a kiíratás végeredményeként, hogy 144 - 5*3 + 1 = 130 akkor a következıket kellene írni: (ki "144

"- "5*3 "+ "1 "= 144 - 5 3 + 1) Nézzünk néhány példát az egészosztásos mőveletekre is: ki (egészhányados 1943 4) - 20 Az eredmény 465, hiszen 1943-ban a 4 485-ször van meg, amibıl még levonunk 20-at. A maradékra is legyen egy példa: ki (maradék 1943 4) * 12 ami azt jelenti, hogy írja ki a program , hogy mennyi marad, ha 1943-at 4gyel elosztunk és ezt a maradékot szorozzuk meg 12-vel. Az eredmény 36 (maradék 1943 4 = 3, 3 * 12 = 36). A változó fogalma és használata Megismerkedtünk a számtani mőveletek elvégzési módjával. Azt is tudjuk már, hogy hogyan kell a kapott eredményt megjeleníteni. Ha mindössze ennyi lenne, amire egy számítógép képes, akkor az nem 40 különbözne semmiben egy egyszerő számológéptıl ( kalkulátortól ). Nagyon körülményes lenne a képletek használata, hiszen állandóan csak a konkrét adatokkal behelyettesített képletekkel tudnánk dolgozni. Ez még nem lenne algoritmust

végrehajtó gép. Ha tetszıleges adatokkal akarunk algoritmust végrehajtani, akkor a konkrét adattól, a konkrét számtól el kell vonatkoztatnunk. Helyette szimbólumokkal kell dolgoznunk. Valamilyen nevet adunk az adatnak és ezzel az elnevezett adattal végezzük a mőveleteket. Nem ismeretlen ez a megközelítési mód. A matematikában, a fizikában is betőkkel helyettesítünk valamilyen adatot, pl. azt mondjuk, hogy ha egy gyalogos t óra alatt s km utat tett meg, akkor az átlagos sebessége v úgy számítható ki, hogy v=s/t. A programozási nyelvek ilyenkor az elnevezett adatnak egy memória rekeszt nyitnak meg. Ennek a memória „fióknak” van egy neve (ahogy elneveztük) és van egy tartalma, a konkrét adat. Az ilyen névvel ellátott adatot tároló memória rekeszt nevezik változónak a programozásban. Ha új adatot teszünk bele, akkor a régi egyszerően elvész és csak az új érték marad benne. a Comenius Logoban a következı módon hozhatunk létre

változót: név ”változónév érték Például: név ”s 17.5 név ”t 3 Ez azt jelenti, hogy létrehoztunk egy s nevő változót, aminek a tartalma 17.5 és egy másikat, aminek a neve t és a tartalma 3 . Ha most s -sel a megtett utat, t -vel az ezalatt eltelt idıt helyettesítettük és v -vel jelöljük majd a sebességet, akkor a sebesség számára létrehozhatjuk a változót úgy, hogy egyben kiszámítjuk az értékét: név ”v :s / :t A példából látható a szabály is: ha nevet adunk a változónak, akkor a változónév elé idézıjelet teszünk, ha hivatkozunk rá, azaz mőveleteket végzünk vele, akkor kettıspontot kell elé tenni. FIGYELEM! Az idézıjel és a változónév vagy a kettıspont és a változónév között nem szabad helyközt kihagyni! Ha most azt írjuk be, hogy ki :v akkor a következı sorba kiírja a gép az 5.83 értéket 41 Nyissuk most meg a memóriaablakot! Azt tapasztaljuk, hogy az ablak bal oldalán a változó nevek

megjelennek elıttük egy kis fiók formájú ikonnal. Ha rákattintunk a fiókocskákra, akkor az ablak belsejében újabb ablakocskák nyílnak meg és megmutatják a változó „tartalmát”, azaz értékét. Látjuk, hogy a v változó értéke sokkal pontosabban van eltárolva, mint ahogyan a gép kiírta a kiíratáskor. Ez azért van, mert kiíratáskor két tizedesjegynyi pontossággal ír ki mindent a program, hacsak más pontosságot nem állítunk be neki. ( Ezt a tizedesjegy! hosszúság utasítással lehet beállítani, pl. tizedesjegy! 5 hatására öt tizedesjegy pontossággal ír ki a késıbbiekben.) Ha a fenti módon létrehozunk egy változót, akkor azt az összes eljárás használhatja. Nézzünk egy új példát! Számítsuk ki egy r sugarú kör kerületét és területét. Ezt a két kiszámított értéket tároljuk változóban és írjuk is ki a képernyıre az értéküket: tanuld kör ker ter név "kerülete 2 * :r 3.14 név "területe :r * :r

3.14 ( ki "kerület "= :kerülete ) ( ki "terület "= :területe ) vége A változó nevének mindig betővel kell kezdıdnie, de folytatódhat számjegyekkel is. (Tartalmazhat még kérdı- és felkiáltójelet, $, %, &, # jeleket is.) Gyakorlatilag tetszıleges hosszúságú lehet, de jól felfogott érdekünkben ne válasszunk túl hosszú neveket, mert azt könnyő elvéteni. Ilyenkor igen alattomos hibát helyezhetünk el a programunkban. Az elgépelést ugyanis észre kell venni. Ez nem megy mindig egykettıre A kör kerületét és területét kiszámító eljárásunkat még nem tudjuk használni. Ha megpróbáljuk lefuttatni a kör ker ter parancs (az eljárás nevének) begépelésével, akkor a program hibajelzést küld: 42 Hiba a kör ker ter eljárás 1. sorában: A(z) r változónak nincs értéke. Így igaz. Valóban elfelejtettünk értéket adni Ezt pótolhatjuk a parancssorból is. Ha beírjuk például, hogy név ”r 10 és most már

eredményesen lefuttatjuk az eljárást, akkor kiírja a kör kerületének és területének az értékét. Foglaljuk össze: Programjainkban változókat használunk. Ezek névvel ellátott memória rekeszek, amelyekben adatot tárolunk. Egy változónak van neve és értéke. A Comenius Logoban név "változónév érték utasítással hozhatunk létre egy változót ill. adhatunk értéket neki Elnevezéskor " jel van a változónév elıtt, ha mővelete végzünk vele, akkor pedig : jel. A változó neve mindig betővel kezdıdik, számjegyek és egyéb nem mőveleti jelek is lehetnek benne, de egyetlen „szónak” kell lennie. Ezt az utasítást nevezzük értékadó utasításnak, amikor egy változónak értéket (új értéket ) adunk. Adatbeviteli utasítás A változók használata sokat könnyít a munkánkon, de még így is nélkülöznének minden intelligenciát. Hogy miért? Csak azért, mert, ha nem lennénk ennél többre is képesek, akkor minden egyes

új adatnál át kellene íri a programot. Ha csak az értékadó utasításokkal adhatnánk értéket egy változónak, akkor , ha pl. a 1237 sugarú kör kerületére és területére lennénk kíváncsiak, akkor ismét be kellene gépelni egy értékadó utasítást. Mi inkább azt várjuk el a programtól, hogy ı kérdezze meg a sugár értékét minden lefuttatáskor, és majd mi megadjuk mindig azt az értéket, amelyikbıl éppen számolni akarunk. Azt az utasítást nevezik adatbeviteli utasításnak, amelyik ezt lehetıvé teszi: olvasszó Rövidítése: osz Nem magában szoktuk használni, sıt nem is lehet. Egy értékadó utasítással kombinálva a változó értékét a program futása közben a felhasználótól kérdezi meg: név ”újadat olvasszó név ”újadat osz vagy: Ha ezt begépeljük, akkor egy kettıspont jelenik meg a következı sorban. Ha ide egy számot írunk, majd ENTER-t ütünk, akkor ugyan nem tapasztalunk 43 semmit, de ha megnyitjuk a

memória ablakot, akkor ott már megtaláljuk az újadat nevő változónkat, értéke pedig az a szám lesz, amit beírtunk a kettıspont után. Ha nem számot, hanem egy szót írunk oda (idézıjel nélkül! ), akkor a változó értéke az a szó lesz. Javítsuk most ki a kör kerületét és területét kiszámító eljárásunkat az adatbeviteli utasítással. Mindössze annyi a dolgunk, hogy beszúrjunk egy elsı sort. Nem jó azonban az eljárás, ha megkérdez tılünk egy adatot, csak éppen az nem világos, hogy mit. Képzeljük el azt az esetet, hogy négy-öt (vagy akár több) változónak is adatot kell adni adatbevitellel. Ha csak kettıspontok jelennek meg, akkor fogalmunk se lesz róla, hogy most éppen melyik változó számára kér értéket a program. Ezért legyen szabály, hogy az adatbevitelt mindig egy kiíratás elızzön meg, ahol kiírjuk a képernyıre, hogy melyik adatot kéri a programunk. Ez történhet ki utasítással és pozícionálással, de sokkal

egyszerőbb a kiírbelsı utasítást használni: tanuld kör ker ter kiírbelsı [A kör sugara ] név ”r olvasszó név "kerülete 2 * :r 3.14 név "területe :r * :r 3.14 ( ki "kerület "= :kerülete ) ( ki "terület "= :területe ) vége Adatbeviteli utasítás segítségével futás közben kér tılünk a program adatot, így tetszıleges értékekkel végezhetı el a számítási vagy egyéb feladat. Adatbevitelre az olvasszó rövidítve: osz utasítás használható. Ennek értékadás jobb oldalán kell szerepelni Elıtte célszerő kiíratni, hogy milyen adatot kér éppen a program: kiírbelsı[az adat megnevezése] név "változónév olvasszó Utasítás sorozatok Ebben a fejezetben igen egyszerő algoritmusok rövid programocskáit tárgyaltuk. Megismerkedtünk az értékadás (változó létrehozása), az adatbevitel, a különféle számítások, a kiíratások utasításaival. Mindezekben van valami közös: egyszerő adott

sorrendben egymás után elvégzendı mőveletek. Csak arra kell ügyelni az algoritmusuk megtervezésekor, hogy helyes sorrendben végezzük el ıket. Az esetek többségében ez nem okoz nagy fejfájást. Eléggé nyilvánvaló, hogy elıbb az adatokat be kell kérni a 44 programnak, ezután elvégezni rajtuk a szükséges mőveleteket, majd ki kell írni a végeredményt. Általában a programok többsége jellemezhetı a következı szerkezettel: bemenı adatok kimenı PROGRAM adatok Az algoritmustervezésnek is éppen az egyik igen fontos lépése, hogy tisztázzuk: milyen bemenı adatokra van szüksége a program algoritmusának és milyen kimenı adatokat várunk el végeredményképpen. A program ebben a megközelítésben egy olyan „fekete dobozhoz” hasonlít, amelybe adatokat töltünk és amelybıl új adatokat kapunk. A doboz belsejében játszódik le a szükséges mőveletek algoritmusa. Az ilyen egymást követı egyszerő utasítások sorozatát utasítás

sorozatnak (idegen szóval: szekvenciának ) nevezzük. Nézzük meg a fenti kör-adatokat számoló eljárásunk blokkdiagramját. Sok könyvben az adatbevitelt paralelogramma formájú cellába írják. Mi nem tartjuk szükségesnek megkülönböztetni ezt az utasítás típust. A gyakorlatban az adatbevitel ugyan olyan utasítás, mint a többi. Az olyan algoritmus szerkezetet, amely egymást követı utasításokat tartalmaz utasítás sorozatnak nevezzük. Ellenırizd tudásod! 1. Mi a változó? Miért van szükség programokban változókra? 2. Hogyan nézhetjük meg, hogy egy Comenius Logo program milyen változókat használ és mi az értékük? 3. Hogyan hozható létre egy változó Comenius Logoban? 4. Milyen módokon adható érték egy változónak? 5. Mi a különbség értékadó utasítás és adatbevitel között? 6. Mit jelent a KI MARADÉK 27 5 utasítás? 7. Mit ír ki a számítógép a következı utasítás hatására? KI 4 + 5 * MARADÉK 13 9 - 1 8. Milyen

különbségek vannak az írólapra és a rajzlapra írás között? 45 8 ábra: Utasítás sorozat blokkdiagramja kör területének és kerületének kiszámításáról Feladatok ☺ 1. Készíts eljárást, amely bekéri egy háromszög alapjának és magasságának az értékét és kiszámítja a területét. ☺ 2. Készíts eljárást, amely bekéri egy test tömegét és térfogatát és kiszámítja a sőrőségét!  3. Készíts eljárást, amely bekéri egy test tömegét, fajhıjét, hımérsékletét Megkérdezi, hogy mennyi hıt közöljünk vele és kiszámítja az új hımérsékletet. Elıfeltétel: nem megy végbe közben halmazállapot változás. ☺ 4. Készíts eljárást, amely bekéri egy háromszög magasságát, az alapjának hosszát és kiszámítja a területét!  5. Készíts eljárást, amely megkérdezi a nevedet, lakcímedet, telefonszámodat és a rajzlapra elkészíti a névjegykártyádat! Keretezd is be a teknıs segítségével! 46

Elágazások Már a köznapi algoritmusainknál (pl. rántotta sütés) is láttuk, hogy még egyszerő feladatok sem oldhatók meg pusztán utasítás sorozatokkal. Szükség lehet egy-egy feltételtıl függı elágazásra. Az említett esetben pl azt kellett megvizsgálnunk, hogy friss-e a tojás. Ha nem, akkor ki kellett dobni, ha igen akkor egy tálkába kellett tenni. A feltétel a frissesség volt A teljesülésétıl függıen más-más útvonalon kell az algoritmusban továbbhaladni. Az „igaz ágon” is (ahol teljesül a feltétel) vannak valamilyen utasítások, a „hamis ágon” is másfajta utasítások. Gyakran az is elıfordul, hogy csak az „igaz” ágban vannak utasítások, a másikban nincsenek. Ez azt jelenti, hogy ha teljesül a feltétel, akkor hajtsuk végre az utasításokat, egyébként pedig lépjünk tovább. Minden esetre, az „igaz” és a „hamis” ág végül találkozik egy pontban és utána már azonos útvonalon halad tovább az algoritmus.

9. ábra: Elágazás blokkdiagramja Hogyan fogalmazzuk meg magyar nyelven, egyszerő hétköznapi mondatokban, ha egy ilyen elágazó algoritmust közlünk valakivel? Ha így és így történik, akkor tedd ezt, különben azt! Vagy pontosabban fogalmazva: Ha a feltétel teljesül, akkor különben hajtsd vége az utasítás1-et, hajtsd vége az utasítás2-t! Szerencsére a Comenius Logo magyar utasításszavakat tartalmazó programnyelv és ezért igen hasonló egy elágazás programsora is: ha feltétel [utasítás1 ][utasítás2 ] Látható, hogy az elsı szögletes zárójelben az „igaz” ág utasításai, a másodikban a „hamis” ág utasításai találhatók. Ha több utasítás is szerepel egy-egy ágban, akkor valószínőleg nem fog egy sorban kiférni mindkét szögletes zárójel. A Comenius Logoban azonban egy ilyen kétirányú elágazás egyetlen sornak számít. Ezt a problémát oldja fel a sortörési jel Egy ~ jelet 47 kell a sor végére elhelyezni és

akkor a program úgy tekinti, mintha egy sorba lennének írva. Nézzünk egy feladatot és azon keresztül egy példát! Menjünk végig az algoritmus tervezés minden lépésén, hogy hozzászokjunk a fegyelmezett munkához! I. FELADAT: Egy boltban kapható háromféle gyümölcs: alma 85 Ft/kg narancs 159 Ft/kg banán 180 Ft/kg. Elmész bevásárolni. Van nálad 300 Ft Írj programot, amely megkérdezi, hogy melyik gyümölcsbıl hány kg-ot kérsz, majd kiírja, hogy mennyi pénzed maradt, vagy ha többet költenél, mint amennyi van, akkor írja ki, hogy „nincsen annyi pénzed”. • • • • • 48 Értelmezés: A feladat egyértelmő, nem lehet félreérteni. Minden adat rendelkezésre áll. Bemenı adatok: az egyes gyümölcsök mennyisége (kg-ban), amennyit vásárolni szándékozom: Nevezzük ezeket a változókat el a gyümölcsökrıl! (Mindig „kifizetıdı” stratégia, hogy „beszédes” változóneveket használjunk. Így könnyő követni, hogy milyen

adatokkal végezzük éppen a mőveletet.) alma narancs banán kg-nyi mennyiségeket veszünk. Kimenı adatok: 300 - fizet Ft, azaz , hogy mennyi forintunk maradt meg vagy: „Nincs annyi pénzed!” szöveg. Elıfeltétel: Nincs különösebb elıfeltétele az algoritmusunknak. Legfeljebb kiköthetjük, hogy csak pozitív mennyiséget lehet vásárolni. (Igaz épesző ember nem is gondolna negatív kg alma megvásárlására. Ez ugyanis azt jelentené, hogy ı az eladó. Feladatunk azonban nem errıl szól) Utófeltétel: fizet < 300 vagy szöveges üzenet a végeredmény, fizet = alma * 85 + narancs 159 + banán 180 • Az algoritmus blokkdiagramja: 9. ábra: A vásárlási algoritmus blokkdiagramja • Most végre nézzük a programot: tanuld vásárol kiírbelsı[Hány kg almát kérsz? ] név "alma olvasszó kiírbelsı[Hány kg narancsot kérsz?] név "narancs osz kiírbelsı[Hány kg banánt kérsz? ] név "banán osz név "fizet :alma * 85 +

:narancs 159 + :banán 180 ha 300 - :fizet >= 0 [(ki "maradt 300 - :fizet "Ft)] ~ [( ki "Nincs "annyi "pénzed! )] vége Az adatbevitelnél a második és harmadik sorban az utasítás rövidített formáját használtuk, hogy az se maradjon szokatlan. Figyeljük meg, hogy az elágazás elsı szögletes zárójele után használtuk a sortörés hullámvonal jelét. A második szögletes zárójelet az elsı alá írtuk, hogy a program jobban áttekinthetı legyen. Érdemes az egyes utasítások beljebb kezdésével is úgy tagolni a program szövegét, hogy az összetartozó szakaszok ugyan annyival kezdıdjenek beljebb, így a szemünk is könnyebben tudja követni, hogy 49 melyek az összetartozó részek. Szokás ezt a gyakorlatot strukturált programlejegyzési módszernek is nevezni. Nézzünk egy másik feladatot is, hogy mindenki számára világos legyen a ha vezérlési szerkezet használata: II. FELADAT: Készíts programot, amely alsó

tagozatos tanulókkal gyakoroltatja az összeadást! A program két (legfeljebb kétjegyő) pozitív véletlenszerően kiválasztott szám összegét kérdezi meg. Ha jó választ ad a tanuló, akkor dicsérje meg a program. Ha rossz a válasz, akkor írja ki a helyes megoldást és fejezze ki rosszallását. Mielıtt elkezdenénk elemezni a feladat megoldását, ismerkedjünk meg a véletlenszámokkal! Ezek olyan számok, amelyeket véletlenszerően kapunk. Ha például dobunk egy dobókockával, akkor elıre nem tudjuk teljes biztonsággal megjósolni, hogy melyik lapja lesz felül. Ez csak a véletlenen fog múlni. A kapott (egy és hat közötti) szám egy véletlenszám lesz Ugyan ilyen a helyzet a lottósorsolásoknál. Ha elıre meg lehetne mondani, hogy melyeket fogják kihúzni, akkor nem volna nehéz telitalálatot elérni. Mindannyian tudjuk, hogy ez nincs így. Csak a véletlenen múlik, hogy azon a héten melyik számok a nyerık. A számítógép is tud véletlenszámokat

produkálni. A véletlenszámot a véletlenszám szám utasítással lehet megkapni. Rövidítése: vsz szám Ilyenkor egy 0 és (szám - 1) közé esı számot fogunk kapni. Figyelem! Az így kapott véletlenszám mindig kisebb a szám-nál!. Most már rátérhetünk a feladatunk elvégzésére is. • Értelmezés: A feladat egyértelmő. • Bemenı adatok: A program maga hozza létre a véletlenszerő bemenı adatokat: a és b száznál kisebb pozitív, egész véletlenszámok. Az összegre a tipp-et azonban tılünk várja. • Kimenı adatok: Vagy a helyeslı szöveg, amely megerısít, hogy jól oldottam meg, vagy a helyes megoldás számértéke és utána a rosszalló szöveg, ha a „tippem” nem a helyes összeg. • Elıfeltétel: Nincs különösebb elıfeltételünk. 50 • Utófeltétel: c=a+b és ha tipp = c akkor azt írja ki hogy „Helyes!”, ha tipp ≠ c akkor azt írja ki, hogy „A helyes megoldás:” c Az algoritmust szöveges leírása: Összeadás: a

= véletlenszám 100 b = véletlenszám 100 c=a+b kiír: a „+” b „=” bekér tipp ha tipp = c akkor kiír: „Helyes!” különben kiír: „A helyes megoldás:” c kiír: „Ezt még gyakorolni kell!” eljárás vége A fenti szöveges algoritmus leírásban a véletlenszám 100 azt jelenti, hogy 0 és 99 közé esı véletlen (egész) szám. Az algoritmus blokkdiagramja: 10. ábra: Az összeadást gyakoroltató program blokkdiagramja 51 Algoritmusok nélkülözhetetlen eleme az elágazás. Szöveges leírásában ha feltétel akkor utasítások1 utasítások2 különben formában írjuk le, ahol az „akkor” után a feltétel „igaz” ága, a „különben” után a feltétel „hamis” („nem”) ága található. Az elágazás Comenius Logo utasítása szintén ha feltétel [ utasítások1 ][ utasítások2 ] ahol az elsı szögletes zárójelbe az „igaz” ág utasításai, a másodikba a „hamis” ág utasításai kerülnek. Ellenırizd tudásod! 1.

Miért szükségesek algoritmusok leírásaiban az elágazások? 2. Miszerint ágazik el egy algoritmus folyamata? 3. Ha egy algoritmus folyamata elágazik, akkor mindegyik ágban kell lenni utasításnak? Miért? 4. Az elágazott algoritmus ágak találkoznak-e valahol? 5. Mi a véletlenszám? Mondj rá példát a köznapi életbıl! 6. Ha számítógéppel hozunk létre véletlenszámot, akkor pl a vsz 100 hatására milyen határok közé esı véletlenszámot kaphatunk? 7. Hogyan hoznál létre -100 és +100 közötti véletlenszámot? 8. Mit gondolsz, mikor jó egy véletlenszám egy programban? (Mikor tekinthetı igazán véletlennek?) Feladatok  1. Írj programot, amely bekéri tıled egy háromszög oldalainak a méreteit és eldönti, hogy szerkeszthetı-e abból a három oldalhosszúságból háromszög! ☺ 2. Írj programot, amely bekér két számot és kiírja a nagyobbikat! ☺ 3. Írj programot, amely bekér két számot és a megfelelı relációs jelet kiteszi

közéjük (<, >, =)! ☺ 4. Írj programot, amely véletlenszerően feladott számokkal gyakorol tatja a a) szorzást b) osztási maradék számítását c) egészosztást.  5. Írj programot, amely megkérdezi az életkorodat és 0 - 5 év között azt írja ki, hogy „óvodás vagy” 6 - 14 év között azt írja ki, hogy „iskolás vagy” 52 15 -18 év között 19 -61 év között 62 év és afölött azt írja ki, hogy azt írja ki, hogy azt írja ki, hogy „középiskolás vagy” „munkaképes korú vagy” „nyugdíjas vagy”. Összetett feltételek Az elágazásokban az algoritmus egy feltétel szerint válik szét két útvonalra. Az elızı fejezetek példái ezt világossá tették Ezek a feltételek eddigi példáinkban egyszerő feltételek voltak. Ez azt jelenti, hogy egyetlen feltételnek kellett eleget tenni. A valóságban azonban igen gyakran fordulnak elı olyan esetek, amikor összetett feltételeket kell megvizsgálni. Az összetett

feltételek több egyszerő feltételt tartalmaznak. Mi kapcsolja össze egyetlen kérdéssé ezeket az egyszerő feltételeket? Logikai mőveletek. Mielıtt áttekintenénk az összetett feltételek szerinti elágazásokat, elıbb foglalkozzunk egy kicsit a logikai mőveletekkel. Logikai mőveletek Idáig matematikából csak a számtani mőveletekkel ismerkedtünk meg. Ezeket számok közt végzik. Vannak azonban logikai mőveletek is, amelyek igen fontosak úgy a matematikában, mint a logikában és a hozzájuk kapcsolódó számtalan területen. A logikai mőveleteket azonban nem számok , hanem állítások közt végzik. Az állításoknak is van értéke, mégpedig igazságértéke. Mindössze kétféle értékük lehet: vagy igazak, vagy pedig hamisak. Mielıtt nagyon megijednénk a logikai mőveletektıl, jó ha felismerjük, hogy ahogyan megtanulunk beszélni, a helyes beszéd szabályaival gyakorlatilag megtanuljuk a logikai mőveletek használatát is. Mindannyian

használjuk mindennapi beszédünk során. Itt azért kell vele foglalkoznunk, hogy tudatossá tegyük azt, amit egyébként is tudunk, másrészt pontosítsuk a hétköznapi pontatlanságokhoz képest. Három alapvetı logikai mővelet van. Az összes többi már kifejezhetı ezekkel Ez a három: az ÉS, a VAGY és a NEM. Az elsı kettı két állítást kapcsol össze, a harmadik egyetlen állítás igazságértékét változtatja meg. ÉS mővelet: Vizsgáljuk meg, hogy mikor igaz, ill. mikor hamis egy ÉS mővelettel összekapcsolt összetett állítás. Ennek érdekében felírjuk az összetett állítás „igazság-tábláját”: 53 1.állítás 2.állítás 1.állítás ÉS 2állítás igaz igaz igaz hamis igaz hamis igaz hamis hamis hamis hamis hamis Látható a táblázatból, hogy csak akkor igaz egy ÉS-sel összekapcsolt állítás, ha mindkét állítás igaz. Minden egyéb esetben hamis Nézzünk néhány példát: A kacsa egy madár és tud úszni. Ez a mondat

két állítást tartalmaz. Az elsı: "a kacsa egy madár" A második: "a kacsa tud úszni". Az elsı állítás igaz, hiszen valóban madár A második is igaz, mert valóban tud úszni. Az összetétel is igaz Mi történik akkor, ha a fenti állítást pl. a pulykáról teszem: A pulyka egy madár és tud úszni. Ez a mondat is két állítást tartalmaz. Az elsı: "a pulyka egy madár" A második: "a pulyka tud úszni". Az elsı állítás igaz, hiszen valóban madár A második viszont hamis, mert nem tud úszni. Az összetétel hamis A Comenius Logo nyelvben nem mőveletként kezelik az ÉS mőveletet, hanem függvényként. A függvény neve ÉS A használata igényel egy kis odafigyelést. Logoban nem azt írjuk, hogy állítás1 ÉS állítás2 , hanem : és állítás1 állítás2 Ha pl. azt írjuk be a gépnek, hogy: ki és 5 > 0 5 < 10 akkor azt írja ki a gép, hogy igaz. Ha nem látjuk át jól a két állítást, akkor

zárójelezhetünk is, pl.: ki és (5 >= 0) (5 < 5) amire természetesen hamisat fog adni. VAGY mővelet: Itt egy kicsit óvatosabbnak kell lennünk, mert a „vagy” szót a nyelvünk kétféle értelemben is használja. Használjuk összekötı értelemben, amikor arra gondolunk, hogy „valamelyik” és használjuk úgy is, hogy „vagy-vagy”, azaz kizáró értelemben, amikor, ha az egyik igaz, akkor a másik már nem lehet az és fordítva. Nézzünk mindegyikre egy-egy példát: 1. Az osztályban találunk olyan tanulót, aki angolul vagy németül ért Itt az elsı állítás : Találunk az osztályban olyan tanulót, aki ért angolul. A második: Találunk az osztályban olyan tanulót, aki ért németül. Egyik állítás nem zárja ki a másikat, hiszen lehet olyan tanuló, aki mindkét nyelven beszél. 54 2. Ha feldobsz egy pénzérmét, akkor az úgy esik le, hogy vagy fej vagy írás lesz felül. Itt az elsı állítás: úgy esik le, hogy fej lesz felül.

A második: úgy esik le, hogy írás lesz felül. A kettı egyszerre nem teljesülhet, hiszen nem tud úgy leesni az érme, hogy egyszerre fej is, meg írás is legyen felül. Az egyik kizárja a másikat. Ez a „kizáró vagy” A logikában nem kizáró értelemben használjuk a VAGY mőveletet, hanem az elsı példa összekötı értelmében. Nézzük az igazság-táblát: 1.állítás 2.állítás 1.állítás VAGY 2állítás igaz hamis igaz hamis igaz igaz hamis hamis igaz igaz igaz hamis Megállapíthatjuk, hogy a VAGY mővelet akkor vezet csak hamis eredményhez, ha mindkét állítás hamis, különben mindig igaz. Nézzünk még egy példát: Péter vagy István tudni fogja, hogyan kell beszerelni a gépbe az új hangkártyát. Az elsı állítás: „Péter tudni fogja, hogyan kell beszerelni a gépbe az új kártyát”. A második: „István tudni fogja, hogyan kell beszerelni a gépbe az új kártyát”. Ha legalább az egyik személy tudja, akkor igaz az

állítás (Ha mindketten tudják, akkor is.) Csak akkor hamis, ha egyikıjük sem tudja A Comenius Logo nyelvben erre a mőveletre is függvény áll rendelkezésünkre. Használata hasonló az és függvényhez: vagy állítás1 állítás2 Például : kiír vagy (105 < 0) (105 > 100) igaz eredményt ad a VAGY-függvény, hiszen a második relációs állítás (105>100) igaz, ha pedig az összekapcsolt állítások legalább egyike igaz, akkor az összetett állítás is igaz. NEM mővelet Nem igényel hosszú taglalást, hiszen mindenki számára nyilvánvaló, hogy egy állítás igazságértékét az ellenkezıjére fordítja. Ezt hívják tagadásnak. Comenius Logo nyelvő használata: nem állítás 55 Például : kiír nem (105 < 0) egy igaz állítás, mivel (105 < 0) hamis, ennek tagadása: igaz. Elágazás összetett feltételek szerint Elágazási feltételekben gyakran kell összetett eldöntendı állításokat használnunk. Nézzünk egy kicsit

bonyolultabb példát: FELADAT: Írj programot, amely egy-egy évszámról eldönti, hogy szökıév-e, avagy sem! Mielıtt hozzálátnánk, a feladat még a probléma szintjén mozog, hiszen legtöbbünknek fogalma sincs róla, hogy milyen szabályok vonatkoznak arra, hogy egy év szökıév-e. Akkor válik igazán feladattá a feladat, ha már tudjuk, hogyan kell ezt meghatározni egy évszámról. Segítene rajtunk, ha könyvtárban utána járnánk. Tegyük fel, hogy a következıket derítettük ki: A szökıév fogalmát Gergely pápa naptár reformja vezette be. Azért szükséges egy-egy „szökınapot” beiktatni idıközönként, mert a Föld nap körüli pályáján évente nem pontosan 360 fokos körbefordulást tesz meg, hanem valamivel kevesebbet. Négy évente egy nappal így megtoldják az év napjainak a számát. Ez azonban egy kicsit túllendít a teljes körforduláson. Száz évente el kell hagyni egy szökınapot Hogy még pontosabb legyen: négyszáz évente

mégis be kell iktatni a százévente elmaradó szökınapot. Ez bizony elég bonyolult! Próbáljuk megfogalmazni a szabályokat: Három szabály van - a néggyel osztható évszámok szökıévek, - a százzal osztható évszámok viszont nem szökıévek, - a négyszázzal osztható évszámok mégis szökıévek. Ebbıl próbáljuk meg összeállítani a szabályt egyetlen összetett állítássá. A második szabály ellentmondana az elsınek és a harmadiknak. Ha viszont az elsı kettıt ÉS-sel kötjük össze, akkor megkapjuk az összes néggyel osztható, de százzal nem osztható számot. Mielıtt felírnánk, nézzük meg, mit is jelent az oszthatóság? Ha egy szám osztható az osztójával, akkor a maradék nulla, egyébként pedig egy nullától eltérı pozitív szám . (MARADÉK év / 4 )= 0 ÉS (MARADÉK év / 100 )> 0 Hogyan kapcsolhatjuk hozzá a harmadik szabályt? Vagy a most megfogalmazott összetett szabályunknak kell teljesülnie, vagy annak, hogy

osztható 400-zal. Ha a kettı közül valamelyik igaz, akkor a többszörösen összetett állítás is igaz lesz, tehát VAGY kapcsolattal kell összekötni: ((MARADÉK év / 4 )= 0 ÉS (maradék év / 100 )> 0) VAGY (MARADÉK év / 400 )= 0 56 • • • • • Bemenı adat: Egy évszám ( év ) Kimenı adat: „Nem szökıév” ill. „Szökıév” szöveg Elıfeltétel: Az év pozitív egész szám. (Értelemszerően idıszámításunk elıtt még nem beszélhetünk szökıévrıl. Az évszám is a belátható elıttünk álló idı esetében értelmes csak.) Utófeltétel: Lásd a fenti összetett szabályt. Ha ennek eleget tesz, akkor a program helyes eredményt adott vissza. Szöveges algoritmus: Szökıév? bekér év ha ((MARADÉK év / 4 )= 0 ÉS (maradék év / 100 )> 0) ~ VAGY (MARADÉK év / 400 )= 0 akkor kiír: „SZÖKİÉV” különben kiír: „NEM SZÖKİÉV” vége. Sajnos az összetett feltétel nem fért ki egy sorba ezért itt használtuk a

Logo nyelvben használatos sortörés jelet (~), hogy jelezzük hogy összetartozik a következı sorral. Az algoritmus blokkdiagramját most nem rajzoljuk fel, mert semmi elvi újdonságot nem jelentene. A Comenius Logo program: tanuld szökıév? kiírbelsı [Add meg az évszámot] név "év osz ha vagy ( és ( maradék :év 4 = 0 ) ( maradék :év 100 > 0 ) )~ ( maradék :év 400 = 0 ) ~ [ki "Szökıév] ~ [( ki "Nem "szökıév )] vége Próbáljuk ki a következı évszámokra: 1904, 1900,2000, 1991. Algoritmusainkban gyakran szükséges a feltételtıl függı elágazás, amikor két útvonalra válik az algoritmus folyamata. Az útvonal egy feltételtıl függıen ágazik el: ha a feltétel teljesül, akkor az egyik, ha nem: a másik útvonalon halad tovább az algoritmus folyamata. A két útvonal egy késıbbi pontban (legkésıbb az algoritmus befejezési pontjában) találkozik. 57 Az elágazási feltétel lehet egyszerő és összetett. Az

összetett feltételek logikai mőveletekkel összekapcsolt egyszerő feltételekbıl épülnek fel. A logikai mőveletek: ÉS (csak akkor igaz, ha mindegyik igaz), VAGY (csak akkor hamis, ha mindegyik hamis), NEM (egy állítást az ellenkezıjére fordít). Az elágazási utasítás szava Comenius Logoban a ha feltétel [az „igaz-ág” utasításai][a „hamis-ág” utasításai] 58 Ellenırizd tudásod! 1. 2. 3. 4. Milyen logikai mőveleteket ismersz? Mi az értéke egy állításnak? Melyek az egyes logikai mőveletek igazságtáblái? Miért van szükség összetett feltételekre az algoritmusokban? Feladatok logikai mőveletekbıl: Az alábbi állítások a megadott feltételek mellett igazak-e? ☺ 1. Ha X = 0 , Y = 85 ,akkor X > 0 ÉS Y < 10 ? ☺ 2. Ha X = 10 , Y = 999 ,akkor X > 0 ÉS Y < 10 ? ☺ 3. Ha X = 30 akkor X > 10 ÉS X≤ 50 ? ☺ 4. Ha X = 0 , Y = 55/6 ,akkor X ≤ 0 ÉS Y > 10 ? ☺ 5. Ha P = 3 , Q = 10/7 ,akkor NEM(P ≤ 0 VAGY Q >

5) ? ☺ 6. Ha R = 4/9 , S = 77 ,akkor R ≥ 1 ÉS NEM (S < 10) ? ☺ 7. Ha A = 10 , B = 527 ,akkor A ≤ 0 VAGY B > 10 ? ☺ 8. Ha N = -10 , M = 55/9 ,akkor N ≤ 4 VAGY M > 12 ? ☺ 10. Ha F = -10 , G = 55/6 ,akkor F ≥ 0 VAGY G ≥ 10 ?  11. „Ha ez a lánc aranyból vagy aranyozott ezüstbıl van, akkor Katinak ajándékozom.” A lánc bronzból készült Megkapja Kati?  12. „Ha délután öt óráig megírom a leckét és süt a nap, akkor felhívlak és lemegyünk a térre focizni.” A lecke fél ötig elkészül, borongós idı van. Mi lesz a focizással?  13. „Alkalmazottakat keresünk legalább középfokú angol vagy spanyol nyelvtudással!”. István jelentkezik Német felsıfokú és angol középfokú államvizsgája van. Megkaphatja az állást?  14. „Ez a golyó azért úszott a víz felszínén, mert kisebb a sőrősége a víznél, vagy belül üreges.” A tárgy szétfőrészelése után megállapítjuk, hogy tömör és a sőrőség mérése

0.91 g/cm3 értéket adott Helyes volt a kezdeti feltevés?  15. „A nátrium éghetı és fémes anyag” Igaz az állítás?  16. „A grafit és a gyémánt ugyan annak az elemnek egy-egy változata és mindkettı elég jó elektromos vezetı.” Igaz az állítás?  17. „Az ókor nagy csatáit dárdákkal és tüzérségi ágyukkal vívták meg” Igaz ez az állítás?  18. Rendelkezésre áll egy zseblámpaelem, egy zseblámpa izzó és néhány kapcsoló, vezetékek. Hogyan tudnád szemléltetni az ÉS és a VAGY mőveletet, ha a bekapcsolt kapcsoló jelenti az „igaz”-at? Rajzold fel a kapcsolási rajzokat! 59 Ciklusok Algoritmusaink gyakran írnak le olyan folyamatot, ahol valamilyen rendszeresen ismétlıdik. Az elızı fejezetekben tevékenység megismerkedtünk az utasítás sorozatokkal és az elágazásokkal. Ezekkel még nem vagyunk képesek bármilyen folyamatot leírni. Szükség van egy olyan vezérlıszerkezetre is, ami utasítások ismétlıdı

végrehajtását oldja meg. Ezeket nevezik ciklusoknak. Ezek olyan folyamatvezérlı szerkezetek, ahol egy feltételtıl függıen egy korábbi állapothoz lépünk vissza. Több változata is létezik a ciklusoknak attól függıen, hogy az ismétlıdı rész elején vagy végén vizsgálja meg az ismétlıdés feltételét. Ha az elején, akkor elıl tesztelı, ha a végén, akkor hátul tesztelı ciklusnak nevezik. Eltérés lehet abban is, hogy a feltétel teljesültekor, vagy nem-teljesülése esetén utasít ismétlésre. Mi csak a Comenius Logo ciklusaival ismerkedünk meg. Más programnyelvekben lehet, hogy többféle ciklus is rendelkezésre áll, ám az itt következı változatokkal is megoldható minden ciklusokat igénylı feladat. Nézzük az általános formát: 11. ábra: Ciklus blokkdiagramja Szokás visszacsatolt szerkezetnek is nevezni a ciklusokat, hiszen egy korábbi állapothoz csatol vissza a folyamat. A fenti blokkdiagram részletbıl is kiolvasható, hogy a

jobboldalon a hurokban levı utasítás(ok) addig ismétlıd(nek), amíg a feltétel teljesül. Egy körkörösen ismétlıdı folyamat alakul ki. Innen kapta a nevét A ciklus szó éppen ezt a körkörös ismétlıdést jelenti idegen eredető kifejezéssel. Szokás még iterációnak is nevezni ezt a folyamatvezérlı szerkezetet. A ciklus belsejében ismétlıdı részt ciklusmagnak nevezik. A Comenius Logoban kétféle ciklus létezik. Mindegyik elıl tesztelı Ezért is rajzoltuk fel csak ennek a blokkdiagramját. Létezik még egy 60 harmadik féle is, de ez nem egy tipikus fajtája a ciklusoknak az ismétlés szám [ ciklusmag ] , de errıl a teknıc-Logo tanulásakor már esett szó. Számlálós ciklus Egy különleges célt szolgáló ciklusfajta. Olyan esetekre találták ki, ahol meghatározott számszor kell valamit ismételni és eközben számlálnunk kell, hogy hányadik ismétlésnél tarunk. Ezért aztán a ciklushoz tartozik egy úgynevezett ciklusváltozó

is, ami az ismétlıdéseket számlálja. Innen származik a ciklus neve is. 12. ábra: Számlálós ciklus blokkdiagramja A számlálós ciklus addig ismétlıdik, amíg a számláló értéke egy végértéket el nem ér. A fenti blokkdiagramunkon i-vel jelöltük a ciklusváltozót és n-nel a ciklusváltozó végértékét. Látható az ábrából, hogy itt a ciklus addig pörög körbe, amíg a feltétel nem teljesül, azaz amíg a ciklusváltozó a végértéket el nem éri. A Comenius Logoban egyetlen utasítás valósítja meg a fenti algoritmusszerkezetet: ciklus ”ciklusváltozó [kezdıérték végérték][ utasítás(ok) ] Ha pl. i = 1 -tıl n = 10 -ig szeretnénk az utasítást ismételni, akkor: ciklus ”i [1 10][ utasítás(ok) ] Nem nehéz a dolgunk, hiszen az utasítás szava is „ciklus”. Ezt követi a ciklusváltozó neve. Nem kell a név utasítással elızıleg létrehozni a 61 ciklusváltozót. Azzal, hogy itt a „ciklus” szó után megnevezzük,

már létre is jött. Az elsı szögletes zárójelben a ciklusváltozó kezdı és végértékét kell megadni. A második szögletes zárójel pedig a ciklusmag utasításait tartalmazza, amelyeket a ciklus ismétel. Mielıtt egy példán próbálnánk ki a számlálós ciklus használatát és programozását, nézzük meg, hogyan is mőködik ez a ciklusfajta. Már tudjuk, hogy a változóknak külön kis ablakot nyit a Comenius Logo. Annak érdekében, hogy megfigyeljük, hogyan változik a ciklusváltozó a ciklus futása közben vizsgáljuk meg a ciklusváltozó ablakát. A ciklus magjában csak egy várakozó utasítást helyezzünk el. Erre azért van szükség, hogy lelassítsa a ciklus lefutását és alkalmunk legyen szemmel követni a változó értékének alakulását. ( A várj 1000 utasítás egy másodperces várakozást erıltet a programra.) Írjuk be a következı ciklust: ciklus ”i [ 1 10 ][ várj 1000 ] Elıször futtassuk le! Stopperrel le is mérhetjük,

hogy valóban tíz másodpercig tart a futása. Most nyissuk meg a memóriaablakot és tartsuk nyomva a SHIFT billentyőt és ezzel egyidıben kattintsunk az egér jobb gombjával az i változó fiók forma ikonjára. Ha visszatérünk a rajzlapra, akkor ott találjuk az i változó ablakát. Ha most ismét lefuttatjuk a begépelt ciklusunkat, akkor azt fogjuk látni, hogy a ciklusváltozó ( i ) ablakában számlálószerően egytıl tízig változik az érték. Most nézzünk egy valódi példát a számlálós ciklusra! I. FELADAT: Írj eljárást, amely egy tetszıleges szorzótábla elsı húsz elemét írja ki az írólapra! • • • • 62 Értelmezés: Ha jól értjük, akkor azt jelenti, hogy a program megkérdezi, hogy melyik szorzótáblát szeretném (szorzó) és kiírja 1 * szorzó = .-tól 20 * szorzó = .-ig a kiszámított értékeket Bemenı adatok: szorzó (melyik szorzótábla legyen ). Kimenı adatok: A szorzótábla elemei. Elıfeltétel: Lehetıleg szorzó

pozitív egész szám legyen, (de ha nem az, a program akkor is mőködik). • • Utófeltétel: Helyes legyen a szorzótábla! Algoritmus: Szöveges leírás: Szorzótábla: Bekér: szorzó ciklus i = 1 -tıl 20 -ig kiír i * szorzó ciklus vége eljárás vége Az eljárás programszövege: tanuld szorzótábla kiírbelsı [milyen szorzótábla legyen? ] név ”szorzó osz ciklus ”i [1 20 ][ (ki :i ”* :szorzó ”= :i :szorzó )] vége Az algoritmus blokkdiagramja: 13. ábra: Szorzótábla számítás blokkdiagramja Legyen egy további feladatunk, amely segít megérteni a számlálós ciklus mőködését. Egy igen gyakori és egyszerő számítási feladat legyen a második példánk: az átlagszámítás. II. FELADAT: Van tetszıleges darab számunk. Ki szeretnénk számítani az átlagát 63 • • • • • • Értelmezés: A feladat egyértelmő, nem igényel további pontosítást. Bemenı adatok: Az adatok száma: n, valamint n darab szám,

nevezzük az egyes számokat szám-nak. (A program egyenként bekéri a számokat az elsıtıl az n -ig) Kimenı adat: A kiszámított átlag érték, nevezzük átl -nak. Elıfeltétel: Nincs semmilyen különleges elıfeltétele a helyes megoldásnak, legfeljebb annyi, hogy valóban rendelkezésre álljon n darab adat. Utófeltétel: A helyes átlagszámítás azt jelenti, hogy az egyes számokat összeadjuk és az összegüket elosztjuk annyival, ahány számot összeadtunk. átl = (szám1 + szám2 + . + számn ) / n Algoritmus: Szöveges leírás: Átlagszámítás: bekér: n átl = 0 ciklus i = 1 -tıl n -ig bekér: szám átl = átl + szám ciklus vége átl = átl / n kiír átl eljárás vége (Azaz összeadjuk az n darab számot és elosztjuk n-nel. A ciklus belsejében kiszámítjuk az összeget és a ciklus után osztjuk az adatok számával.) Az algoritmus blokkdiagramja: 64 14.ábra: Átlagszámítás blokkdiagramja Az eljárás programja: Itt egy újdonsággal kell

megismerkednünk, hogy megértsük miért kell így írni az eljárásunk programját. A ciklus utasításban az elsı szögletes zárójelben található, hogy a ciklusváltozónak mi a kezdı és a végértéke. Ebben az elsı szögletes zárójelben azonban nem szerepelhet változó (!). Ezért, ha változóban tároljuk a ciklusváltozó kezdı vagy végértékét, akkor az egész szögletes zárójelben levı részt kell egyetlen változóban elhelyeznünk. Ez azért lehetséges, mert a Logo nyelvnek vannak úgynevezett lista típusú adatai, ill. a változók tárolhatnak ilyen adatokat A lista egy szám és/vagy szöveg sorozat. Esetünkben egy két elemő listára van szükségünk, ahol a lista elsı eleme a ciklusváltozó kezdı értéke, második eleme pedig a végértéke. A lista adatokat a Logo szögletes zárójelbe teszi, ezért ha létrehozunk egy ilyen két elemő listát, akkor éppen az lesz a tartalma és a formája, mint amire szükségünk van. Ezt a

listaváltozót a programunkban nevezzük L -nek Nézzük hát a programot: tanuld átlag kiírbelsı [Hány adatod van?] név "n osz név "átl 0 név "L lista 1 :n ciklus "i :L ~ [( kiírbelsı :i ".szám "= ) név "szám osz ~ név "átl :átl + :szám] név "átl :átl / :n ( ki "átlag "= :átl ) vége 65 Nézzük meg a memóriaablakban az L változó tartalmát. Láthatjuk, hogy a változó ablakában egy szögletes zárójel van, a zárójelben az elsı szám az 1, a második pedig az az érték, amit a legutolsó programfuttatáskor az n -nek adtunk. Térjünk most vissza az elsı ciklusos feladatunkhoz és bıvítsük ki további teendıkkel: I/b ISMÉT EGY KÜLÖNLEGES SZORZÓTÁBLA FELADAT: Most egy különleges "szorzótáblát" szeretnénk készíteni. Olyan legyen, hogy ne egyesével, hanem 0,2 lépésenként tartalmazza a szorzandó és a szorzó szorzatát! A szorzót kérdezze meg tılünk a program!

Azért tértünk vissza a feladathoz, mert ez újabb ürügyet szolgáltat a ciklusokkal kapcsolatos ismereteink bıvítéséhez. A számlálós ciklusoknál a legtöbb programnyelvben van lehetıség arra, hogy ne csak egyesével lépegessen a ciklusváltozó, hanem tetszıleges (akár negatív ) értékkel is. Most csak a szöveges algoritmust, a blokkdiagramot és az eljárás programját írjuk le. Az algoritmus szöveges leírása: Szorzótábla: Bekér: szorzó Bekér: kezdıért végért lépésköz ciklus i = kezdıért -tıl végért -ig lépésköz -önként kiír i * szorzó ciklus vége eljárás vége 66 Az algoritmus blokkdiagramja: 15.ábra: Szorzótábla számítás nem egész lépésközönként Az eljárás programja: Válasszuk azt az egyszerő megoldást, hogy a program megkérdezi tılünk a ciklusváltozó kezdı- és végértékét, valamint a lépésközt. Ezt egy lista típusú változóba azonnal be tudjuk olvasni az olvaslista utasítás

segítségével. Rövidítése: ol Ezt ugyan úgy kell használni mint az olvasszó utasítást, csak több adatot kell egymásután egy sorban beírni helyközökkel elválasztva. Ha a lefuttatás után a memóriaablakban megtekintjük az L változó tartalmát, akkor azt a háromelemő listát látjuk benne, amit a programfutás során beírtunk, csak szögletes zárójelek között, mint minden lista esetében. A blokkdiagramon kék cellával jelölt lépésközzel-léptetés a programban rejtve marad, mert csak az L listában szerepel a lépésköz értéke. Az eljárás programja: tanuld szorzótábla2 kiírbelsı [milyen szorzótábla legyen?] név "szorzó osz kiírbelsı [Add meg a kezdı és végértéket és a lépésközt] név "L olvaslista ciklus "i :L [( ki :i "* :szorzó "= :i :szorzó )] vége Most már megfogalmazhatjuk általánosságban a számlálós ciklus szerkezetét: 67 A számlálós ciklus olyan ismétlıdı algoritmus

szerkezet, ahol egy ciklusváltozó egy kezdıértéktıl kezdıdik és egy elıre megadott végértékig változik minden ismétlésnél a megadott lépésköz értékével. Eközben a ciklusmagban minden ismétlésnél egyéb utasítások is végrehajtásra kerülhetnek. A szöveges algoritmus lejegyzési módja általános formában: ciklus ciklusváltozó = kezdıérték -tıl végértlék-ig lépésköz-önként a ciklusmag utasításai ciklus vége Ha nem írunk lépésköz értéket, akkor az megegyezés szerint azt jelenti, hogy a lépésköz = 1. Az általános forma blokkdiagramja: 16.ábra: Tetszıleges lépésköző számlálós ciklus A Comenius Logo számlálós ciklusutasítás formája: ciklus ”ciklusváltozó lépésköz]~ [kezdıérték végérték [ utasítások ] Számlálós ciklusokat olyan esetekben használunk programalgoritmusokban, ahol valamilyen egész halmazon el kell végezni mőveleteket. Ellenırizd tudásod! 1. Miért nevezik „ciklusnak”

ezeket az algoritmus vezérlıszerkezeteket 2. Miért nevezik „számlálós” ciklusnak ezt a ciklusfajtát? 3. Mi a ciklusváltozó szerepe? 4. Hol fordul elı elıször a ciklusváltozó: a cikluson belül vagy azon kívül? 68 5. Mi a Comenius Logo utasítása a számlálós ciklusnak? 6. Hol szerepel a ciklusváltozó a Comenius Logo ciklusutasításában? Hol szerepel a ciklusváltozó kezdıértéke, végértéke? 7. Van-e valamilyen különbség a Comenius Logo ciklusutasításában aközött, ha 1 és ha nem 1 a ciklusváltozó lépésköze (növekménye)? 8. Lehet-e csökkenı ciklusváltozó értékekkel számlálós ciklust írni? 9. Lehet-e változó lépésközzel (pl 1, 2,4,8,16) számlálós ciklust írni Comenius Logoban? Feladatok ☺ ☺ 1. Készíts programot, amely az elsı 24 természetes szám négyzetét kiírja! 2. Készíts programot, amely az elsı 50 természetes szám négyzetgyökét kiírja! ? (A Comenius Logoban a gyök függvény adja meg egy

szám négyzetgyökét.)  3. Készíts programot, amely kiszámítja a számok négyzetgyökét 01 -tıl 10 -ig 0.1-enként! Próbálj valamilyen táblázatos formát találni a kiíratásra! 4. Készíts programot, amely az elsı 500 természetes szám reciprokát összeadja! ☺ 5. Készíts programot, amely az elsı 1000 darab páratlan számot összeadja!  6. Tudnál-e spirális csigavonalat rajzolni számlálós ciklus (és a teknıs) segítségével?  7. Tudnál-e ilyen ábrákat készíteni számlálós ciklus (és a teknıs) segítségével? Feltételes ciklus Nézzünk néhány nagyon hétköznapi példát! Amikor fızünk egy ételt, akkor elıször belekóstolunk. Úgy ítéljük meg, hogy pl még sótalan Ekkor teszünk bele egy kevés sót. Ismét megkóstoljuk Ha még mindig sótalannak 69 érezzük, akkor megismételjük az elızı tevékenységet (azaz sózunk). Ezt addig ismételgetjük, amíg eléggé ízletesnek nem találjuk. Ha forró ételt raknak elénk,

akkor is óvatosan belekóstolunk. Ha túl melegnek találjuk, akkor kevergetjük, fújogatjuk, várunk; és ismét kóstolunk. Mindaddig ismételgetjük ezt a tevékenységet, amíg úgy nem döntünk, hogy már nem fogja összeégetni a szánkat. Mindkét példa igazi feltételes ciklus, hiszen addig ismételgetünk valamilyen tevékenységet (sózást vagy a másik esetben hőtögetést), amíg el nem értünk egy célt (már jó íző, ill. már nem forró ) A számlálós ciklus mellett a feltételes ciklus a másik elterjedt algoritmikus vezérlıszerkezet. A programnyelvek többségében megtalálható az utasítása. A számlálós ciklus, (amelyet az elızı fejezetben ismertünk meg) egy elıl tesztelı ciklus volt, azaz a ciklusmag végrehajtása elıtt vizsgáltuk meg, hogy a ciklusból (az ismétlésekbıl ) ki kell-e lépni, avagy folytassuk tovább az ismételgetést. A feltételes ciklusok már lehetnének elıl vagy hátul tesztelık is. A Comenius Logo nyelvben

azonban csak elıl tesztelı feltételes ciklus van, ezért nem is foglalkozunk a hátul tesztelı feltételes ciklusok algoritmusával. A feltételes ciklus blokkdiagramja: 17. ábra: Feltételes ciklus Az ábra már ismerıs, mert tökéletesen megegyezik a ciklusok ismertetésénél bemutatott blokkdiagrammal. Láthatjuk, hogy míg a számlálós ciklus addig ismétel, amíg nem teljesül a feltétel, addig itt a feltételes ciklusnál addig ismétlünk, amíg a feltétel teljesül. A feltételes ciklusok, ahogy a nevük is mutatja , valamilyen feltételtıl függıen ismétlıdnek vagy befejezik a ciklusmag ismétlését. Amíg a feltétel teljesül, addig ismét és ismét végrehajtják a ciklusmag utasításait. Természetesen a ciklusmagban végbe kell menni valamilyen olyan változásnak, amely a feltételvizsgálatot is befolyásolja. Ha nem így lenne, akkor végtelen ciklusba bonyolódnánk A feltételes ciklusokat tehát olyan esetekben használjuk, amikor a ciklusmagban

ismétlıdıen valamilyen változtatást hajtunk végre és azt vizsgáljuk, hogy ezzel a változtatással elértük-e már a célunkat, vagy még folytatni kell a változtatást. Szöveges algoritmus-leírásoknál a következı módon jelölik: 70 ciklus amíg feltétel utasítás(ok) ciklus vége A Comenius Logo utasítása: amíg [ feltétel ][ utasítás(ok) ] Nézzünk most egy nagyon egyszerő példát! FELADAT: Adott egy számsorozat. Van-e közte negatív szám? Értelmezés: Egyszerő, egyértelmő feladat. Nem igényel további pontosítást • Bemenı adatok: A számsorozat számai egymásután egy lista formájában. • Kimenı adatok (a program eredménye): Egy „igaz” vagy „hamis”-nak megfelelı válasz attól függıen, hogy találte negatív számot a listán, avagy sem. A jobb érthetıség kedvéért „Van negatív szám” ill. „Nincs negatív szám” választ adja a program • Elıfeltétel: Különösebb elıfeltételre nincs szükség.

Legfeljebb kiköthetjük azt a magától értetıdı feltételt, hogy a számsorozat legalább egy számot tartalmazzon. • Utófeltétel: Ha van olyan eleme a számsorozatnak, amelyik kisebb 0 -nál, akkor „Van negatív szám”, különben „Nincs negatív szám”. • Algoritmus: Mielıtt nekilátnánk az algoritmus felvázolásához, el kell gondolkodnunk azon, hogy hogyan is kell a feladatot megoldani: Vesszük az elsı számot a sorozatból, megvizsgáljuk, hogy negatív-e? Ha nem, akkor továbbmegyünk, vesszük a következıt, mindaddig, amíg nem találunk egy negatív számot. Ha találtunk egyet, akkor abbahagyhatjuk a keresgélést, hiszen az volt a feladat, hogy van-e közte. Azt senki sem kérdezte, hogy hány van még. Az ismétlés, (a következı szám vizsgálata) addig tart, amíg a feltétel teljesül, azaz amíg a vizsgált szám 0 vagy pozitív. Mi történik azonban akkor, ha nem találtunk a sorozatunkban egyetlen negatív számot sem. Vesszük az utolsót,

megvizsgáljuk, hogy negatív-e, de mivel nem az, ezért vennénk a következıt, de olyan már nincsen (!). Ettıl bizony a számítógép „zavarba jön”, ami azt jelenti, hogy hibaüzenetet ad. Tennünk kell valamit! A legegyszerőbb az, hogy a folyamat kezdetén megállapítjuk, hogy a számsorozatnak hány eleme van. Ezután a végére • 71 teszünk mi magunk egy negatív számot, mondjuk -1 -et. Ettıl mindenképpen befejezi a ciklust az algoritmus (és a program). Ezután megvizsgáljuk, hogy a hányadik elemnél hagytuk abba a keresést. Ha az utolsó utáninál (amit mi tettünk bele), akkor nem volt, ha kisebb sorszámúnál, akkor volt negatív szám a sorozatban. (Erre a trükkre a számítógép miatt van szükségünk) Adatlisták kezelésére szolgáló Comenius Logo utasítások Már szó volt az elızı fejezetben is az adatlista jellegő adatokról, ahol egymás után egy sorozatban szerepelnek az adatok. Az egyedi adatokat a listán a sorszámukkal lehet

azonosítani. Adatlista beolvasása: olvaslista rövidítve: ol például: név ”x olvaslista Az adatlistán szereplı adatok számának meghatározása: elemszám az adatlistát tároló változó kiír elemszám :x például: A valahányadik sorszámú eleme az adatlistának: elem sorszám változó például: kiír elem 3 :x az x változóban tárolt adatlista harmadik adatát írja ki. Adat elhelyezése az adatsor végére: utolsónak adat listaváltozó például: név ”x utolsónak -1 :x Adat elhelyezése az adatsor elejére: elsınek adat listaváltozó név ”x elsınek 100 :x például: A feladat algoritmusa: Szöveges leírás: Van negatív? bekér: x (számsorozat) n = x elemeinek a száma xn+1 = -1 i=1 ciklus amíg xi ≥ 0 i=i+1 ciklus vége ha i > n akkor kiír : „NINCS NEGATÍV SZÁM” különben kiír : „VAN NEGATÍV SZÁM” eljárás vége 72 Az eljárás blokkdiagramja: 18. ábra: A negatív szám jelenlétét eldöntı program blokkdiagramja Az

eljárás programja: tanuld Van negatív? kiírbelsı [Add meg a számsorozatot] név "x olvaslista név "n elemszám :x név "x utolsónak -1 :x név "i 1 amíg [elem :i :x >= 0][név "i :i + 1] ha :i > :n [( ki "Nincs "negatív "szám )] ~ [( ki "Van "negatív "szám )] vége A blokkdiagramon és a program szövegében is piros színnel jeleztük a ciklust magát. Zölddel a ciklusmagot Figyeljük meg, hogy a feltételes ciklusnak nincs saját ciklusváltozója. Ciklusváltozó ugyan ebben a feladatban van (i), de ez nem tartozik szervesen a ciklushoz. Éppen ezért a ciklusváltozó 73 kezdıérték-adása és léptetése sem szerves része a ciklusnak. Az i változó növelése (azaz a sorszám léptetése ) egyszerően maga a ciklus magja. Számlálós ciklusokat olyan esetben használunk, ha egy adatsorozatot teljes egészében fel kell dolgozni. Ezzel szemben feltételes ciklusok akkor használatosak, ha az

adatsorozat feldolgozása egy feltétel teljesülése mellett szükséges csak, azaz nem kell az egész adatsort végigfutni a feladat megoldásához. A feltételes ciklus addig ismétli a ciklus magját, amíg a feltétel teljesül. Ha már nem, akkor kilép az ismételgetésbıl Nincs külön ciklusváltozója. Szöveges algoritmus lejegyzésnél ciklus amíg feltétel ciklusmag utasításai ciklus vége formában írjuk le. Comenius Logo utasítása: amíg [ feltétel ][ a ciklusmag utasításai ] Ellenırizd tudásod! 1. Miért nevezzük „feltételes” ciklusnak ezt a ciklus változatot? 2. Mi a különbség a feltételes és a számlálós ciklus között? 3. Van-e ciklusváltozója a feltételes ciklusnak? 4. A rántottasütési algoritmusban van-e ciklus? Ha van, akkor milyen? 5. Lehetséges-e „végtelen” ciklust írni feltételes ciklussal? 6. A feltételes ciklus a feltétel teljesülése vagy nem-teljesülése esetén ismétel? És a számlálós ciklus? 7. Melyik

ciklusfajta az általánosabb, azaz ha csak egyféle ciklust lehetne íri egy programnyelvben, akkor melyik (a számlálós vagy a feltételes) lenne a szükséges. Hogyan lehet vele megvalósítani a másikat? 8. Miért kellett a mintafeladatban egy képzetes utolsó utáni elemet felvenni a számsorozatunk végére? Milyen tulajdonságúnak kellett lennie ennek az utolsó utáni elemnek? 9. Mi a tulajdonsága a lista típusú adatnak? Miben különbözik az egyedi adattól? 10. Lehet-e egyetlen változóban egy egész adatlistát tárolni? 11. Hogyan férhetünk hozzá egy adatlistának a k eleméhez? 74 Feladatok ☺ 1. Készíts programot, amely egy számsorozatról megmondja, hogy van-e a számok között 11-gyel osztható szám!  2. A π kiszámítására van egy közismert formula A képlet helyett csak az elsı néhány tagját adjuk meg a kifejezésnek: π ≈ 4(1-1/3+1/5-1/7+1/9-1/11+.) Írj programot, ahol a π kiszámítását addig folytassa, amíg két

kiszámított érték különbsége 0.00000001 !  3. Készíts programot, ahol a teknıs (felemelt tollal) addig megy, amíg egy fehértıl eltérı színő pontot nem talál! (A rajzlap háttere fehér.) A pontszín függvény adja meg a teknıs hasa alatt levı pont színkódját. 4. A megijedt teknıs Készíts programot, ahol a teknıs az alábbi „sárga ajtajú” négyzetben véletlen helyen, véletlenszerő iránnyal indul. Ha falnak ütközik, akkor „megijed”, véletlenszerő irányba fordul és tovább próbálkozik. Csak akkor álljon meg, ha megtalálta a sárga ajtót. (Természetesen felemelt tollal futkározik a szobában)  5. Használjuk körzınek a teknıst! Készíts programot, ahol felemelt tollal a teknıs egy köríven addig halad, amíg egy rajzlaptól eltérı színő pontot nem talál. 75 Algoritmusok hatékonysága Mikor jó egy algoritmus? Ha helyesen mőködik és a kívánt eredményt adja? –Igen. Biztos, hogy ebben az esetben jó az

algoritmus? –Nem. Hosszú fejtegetések helyett járjuk körül a problémát egy példa segítségével! FELADAT: Döntsük el egy tetszıleges, kettınél nagyobb természetes számról, hogy prímszám-e? • • • • • • 76 Értelmezés: A feladat egyértelmő. Mégis sokféle megoldással próbálkozhatunk Egy szám akkor prím, ha önmagán és 1-en kívül nincsen természetes osztója. Bemenı adatok: A természetes szám (x). (0 -t nem soroljuk a természetes számok közé) Kimenı adatok: Egy igen vagy nem válasz. Elıfeltétel: A bemenı adat természetes szám és kettınél nagyobb legyen. (Azért adtuk meg így, hogy egyszerőbb legyen az algoritmus és ne kelljen megvizsgálni, hogy a számunk nem kettı-e?) Utófeltétel: „Igaz” válasz esetén ne legyen természetes osztója, „hamis” válasz esetén legyen olyan (önmagától és 1-tıl különbözı) szám, amellyel elosztva a maradék 0 legyen. Algoritmus: Megismerkedtünk a szöveges

algoritmus lejegyzési móddal is. Tekintsünk most el a blokkdiagramos leírástól és csak szövegesen nézzünk meg néhány lehetséges elképzelést az algoritmus kivitelezésére. A hozzájuk tartozó programeljárás viszont mindig megírjuk, hogy ki lehessen próbálni. Ez a fejezet a kísérletezés jegyében alakul Felvázolunk néhány lehetséges eljárást és megpróbáljuk eldönteni, hogy melyik a legszerencsésebb: I. változat: Elkezdünk próbálkozni és 2-tıl a (szám-1)-ig próbálunk osztókat keresni. bevezetünk egy változót, amely vagy az „igaz” vagy a „hamis” szót tartalmazza. Kezdetben a tartama „igaz” mindaddig, amíg nem találunk egy osztót. Ha találunk akkor „hamis”-ra váltjuk és megyünk tovább: Prím1: bekér :x prím = „igaz” ciklus i = 2-tıl (x - 1)-ig ha maradék( x / i ) = 0 , akkor ciklus vége kiír: prím eljárás vége prím = „hamis” Úgy határozzuk meg, hogy osztható-e egy számmal (i-vel), hogy

megnézzük: 0-e a maradék? Ha egyszer „hamis”-ra állítottuk a prím nevő változó értékét, akkor az már úgy is marad. Ha ismét „hamis”-ra állítjuk, az nem változtat rajta. Az eljárás programja: tanuld prím1 kiírbelsı [Add meg a számot] név "x osz név "prím "igaz név "L lista 2 ( :x - 1 ) ciklus "i :L [ha ( maradék :x :i ) = 0 [név "prím "hamis]] ki :prím vége Próbáljuk ki néhány prím és nem-prím számra! Mőködik, tehát jó. Próbáljuk mos ki néhány nagy természetes számra is, pl. 110001 -rıl döntsük el, hogy prím-e. Mi ránézésre látjuk, hogy nem az, (mert a számjegyek összege osztható 3-mal, így a szám is). A program is meg fogja ezt állapítani, de abban a meglepetésben lesz részünk, hogy hosszú másodpercekig kell várnunk rá, hogy a gép kiírja az eredményt. A programunk nagyon lassú! Szükséges ennyit várakozni a végeredményre? Keressünk valami gyorsabb megoldást!

II. változat: Ha belegondolunk, akkor gyorsan rá fogunk jönni, hogy a munka felét megtakaríthatjuk, hiszen páros számok között nem kell keresnünk a prímet. Ha az x páratlan, akkor biztosan nincs páros osztója sem, ezért elegendı csak a páratlan számokkal próbálkozni: 77 Prím2: bekér :x ha maradék( x / 2 ) = 0 akkor prím = „hamis” különben prím = „igaz” ciklus i = 3-tól (x - 1)-ig 2-esével ha maradék( x / i ) = 0 , akkor ciklus vége elágazás vége kiír: prím eljárás vége prím = „hamis” Mivel csak minden második természetes számra kell megvizsgálnunk, hogy osztója-e x-nek, ezért fele annyi lépést kell a gépnek végrehajtani. A program: tanuld prím2 kiírbelsı [Add meg a számot] név "x osz ha ( maradék :x 2 ) = 0 [név "prím "hamis]~ [név "prím "igaz ~ név "L utolsónak 2 lista 3 (:x - 1)~ ciklus "i :L ~ [ha ( maradék :x :i ) = 0~ [név "prím "hamis]]] ki :prím vége

Ez már valamivel gyorsabb, de elvárnánk tıle, hogy az ilyen egyszerő feladatot kicsit serényebben hajtsa végre. A ciklusban rögtön az elsı esetben megtalálja a 3-at, mint osztót. Ezután már teljesen feleslegesen próbál újabb osztókat (is) keresni, hiszen, ha van osztója, akkor nem prím. Nincs mit vitatkozni! Ha idáig nem lett volna eléggé rossz elıérzetünk, hogy talán mégsem a helyes úton indultunk el, akkor most itt az ideje. Jusson eszünkbe a feltételes ciklus! Csak addig kell az osztót keresgélni, azaz ismételten osztási maradékot vizsgálni, amíg meg nem találunk egy osztót. Ezzel annak a megállapítása, hogy nem prím lényegesen lerövidülhet. III. változat: Alkalmazzunk feltételes ciklust a II. változat ötletére A ciklusban maradás feltétele, hogy az osztási maradék nagyobb 0-nál. 78 prím3: bekér :x ha maradék( x / 2 ) = 0 akkor kiír: „hamis” különben i=3 ciklus amíg (maradék( x / i ) > 0 ) ÉS ( i < x )

i=i+2 ciklus vége ha i ≥ x akkor kiír: „igaz” különben kiír: „hamis” eljárás vége Ha találtunk egy osztót vagy túlszaladtunk az osztóval x-en, akkor hagyjuk abba az ismétlést. Ha azért hagytuk abba, mert túlszaladtunk, akkor nem találtunk osztót, tehát prím, különben pedig nem az. A programja: tanuld prím3 kiírbelsı [Add meg a számot] név "x osz ha ( maradék :x 2 ) = 0 ~ [ki "hamis] ~ [név "i 3 ~ amíg [és ( ( maradék :x :i ) > 0 ) ( :i < :x )]~ [név "i :i + 2]] ha :i >= :x [ki "igaz][ki "hamis] vége Ha ezzel próbáljuk az 110001 -rıl megállapítani, hogy prím-e, akkor azon nyomban megkapjuk a (nemleges) eredményt. Nem volt hiábavaló a fáradságunk. Ez is egy kiváló példa a feltételes ciklusok hasznosságára ill nélkülözhetetlenségére. Próbáljuk most ki 110017 -re! Ez bizony prím, de ismét nagyon lassan kapjuk meg az eredményt. A programnak 55008-szor kell megpróbálnia elosztani

egy számmal a beadott számunkat, amíg megkapjuk, hogy nincsen osztó. Nem lehetne valamit még itt is gyorsítani? IV. változat: Gondolkozzunk tovább! Mi lehet egy szám legnagyobb osztója saját magán kívül? Hamar rájövünk, hogy a szám felénél biztosan nincs nagyobb osztó. Ekkor máris megtakarítottuk a próbálkozások felét Még a feléig sem kell elmenni. Nekünk csak a legkisebb osztót kell megtalálni Bizonyítható, hogy egy számnak a legnagyobb osztója a szám négyzetgyöke. (Matematika iránt érdeklıdık! Próbáljuk meg bebizonyítani!) Most a bizonyítástól eltekintünk. A III változatot dolgozzuk át ebben a szellemben A gyökvonást ne a feltételes ciklus feltételébe helyezzük, mert akkor a program minden ismétléskor gyököt von, ami szintén idıigényes. Számoljuk inkább ki egy változóban az x négyzetgyökét és ez szerepeljen a feltételben: 79 prím4: bekér :x ha maradék( x / 2 ) = 0 akkor kiír: „hamis” különben i=3

fh = x ciklus amíg (maradék( x / i ) > 0 ) ÉS ( i ≤ fh ) i=i+2 ciklus vége ha i > fh akkor kiír: „igaz” különben kiír: „hamis” eljárás vége Az eljárás programja: tanuld prím4 kiírbelsı [Add meg a számot] név "x osz ha ( maradék :x 2 ) = 0 ~ [ki "hamis] ~ [név "i 3 ~ név "fh gyök :x~ amíg [és ( ( maradék :x :i ) > 0 ) ( :i <= :fh )]~ [név "i :i + 2]] ha :i > :fh [ki "igaz][ki "hamis] vége Próbáljuk ki most ezzel a változattal az elıbbi számot (110017). Az eredményt igen hamar megkapjuk. Ez az igazi változat! Kísérletezzünk tovább: A Comenius Logoban a kiír idı utasítás kiírja a számítógép belsı órájának az állását. Ha mindegyik változatban elhelyezzük ezt az utasítást a név "x osz utáni és a vége elıtti sorba, akkor mérni tudjuk, hogy mennyi idıt vett igénybe a program futása. Mérjük meg az egyes változatok idıigényét ugyan azokra a bemenı

adatokra. Az elsı három változat jó algoritmus volt? Igen, mert helyes eredményt adott. Az elsı három változat jó algoritmus volt? Nem, mert alig gyıztük kivárni az eredményt. Lassan mőködött, pedig számítógéppel hajtattuk végre a teendıket. 80 Mikor jó egy algoritmus? Most már megpróbálhatunk válaszolni a kérdésre. A fenti ellentmondást azzal oldhatjuk fel, ha megfogalmazzuk az algoritmusokkal szembeni követelményeinket. • adjon helyes eredményt • legyen hatékony, azaz a lehetı leggyorsabban vezessen a helyes eredményre • ne foglaljon a feltétlenül szükségesnél több helyet a memóriából • legyen áttekinthetı. A késıbbiekben is meg lehessen érteni, hogy mit miért csináltunk benne. A fenti szempontok bizony néha egymás ellen dolgoznak. Törekedünk rá, hogy a lehetı legjobban eleget tegyünk mindegyiknek. Egy feladatnak sok jó megoldási változata lehet. Ellenırizd tudásod! 1. Milyen elvárásoknak feleljen meg egy

„jó” program? 2. Mit gondolsz, kerülhet-e ellentmondásba egymással a fenti elvárások közül néhány? 3. Mikor komoly követelmény a gyorsaság és mikor a kis helyfoglalás? 4. Miért kell egy programnak jól áttekinthetınek lenni Miért nem elég a helyes, megfelelıen gyors mőködés? Feladat  A fenti prímszám eldöntı programot tovább szeretnénk vinni. Írjunk olyan programot, amely 10000 -ig kiírja az összes prímszámot. Milyen ötleted lenne, hogy gyorsabbá tedd a program mőködését? 81 Az algoritmusvezérlı-szerkezetekrıl Megismerkedtünk az elızı fejezetekben néhány alapvetı algoritmikus szerkezettel. Tekintsük át még egyszer: utasítássorozatok, elágazások, ciklusok voltak ezek a jellegzetes algoritmus formációk. Ez a három szerkezet fontosabb, mint ahogy azt elsı megközelítésre gondolnánk. Ezzel a három szerkezettel minden egyetlen folyamatból álló algoritmus leírható. Használhatnánk esetleg más szerkezeteket is

az algoritmusok megvalósítására, de ez a három éppen elegendı. Bizonyítható, hogy ez így van, de a bizonyítás alaposabb matematikai ismereteket igényelne, ezért eltekintünk tıle. A strukturált programozás elve éppen abból indul ki, hogy elegendı ez a három szerkezet minden tetszıleges folyamat leírására. Ezeknek a szerkezeteknek a megvalósításához a legtöbb programnyelv rendelkezik megfelelı utasításokkal, mint ahogy azt tapasztaltuk a Comenius Logo esetében is. Ez biztatóan hangzik, hiszen ez azt is jelenti, hogy viszonylag kevés program utasítás segítségével igen sok mindent képesek lehetünk megoldani. Természetesen, mielıtt azt hinnénk, hogy már mindent megismertünk a programozásról, el kell árulni, hogy közel sincs így. Nagyon sok olyan teendıt ad egy számítógép, ami a gép egy adott szolgáltatását kell, hogy kihasználja. Ezek igencsak megszaporítják a megtanulandó utasításokat Az a tény azonban igaz marad, hogy a

fenti vezérlıszerkezetek elegendık minden algoritmikus folyamat leírására. Említettük, hogy más szerkezetekkel is meg lehetne esetleg valósítani a megtervezni kívánt folyamatot. Ezeknek az lenne a hátránya, hogy sokkal kevésbé lenne áttekinthetı egy program. Azzal, hogy ebbıl a három szerkezetbıl építkezünk, a programjaink is áttekinthetıbbé válnak. Azt pedig megállapítottuk, hogy egy program jóságát az is meghatározza, hogy mennyire áttekinthetı, mennyire érthetı. A régebbi idık programtervezése nem mondta ki ezt az elvet. Sok igen szellemes program született, amelyeknek az volt a bajuk, hogy szinte követhetetlenek voltak. Ha hiba adódott bennük, (mert hiba bármelyik programban meglapulhat,) emberfeletti munkát követelt a hiba helyének vagy okának felderítése és a kijavítása. A strukturált programozás éppen az egyszerő szerkezetekbıl megvalósított építkezéssel azt a célt tőzte maga elé, hogy áttekinthetıbb,

világosabb programok keletkezzenek. 82 Fokozható az áttekinthetıség, ha egy bonyolultabb, összetettebb feladatot szétbontunk részfeladatokra. Ezek már sokkal rövidebb, átláthatóbb algoritmusok. Kisebb az esély, hogy hibát követünk el bennük A kipróbálásuk is egyszerőbben valósítható meg. Ezek a szétbontott kis részfeladatok egy-egy programegységet képezhetnek. Ezeket nevezzük eljárásoknak. A nagyobb programok ilyen eljárások összeépítésével valósulnak meg. Itt is szempont, hogy érdemes beszédes eljárásneveket választani. Ha az eljárások nevébıl elég jól kiderül, hogy mit csinálnak, akkor igen „jól olvasható” programokat írhatunk. Ellenırizd tudásod! 1. Milyen algoritmikus szerkezetekbıl építhetı fel egy program? 2. Miért ragaszkodunk hozzá, hogy mindössze háromféle vezérlıszerkezetbıl épüljenek föl a programjaink? 3. Milyen elvnek hívják a meghatározott vezérlıszerkezetekbıl és eljárásokból

történı építkezést? 4. Milyen gondot okozhat, ha nem tartjuk magunkat az ebben a fejezetben megfogalmazott elvekhez? 83 Eljárások és függvények Egy-egy valódi feladat bizony elég összetett és bonyolult algoritmushoz vezethet. Eleinte a kezdı szinte reménytelennek látja a helyzetet, és úgy érzi, hogy soha sem fog megbirkózni vele. A gond abból adódik, hogy nehezen áttekinthetı a feladattal járó teendık egésze. Itt is van megoldás! A bonyolult és áttekinthetetlen feladatot kisebb részfeladatokra kell bontani, és ezekbıl kell felépíteni a végleges algoritmust. Az egyes részfeladatok algoritmusa már sokkal egyszerőbb. Külön-külön kipróbálhatóak Ha pedig mőködnek, akkor már csak azzal kell foglalkoznunk, hogy helyesen építsük össze ezeket a kipróbált programrészeket. Ezek a magukban is mőködıképes programegységek az eljárások. Ezt a módszert nevezik a program felülrıl lefelé történı megtervezésének. Ilyenkor a

feladat egészébıl indulunk ki, és azt bontjuk egyre kisebb részfeladatokra. A kis részfeladatokra eljárások készülnek, és ezek épülnek aztán össze egy teljes feladatot megoldó programmá. Létezik egy másik megközelítési mód, amikor kész eljárásokból építjük fel a feladat megoldását. A kis részfeladatokat megoldó eljárások már készen vannak, csak a helyes összeépítéssel kell foglalkozni. Ezt nevezik alulról fölfelé építkezésnek. Akik szereztek már némi gyakorlatot a teknıc-Logo területén, azok számára már nem egészen ismeretlen ez a módszer, hiszen ott is elıre elkészített téglalap-, háromszögrajzoló eljárásokból tudott házat, robot-figurát, stb. összeállítani Mi most a másik utat követjük, a felülrıl lefelé történı programtervezést. Bonyolultabb feladatoknál, ahol még a részfeladatok megoldása sincsen kidolgozva ez az út a célszerő. Az eddigiekben is eljárásokat írtunk. Egyes programnyelveknél

van fıprogram és vannak eljárások, amelyeket ez a fıprogram használ. A Comenius Logo nem emel ki fıprogramot. Az eljárások teljesen egyenrangúak. Bármelyik eljárás használhatja a többi eljárást A megírásuk, elhelyezésük sorrendjére sincsen semmilyen kikötés. Nem teljesen igaz, hogy a Comenius Logoban nincsen fıprogram. Egy fıprogramszerő megoldás azért létezik ebben a nyelvben is. Ha egy eljárás azt a nevet kapja, hogy indító akkor a fájlt betöltésekor automatikusan ez indul el. Ilyen módon a fıprogram szerepét látja el. Nem kötelezı azonban ilyen önindító eljárást használni Az eljárások mindig a tanuld szóval kezdıdnek és a vége lezárásig tartanak. Egy eljárás a nevével hívhat meg egy másikat Ahol egy eljárásban egy másik eljárás neve szerepel, ott a program futásakor azt az eljárást hajtja végre, majd folytatja a következı utasítással. 84 Paraméterek Az eljárások kaphatnak olyan bemenı adatokat,

amelyeket nem adatbeviteli utasítással adunk át az eljárásnak az eljárás futása közben, nem is egy korábban értéket kapott változón keresztül, hanem az eljárás meghívásakor (lefuttatásának indításakor) paraméteren keresztül. A paraméter arra szolgál, hogy adatot adjon át az eljárásnak. Nem változó A paraméternek is van neve éppen úgy, mint egy változónak, de csak ezt az átadott értéket képviseli. Értéke nem változhat meg az eljárás során Az eljárás lefutása után nem marad meg. Nem tekinthetjük meg az értékét külön ablakban, mint a változóét. Hasonlítsuk össze a változót a paraméterrel: Változó Paraméter – névvel rendelkezı adat – névvel rendelkezı adat – értéke az eljárás során – értéke az eljárás folyamán nem megváltozhat változhat meg – megmarad az eljárás végrehajtása– az eljárás végrehajtása után után is megszőnik. – értéke külön ablakban – értéke nem tekinthetı meg

megtekinthetı külön ablakban A paraméterek neveit az eljárás neve után kell felsorolni. Éppen úgy kettıspontot kell tenni eléje, mint a változónevek elé. Amikor meghívjuk az eljárást, akkor a paraméterek helyére (olyan sorrendben, ahogy fel voltak sorolva) az átadni kívánt értékeket kell megadni. Legyen egy egyszerő példánk egy eljárás, ami egy kivonást végez el. A paraméterei a kisebbítendı és a kivonandó: tanuld különbsége :kisebbítendı :kivonandó kiír :kisebbítendı - :kivonandó vége Amikor meghívjuk az eljárást, akkor a kisebbítendı és a kivonandó helyére már a számokat írjuk be, pl.: különbsége 100 30 Ez pedig kiírja a végeredményt: 70 . Függvények Meg kell még ismerkednünk egy új fogalommal: a függvényével. Matematikában már biztosan mindenki találkozott vele. Ott úgy ismertük meg a függvényeket, hogy van egy (vagy több ) paramétere (ezt szokás független változónak is nevezni) és ezektıl a

paraméterektıl függıen a 85 függvénynek van egy függvényértéke. Éppen azért nevezik függvénynek, mert az értéke csak a paramétereinek az értékétıl függ. A számítástechnikában is valami hasonlót jelent. A programozás területén a függvény is egy eljárás. Éppen olyan eljárás, mint a többi, mindössze annyiban különbözik a többitıl, hogy a lefuttatáskor a függvényként megírt eljárás neve egy értéket kap a bemenı paraméterektıl függıen. Szerepelhet például értékadó utasításban is. Attól válik egy eljárásból függvény, hogy a végén szerepel benne egy eredmény szó, és amit ez után írunk, az lesz a függvény végeredménye (ami olyan, mint a függvényérték). Az eredmény elıállítása után a program kilép az eljárásból. Ha lennének még utána sorok, azokat nem hajtaná végre. Nézzük meg az elıbbi kivonási példát függvénnyé alakítva: tanuld különbsége :kisebbítendı :kivonandó eredmény

:kisebbítendı - :kivonandó vége Most különbsége a függvényünk neve. Ha a programban például a következı sorok szerepelnek valahol: . . név ”y különbsége 100 30 kiír :y . . akkor itt egy értékadással a kiszámított különbség értékét az y változónak is átadjuk, majd az y értékét kiíratjuk. Ha a következı formában írnánk a függvényünket, akkor is pontosan csak ennyit csinálna: tanuld különbsége :kisebbítendı :kivonandó eredmény :kisebbítendı - :kivonandó (kiír ”Jó ”munkát!) vége azaz nem írná ki a jókívánságot, hiszen az már az eredmény elıállítása után szerepel. További különbség a matematikai és a programnyelvek függvényei között, hogy míg a matematikai függvények értéke egyetlen szám, addig a programok függvényeljárásainak az eredménye lehet valamilyen összetett adat, a Comenius Logoban egy számsorozat, szósorozat azaz „lista” is. 86 Feladat részekre bontása. Építkezés

eljárásokból Itt az ideje, hogy az eljárásokról tanultakat egy példán ki is próbáljuk. Talán többen is ismerik a szópóker játékot. Erre kellene egy programot írni FELADAT: Írj programot a szópóker játékra! A játék lényege: Az egyik játékos (esetünkben a gép) gondol egy ötbetős szót. A másik játékos mond ötbetős szavakat, a kigondoló pedig csak annyit mond meg, hogy az adott helyen hány bető talált, (de azt nem mondja meg, hogy melyik helyen). Cél: minél kevesebb próbálkozásból kitalálni a feladott szót A program 30 próbálkozást engedjen. Aki 5 tippbıl kitalálja, az „profi”, aki 10-bıl, az „ügyes”, aki 20-ból, az „végre kitalálta”, aki 20-nál többıl, az „lassan, de kitalálta”. • • • • • Értelmezés: mivel a számítógép nem képes „kigondolni” egy feladvány szót, ezért egy elızetesen betáplált szósorozatból véletlenszerően válasszon a program egy feladványt. A szósorozat

tetszıleges számú szót tartalmazzon, a program módosítás nélkül képes legyen kezelni az olyan estben is a szósorozatot, ha új szavakkal bıvítjük a választékot. Bemenı adatok: A program tartalmazza a lehetséges feladvány-szavak listáját, ebbıl választ véletlenszerően. Ezt a bemenetet maga a program kezeli További bemenı adatok a tipp szavak. Ezeket a program kezelıjétıl (a játékostól) várja. Kimenı adatok: A megfelelı helyeken eltalált (egyezı) betők száma: találat. Elıfeltétel: Csak ötbetős magyar szavak lehetnek a feladványok, mégpedig fınevek, azon belül pedig csak köznevek. Utófeltétel: Azok a betők számítanak találatnak, ahol az azonos sorszámú bető a tippben és a feladványban megegyezik. A játékos akkor nyer (a géppel szemben), ha a teljes szavat eltalálja, azaz tipp = feladvány. Ebbıl következik, hogy találat = 5. 87 Algoritmus: Próbáljuk meg elıször kisebb részekre bontani a feladatot. Biztosan kell

egy véletlenszerő feladványválasztás. Ezután ismételten szükség lesz egy állandó képernyı-pozíción kérni egy tippet. Össze kell számlálni a találatokat, és egy állandó képernyı-pozícióban kiírni a találatok számát. Meg kell vizsgálni, hogy eltalálta-e a játékos a szót, ha nem, akkor ismételni a tipp kérést, találat kiírást. Ezzel együtt azt is vizsgálni kell, hogy a játékosnak vane még „élete”, azaz adhat-e még újabb tippet, vagy már kimerítette a harminc lehetıséget. Ha eltalálta, akkor attól függıen, hogy hányadik próbálkozásra, a program minısítse a játékost. Látjuk, hogy itt szinte egyetlen olyan teendı sincs, amit ezek közül egyetlen utasítással el lehetne intézni. Ha van is, akkor is áttekinthetıbb, ha valamilyen „árulkodó” nevet adunk a teendınek Legyenek a következı eljárásaink: Választ a feladvány szó véletlenszerő kiválasztására, Újtipp a tippünk bekérésére egy állandó

képernyıpozícióban, a találatok összeszámlálására, a találatok kiírására egy állandó Találat számláló Eredménytír képernyıhelyen, Értékelés :hányadikra egy függvény a játékos minısítésére. Írjuk föl a játék algoritmusát a fenti eljárások segítségével: Szópóker: Választ próba = 0 találat = 0 ciklus amíg (találat < 5) ÉS (próba <= 30) próba = próba + 1 újtipp találat számláló eredménytír ciklus vége értékelés ( próba ) eljárás vége Az értékelés nevő függvénynél zárójelben adtuk meg a bemenı paramétert. Szöveges algoritmus-leírásnál a továbbiakban is így fogjuk jelölni a függvényeket. Meg kell most tervezni az egyes eljárásokat is. Vegyük sorra ezeket az elıfordulásuk sorrendjében: 88 Választ: n = a szavak darabszáma i = (véletlen egész szám 0 és n -1 között ) + 1 feladvány = szavak i eljárás vége Ez Comenius Logoban az i és n változó használata nélkül is

felírható majd. A jelenlegi felírásban a szavak i azt jelenti, hogy a szavak nevő szósorozat i-edik eleme. Újtipp: képernyıhely beállítás író és háttérszín beállítás kiír: „. ” (azonos) képernyıhely beállítás bekér tipp eljárás vége Találat számláló: találat = 0 ciklus i = 1-tıl 5 -ig ha tippi = feladványi , akkor találat = találat + 1 ciklus vége eljárás vége Itt a tippi és a feladványi azt jelenti, hogy a tipp szó i-edik ill. a feladvány szó i-edik betője. Eredménytír: képernyıhely beállítás író és háttérszín beállítás kiír: találat eljárás vége Függvény értékelés ( hányadikra ) ha hányadikra < 6, akkor értékelés = „Profi vagy! Gratulálok!” ha hányadikra < 11, akkor értékelés = „Ügyes vagy! Gratulálok!” ha hányadikra < 20, akkor értékelés = „Végre kitaláltad!” ha hányadikra ≤ 30, akkor értékelés = „Lassan, de kitaláltad!” ha hányadikra > 30, akkor

értékelés = „A játszma véget ért! Nem sikerült kitalálni” függvény vége 89 19. ábra: A szópóker program egészének folyamatábrája Az eljárások olyan egyszerőek, hogy egyedül a találat számlálót és az értékelés függvényt érdemes blokkdiagramon ábrázolni. 20. ábra: A találatszámláló eljárás blokkdiagramja 90 Egyszerő számlálós ciklusba beágyazott elágazás. Ha megegyeznek az adott sorszámú betők, akkor növeli eggyel a számláló (találat) értékét, ha nem, akkor továbblép a következı betőre. Az értékelés függvény blokkdiagramjából kitőnik, hogy egy sor elágazás van egymásután felfőzve. Ha teljesül a feltétel, akkor értéket kap a függvény és egyenesen a „Vége” cellához lép, azaz kilép a függvényeljárásból az elıállított értékkel (értékelés) .Az értékelés függvényeljárás blokkdiagramja: 21. ábra: Az értékelés függvény blokkdiagramja A fenti eljárások

algoritmusaiból látható, hogy külön-külön elég egyszerőek. Ha az egész programot egyetlen eljárásban írnánk meg, akkor azért nehezen tudnánk áttekinteni. Nem lenne elsı ránézésre világos, hogy melyik rész felelıs a találatok összeszámlálásáért, melyik a tippek bekéréséért, stb. Ha azonban kis eljárásokra bontjuk, mint ahogyan most eljártunk, akkor ezek a rövid eljárások könnyen kipróbálhatók. Külön-külön ki lehet próbálni az egyes eljárásokat. Meggyızıdhetünk róla, hogy jó helyre írja-e a tipp-bekérést, a találatok számát. Jól számolja-e össze a találatokat? Ha az eljárásaink helyesek, azt teszik, amit elvárunk tılük, akkor már csak arra kell ügyelni, hogy helyesen is építsük össze ezeket. 91 Az eljárások és a „fıprogram” algoritmusa után következzenek a Comenius Logo programjaik: tanuld szópóker törölírólap íróablak választ név "találat 0 név "próba 0 amíg [és (

:találat < 5 ) ( :próba <= 30 )] ~ [név "próba :próba + 1 ~ újtipp ~ találat számláló ~ eredménytír] kurzorhely! [5 20] írószín! 124 ki értékelés :próba vége Az eljárások programjai: tanuld választ név "feladvány ~ elem ( 1 + véletlenszám ( elemszám :szavak ) ) :szavak vége Elızetesen be kell vinnünk egy feladvány szavakból álló sorozatot a szavak változóba. Ezt úgy is tehetjük, hogy a Memóriaablak /Elemek / Új változó ablakát Szavak néven megnyitjuk, és helyközökkel elválasztva felsoroljuk a szavakat. tanuld újtipp írószín! 240 kurzorhely! [30 14] ( ki "Írj "egy "ötbetős "szót: ) írószín! 225 kurzorhely! [37 15] ki ( ". ) kurzorhely! [35 15] név "tipp osz írószín! 240 vége tanuld találat számláló név "találat 0 ciklus "i [1 5][ha (elem :i :tipp) = (elem :i :feladvány) ~ [név "találat :találat + 1]] vége 92 tanuld eredménytír írószín! 240

tí kurzorhely! [35 10] írószín! 188 ( kiír :találat "találat ) írószín! 240 vége Az értékelés eljárásfüggvény programja: tanuld értékelés :hányadikra ha :hányadikra < 5 [eredmény "Profi vagy! Gratulálok!] ha :hányadikra < 10 [eredmény "Ügyes! Gratulálok!] ha :hányadikra < 20 [eredmény "Végre kitaláltad!] ha :hányadikra <= 30 ~ [eredmény "Lassan, de kitaláltad!] ~ [eredmény "A játszma véget ért! ~ Nem sikerült kitalálni!] vége Itt az utolsó eljárásfüggvényünknél egy további lehetıséggel is meg kell ismerkednünk. A Comenius Logo nyelvben a backslash jel ( ) összefőzésre való. Ha több szóból álló mondatot szeretnénk egyetlen „szóként” összefőzni, akkor a szavak után jelet kell tennünk, majd utána a szóközt. Ez azt eredményezi, hogy a szóhoz hozzákapcsolja a szóközt és folytatja a következı szóval. Ezért látjuk az eredmény szövegben minden mondatközi szó

után a jelet. A függvényérték kiíratásakor láthatjuk, hogy maguk a jelek nem jelennek meg a kiírt szövegben. Programjainkat célszerő felülrıl lefelé megtervezni. Ez azt jelenti, hogy kisebb részfeladatokra bontjuk a feladat egészét. A részfeladatokból állítjuk össze a program egészének az algoritmusát. A részfeladatokat tovább finomítjuk (esetleg további részfeladatokra bontjuk). Ezeket a részfeladatokat írjuk meg egyegy program-eljárásban Az eljárások külön-külön kipróbálhatók, ellenırizhetık. A program már kipróbált, jól mőködı eljárásokból épül fel. A függvények is eljárások, csak a nevük a lefuttatás során egy értéket kap. Ez úgy valósítható meg, hogy az eljárásban szerepel az eredmény szó és utána az érték vagy kifejezés, amit a függvény eredményül kap. Az eljárások paramétereken keresztül adatokat kaphatnak. A paraméter olyan bemenı adata egy eljárásnak vagy függvénynek, amelynek

értéke az eljáráson (függvényen) belül nem változhat meg. 93 Ellenırizd tudásod! 1. Milyen elınyökkel jár a program eljárásokból való felépítése? 2. Hasonlítsd össze a változót és az eljárás paraméterét! 3. Mi a különbség az eljárás és a függvény között a programozás területén? 4. Hogyan illik a strukturált programozás elvei közé a program eljárásokból, függvényekbıl építkezı stratégiája? 5. Milyen elınyöket jelent az eljárások, függvények használata a hibakeresésnél? Feladatok ☺ 1. Egészítsd ki a fenti szópóker programot úgy, hogy ha nem ötbetős tippet ad meg a játékos, akkor írja ki a képernyıre, hogy „Ez nem öt betős szó” és kérjen új tippet.  2. Próbáld meg eljárásokból felépíteni az elızı fejezet feladatát (prímszámok kigyőjtése 10000 -ig)!  3. Készíts programot, amely egy menüvel kezdıdik: 1. Négyzetgyökök 2. Négyzetszámok 3. Köbszámok és amelyik számot

megnyomjuk, azt a táblázatot írja ki a természetes számok függvényében 1 -tıl 20 ig. Használj eljárásokat és függvényeket! 94 Fájlkezelési mőveletek Nem lenne teljes a kép, ha nem térnénk ki arra a kérdéskörre, hogy hol is van a helye az adatoknak. Attól függ, hogy a programunk párbeszédes módban csak néhány adatot kér-e tılünk. Ekkor ugyanis az a legegyszerőbb, ha a program ezt futás közben megkérdezi, mi pedig begépeljük. Van azonban olyan feladat is, amikor nagyon sok adatot kell megadni a programnak. Ilyenkor mindig begépelgetni nagyon kényelmetlen lenne, nem is beszélve a hibák lehetıségérıl. Sokkal célszerőbb, ha egy külön fájlba helyezzük el az adatokat, és a program onnan olvassa be és végzi el a szükséges mőveleteket. A program általános, a különbözı adatsorok külön fájlban találhatók, a programnak csak a fájl nevét (és elérési útvonalát) kell megadni. Bemenı adataink tehát külön fájlban is

kaphatnak helyet Hasonló helyzet áll elı olyankor is, ha a program kimenı adatainak olyan nagy a száma, hogy nehezen áttekinthetıek, sıt késıbb is szükség lehet rájuk. Ilyenkor a program a kimenı adatait egy fájlba írja, ahol bármikor hozzáférhetıek lesznek. A programírásnak egy fontos alapelve, hogy a programot és az adatokat, amelyeken a program valamilyen munkát végez, válasszuk el egymástól. Ennek egyik kézenfekvı eszköze a fájlból történı beolvasás és a fájlba írás. A Comenius Logo csak egyféle fájlt képes kezelni, az úgynevezett szöveges (szekvenciális) fájlt. A különféle programnyelvek általában ennél bıvebb fájlkezelési lehetıséggel rendelkeznek. Több féle fájltípus is létezik, például olyan is, amelyben a számadatok nem karakteresen, hanem a számítógép belsı számábrázolása szerint vannak eltárolva. A Logo ilyen lehetıséggel nem rendelkezik, pusztán karakterenként szöveges formában tud fájlba

írni, illetve ilyen formájú fájlból tud csak olvasni. Ez a fájlkezelési lehetıség is elegendı azonban. Szinte semmirıl nem kell lemondanunk, mert ezzel is megoldható a legtöbb feladat. Fájl létrehozása és írás fájlba Comenius Logoban rendkívül egyszerő létrehozni egy fájlt. Mindössze annyi történik, hogy a kiírni kívánt adatokat a képernyı helyett a megnevezett fájlba irányítjuk át, azaz a képernyı helyett a létrehozni kívánt fájlt nevezzük meg kimeneti eszközként. Ki kell tehát adni a: kiíróeszköz "fájlnév utasítást. Ennek hatására létrejön a megadott névvel egy üres fájl és ezután minden kiíratás jellegő utasítás a fájlba ír mindaddig, amíg vissza nem 95 veszzük a kiíratás célpontjának a képernyıt: kiíróeszköz [] Ez egyben a fájlt is bezárja. Ezt az utasítást kell használnunk fájl bezárásra Tegyük is meg az elsı olyan alkalommal, amikor már nem szükséges, hogy a fájl nyitva

legyen, ugyanis a nyitott fájl sérülékeny. Ha ezután a már bezárt fájlt ismét meg akarnánk nyitni a kiíróeszköz "fájlnév utasítással, akkor azt tapasztalnánk, hogy üres a fájlunk. Ne lepıdjünk meg. A Comenius Logo nem teszi lehetıvé, hogy egy létezı fájlhoz főzzünk hozzá további adatokat. A fájlkezelési fejezet végén majd arra is látunk egy példát, hogyan hidalható át ez az akadály. Hol jön létre a fenti módon létrehozott fájl? Természetesen, mint minden hasonló esetben, abban a könyvtárban (mappában), ahol az a program elhelyezkedik, amelybıl létrehoztuk. A Comenius Logo alapértelmezésben a PROJEKT könyvtárban helyezi el a Logo programokat, ezért a létrejövı fájlunk is ott fog megjelenni. Ha azt szeretnénk, hogy egy másik (akár távoli) könyvtárban jöjjön létre a fájlunk, akkor a nevével együtt meg kell adni az elérési útvonalat. Ez egy kicsit más, mint minden más esetben A Comenius Logoban az útvonal

elemeit tagoló backslash ( ) jeleket duplán kell alkalmazni: kiíróeszköz "meghajtó:\könyvtár\alkönyvtár\fájlnév A fenti módon létrehozott fájl olvasható mindazokkal az eszközökkel, amellyel egy szöveges fájl olvasható. Ezek közül a legegyszerőbb talán a Windows Jegyzettömbje. Felmerülhet még az a kérdés, hogy mi történik olyankor, ha az írószínt, a kurzorhelyet is beállítjuk fájlba történı íráskor? A válasz az, hogy semmi. Ezek az utasítások természetesen értelmüket vesztik, ezért semmilyen hatással nincsenek a fájlba írásra. A rajzlapra történı írás sem irányítódik át a fájlba, azaz betőzd utasítással nem lehet fájlba írni. I. FELADAT: A "Számlálós ciklus" fejezet I./b feladatát alakítsuk át úgy, hogy a különleges szorzótáblát egy "sztabla.txt" nevő fájlba írja • • 96 Értelmezés: A feladat egyértelmő, még a létrehozandó fájl nevét is megadta. Bemenı adatok:

Itt is a szorzó. • • • • Kimenı adatok: Valójában a Sztabla.txt fájl a kimenet, amely szorzótábla elemeit fogja tartalmazni. Elıfeltétel: A szorzó pozitív egész szám legyen, (bár minden számra mőködik az algoritmus, csak nem szokás negatív vagy tört szorzótábláról beszélni). Utófeltétel: Helyes legyen a fájlban létrejövı szorzótábla! Algoritmus: Szöveges leírás: Szorzótábla3: Bekér: szorzó Bekér: kezdıért végért lépésköz Megnyit "sztabla.txt" ciklus i = kezdıért -tıl végért -ig lépésköz -önként fájlba ír i * szorzó ciklus vége Bezár "sztabla.txt" fájlt Eljárás vége Láthatóan csak a fájlba irányítás és a fájl bezárás sora került bele a már ismert programszövegbe. Az eljárás programja: tanuld szorzótábla3 kiírbelsı [milyen szorzótábla legyen?] név "szorzó osz kiírbelsı [Add meg a kezdı és végértéket és a lépésközt] kiíróeszköz "sztabla.txt

név "L olvaslista ciklus "i :L [( ki :i "* :szorzó "= :i :szorzó )] kiíróeszköz [] vége Megtekinthetjük a Jegyzettömb segítségével, hogy hogyan is fest a szorzótábla az általunk létrehozott fájlban. Adatok beolvasása fájlból A fájlból történı adat beolvasás sem jelent nagyobb nehézséget, mint a fájlba írás. Természetesen csak szövegfájlból tud a Comenius Logo adatot beolvasni. Ezt a fájlt egy másik Logo programmal hozhatjuk létre, de akár egy egyszerő szövegszerkesztıvel mi is begépelhetjük. Elsısorban a Windows Jegyzettömbje ajánlható erre a célra, de a Comenius Logonak is 97 van egy szövegszerkesztı ablaka, amelyet az átírfájl paranccsal lehet elıhívni. Ha utána idézıjellel kezdve megadjuk a fájlnevet, akkor azzal a névvel nyit meg egy üres fájlt. Bizonyára könnyő kitalálni, hogy fájlból olvasáskor olvasó eszközt kell megnyitni. A fájl megnyitása olvasásra az olvasóeszköz

"fájlnév utasítással történik. Természetesen csak létezı fájl nyitható meg olvasásra Ha nem létezı fájlnevet adunk meg (vagy inkább elgépeltük a fájl nevét), akkor hibaüzenetet kapunk: Hiba: Problémáim vannak a(z) fájlnév fájllal A fájl bezárásáról szintén gondoskodni kell. Ez is hasonlóképpen történik, mint a fájlok írásánál. Vissza kell adni az olvasóeszköz feladatot a billentyőzetnek az olvasóeszköz [] utasítással. Kissé kényelmetlen, hogy egyszerre csak egy fájl lehet nyitva olvasásra (de írásra is), mivel ha egy újat megnyitunk, akkor a másik automatikusan bezáródik, és ha újból visszatérünk az elsıként megnyitott fájlhoz az olvasóeszköz utasítással, akkor megint az elejérıl kezd olvasni belıle a program. Ha fájlból olvassuk az adatokat, akkor ügyelnünk kell rá, hogy csak addig tudunk olvasni a fájlból, amíg el nem értük a végét. A fájl végét egy fájlvég karakter jelzi, amit a

fájlkezelı helyez el ott. Nekünk külön nem kell vele foglalkoznunk, viszont a programunknak figyelni kell, hogy nem értük-e el? Ezért ismeretlen számú adatot feltételes ciklussal olvasunk a fájlból: amíg [nem fájlvége?][a ciklus utasításai] Adatbevitelre itt is a szokásos olvasszó (osz), olvaslista (ol), olvasjel (oj) utasítások használhatók, amelyek az olvasó eszköz átállítása után a fájlból olvassák az adatokat. I. FELADAT: Adott egy vers egy szövegfájlban. a) Írassuk ki az írólapra szavanként, b) soronként. 98 • Értelmezés: Egyszerő feladat. Nekünk kell gondoskodni a versrıl Esetünkben nyissuk meg a Windows Jegyzettömbjét és gépeljük be mondjuk Weöres Sándor Az ábécé 25 betőjére írt versciklusából az A címőt. Minden sor végén üssünk ENTER-t! Mentsük el a ComLogo PROJEKT könyvtárába alma.txt néven A program kérdezze meg a fájl címét, így tetszıleges fájlra általános megoldást készítünk.

• Bemenı adatok: Valójában a fájl neve (fn) a meghatározó bemenı adat. Ez meghatározza a fájlban található adatokat, mint másodlagos bemenı adatokat. Kimenı adatok: a) A vers szavai (az írólapon). b) A vers sorai (az írólapon) Elıfeltétel: Létezzen a megadott fájl (a PROJEKT alkönyvtárban) és ne legyen üres. Utófeltétel: Helyesen és valóban a) szavanként b) valódi verssoronként tördelve írja ki a program a szöveget! Algoritmus: Szöveges leírás: • • • • 99 . Szavanként bekér: fn fn nevő fájl megnyitása amíg nem fájlvége kiír fájlból olvasott szót ciklus vége fn fájl bezárása eljárás vége Soronként: bekér: fn fn nevő fájl megnyitása amíg nem fájlvége kiír fájlból olvasott sor ciklus vége fn fájl bezárása eljárás vége • Az eljárások programja: tanuld szavanként kiírbelsı [A fájl neve] név "fn osz olvasóeszköz :fn amíg [nem fájlvége?] ~ [ki osz] olvasóeszköz [] vége

tanuld soronként kiírbelsı [A fájl neve] név "fn osz olvasóeszköz :fn amíg [nem fájlvége?] ~ [kiír ol] olvasóeszköz [] vége Látható, hogy az olvasszó utasítás szavanként olvas attól függetlenül, hogy hogyan van sorokra tördelve a szöveg. Az olvaslista (ol) pedig soronként olvassa ki a fájlból a szöveget. Ha kiír helyett ki utasítást írtunk volna a soronként nevő eljárásba, akkor a sorokat szögletes zárójelbe téve írta volna ki. II. FELADAT: A Szópóker program Választ eljárását módosítsuk úgy, hogy fájlban tárolt szavak közül válasszon véletlenszerően feladványt! • 100 Értelmezés: Már ismeretes, hogy milyen célt szolgál az eljárás. Most úgy szeretnénk • • igazán "profivá" tenni a programunkat, hogy a már említett elv szerint el akarjuk választani a programot és az adatokat. Jegyzettömbbel írunk egy fájlt, amelyben felsoroljuk a lehetséges feladvány szavakat. (Minden szó új

sorba, bár nincs igazán jelentısége.) Megkönnyíti a dolgunkat, ha a fájl elején az elsı sorban elhelyezzük a fájlban található szavak számát, és ezzel megtakarítjuk, hogy nekünk kelljen megszámlálni (egy végigfutás), majd annyi lehetséges szóból választani, ahányat találtunk (újabb végigfutás). Tároljuk ezeket a feladvány szavakat egy szavaktxt nevő fájlban. Azt a módszert követjük, hogy a fájl elsı sorából kiolvassuk a szavak számát, majd véletlen számot hozunk létre a szavak számának határáig és egy számlálós ciklusban annyi szót olvasunk ki a fájlból, amennyi a véletlen szám volt. Az utoljára kiolvasott szó lesz a feladvány Bemenı adatok: A fájl neve (szavak.txt) Kimenı adatok: feladvány • • • Elıfeltétel: A szopoker.lgp programmal azonos könyvtárban szerepeljen a szavak.txt fájl A fájl elsı sora helyesen tartalmazza a benne szereplı szavak számát. A szavak ötbetősek legyenek! Utófeltétel: A

feladvány egy ötbetős magyar szó legyen. Algoritmus: Szöveges leírás: Választ: megnyitni a szavak.txt fájlt olvasásra beolvas fájlból n ciklus i = 1 -tıl (véletlenszám n) + 1-ig beolvas fájlból feladvány ciklus vége bezárni a szavak.txt fájlt eljárás vége tanuld választ olvasóeszköz "szavak.txt név "n osz név "L lista 1 ( 1 + véletlenszám :n ) ciklus "i :L [név "feladvány osz] olvasóeszköz [] vége 101 Ha a szavak.txt fájlt rejtett attribútumúra állítjuk, akkor a játékosok nem láthatnak bele a lehetséges feladványokba. Fájlok bıvítése A Comenius Logoban nincs olyan utasítás, ami arra szolgálna, hogy létezı fájl tartalmához további adatokat főzzünk hozzá. Általában hozzáfőzési mőveletnek szokás ezt nevezni és néhány programnyelv külön utasítást biztosít rá. A Comenius Logoban bizony nekünk kell megszervezni Milyen lépésekbıl áll a feladat általános végrehajtása? 1.) A

fájl megnyitása olvasásra, 2.) egy segédfájl megnyitása írásra 3.) a segédfájlba írni a fájl tartalmát 4.) a segédfájlba írni a hozzáfőzni kívánt adatokat, 5.) bezárni mindkét fájlt, 6.) olvasásra nyitni a segédfájlt, írásra a fájlt (ezzel felülíródik), 7.) a fájlba írni a segédfájl tartalmát, 8.) bezárni mindkét fájlt, 9,) kitörölni a segédfájlt. A fentiek véghezviteléhez már mindent tudunk, mindössze a fájl törlését kell megismerni: törölfájl "fájlnév utasítással hajtható végre. Érdemes odafigyelni arra, hogy a fájlok megnyitása elıtt érdemes a hozzáfőzni kívánt adatokat beolvasni változó(k)ba, mert különben nem biztos, hogy azt fogjuk találni a kibıvített fájlban, amit oda szántunk. FELADAT: Írj programot, amely a Szópóker feladvány szavait tartalmazó szava.txt fájl bıvítését biztosítja további feladvány szavakkal. • • • • 102 Értelmezés: A fentiekben már tulajdonképpen

tisztáztuk, hogy mit jelent a hozzáfőzési feladat. Bemenı adatok: szavak.txt fájl, újszavak adatlista Kimenı adatok: A (kibıvített) szavak.txt fájl Elıfeltétel: A szavak.txt fájl létezik, az újszavak adatlista valóban ötbetős magyar • • közneveket tartalmaz, az elsı sorában pedig helyesen szerepel a benne levı szavak száma. Utófeltétel: A kibıvített szavak.txt fájl valóban tartalmazza a régi fájl szavait és az összes újszavak adatlistán szereplı szót. A fájl elsı sorában szereplı szám valóban a fájlban található szavak darabszáma. Algoritmus: A konkrét feladat annyi többletfeladatot jelent, hogy ki kell olvasni a fájl elsı sorából a benne található szavak számát és a segédfájlba már az újszavak számával megnövelt számot kell írni. Szöveges leírás: Hozzáfőzés: bekér újszavak adatlistát núj = újszavak elemszáma megnyitja olvasásra a szavak.txt fájlt megnyitja írásra a segédf.000 fájlt beolvas

a szavak.txt fájlból: nszavak kiír a segédf.000 fájlba: (nszavak + núj) ciklus i = 1 -tıl nszavak -ig kiír a segédf.000 fájlba: a szavaktxt fájlból olvasott szót ciklus vége ciklus i = 1 -tıl núj -ig kiír a segédf.000 fájlba: újszavaki ciklus vége bezár szavak.txt fájlt bezár segédf.000 fájlt megnyit olvasásra segédf.000 fájl megnyit írásra szavak.txt fájlt ciklus amíg nem fájlvége? kiír a szavak.txt fájlba: a segédf000 fájlból olvasott szót ciklus vége bezár szavak.txt fájlt bezár segédf.000 fájlt kitöröl segédf.000 fájlt eljárás vége 103 Az eljárásprogramja: tanuld Hozzáfőzés kiírbelsı [Add meg az új szavakat] név "újszavak ol név "núj elemszám :újszavak olvasóeszköz "szavak.txt kiíróeszköz "segédf.000 név "nszavak osz ki ( :nszavak + :núj ) ciklus "i lista 1 :nszavak [ki osz] ciklus "i lista 1 :núj [ki ( elem :i :újszavak )] kiíróeszköz [] olvasóeszköz []

olvasóeszköz "segédf.000 kiíróeszköz "szavak.txt amíg [nem Fájlvége?][ki osz] kiíróeszköz [] olvasóeszköz [] törölfájl "segéd.000 vége Programjainkat célszerő úgy megírni, hogy különválasszuk egymástól a programot és az adatokat, amelyeken a program valamilyem mőveleteket végez. Ennek egyik módja, hogy a nagyobb adatmennyiség külön fájlba kerüljön. Programból létrehozható szöveges fájl a kiíróeszköz "fájlnév utasítással. Szöveges fájlt olvasásra az olvsóeszköz "fájlnév utasítással nyitható meg. Fájlba írásra a ki, kiír, kiírbelsı utasítások, fájlból olvasásra az olvasszó (osz), olvaslista (ol) olvasjel (oj) és az utasítások szolgálnak. Fájlokat célszerő a használatuk után közvetlenül bezárni. Erre a kiíróeszköz [] olvsóeszköz [] utasítások használatosak. Ellenırizd tudásod! 1. Miért célszerő adatokat fájlban tárolni? 104 2. Miért célszerő elválasztani

az adatokat a programtól? 3. Milyen formában tárol adatokat a Comenius Logoban használható adatfájl? Feladatok ☺ 1. Készíts programot, amely fájlban négyzet táblázatot készít! ☺ 2. Készíts programot, amely fájlban négyzetgyök táblázatot készít!  3. Tárold el a féléves bizonyítványodat egy szöveges fájlban úgy, hogy minden sorban elıl a tantárgy neve, utána helyközzel elválasztva a félévi (év végi) jegy legyen. Készíts programot, amely ebbıl a fájlból kiszámítja az átlagot!  4. Módosítsd a Szópóker programot úgy, hogy kezdetben kérdezze meg a játékos nevét, majd tárolja el az elért eredményét egy fájlban. Az igazi az a megoldás, ahol hozzáír a korábbi eredményekhez. 5. Készíts programot, amely ismerısök nevét, lakcímét, telefonszámát tárolja el fájlba. Oldd meg, hogy új személy adatai is felvehetıek legyenek ebbe a nyilvántartásba! 105 Alapvetı algoritmusok 106 Vannak kaptafák Mostanra

megismerkedtünk az alapvetı algoritmikus vezérlıszerkezetekkel, a strukturált programírás alapvetı elveivel. Már csak a programírás van hátra. Úgy tőnik, hogy ahány probléma, annyiféle program lehetséges, sıt még sokkal több. Már láttuk, hogy ugyan azt a problémát is igen sokféleképpen lehet megközelíteni. Kicsit szédítı a kezdıknek ez a bıség. A helyzet még sem olyan reménytelen, mint amilyennek látszik A programozási problémák igen jelentıs része egy-egy tipikus feladat megoldásával intézhetı el, de legalábbis ilyen tipikus részfeladatok megoldásaira bontható. Ezeket a feladattípusokat feladatosztályoknak vagy gyakrabban programozási tételeknek nevezzük. Több mint tíz ilyen programozási tétel van. Ezekre az jellemzı, hogy egy-egy ilyen feladatosztályba tartozó feladatnak gyakorlatilag ugyan az az algoritmus a megoldása. Csak a konkrét feladat egyedi adataihoz kell pontosítani az algoritmust, de a szerkezete ugyan az

minden azonos osztályba tartozó feladatnál. Talán már felismertük, hogy mekkora könnyebbséget jelent ez nekünk. Ismernünk kell az egyes programozási tételek algoritmusait és ezután már csak az a dolgunk, hogy az adott feladatról megállapítsuk, hogy melyik tételhez tartozik, és alkalmaznunk kell a megfelelı algoritmust. Nem fogunk tárgyalni minden programozási tételt, csak az egyszerőbbeket. A tételeket akkor értjük meg a legkönnyebben, ha szóban megpróbáljuk megfogalmazni, hogy mi is a lényege egy-egy ilyen feladatosztálynak. Megfogalmazásaink lehet, hogy egy kocsit pontatlanok lesznek, viszont könnyen érthetıek. A következı megfogalmazásoknál „halmazokról” fogunk beszélni. A matematikában egy halmaztól elvárjuk, hogy egyfajta elemet csak egy példányban tartalmazzon. Mi itt egy kicsit pontatlanul használjuk a „halmaz” fogalmát, mert az alábbi összes esetben megengedjük, hogy az a halmaz, amirıl beszélünk egy-egy fajta

elemnek több példányát is tartalmazza. Az ilyen halmazokat a matematikában „multihalmazoknak” hívják. Mi az egyszerőség kedvéért inkább egy kicsit pontatlanul használjuk a „halmaz” fogalmát. Például, ha azt mondjuk, hogy adott egy számhalmazunk, akkor lehetséges hogy egy szám többször is elıfordul benne, vagy pl. , ha adott egy színsávokból álló halmazunk, akkor lehet, hogy a piros (vagy bármilyen másik ) szín többször is elıfordul. Vegyük most sorra az egyszerőbb programozási tételeket: Kiválasztás: Adott egy halmaz. Biztosan tudni lehet, hogy van benne egy adott tulajdonságú elem. Adj meg egy ilyet! (Feladat lehet a sorszámának vagy az adott elemnek a megállapítása.) 107 Eldöntés: Adott egy halmaz. Van-e adott tulajdonságú elem a halmazban? Keresés: Adott egy halmaz. Van-e adott tulajdonságú elem a halmazban és ha igen, akkor adj meg egyet! (Szintén a sorszám vagy az elemnek magának a megállapítása lehet a

feladat.) Kiválogatás: Adott egy halmaz. Válogasd ki belıle az adott tulajdonságú elemeket (A feladat vonatkozhat a sorszámaik vagy az egyes elemek kiválogatására.) Megszámlálás: Adott egy halmaz. Számláld meg benne az adott tulajdonságú elemeket Sorozatszámítás (Összegzés): A számításnak van egy 0. eleme, (amellyel, ha mőveletet végzünk, az érték nem változik). A halmaz elsı elemével mőveletet végzünk vele és kialakul egy számított eredmény. A kiszámított eredménnyel és a halmaz második elemével ismét mőveletet végzünk, új számított eredmény keletkezik és így tovább, egészen a halmaz utolsó elemének a felhasználásáig. ( Az összegzés is ilyen mővelet, ezért gyakran összegzési tételnek is nevezik.) Másolás: Adott egy halmaz. Minden egyes eleméhez hozzárendelünk valamilyen szabály szerint egy értéket. Szélsıérték (maximum vagy minimum )kiválasztás: Adott egy halmaz. Add meg a legnagyobb (vagy legkisebb)

elemét (A feladat vonatkozhat a legnagyobb vagy legkisebb elem sorszámára is. ) Halmazok összevonása (Unió): Adott két halmaz. Vonjuk össze egyetlen halmazzá úgy, hogy ha van olyan elem, amely mindkettıben szerepel, akkor az eredményhalmazban az csak egyszer szerepeljen. Ugyanez úgy is megfogalmazható, hogy soroljuk fel, hogy mely elemek szerepelnek a halmazokban. Metszet: Adott két halmaz. Adjuk meg azokat az elemeket, amelyek mindkettıben szerepelnek. Sorbarendezés: Adott egy halmaz. Rendezzük növekvı (vagy csökkenı ) sorrendbe az elemeit. Van még néhány tétel, de azok vagy elég ritkán szükségesek vagy túl bonyolultak. A következı fejezetekben sorra vesszük az egyes tételeket. Megismerjük a megoldó algoritmusukat és kipróbáljuk néhány példán. Azoknál a tételeknél, ahol megoldható egy szemléletes bemutatás, ott a tétel mőködési elvét egy szemléletes-szemléltetı program segítségével be is mutatjuk. 108 Mindegyik ilyen

esetben visszatérünk a grafikus Logo fıszereplıjéhez, a teknıshöz. Egy szivárvány minden színében „tündöklı” tócsa közepén áll Az egyes tételeket azzal mutatjuk majd be, hogy a teknıs kivánszorog a tócsa közepérıl és közben végrehajtja az adott tételhez tartozó feladatot. Néhány segédprogram a tételek szemléltetéséhez SZÍNTÓCSA ELJÁRÁS: Készíts eljárást, amely a képernyın koncentrikus, különbözı vastagságú és színő körsávokból egy színes „tócsát” rajzol a képernyı közepén található teknıs köré! A feladat elég egyértelmő. Azt nem határozza meg, hogy mekkora legyen a „tócsa” és hány színes sávot tartalmazzon. Ezt most nekünk kell eldönteni. Célunk, hogy a tócsa eléggé kitöltse a képernyıt és jól látható legyen, hogy egy-egy sávon belül is hol tart a teknıs. Ha legfeljebb 360 képpont a lehetséges legnagyobb átmérıje a tócsának, akkor az már jól kitölti a rajzlapot.

Egy-egy sáv átlagosan 15 képpont legyen, azaz két folt átmérıje közt a különbség átlagosan 30 legyen. (A véletlen színválasztás azt az eredményt is hozhatja, hogy ugyan az a szín többször is egymás mellé kerül, ezért kevesebb és vastagabb sáv is elıfordulhat.) A lefuttatáskor nem igényel külön bemenı adatokat. A fenti megfontolásokkal az eljárás megtervezéséhez szükséges adatokat tisztáztuk. Kimenetként azt várjuk el az eljárástól, hogy olyan koncentrikus színsávokból álló nagyjából kör alakú ábra keletkezzék, amilyennek a feladat leírta. A késıbbiekben most már egyre szőkszavúbban kezeljük a feladat elızetes tervezését. Lassan elhagyjuk a bemenı és kimenı adatok , az elı- és utófeltételek részletes taglalását. Az elıkészítı munkának ezt az átgondolását a tanulókra bízzuk. A Színtócsa eljárás nagyjából úgy valósítható meg legegyszerőbben, hogy különbözı mérető, színő pontokat

helyezünk el a rajzlapon, a legnagyobbal kezdve egyre kisebbeket. A pont akármekkora lehet A kisebb egyszerően rárajzol a nagyobbra. Írjunk tehát egy számlálós ciklust, amely egy 360 mérető ponttal kezd és 30-cal csökkenti minden ismétlésnél a pont méretét. Ekkor azonban egyforma széles sávok keletkeznének Vonjunk le tehát egy legfeljebb 25-ig terjedı véletlenszámot ebbıl a meghatározott átmérıbıl. Ezzel már elértük, hogy változó szélességő sávok keletkezzenek A Comenius Logo a színekre 0 és 15 közé esı színkódokkal hivatkozik. Minden ismétléskor egy 0 és 14 közé esı véletlenszámmal kell újra 109 meghatározni a pont színét. (Azért csak 14-ig, mert a 15 a fehér kódja, ezt pedig csak a rajzlap háttere számára tartjuk fenn.) A Színtócsa eljárás algoritmusa: Színtócsa: ciklus i = 360 tól 30-ig (-30)-anként átmérı = i - véletlenszám (25) szín = véletlenszám (14) pont ciklus vége Eljárás vége A

Színtócsa eljárás programja: tanuld színtócsa ciklus "i [360 30 -30] ~ [tollvastagság! ( :i - véletlenszám 25 ) ~ tollszín! véletlenszám 15 ~ pont] vége 22. ábra: A színtócsa eljárás lefuttatásának egy lehetséges eredménye Egy másik szükséges függvény még a szemléltetı programunkhoz, amely megadja, hogy a teknıs új színő sávba lépett-e. Nevezzük ezt Újszín?- 110 nek. Értéke „igaz”, ha valóban új színt érint és „hamis”, ha még a régi színő sávban fut. A Comenius Logoban a pontszín utasításfüggvény adja vissza azt a színkódot, amely a teknıs hasa alatt van éppen. Elinduláskor ill , ha a teknıs új színő sávba ér, akkor el kell tenni egy változóba a teknıs alatt található szín kódját (szín0). Minden lépésnél ezt kell összehasonlítani az új pozíció színével (aktuálisszín). Ha megegyezik, akkor „hamis” értéket ad vissza a függvényünk. Ha különbözik, akkor a változó

felveszi az új színkód értékét, mint aktuális színt, és „igaz” értéket ad vissza a függvény: Újszín?( aktuálisszín) ha szín0 ≠ aktuálisszín , akkor szín0 = aktuálisszín újszín? = „igaz” különben újszín? = „hamis” függvény vége A függvény Comenius Logo programja: tanuld újszín? :aktuálisszín ha :szín0 <> :aktuálisszín ~ [név "szín0 :aktuálisszín eredmény "igaz] ~ [eredmény "hamis] vége A következı fejezetek programozási tételeinél gyakran fogjuk majd használni a fenti két eljárást. 111 Kiválasztás, eldöntés, keresés, kiválogatás, megszámlálás Vegyük most sorra az egyes programozási tételeket! Megvizsgáljuk, mi a jellemzıjük, miben különböznek a hasonló tartalmú tételektıl. Mi a jellemzı algoritmusuk? Minden tételt bemutatunk legalább egy (vagy akár több) programpéldán keresztül is. Ez segítséget nyújt abban, hogy ha hasonló feladattal találkozunk,

akkor legyen egy példa a szemünk elıtt, hogyan is kell a feladat megoldásához hozzáfogni. Kiválasztás Adott egy halmaz, ahol azt is tudom, hogy biztosan van benne adott tulajdonságú elem. Ki kell választani egy ilyen elemet! Néhány példa: – Van egy többemeletes lakóház. Add meg egy elsı emeleti lakó nevét! – Adott egy osztály. Mondj egy olyan tanulót, aki 3-as volt matematikából (biztosan van ilyen)! – A természetes számok közül 10 és 1000 között mondj egy prímszámot! – Adott a magyar ábécé. Mondj egy olyan betőt, ami nincs benne az angol ábécében! És még sorolhatnánk a példákat oldalakon keresztül. Elıször is tisztázzuk, mit jelent az „adott tulajdonságú elem”. A példáinkban sorban: – hogy elsı emeleti lakó, – a másik feladatban, hogy 3-as volt matekból, – a következıben, hogy prímszám – az utolsóban, hogy nem az angol ábécé betője. A feladat megoldása igen egyszerő: elkezdjük az elejérıl

bejárni a halmazt és addig lépegetünk egyenként a következı elemre, amíg egy olyan tulajdonságút nem találunk, mint amilyet ki kell választanunk. Ha megtaláltuk, akkor készen vagyunk. Program esetében attól függ, mi a célunk vele. Helyezzük el egy változóban, adjuk vissza függvényértékként, írjuk ki, stb. Azért igen egyszerő a kiválasztás tétel megoldása, mert itt egy feltételes ciklussal kell haladnunk a halmazban. A ciklus ismétlési feltétele az adott tulajdonság tagadása, azaz vedd a következı halmazelemet mindaddig, amíg az nem adott tulajdonságú. Nem kell félnünk, hogy kifutunk a halmazból és a 112 program az utolsó utáni elemet akarja venni, mert tudjuk, hogy van a halmazban adott tulajdonságú elem. Ez az algoritmus elıfeltétele Legyen minden általános példánkban X a halmaz, Xi a halmaz egy i-edik eleme. Az algoritmus szöveges leírása: Kiválasztás: i=1 ciklus amíg Xi nem adott tulajdonságú i=i+1 ciklus vége

Kiír i, Xi Eljárás vége Most azt az esetet mutattuk be, amikor a megkapott elemnek a sorszámát is, magát az elemet is kiírja. Az egyedi feladattól függ, hogy melyikre van szükségünk. Az általános forma blokkdiagramja: 23. ábra: A kiválasztás folyamatábrája A blokkdiagramot csak mint egy részletet mutatjuk be, hiszen egy ilyen tétel még összeépülhet további feladatok megoldásával is. Program példaként rögtön vegyünk egy hasznos és a szemléltetı programunk szempontjából szükséges feladatot. A Comenius Logo nyelv a színekre csak színkódokkal tud hivatkozni. Ehhez nekünk mindig fejbıl tudni kellene, hogy melyik színnek mi a kódszáma. Ezt senkitıl sem lehet elvárni I. FELADAT: Kell készítenünk egy függvényt, amelynek bemenı paramétere egy szó: a szín neve magyarul, a függvény pedig megadja hozzá a színkódot. 113 Már említettük, hogy a Comenius Logo nyelvben lehet létrehozni a program lefuttatása elıtt is

változókat, lehet értéket adni nekik. Ilyenkor a memóriaablak Elemek/ új változó menüpontját választjuk. Ekkor Adjuk a változónak azt a nevet, hogy színek. Ekkor megnyílik egy ablak és az ablakban értéket írhatunk a változóba. Most azt kell tennünk, hogy a színkódok sorrendjében felsoroljuk a kódokhoz tartozó színek magyar neveit: fekete kék zöld türkiz piros lila okker világosszürke világoskék világoszöld világostürkiz sötétszürke világospiros ciklámen sárga fehér Ezzel létrehoztunk egy lista típusú változót, ahol a listán most nem számok, hanem szavak (a színek nevei) vannak. Ekkor visszavezettük a feladatunkat a kiválasztásra, hiszen mi megadjuk a függvény bemenı paramétereként a szín nevét, és ki kell választanunk a listáról a megadott színt. Arra vagyunk kíváncsiak, hogy ez hányadik a listán? A sorszáma most eggyel több a színkódnál, hiszen a színkódok 0-val kezdıdnek, a sorszámok pedig 1-gyel. A

függvény szöveges algoritmusa: Függvény Színkódja ( szín ) j=1 ciklus amíg szín ≠ színekj j=j-1 ciklus vége színkódja = j + 1 függvény vége A szöveges leírásból látszik, hogy pontosan megegyezik az algoritmus az általános formával, csak az „Xi nem adott tulajdonságú” helyére a konkrét feltétel: szín ≠ színekj került. Itt a szín a bemenı paraméter A függvény Comenius Logo programja: tanuld Színkódja :szín név "j 1 amíg [:szín <> elem :j :színek][név "j :j + 1] eredmény ( :j - 1 ) vége Ha most kipróbáljuk pl.: ki Színkódja ”piros , akkor ki fogja írni, hogy 4 , ami valóban a piros szín színkódja. Erre a függvényre azért volt szükségünk, hogy ne kelljen megtanulni a színkódokat, hanem hivatkozhassunk a színekre a nevükkel is. Lássuk most az elsı szemléltetı programot, ahol többször is felhasználjuk a frissen írt függvényünket! II. FELADAT: Készíts programot, ahol a teknıs a

színtócsa közepén áll. Egy megadott színt 114 úgy kell kiválasztania, hogy addig sétál, amíg el nem éri a kért szín sávjának a szélét. (Ahhoz, hogy valóban legyen is olyan színő sáv véletlenszerően kiválasztunk egy sávot és azt átszínezzük a kívánt színre. Ezzel az elıfeltétel biztosan teljesül, mert tudjuk, hogy van a kért színő sáv.) Ezzel szemléltetjük a kiválasztás tétel mőködését is, hiszen ott is addig kell a halmaz elemeit (itt a színeket) sorra venni, ameddig a kiválasztani kívánt elemet (itt színt) el nem értük. Kell egy keret program, ami elhelyezi a színtócsát, abban a kívánt színő sávot, visszaküldi a teknıst középre, majd végrehajtja a kiválasztást. A kiválasztás maga itt csak egy eljárása lesz az egész programnak. Nevezzük a teljes programot Kiválasztósdinak. A kiválasztást végzı eljárás neve maradjon Kiválasztás. A keretprogram szóbeli algoritmusa: Kiválasztósdi: színtócsa

elıre (véletlenszám (160) ) bekér színem betölt (sávot) Színkódja (színem) haza Kiválasztás (Színkódja (színem)) Program vége A keretprogram Comenius megegyezik a szöveges leírással: Logo programja majdnem teljesen tanuld Kiválasztósdi tr színtócsa tf elıre véletlenszám 160 tl kiírbelsı [Melyik színt válasszam ki] név "színem olvasszó tollszín! Színkódja :színem tölt tf haza várj 500 kiválasztás Színkódja :színem vége A kiválasztás tétele itt rendkívüli mértékben leegyszerősödik. Paraméterként adjuk meg neki a kiválasztani kívánt szín kódját (kivszín). Mivel csak azt várjuk el a teknıstıl, hogy a kiválasztandó színsáv határán álljon meg, ezért nem kell számlálnia, hogy hány lépést tett meg addig vagy hány színsávon haladt át. A feltételes ciklus magjába csak egy elıre utasítás kerül, ill. egy rövid várakozás, hogy jól lássuk a teknıc haladását, ne fusson végig túl gyorsan. A

szöveges leírás: 115 Kiválasztás ( kivszín ) ciklus amíg kivszín ≠ (szín a teknıs alatt) lépj elıre 1 -et ciklus vége eljárás vége Az eljárás programja: tanuld kiválasztás :kivszín amíg [pontszín <> :kivszín][elıre 1 várj 10] vége 24. ábra: A Kiválasztósdi program egy lehetséges kimenetele 116 Eldöntés Adott egy halmaz. Van-e benne adott tulajdonságú elem? Néhány példa: – Van egy bélyeggyőjtemény. Van e benne újzélandi bélyeg? – Van egy osztály. Van-e kitőnı tanuló közöttük? –Egy adott cégnél van-e olyan alkalmazott, aki beszéli a japán nyelvet? – Május hónapban minden nap feljegyzik a déli hımérsékletet. Volt-e olyan nap, amikor 30 °C-t elérte vagy túllépte a hımérséklet? Az eldöntés tétele gyakorlatilag nagyon hasonlít a kiválasztáshoz. Mindkettıben egy adott tulajdonságú elemre kell rámutatni. A kiválasztásnál biztos, hogy van ilyen, az eldöntésnél azonban nem. Itt a

válasz csak egy igaz / hamis jellegő válasz. Ha sikerült rámutatni, akkor igaz, ha nem, akkor hamis. Máris felismerhetjük, hogy az olyan feladatok, ahol a válasznak egy igen / nem-nek kell lenni vagy van / nincs jellegőnek, ott a feladat nagy valószínőséggel eldöntés. Az eldöntés tételnél nincs elıfeltétel. Éppen arra vagyunk kíváncsiak, hogy van-e a halmazban olyan elem, amilyet keresünk. Itt kezdıdnek a gondok! Azt rögtön gondoljuk, hogy csak addig kell a halmazban lépegetni és venni a következı elemet, amíg nem találunk egy keresett tulajdonságút. De mi van, ha nem találunk? Elérünk a halmaz végéig, vennénk a következıt, de olyan halmazelem már nincsen. Ha nem számítógéppel akarjuk a feladatot megoldani, akkor elég azt figyelnünk, hogy elértük-e már a halmaz utolsó elemét. Ha túl kívánunk lépni, akkor hagyjuk abba a ciklikus ismétlést Ha a halmaz utolsó utáni eleménél tartanánk, akkor „hamis” a végeredmény, ha

a sorszám még nem érte el a halmaz végét, akkor „igaz”, hiszen éppen azért hagytuk abba elıbb a keresést, mert már megtaláltuk. Ilyen esetre a szöveges algoritmus: Eldöntés: i=1 n = a halmaz elemeinek a száma ciklus amíg (Xi nem adott tulajdonságú) ÉS (i ≤ n) i=i+1 ciklus vége ha i > n akkor kiír: HAMIS különben kiír: IGAZ Eljárás vége Ennek az algoritmusnak csak az a baja, hogy a számítógép az ÉS függvény kiértékelésekor megvizsgálja a benne szereplı mindkét feltételt. Megvizsgálja azt, hogy Xi nem adott tulajdonságú-e és megvizsgálja azt is, hogy 117 i kisebb-e n-nél. Ez utóbbival nem is lenne semmilyen baj De amikor i túllép n-en, akkor már nem létezik Xi halmazelem. Olyan halmazelemrıl kellene a gépnek eldöntenie, hogy nem adott tulajdonságú-e, amelyik nem létezik. Erre pedig a gép igazán nem lehet képes. Ravaszabb megoldáshoz kell folyamodnunk. Programjainkban még a ciklus elıtt el kell helyezni egy

n+1dik elemet, amelyik biztosan adott tulajdonságú Ez csak egy „képzetes” eleme a valódi halmaznak, de ekkor ennél az elemnél biztosan abba fogja hagyni a keresést. Most már csak azt kell megvizsgálni, hogy az n+1-dik elemnél hagyta-e abba, mert akkor HAMIS a végeredmény. Ha korábban, akkor IGAZ. Nézzük az algoritmus leírást: Eldöntés: i=1 n = a halmaz elemeinek a száma Xn+1 = egy adott tulajdonságú elem ciklus amíg (Xi nem adott tulajdonságú) i=i+1 ciklus vége ha i > n akkor kiír: HAMIS különben kiír: IGAZ Eljárás vége Ha visszaemlékezünk, akkor rá kell jönni, hogy ez már ismerıs. A feltételes ciklus megismerésekor volt egy ilyen algoritmusunk és programeljárásunk. Ott azt kellett eldönteni, hogy van-e negatív szám, a számsorozatunkban. Nézzük az eldöntés általános blokkdiagramját: 118 25. ábra: Eldöntés folyamatábrája Program példaként már említettük a Van negatív? címő eljárásunkat a feltételes

ciklusokról szóló fejezetbıl. Itt csal a szemléltetı példát fogjuk elkészíteni. Írjunk függvényt az eldöntésbıl! A függvény értéke „igaz”, ha a színsávok közt megtalálja a keresett színt, „hamis”, ha nem. Itt nem kell elhelyezni egy n+1-dik halmazelemet, azaz egy legkülsı színsávot, mert tudjuk, hogy a rajzlap fehér, a színsávjainkat pedig úgy állítottuk elı, hogy ne legyen fehér sáv. Ez nagyon szerencsés eset, mert egy összetett feltétellel biztonságosan elintézhetı a keresés. Nem tud nem létezı elemre lépni Azt kell vizsgálnia, hogy a (szín a teknıs alatt = a keresett szín ) ÉS (szín a teknıs alatt ≠ fehér) A végén csak azt kell megvizsgálni, hogy fehér ponton áll-e. Ha nem fehéren, akkor azért állt meg, mert a keresett színt megtalálta, ha fehéren, akkor nem talált. Itt a függvény a pontszín ≠ fehér reláció eredményét vegye fel a függvény értéke is, azaz „igaz”-at avagy „hamis”-at. A

keretprogramnak csak annyit kell tennie, hogy elhelyezi a színtócsát, megkérdezi, hogy melyik színt keresse és elindítja az eldöntés függvényt. A függvény igaz vagy hamis értékétıl függıen kiírja, hogy VAN vagy NINCS. Most még a keretprogram szöveges leírását is elhagyhatjuk, hiszen teljesen megegyezik a valóságos Comenius Logo programmal: 119 tanuld eldöntısdi tr színtócsa várj 500 tollatfel kiírbelsı [Milyen színrıl döntsem el, hogy van - e] név "színem olvasszó ha eldöntés Színkódja :színem [ki "VAN][ki "NINCS] vége Írjuk meg az eldöntés függvényünk szöveges leírását. A függvények itt is a bemenı paramétere a keresett szín kódja (kivszín): Eldöntés( kivszín ) ciklus amíg (szín a teknıs alatt ≠ kivszín) ÉS (szín a teknıs alatt ≠ fehér) lépj 1-et elıre ciklus vége ha szín a teknıs alatt ≠ fehér akkor eldöntés = IGAZ különben eldöntés = HAMIS függvény vége Comenius Logo

nyelven a függvényeljárás: tanuld eldöntés :kivszín amíg [és ( pontszín <> :kivszín ) ( pontszín <> 15 )] ~ [elıre 1 várj 10] eredmény ( pontszín <> 15 ) vége Ha lefuttatjuk a szemléltetı programunkat, akkor azt látjuk, hogy majdnem ugyanaz történik, mint a kiválasztásnál, csak az osztott képernyı alján az írólap belógó részére kiírja a program, hogy „VAN” vagy , hogy „NINCS”. Keresés Adott egy halmaz. Nevezz meg egy adott tulajdonságú elemet, ha van! Néhány példa: – Van egy bélyeggyőjtemény. Mutass egy újzélandi bélyeget, ha van! – Adott egy osztály. Nevezz meg egy kitőnı tanulót, ha van az osztályban ilyen! – Adott egy cég. Nevezz meg egy személyt az alkalmazottak közül, aki beszél japánul, ha van ilyen közöttük! – Május hónapban minden nap feljegyzik a déli hımérsékletet. Adj meg egy olyan napot, amikor 30 °C-t elérte vagy túllépte a hımérséklet, ha volt ilyen? 120 A

fenti példák is jól szemléltetik, hogy a keresés nem sok újdonságot jelent az elızı két tételünkhöz képest. Akár úgy is fel lehet fogni, hogy egy eldöntés és egy kiválasztás kombinációja. Ha az eldöntés arra az eredményre jut, hogy van adott tulajdonságú elem, akkor ki is kell választani. Az algoritmus nagyon hasonlít az eldöntéshez, csak itt amikor leáll a keresés, akkor meg kell adni az elem sorszámát vagy magát az elemet. Ha azért áll le, mert túllépett a halmazon, akkor itt is csak annyit kell megadni, hogy „NINCS”. A keresés általános szöveges algoritmus-leírásánál nézzük most a programírás számára átalakított változatot, ahol a halmazhoz hozzáveszünk egy n+1-dik elemet is: Keresés: i=1 n = a halmaz elemeinek a száma Xn+1 = egy adott tulajdonságú elem ciklus amíg (Xi nem adott tulajdonságú) i=i+1 ciklus vége ha i > n akkor kiír: NINCSEN különben kiír: i, Xi Eljárás vége Látható, hogy csak az

eljárás végén az elágazás „hamis” ágában van különbség az eldöntéshez képest. 121 A keresés általános formájának blokkdiagramja: 26. ábra: Keresés folyamatábrája A teknıcös példa elıtt nézzünk egy másik példát is! I. FELADAT: Adott egy listán egy osztály tanulóinak a keresztnevei. Adj meg egyet közülük, akinek a neve egy megadott betővel kezdıdik. (A nevek nem ábécé sorrendben, hanem össze-vissza vannak a listán). Szükséges bemenı adat a névlista és a kezdıbető. Végeredményként egy keresztnevet várunk, vagy azt, hogy „nincs ilyen név a listán”. A feladat algoritmusának szóbeli leírásához csak az általános algoritmusba kell helyettesíteni, ill. az adatbevitelt az elejére helyezni Az n+1-dik elem lehet maga a kezdıbető. 122 NévKeresés: bekér keresztnevek bekér kezdıbető i=1 n = a keresztnevek elemeinek a száma keresztnevek n+1 = kezdıbető ciklus amíg (keresztnevek i elsı betője ≠

kezdıbető) i=i+1 ciklus vége ha i > n akkor kiír: NINCSEN különben kiír: keresztneveki Eljárás vége Az algoritmus csak az elsı karaktert vizsgálja, tehát nem adható meg olyan, hogy keressen pl. Cs betővel kezdıdı nevet, csak C-vel kezdıdıt tud keresni. Ez elıfeltételnek tekinthetı Nézzük az programeljárást: tanuld NévKeresés tí kiírbelsı [A nevek] név "keresztnevek olvaslista kiírbelsı [A keresett kezdıbető: ] név "kezdıbető olvasjel név "i 1 név "n ( elemszám :keresztnevek ) név "keresztnevek utolsónak :kezdıbető :keresztnevek amíg [elem 1 ( elem :i :keresztnevek ) <> :kezdıbető] ~ [név "i :i + 1] kiír :kezdıbető ha :i > :n [kiír "Nincs ilyen név a listán] ~ [kiír elem :i :keresztnevek] vége Most nézzük a teknıcös szemléltetı példánkat. Ha csak annyit várnánk el tıle, hogy álljon meg a keresett színsáv határán akkor semmiben sem különbözne az eldöntéstıl.

II: FELADAT: Egészítsük ki a feladatot annyival, hogy azt is írja ki, hogy belülrıl számítva hányadik a keresett színsáv. Erre a célra a már korábban megírt Újszín? függvényünket fogjuk igénybe venni. Bevezetünk egy sávszám nevő változót, amely minden egyes új színő sávnál növekszik eggyel. A keretprogram teljesen megegyezik az eldöntısdi-vel, csak a keresés eljárás szerepel benne az eldöntés függvény helyett, ezért nem kell elágazás sem a végére: 123 A keretprogram: tanuld keresısdi tr színtócsa várj 500 tf kiírbelsı [Milyen színrıl döntsem el, hogy van-e] név "színem osz keresés Színkódja :színem vége A szöveges algoritmus: Keresés( kivszín ) szín0 = szín a teknıc alatt ciklus amíg (szín a teknıs alatt ≠ kivszín) ÉS (szín a teknıs alatt ≠ fehér) ha Újszín? akkor sávszám = sávszám + 1 lépj 1-et elıre ciklus vége ha szín a teknıs alatt ≠ fehér akkor kiír sávszám különben kiír

„Nincs ilyen szín” eljárás vége A keresés eljárás programja: tanuld keresés :kivszín név "szín0 pontszín név "sávszám 1 amíg [és ( pontszín <> :kivszín ) ( pontszín <> 15 )] ~ [ha újszín? pontszín [név "sávszám :sávszám + 1][] ~ e 1 várj 10] ha pontszín <> 15 [( kiírbelsı :sávszám ". sáv ) ki] ~ [ki "Nincs ilyen szín a tócsában] vége A sávszám kiírása után azért kell egy üres kiírást betenni, hogy új sorba ugorjon a kurzor. Kiválogatás Adott egy halmaz. Válogasd ki az adott tulajdonságú elemeket! Néhány példa: – Van egy bélyeggyőjtemény. Válogasd ki az összes luxemburgi bélyeget! – Adott egy osztály. Kik a kitőnı tanulók? – Adott egy cég. Kik beszélnek az alkalmazottak közül franciául? 124 – Május hónapban minden nap feljegyzik a déli hımérsékletet. Mely napokon volt 30 °C vagy magasabb a hımérséklet? A kérdések, feladatok mind egy halmaz

bizonyos elemeire vonatkoznak. Már a feladat szövegében árulkodó lehet a többes szám. Ahol a kérdés többes számban valamilyen tulajdonságú halmazelemekre vonatkozik, akkor valószínő, hogy kiválogatási feladattal van dolgunk. A feladat szempontjából a kereséshez képest az a lényeges különbség, hogy ott csak egy adott tulajdonságú elemet kell megadnunk válaszként, itt az összest. Ez bizony jelentısen átalakítja a megoldás algoritmusát is Míg a kiválasztás, eldöntés, keresés tételeknél csak addig kell a halmazban lépegetni, amíg nem találunk egy keresett tulajdonságú elemet, addig a kiválogatásnál az egész halmazt be kell járni. Máris eszünkbe juthat, hogy akkor itt a feltételes ciklus helyett inkább számlálós ciklust kell alkalmazni. Itt is kíváncsiak lehetünk az elem sorszámára ill. magára a halmazelemre A feladat megoldása igen egyszerő. Az elsı elemtıl az utolsóig végigjárjuk a halmazt és minden egyes elemet

megvizsgálunk, hogy rendelkezik-e a keresett tulajdonsággal. Ha igen, akkor kiírjuk (vagy egy változó listájára felvesszük), ha nem, akkor továbblépünk. Itt nem okoz gondot, hogy kifutunk a halmazból, hiszen számlálós ciklust alkalmazunk. Az algoritmus általános formája: Kiválogatás: n = elemszám Xi i=1 ciklus i = 1-tıl n-ig ha Xi adott tulajdonságú akkor kiír i, Xi ciklus vége eljárás vége 125 Az általános forma blokkdiagramja: 27. ábra: Kiválogatás folyamatábrája Elsı példaként most alakítsuk át kiválogatássá a Névkeres eljárásunkat NévVálogat eljárássá. I. FELADAT: Adott egy listán egy osztály tanulóinak a keresztnevei. Add meg azokat a neveket, amelyek egy megadott betővel kezdıdnek. (A nevek nem ábécé sorrendben, hanem össze-vissza vannak a listán). A bemenı adatok ugyan azok, a kimenet azonban több név is lehet. Lehet olyan eset is, amikor egyetlen nevet sem ír ki a program, mert nincsen a kérdéses betővel

kezdıdı keresztnév a listán. Nem várjuk el, hogy ilyenkor azt is közölje velünk, hogy nincsen ilyen. Szöveges algoritmus leírás: 126 NévVálogat: bekér keresztnevek bekér kezdıbető n = a keresztnevek elemszáma ciklus i = 1-tıl n-ig ha keresztneveki elsı betője = kezdıbető akkor kiír keresztneveki ciklus vége eljárás vége Az eljárás Comenius Logo programja: tanuld NévVálogat tí kiírbelsı [A nevek] név "keresztnevek olvaslista kiírbelsı [A keresett kezdıbető: ] név "kezdıbető olvasjel kiír :kezdıbető név "n ( elemszám :keresztnevek ) név "L lista 1 :n ciklus "i :L ~ [ha elem 1 ( elem :i :keresztnevek ) = :kezdıbető ~ [ki elem :i :keresztnevek][]] vége A teknıcös szemléltetı példánknál most a kívánt színő összes színsávot ki kell válogatni. Ez történhet úgy, hogy hangjelzést ad az összes ilyen színő sávnál, elhelyezhet valamilyen jelzést a sávok határánál vagy egyszerően

kigyőjti a sávok sorszámait és kiírja. Válasszuk az elsı két esetet: II. FELADAT: A színtócsán végighaladva a teknıs adjon hangjelzést minden keresett színő sávban és helyezzen el egy kisegeret az ilyen színsávok határain! A szemléltetı programunkhoz kisegítı eljárásra is szükségünk lesz. A keretprogram elhelyezi a színtócsát, megméri a szélességét (ez az új kisegítı függvényeljárás), majd elindítja a kiválogatás eljárást. Válogatósdi: színtócsa szélesség = tócsaszélesség bekér színem kiválogatás (Színkódja (színem)) eljárás vége. A tócsaszélesség függvény úgy mőködik, hogy középrıl elindul a teknıs és addig lépeget egyesével elıre és közben számlálja a megtett lépéseket, amíg a fehér rajzlapra nem ér: 127 Függvény tócsaszélesség: i=0 ciklus amíg NEM fehér a teknıs alatt i=i+1 ciklus vége tócsaszélesség = i függvény vége A keretprogram (Válogatósdi) és a

tócsaszélesség függvény Comenius Logo programja: tanuld Válogatósdi tr színtócsa név "szélesség tócsaszélesség kiírbelsı [Milyen színő sávokat keressek] ~ név "színem olvasszó Kiválogatás Színkódja :színem vége tanuld tócsaszélesség tf név "i 0 amíg [pontszín <> 15][e 1 név "i :i + 1] haza er :i vége A Kiválogatás eljárás paraméterként megkapja a kiválogatni kívánt szín kódját. A tócsa szélessége már el van helyezve egy változóban (Errıl a Válogatósdi címő keretprogram gondoskodott.) A teknıs középrıl indul és elbandukol a tócsa széléig. Minden lépésnél megvizsgálja, hogy új szín van-e alatta. Ha igen, akkor az éppen a keresett szín-e? (Ez egy ÉS kapcsolattal összefőzött összetett feltétel.) Ha a feltétel teljesül, vagyis az új szín éppen a keresett, akkor egy kb. fél másodpercnyi hangjelet ad, majd alakot vált a teknıs. Átalakul kisegérré, lenyomatot készít az

alakjáról, majd visszaalakul teknıssé és továbblép. 128 Kiválogatás (kivszín) szín0 = Színkódja ( fehér ) ciklus i = 1-tıl szélesség-ig ha Újszín? ÉS (szín a teknıs alatt = kivszín) akkor hangjel teknıs új alak: kisegér lenyomat teknıs új alak: teknıs elágazás vége lépj 1-et elıre ciklus vége eljárás vége 28. ábra: A Válogatósdi program egy lehetséges kimenetele 129 A Kiválogatás programja: tanuld Kiválogatás :kivszín tf név "szín0 Színkódja "fehér név "L lista 1 :szélesség ciklus "i :L ~ [ha és ( újszín? pontszín ) ( pontszín = :kivszín ) ~ [hang [220 500] ~ alak! "cinci lenyomat alak! "teki látható][] ~ elıre 1 várj 10] vége Megszámlálás Adott egy halmaz. Számláld meg az adott tulajdonságú elemeket! Néhány példa: – Van egy bélyeggyőjtemény. Hány darab luxemburgi bélyeg van közöttük? – Adott egy osztály. Hány kitőnı tanuló van az osztályban? – Adott

egy cég. Hányan beszélnek az alkalmazottak közül franciául? – Május hónapban minden nap feljegyzik a déli hımérsékletet. Hány nap volt, amikor 30 °C vagy magasabb volt a hımérséklet? Az összes kérdés mind tartalmazza a „hány.” kérdı névmást Esetleg szólhat úgy a feladat, hogy „Számláld meg, hány .” Ezek árulkodó fordulatok a kérdésben, feladatban. Igen valószínő, hogy az ilyen szavakat tartalmazó feladatok megszámlálási tételhez vezetnek. A megszámlálás a kiválogatás rokona. Csak annyiban különböznek egymástól, hogy a ciklus elıtt el kell helyezni egy számlálásra szolgáló változót és kinullázni. A cikluson belül az elágazás „igaz” ágában most nem kiírás szerepel, hanem a számlálásra való változó értékét növeljük mindig eggyel. Ez azt jelenti, hogy, ha találtunk adott tulajdonságú elemet a halmazban, akkor növeljük a számlálónk értékét. 130 A megszámlálás tétel általános

algoritmusának szöveges leírása: Megszámlálás: n = elemszám Xi számláló = 0 i=1 ciklus i = 1-tıl n-ig ha Xi adott tulajdonságú akkor számláló = számláló + 1 ciklus vége kiír számláló eljárás vége Az általános forma blokkdiagramja: 29. ábra: Megszámlálás folyamatábrája Maradjunk továbbra is a nevekkel kapcsolatos feladatunknál. Most a megadott betővel kezdıdı neveket számlálja össze a program! I. FELADAT: Adott egy listán egy osztály tanulóinak a keresztnevei. Írja ki a program, hogy hány olyan név van, amelyek egy programfutás során megadott betővel kezdıdnek. (A nevek nem ábécé sorrendben, hanem össze-vissza vannak a listán). 131 Csak annyi a dolgunk, hogy egy számlálót kell elhelyezni a ciklus elé és kicserélni a kiírást az elágazásban számláló növelésre: NévSzámlál: bekér keresztnevek bekér kezdıbető db = 0 n = a keresztnevek elemszáma ciklus i = 1-tıl n-ig ha keresztneveki elsı betője =

kezdıbető akkor db = db + 1 ciklus vége kiír db eljárás vége Itt db-nek neveztük el a számlálásra szolgáló változót. Mivel egyetlen számot várunk válaszképpen, ezért függvényként is megírhatnánk a Megszámlálás eljárását, ahol a bemenı paraméter a kezdıbető, (esetleg lehet bemenı paraméter a névlista is), a függvényérték pedig az összeszámlált darabszám. Most eljárásként írjuk meg, hogy ne legyen szükség külön keretprogramra. A programeljárás a következı: tanuld NévSzámlál tí kiírbelsı [A nevek] név "keresztnevek olvaslista kiírbelsı [A keresett kezdıbető: ] név "kezdıbető olvasjel kiír :kezdıbető név "db 0 név "n ( elemszám :keresztnevek ) név "L lista 1 :n ciklus "i :L ~ [ha elem 1 ( elem :i :keresztnevek ) = :kezdıbető ~ [név "db :db + 1][]] (kiír :db :kezdıbető "betővel kezdıdı név van. ) vége A teknıcös szemléltetı példánkon sem kell sokat

változtatni. Meghagyhatjuk a hangjelzést is, a kisegereket is, hogy legalább jól látható legyen, hogy annyit ír ki, ahány kisegeret elhelyezett a színtócsa sávjai szélén. II. FELADAT: Alakítsd át a Válogatósdi és a Kiválogatás eljárásokat úgy, hogy a végén számmal írja ki az osztott ablakba alulról belógó írólapra, hogy hány keresett színő sávot talált. A többi ugyanúgy mőködjék! A Megszámlálósdi keretprogram teljes egészében megegyezik a Válogatósdival, csak a Kiválogatás eljárást kell benne Megszámlálásra kicserélni: 132 Megszámlálósdi: színtócsa szélesség = tócsaszélesség bekér színem megszámlálás (Színkódja (színem)) eljárás vége. Megszámlálás (kivszín) számláló = 0 szín0 = Színkódja ( fehér ) ciklus i = 1-tıl szélesség-ig ha Újszín? ÉS (szín a teknıs alatt = kivszín) akkor hangjel teknıs új alak: kisegér lenyomat teknıs új alak: teknıs számláló = számláló + 1

elágazás vége lépj 1-et elıre ciklus vége kiír: számláló eljárás vége A megfelelı Comenius Logo programeljárások: tanuld Megszámlálósdi tr színtócsa név "szélesség tócsaszélesség kiírbelsı [Milyen színő sávokat keressek] ~ név "színem olvasszó Megszámlálás Színkódja :színem vége tanuld Megszámlálás :kivszín tf név "számláló 0 név "szín0 Színkódja "fehér név "L lista 1 :szélesség ciklus "i :L ~ [ha és ( újszín? pontszín ) ( pontszín = :kivszín ) ~ [hang [220 500] ~ alak! "cinci lenyomat alak! "teki3 látható ~ név "számláló :számláló + 1][] ~ elıre 1 várj 10] (ki :számláló :színem "színő sáv van.) vége 133 Ellenırizd tudásod! 1. A kiválasztás, eldöntés, keresés, kiválogatás, megszámlálás tételek közül melyekben van feltételes és melyekben számlálós ciklus? 2. A fenti tételek közül melyeknél kell a képzetes utolsó utáni

elemet használni programírásnál és miért? 3. Mi az alapvetı különbség a kiválasztás és a keresés között? 4. Mi az alapvetı különbség a kiválogatás és a kiválasztás között? 5. A megszámlálás tétele a keresésre vagy a kiválogatásra hasonlít jobban? 6. Miért nem használtunk képzetes utolsó utáni elemet a színtócsás példáknál? 7. A hatékonyságról szóló fejezet prímszámos példája melyik tételhez tartozik? 8. Melyik tételhez tarozik az a feladat, ahol a 10000 alatti prímszámokat kell meghatározni. 9. Milyen tételek szerepelnek a szópóker program egyes eljárásaiban? Feladatok ☺ ☺ ☺ ☺ ☺ ☺    134 1. Készíts programot, amely bekér egy számsorozatot és megadja, hogy van-e prímszám a számsorozatban! 2. Készíts programot, amely bekér egy számsorozatot és megadja, hány prímszám van a sorozatban! 3. Készíts programot, amely bekér egy számsorozatot és kiírja közülük a prímszámokat! 4.

Készíts programot, amely bekér egy természetes számokból álló számsorozatot és kiírja közülük található négyzetszámokat! 5. Készíts programot, amely bekéri egy osztály tanulóinak a családneveit és megállapítja, hogy van-e olyan név, amely y -ra végzıdik, és ha van, akkor kiír egy ilyet. 6. Készíts programot, amely bekéri egy osztály tanulóinak a családneveit és kiír egyet, amely öt betőnél hosszabb. 7. Készíts programot, amely a Fájlkezelés fejezet példájában szereplı alma.txt fájlban meghatározza, hogy hányadik szó a "gondolat" 8. Készíts programot, amely a Fájlkezelés fejezet példájában szereplı alma.txt fájlban megkeresi, hogy van-e a szövegben a program elején bekért szó, és ha igen , akkor a hányadik! 9. Készíts programot, amely a Fájlkezelés fejezet példájában szereplı alma.txt fájlban megszámlálja a szavakat és a beőket!  10. Készíts programot, amely a Fájlkezelés fejezet

példájában szereplı alma.txt fájlban megszámlálja, hányszor szerepel benne az "alma" szó.  11. Készíts programot, amely bekéri egy használt autó kereskedés éppen aktuális típusválasztékát és megkérdezi, hogy milyen márkára vagy kíváncsi és az összes olyat kiírja.  12. Az elıbbi feladat, de csak egyet ír ki, ha van  13. Szintén ugyan az a feladat, de azt írja ki, hogy a kérdéses márkából hány példány van éppen a kínálatban. (A fenti három feladatban az eleme? függvényt is kell használni.) Használati szabálya: eleme? mi minek formájú és „igaz” / „hamis” választ ad.) (Pl. az OPEL CORSA és az OPEL| VECTRA is Opel márkájú autók)  14. Döntse el a teknıs, hogy aktuális helyének 20 képpontnyi körzetén belül van-e háttérszíntıl eltérı színő pont.  15. A teknıs színezzen pirosra minden olyan pontot, amely háttértıl eltérı színő és legfeljebb 20 képpontnyira van a teknıs induláskor

aktuális helyétıl! (Melyik tételt kell a feladat megoldásához és hányszor használni?) 135 Szélsıérték kiválasztás, sorozatszámítás, másolás Míg az elızı fejezetben tárgyalt tételek rokonságban álltak egymással, elég hasonló volt az algoritmusuk is, addig a most következık már eléggé különböznek. Szélsıérték (maximum, minimum) kiválasztás Adott egy halmaz. Add meg a legnagyobb (vagy legkisebb) elemét! Néhány példa: – Van egy bélyeggyőjtemény. Katalógusárak alapján melyik a legértékesebb példány? – Adott egy osztály. Mi a legrosszabb tanulmányi átlag? – Adott egy cég. Mennyi a legmagasabb fizetés? – Május hónapban minden nap feljegyzik a déli hımérsékletet. Melyik nap volt a legmelegebb? A kérdésekbıl kitőnik, hogy mind valamilyen tulajdonság felsı fokára kérdez. Mind valamilyen „leg-et” akar megtudni Ha a feladat szövegében ilyen „leg.” szerepel, akkor valószínő, hogy szélsıérték

kiválasztással van dolgunk. Arra kell figyelni, hogy a legnagyobbra (maximum) vagy a legkisebbre (minimum) kíváncsi a feladat. Ha például a legöregebb embert kell megadnom egy csoportból, akkor a legnagyobb életkort, de a legkisebb születési évszámot kell kiválasztanom. Nemcsak a legnagyobb vagy legkisebb érték lehet a kérdés, hanem ezek sorszáma is. Szélsıérték kiválasztáshoz is végig kell járnunk az egész halmazt. Ez pedig azt jelenti, hogy számlálós ciklust kell alkalmazni. Ha a maximumot kívánjuk kiválasztani, akkor vesszük a halmaz elsı elemét és kinevezzük maximumnak. Ezután vesszük a következıt Ha az nagyobb, akkor kicseréljük és ezután azt tekintjük maximumnak, ha nem nagyobb akkor tovább megyünk. A halmaz minden elemét összehasonlítjuk az addig talált legnagyobbal és csak akkor cserélünk, ha a halmazelem nagyobb. A végén a halmaz legnagyobb eleme marad a maximumnak kijelölt helyen (változóban). 136 Maximum

kiválasztás: max = X1 maxi = 1 n = X elemszáma ciklus i = 2-tıl n-ig ha Xi > max akkor max = Xi maxi = i ciklus vége kiír: maxi, max eljárás vége Azért fut a számlálós ciklus a második elemtıl, mert az elsıt rögtön elhelyeztük a max változóban és csak a másodiktól kezdve kell hasonlítgatni. A Maxi változóban a sorszámát tároljuk az addig talált legnagyobbnak. Mi van olyankor, ha a maximális érték többször is elıfordul a halmazban? Olyankor az elsı ilyen maximális értékő elemet választja ki az algoritmus. A maximum kiválasztás általános formájának blokkdiagramja: 30. ábra: A maximum kiválasztás folyamatábrája Elsı példaként ismét visszanyúlhatunk a névsoros témakörhöz. I. FELADAT: Adott egy listán egy osztály tanulóinak a keresztnevei. Írja ki a program, 137 hogy ki a legutolsó az ábécé szerinti névsorban! (A nevek nem ábécé sorrendben, hanem össze-vissza vannak a listán). A < és a >

reláció szavak közt is értelmezve van. Ilyen esetekben a nagyobb azt jelenti, hogy az ábécé szerinti névsorban utána van. Nem kell mást tennünk, mint az általános algoritmust alkalmazni a konkrét feladatra. A sorszámot a feladat nem kéri, ezért nem is vesszük be a programunkba a sorszám kiíratását. NévUtolsó: bekér: keresztnevek utolsó = keresztneveki n = keresztnevek elemszáma ciklus i = 2-tól n-ig ha keresztneveki> utolsó akkor ciklus vége kiír: utolsó eljárás vége utolsó = keresztneveki Az eljárás Comenius Logo programja: tanuld NévUtolsó tí kiírbelsı [A nevek] név "keresztnevek olvaslista név "n ( elemszám :keresztnevek ) név "utolsó elem 1 :keresztnevek név "L lista 1 :n ciklus "i :L ~ [ha elem :i :keresztnevek > :utolsó ~ [név "utolsó elem :i :keresztnevek][]] kiír :utolsó vége Ha a legelsı nevet szeretnénk kiválasztani, akkor csak a relációs jelet kellene megfordítani az

elágazás feltételében. Ekkor minimum kiválasztást kapunk. Még most sem kell lemondani a teknıcös szemléltetı példánkról. A színsávok különbözı szélességőek. II. FELADAT: A teknıc a színtócsa közepérıl indul. Haladjon végig a tócsa sugarán és írja ki a program a legvégén, hogy hányadik színsáv a legszélesebb! Itt a keretprogram rendkívül leegyszerősödik. Nem kell adatot bevinni Csak a színtócsát kell a rajzlapon elhelyezni, meghatározni a tócsa szélességét és elindítani a MaxKiválasztást. 138 Szöveges leírás helyett elegendı maga a keretprogram is: tanuld MaxKiválasztósdi tr színtócsa név "szélesség tócsaszélesség MaxKiválasztás vége A MaxKiválasztás viszont azért bonyolultabb, mert nem csak a maximális szélességő színsáv kiválasztásával kell foglalkoznunk, hanem közben mérni is kell az egyes sávok szélességét. Ettıl válik olyan bonyolulttá az algoritmus. Két elágazást kell

egymásban elhelyezni A külsı elágazás azt figyeli, hogy új színsávba lépett-e a teknıs. Ha nem, akkor méri tovább a sáv szélességét. Ha új sávba lépett, akkor új elágazás következik Ez a maximum kiválasztás elágazása. Itt hasonlítjuk össze a legutoljára mért sávszélességet az eddig talált legszélesebbel. Ha beállítottuk (vagy változatlanul hagytuk) a max és a maxsorsz értékét, akkor, mivel új sávba léptünk nullázni kell a sávszélességet ill. növelni kell eggyel a sáv sorszámát A szöveges leírás: MaxKiválasztás: szín0 = szín a teknıs alatt sávszélesség = 0 sorszám = 1 max = 0 maxsorsz = 0 ciklus i = 1-tıl szélesség-ig lépj elıre 1-et ha NEM Újszín? (szín a teknıs alatt) akkor sávszélesség = sávszélesség + 1 különben ha sávszélesség > max akkor max = sávszélesség maxsorsz = sorszám elágazás vége sorszám = sorszám + 1 sávszélesség = 1 elágazás vége ciklus vége kiír: maxsorsz

eljárás vége Az eljárás programjában a sávszélesség mérését zöld, a maximum kiválasztást piros színnel emeltük ki a jobb követhetıség érdekében: 139 tanuld MaxKiválasztás tf név "szín0 pontszín név "sávszélesség 0 név "sorszám 1 név "L lista 0 :szélesség név "max 0 név "maxsorsz 0 ciklus "i :L ~ [e 1 várj 10 ~ ha nem újszín? pontszín ~ [név "sávszélesség :sávszélesség + 1] ~ [ha :sávszélesség > :max[név "max :sávszélesség ~ név "maxsorsz :sorszám][]~ név "sorszám :sorszám + 1 ~ név "sávszélesség 1]] kiírbelsı "A ( ki :maxsorsz ". sáv a legszélesebb ) vége Sorozatszámítás Adott egy (szám)halmaz. Kiindulunk a mővelet nullelemébıl A halmaz elsı eleme és a nullelem között elvégezzük a mőveletet, és egy részeredményt képezünk. Ezután vesszük a halmaz következı elemét és a részeredményt, és új részeredményt

képezünk vele és így tovább. Néhány példa: – Számítsd ki az osztály tanulmányi átlagát matematikából. – Számítsd ki a háztartási könyvelés alapján, hogy az elmúlt hónapban mennyi volt a család összes kiadása! – Számítsd ki, mennyi az elsı tíz természetes szám szorzata. (Ezt a számot nevezik 10 „faktoriálisának” és 10! -nek jelölik.) – Mennyi az elsı 100 természetes négyzetszám összege? Itt a feladat szövegébıl nem derül ki valamilyen árulkodó szóhasználat folytán, hogy sorozatszámítási tétellel van dolgunk. Legfeljebb, ha szerepel a feladat szövegében az „összege” kifejezés, akkor gyanítjuk, hogy összegezni kell, az pedig sorozatszámítás. Való igaz, hogy az összegzés a legjellemzıbb változata a sorozatszámításnak. Ezért szokták néha „Összegzési tételnek” is nevezni. Lehet azonban más mővelet is a sorozatszámításban, nemcsak az összegzés. Magyarázatra szorul még a mővelet

nulleleme. Ez az a szám, amellyel, ha mőveletet végzünk egy másik számmal, akkor az nem változtat a 140 másik szám értékén. Az összeadás- kivonásnak a nulleleme a 0, ugyanis, ha 0-t adunk egy számhoz vagy vonunk ki belıle, akkor a szám nem változik. A szorzásnak, osztásnak 1 a nulleleme, mivel 1-gyel szorozva vagy osztva egy számot a szám nem változik. A sorozatszámítás elvégzésekor az egész számhalmazunkon végig kell menni és minden elemével el kell végezni a mőveletet. Ebbıl rögtön következik, hogy számlálós ciklust kell alkalmazni. Említettük, hogy többféle mővelet is szerepelhet a sorozatszámításoknál. Ezért egy ⊕ jelet teszünk az általános algoritmus-leírásban a mőveleti jel helyére. Ezt kell az adott feladat megfelelı mőveletével (+, - *, stb.) behelyettesíteni Az algoritmus általános formája: Sorozatszámítás: részeredmény = nullelem n = X elemszáma ciklus i = 1 -tıl n -ig részeredmény =

részeredmény ⊕ Xi ciklus vége kiír részeredmény eljárás vége Az általános algoritmus blokkdiagramja: 31. ábra: A sorozatszámítás folyamatábrája Itt már el kell köszönnünk a névlistás példáinktól és a színtócsás szemléltetı példáktól is. Volt már azonban az elızı kidolgozott algoritmus példák között egy sorozatszámítás: az átlag kiszámítása. Ez volt a második 141 példánk a számlálós ciklus ismertetésekor. Ott is összegzést végeztünk, csak a végén az összeget el kellett osztani a tényezık darabszámával. I. FELADAT: Készíts programot, amely kiszámítja az elsı húsz természetes szám szorzatát! Nincs más dolgunk, mit az általános algoritmusba helyesen behelyettesíteni: Faktoriális: részeredmény = 1 ciklus i = 1 -tıl 20-ig részeredmény = részeredmény * i ciklus vége kiír: részeredmény eljárás vége Itt még Xi bevitelére és használatára sincsen szükség, hiszen Xi = i . A halmazunk a

természetes számokat tartalmazza 1-tıl 20-ig. Ezeken fut végig éppen a számlálós ciklus. A ⊕ jel helyére a * jelet kellett behelyettesíteni, a nullelem pedig szorzás esetén: 1. A Comenius Logo programja is nagyon egyszerő: tanuld Faktoriális név "részeredmény 1 ciklus "i [1 30][név "részeredmény :részeredmény * :i] kiír :részeredmény vége A maximum kiválasztási tétel színtócsás szemléltetı példájában van egy sorozatszámítás is „elrejtve”. A programba zölddel jelölt rész a sávok szélességét „méri le”. Ez sávonként egy-egy sorozatszámítási feladat, azaz össze kell adni a lépéseket (összegzés) egy-egy sávon belül. Másolás Adott egy halmaz. Minden eleméhez rendeljünk hozzá egy „értéket” valamilyen szabály szerint! Néhány példa: – Van egy bélyeggyőjtemény. Minden bélyeghez add meg az becsült értékét! – Adott egy osztály. Minden tanulónak a neve mellé tőntesd fel a

lakcímét. – Adott egy cég. Minden alkalmazottnak a neve mellett tőntesd fel a fizetését. 142 – Adott egy cég. Minden alkalmazottnak a neve mellett tőntesd fel a személyazonossági igazolványának a számát. – Adott egy vonatjárat. Minden megállóhelyhez tőntesd fel az érkezési idıpontot. Készíts táblázatot 0 -tól 10-ig 0,1 lépésközönként a számok négyzetgyökével! Itt sincsen biztos szöveges fordulat, amibıl rögtön kiderülne, hogy másolási tétel segítségével oldható meg a feladat. Támpont lehet azonban, hogy ha valamilyen táblázatot kell készíteni számított adatokból (négyzetgyök táblát, négyzetszám táblát, szorzótáblát, bármilyen függvénytáblát, stb.), akkor az másolási tételhez vezet A fenti példákból van még egy terület, ami biztosan másolási tétellel oldható meg: minden kódolási feladat (pl. az alkalmazottak szig száma) Az algoritmus nagyon egyszerő. Az egész halmazt végig kell járni,

tehát számlálós ciklus kell. Minden Xi elemhez egy Yi -t rendel A ciklus végigfut az egyes Xi elemeken és számítással vagy valamilyen más módon elvégzi a hozzárendelést és általában ki is írja vagy egy változóban elhelyezi (ugyan olyan sorszámokkal). Másolás: n = X elemszáma ciklus i = 1 -tıl n -ig Xi Yi kiír: Yi ciklus vége eljárás vége A hozzárendelést jellel jelöltük. Ez lehet egy Yi = f (Xi) függvény, valamilyen kódtáblából egy kód hozzárendelése vagy az egyes elemekhez egyéb kérdéses tulajdonság megadása. Az általános algoritmus blokkdiagramja: 143 32. ábra: A másolás folyamatábrája A Comenius Logonak van egy igen kellemes szolgáltatása. Ha a parancssorba begépeljük azt, hogy hangsor vagy a memória ablak Alapszavak hangsor menüpontjából választjuk ki a hangsor utasításszót, akkor megjelenik egy ötvonalas kottasor, ahol hangjegyeket helyezhetünk el egér segítségével. Az így megszerkesztett zenét meg

is hallgathatjuk. Eközben a Comenius Logo elvégzi a hangjegyek kódolását egy szöveges jellegő kódsorrá. Itt is egy másolási tételhez tartozó feladat van a szolgáltatás mögé elrejtve. Elızı példáink között már szerepelt másolás. Szintén a számlálós ciklus bemutatásánál volt egy szorzótáblás algoritmus. Itt ismét használhatjuk a névlistás feladatkörünket. I. FELADAT: Adott egy listán egy osztály tanulóinak a keresztnevei. Add meg minden névhez a név hosszát ( hány karakterbıl áll)! Itt sincs semmilyen különleges dolgunk. Csak az általános formába kell helyettesíteni: NévHosszak: bekér keresztnevek n = a keresztnevek száma ciklus i = 1 -tıl n -ig kiír keresztneveki, karakterszáma(keresztneveki) ciklus vége eljárás vége 144 Az eljárás programja: tanuld NévHosszak tí kiírbelsı [A nevek] név "keresztnevek olvaslista tí név "n ( elemszám :keresztnevek ) név "L lista 1 :n ciklus "i :L ~

[kurzorhely! lista 5 :i kiír elem :i :keresztnevek ~ kurzorhely! lista 25 :i ~ kiír elemszám ( elem :i :keresztnevek)] vége Igen egyszerő algoritmus és egyszerő program. A legnagyobb gondot általában a kiíratás pozícionálása okozza. A következı feladatunkban is szinte az egyetlen megoldásra váró kérdés a számok megfelelı elhelyezése az írólapon. II. FELADAT: Készíts négyzettáblázatot, amely 0.2-enként tartalmazza a számok négyzeteit 0 -tól 10 -ig. Példázza ez a feladat azt, hogy maga a feladat programozási tétel szerinti végrehajtása rendkívül egyszerő. Az eredmények megjelenítésétıl azonban elvárjuk, hogy jól áttekinthetı, esztétikus legyen. Ha kicsit is igényesek vagyunk, akkor ez az adatkiíratás jelenti inkább a problémát és ezzel együtt a bonyolultságot az elkészült eljárásban. Az algoritmus-leírásból most szándékosan kihagyjuk a kiíratás részletezését.: NégyzetTábla: kiír táblázat fejléc kiír

táblázat oldalléc ciklus i = 0 -tól 10 -ig 0.2 -enként 2 pozícionáltan kiír i ciklus vége eljárás vége Az algoritmus rendkívül egyszerő. Nem látszik belıle, hogy a pozícionált kiírás milyen problémákat rejt magába. Úgy szeretnénk a négyzet táblázatot megjeleníteni, hogy oldalt (piros színnel) legyenek az egész számok, a fejlécen (szintén pirossal) a tizedes tört részek oszlopfejlécként. A 3 sorába és 0.6 oszlopába kerüljön például a 362 Az oszlopok tíz karakternyi helyenként kövessék egymást. Az látszik a legegyszerőbbnek, ha bevezetünk egy x változót az oszlopok és egy y változót a sorok pozícionálására. x tízenként növekszik, y egyenként. Igen ám, de ekkor átlósan végigfutna a kiíratás a képernyın és kifutna belıle. Nem ez a célunk Azt kell 145 megoldanunk, hogy öt adatot tíz karakterenként egymás mellé írjon, csak ezután lépjen új sorba. Ezért a 10 karakterhelynél kezdjük a kiíratást és

az x értékét növeljük ugyan tízenként, de vesszük az 50-nel osztás maradékát. (Ez éppen 0-tól 40ig változik.) Az y-t ugyan egyenként léptetjük, de csak ötönként kell új sorba ugrani. Ott az y és az 5 egészhányadosát kell venni ( Ez éppen ötönként ugrik egyet.) Bizony elég bonyolult Tekintsük ezt egy ötletet adó példának! Az eljárás programjában piros színnel emeltük ki a másolás tételét. Kékkel írtuk a fej- és oldalléc kiíratását. Zölddel a számított adatok pozícionált kiíratását: tanuld NégyzetTábla ía tí írószín! 244 ciklus "i [0 4][kurzorhely! lista ( 10 + :i * 10 ) 1 ~ ki :i / 5] ciklus "i [0 10][ki :i] írószín! 240 név "x 0 név "y 0 ciklus "i [0 10 0.2] ~ [kurzorhely! lista ( 10 + maradék :x 50 ) ~ ( 2 + egészhányados :y 5 ) ~ ki :i * :i ~ név "x :x + 10 ~ név "y :y + 1] vége Még ez a program-eljárás sem az igazi. A lefuttatáskor látjuk, hogy a számok nem helyi

értékesen kerülnek egymás alá, hanem csak egymás alatt kezdıdnek. A helyi érték szerinti pozícionálás még tovább bonyolított volna a helyzeten. Ettıl most eltekintettünk Ellenırizd tudásod! 1. Miért a sorozat második elemétıl indul a számlálós ciklus a maximum kiválasztási algoritmusban? 2. Ha több maximális érték is van, akkor melyiket adja meg a maximum kiválasztási algoritmus? Hogyan kellene módosítani, hogy a másikat adja meg? 3. Egyetlen végigpásztázással megkapható-e az összes maximális értékő elem egy sorozatból? Hogyan oldható meg, hogy mindet kiírja? Szükség van-e másik tételre is? 4. Mitıl függ, hogy mi a nulladik eleme a sorozatszámításnak? 146 5. A feltételes ciklusok fejezete után a 4 feladat a π közelítı kiszámítása Milyen tételhez tartozik? Miért van benne mégis feltételes ciklus? 6. Bármilyen függvénytábla kiíratása milyen tételhez tartozik? 7. A véreredmény oldaláról nézve mi

legszembetőnıbb különbség a sorozatszámítás és a másolás tétele között? 8. Hány bemenı és hány kimenı adata van a másolási algoritmusoknak? Feladatok ☺ 1. Adott egy osztály tanulóinak a nevei Készíts programot, amely kiírja, hogy kinek a neve a leghosszabb és kié a legrövidebb! ☺ 2. Adott egy osztály tanulóinak a születési dátuma Készíts programot, amely kiírja, hogy ki a legidısebb és ki a legfiatalabb az osztályban! (Ügyelj arra, hogy hogyan használod a születési dátumokat!)  3. Szórásszámítás: A matematikában egy sokaság szórását úgy számítják ki, hogy minden egyes adatból kivonják a sokaság átlagát, ezt a különbséget négyzetre emelik. Ezeket a különbség-négyzeteket összeadják és az összeget osztják a (sokaság darabszáma - 1 )-gyel, ebbıl pedig négyzetgyököt vonnak. Készíts programot, amely egy osztály tanulóinak a magasságait kéri be, majd kiszámítja az átlagos magasságukat és a

magasság szórását!  4. Készíts programot, amely a 3 feladat adataiból minden adathoz kiírja, hogy mennyivel tér el az átlagtól!  5. Készíts programot, amely a 3 feladat adataiból kiválasztja a legnagyobb és a legkisebb „szórású” egyedi adatot. ☺ 6. Készíts programot, amely kiszámítja az elsı ezer természetes szám reciprokának összegét! ☺ 7. Készíts programot, amely kiszámítja az elsı ötszáz páratlan szám összegét!  8. Van egy számsor, amelyet Fibonacci-számsornak neveznek Az elsı két tagja 1 és 2 . Minden további tagja az elızı kettı összege Mi az 25 eleme? Készíts Programot a kiszámítására! (Milyen tétel?)  9. Készíts programot, amely kiírja a Fibonacci-számsor elsı 24 elemét!  10. Szín-zene: Gondoltál már rá, hogy egy dallam hangjainak színeket lehetne megfeleltetni, a színes sávok (egyforma magasságú téglalapok) hosszának pedig a hangok idıtartamát. Egy dallamot így egy színes vonallal is

leírhatnánk. Készíts programot, amelynél a hangsor utasítás zongorájával beviszel egy dallamot. (Az ablak alján levı Másol gombbal memóriába másolható a dallam kódja. Innen egy változóba viheted a Ctrl + V segítségével. A kód nemcsak a 147 hangmagasságokat tartalmazza. Az elsı négy eleme számodra felesleges.) Ezt a teknıs segítségével színes vonallá alakítod (Ügyelj rá, hogy 15 hangnál ne legyen nagyobb a hangterjedelme a dallamnak, mert akkor nem lesz elég színed!)  11. Készíts programot, amely a 10 feladatban létrehozott színes-vonal dallamot le tudja játszani úgy, hogy a teknıs végig halad a színes sávon és „lejátssza” a dallamot.  12. Készíts programot, amely a Fájlkezelés fejezet példájában szereplı alma.txt fájlban megkeresi a leghosszabb szót 148 Halmazok egyesítése és metszete Az itt következı két tétel klasszikus halmaz mőveleteket valósít meg. Egy alapvetı vonásában eltér ez a kettı az

eddigiektıl. Az idáig tárgyalt programozási tételek mindig csak egy halmazon végeztek valamit. Most két halmaz között kell mőveletet végezni. Általános algoritmus-leírásainkban nevezzük ezt a két halmazt X-nek és Y-nak. Itt is alsó index jelöli azt, hogy a halmaz hányadik elemérıl van szó. Az eredményhalmazt Z-nek nevezzük Egyesítés (unió) Adott két halmaz. Vond össze egy halmazzá úgy, hogy minden elem csak egyszer szerepeljen benne! Néhány példa: – Egy iskolában van kosárlabda sportkör és rajz szakkör. Készítsd el azoknak a névsorát, akik külön foglalkozásra járnak! – Egy botanikus expedíció indult Észak-Dunántúlon, egy pedig a Mátrában májusban virágokat begyőjteni. Milyen virágok szerepelnek a két kutató csoport győjteményében? – Egy nyelviskola angol és német nyelv oktatásával foglalkozik. Add meg a nyelvtanárok neveit! – Egy évfolyamon csak matematikából és fizikából volt bukás félévkor. Add

meg a bukottak neveit! A tétellel járó feladat könnyen megérthetı. Szükséges bemenı adat: a két halmaz adatai. Végeredményként egy halmazt kapunk, ami nem lehet kisebb a kettı közül a nagyobbiknál. (Legfeljebb éppen akkora, mert a kisebbik halmaz csupa olyan elemet tartalmaz, mint a nagyobbik is.) Figyelem! Idáig a halmazainktól nem követeltük meg, hogy minden elemet csak egy példányban tartalmazzon. (A matematikában a halmazokkal szemben ez követelmény.) Itt az egyesítés és majd a metszet tételnél is elıfeltétel, hogy a halmazok minden elemet csak egy példányban tartalmazzanak. Itt már két halmazzal van dolgunk. Végig kell futnunk mindkét halmazon. Ebbıl következik, hogy számlálós ciklus biztosan szerepel az algoritmusban. Az egyik (X) halmazt egyszerően bemásoljuk a Z eredményhalmazba. Ezután egyenként meg kell vizsgálni, hogy Y-ból mely 149 elemek nincsenek benne X-ben. Azokat szintén bele kell másolni Z-be Ez azt jelenti,

hogy a második (Y-t pásztázó) számlálós ciklusba bele kell ágyazni egy feltételes ciklust, amely a számlálós ciklusban éppen soron levı Yj-t egyenként addig hasonlítgatja az X elemeivel, amíg különböznek és van még X-elem. Ha a feltételes ciklusból azért léptünk ki, mert X elfogyott (és nem egyezett egyikkel sem az éppen soron levı Yj), akkor azt az Yj -t hozzá kell venni Z-hez. Ez bizony bonyolultabb algoritmus az eddigieknél! Itt is gondot okozhat az, hogy ha elfogyott X akkor a program meg akarja vizsgálni az utolsó utáni elemet. Sajnos itt sem ússzuk meg a képzetes utolsó utáni elem beszúrását. Egyesítés: n = X elemszáma m = Y elemszáma ciklus i = 1 -tıl n -ig Zi = Xi ciklus vége Xn+1 = egy képzetes elem db = n ciklus j = 1 -tıl m -ig i=1 ciklus amíg i ≤ n ÉS Xi ≠ Yi i=i+1 ciklus vége ha i > n akkor db = db + 1 Zdb = Yj elágazás vége ciklus vége Kiír: Z Eljárás vége Az elsı számlálós ciklust gyakran

megspórolhatjuk, mert néhány programnyelv (a Comenius Logo is) alkalmas arra, hogy egy egész sorozatot adjon értékként egy másik változónak. Ilyenkor nem kell elemenként átmásolni X-et Z-be. Az általános forma blokkdiagramjánál ezt a változatot mutatjuk be. A szöveges lejegyzésben ezt úgy is írhattuk volna egyszerően, hogy Z = X . 150 33. ábra: Az unió folyamatábrája Itt ismét neveket tartalmazó példát választhatunk. Most azonban nem egy, hanem két névlista szükséges. FELADAT: Az osztályból néhányan sportköri tagok, néhányan pedig a rajzszakkör foglalkozásaira járnak el. A két szabadidıs elfoglaltság külön napra esik, így néhányan mindkettıre járnak. Kik járnak valamilyen szabadidıs külön foglalkozásra? Szükséges adatok: a két lista a nevekkel (nevek1, nevek2). A végeredmény szintén egy neveket tartalmazó lista (különórán), ahol minden név már csak egyszer szerepelhet. Az algoritmus megtervezése nagyon

egyszerő. Csak be kell helyettesíteni az általános algoritmusba: 151 NevekEgyesít: bekér nevek1 bekér nevek2 n = nevek1 elemszáma m = nevek2 elemszáma különórán = nevek1 nevek1n+1 = egy képzetes elem ciklus j = 1 -tıl m -ig i=1 ciklus amíg i ≤ n ÉS nevek1i ≠ nevek2i i=i+1 ciklus vége ha i > n akkor különórán végére : nevek2j elágazás vége ciklus vége Kiír: különórán Eljárás vége A program is egyszerő. A nevek bevitelekor arra kell ügyelni, hogy a családnév után jelet tegyük, hogy a család és keresztnevet egy adatként tárolja (pl.: Tóth Anna Kiss Endre Varga Tamás stb): Az eljárás programja: tanuld NevekEgyesít tí kiírbelsı [A sportkör tanulói] név "nevek1 olvaslista kiírbelsı [A szakkör tanulói] név "nevek2 olvaslista név "n elemszám :nevek1 név "m elemszám :nevek2 név "L lista 1 :m név "különórán :nevek1 név "nevek1 utolsónak "* :nevek1 ciklus "j :L ~

[név "i 1 ~ amíg [és (:i <= :n)((elem :i :nevek1)<>(elem :j nevek2))]~ [név "i :i + 1] ~ ha :i > :n [név "db :db + 1 ~ név "különórán utolsónak (elem :j :nevek2) :különórán] []] ki "Külön foglalkozásra járnak: kiírsor :különórán vége 152 Metszet Adott két halmaz. Add meg azokat a halmazelemeket, amelyek mindkét halmazban megtalálhatók! Néhány példa: – Egy iskolában van kosárlabda sportkör és rajz szakkör. Sorold fel azoknak a neveit, akik mindkét foglalkozásra járnak! – Egy botanikus expedíció indult Észak-Dunántúlon, egy pedig a Mátrában májusban virágokat begyőjteni. Mely virágok szerepelnek mindkét kutató csoport győjteményében? – Egy nyelviskola angol és német nyelv oktatásával foglalkozik. Add meg azoknak a nyelvtanárok neveit, akik mindkét nyelvet tanítják! – Egy évfolyamon csak matematikából és fizikából volt bukás félévkor. Add meg azoknak a tanulóknak a

neveit, akik mind a két tantárgyból megbuktak! Ez a tétel az egyesítés rokona. Itt két halmaz közös részét kell meghatározni. Szintén két különálló halmaz adatai a bemenı adatok és az eredmény is egy halmaz. Az eredmény halmaz legfeljebb akkora, mint a két bemenet közül a kisebbik. (Akkora is csak abban az esetben lehet, ha a bemenet nagyobbik halmaza teljes egészében tartalmazza a kisebbiket.) Az összes halmazunkkal szemben követelmény (elıfeltétel), hogy egy elemet több példányban nem tartalmazhatnak. A metszetképzést egy számlálós ciklusba helyezett feltételes ciklussal tudjuk megoldani. A külsı számlálós ciklus az egyik halmaz elemein fut végig, közben minden egyes esedékes halmazelemet egy feltételes ciklus elkezd hasonlítani a másik halmaz elemeivel. A belsı feltételes ciklus addig fut, amíg nem talál megegyezı elemet a két halmazban vagy a másik halmaz elemei el nem fogynak. Ha azért lépünk ki a feltételes

ciklusból, mert találtunk megegyezı elemet, akkor a második halmazban a sorszám még kisebb a halmaz elemszámánál. Ezt kell vizsgálni egy feltételnek, és ha így van, akkor az eredményhalmaz végére felvesszük a külsı ciklusban éppen esedékes elemet. 153 Metszet: n = X elemszáma m = Y elemszáma Ym+1 = képzetes elem db =0 ciklus i = 1 -tıl n -ig j=1 ciklus amíg j ≤ m ÉS Xi ≠ Yj j=j+1 ciklus vége ha j ≤ m akkor db = db + 1 Zdb = Xi elágazás vége ciklus vége Kiír: Z Eljárás vége Itt is élni kell a képzetes elem beszúrásával. Az egyesítésnél az elsı halmaz (X) végére, itt a második (Y) halmaz végére kell beszúrni, nehogy a feltételes ciklusban nem létezı halmazelemre hivatkozzunk. Az általános forma blokkdiagramja: 34. ábra: Metszet folyamatábrája 154 Mintapéldának alakítsuk át az egyesítésnél bemutatott feladatot. FELADAT: Az osztályból néhányan sportköri tagok, néhányan pedig a rajzszakkör

foglalkozásaira járnak el. A két szabadidıs elfoglaltság külön napra esik, így néhányan mindkettıre járnak. Kik járnak mindkét szabadidıs külön foglalkozásra? A feladat megoldásához szintén csak helyettesíteni kell az általános algoritmusba. A második halmaz végére pl egy * jelet főzünk képzetes elemként. A különórán nevő változót itt is megtartjuk az eredmény metszethalmaz számára. (Csak azért nevezzük így, hogy könnyebb legyen összehasonlítani az egesítéssel.) A különórán változót az eljárás elején üresre állítjuk, azaz egy üres listaként hozzuk létre. Ezt legegyszerőbben úgy tudjuk megtenni, hogy az [] „értéket” adjuk neki, azaz a listát körülfogó szögletes zárójeleket üresen írjuk be. A különórán változó listáját mindig az utolsónak utasítással töltjük fel. Nézzük elıbb az eljárás algoritmusát szöveges leírással: NevekMetszet: bekér nevek1 bekér nevek2 különórán = üres n =

nevek1 elemszáma m = nevek2 elemszáma nevek2m+1 = „*” ciklus i = 1 -tıl n -ig j=1 ciklus amíg j ≤ m ÉS nevek1i ≠ nevek2j j=j+1 ciklus vége ha j ≤ m akkor különórán végére : nevek2j elágazás vége ciklus vége Kiír: különórán Eljárás vége 155 A feladat megoldásának programja: tanuld NevekMetszet tí kiírbelsı [A sportkör tanulói] név "nevek1 olvaslista kiírbelsı [A szakkör tanulói] név "nevek2 olvaslista név "különórán [] név "n elemszám :nevek1 név "m elemszám :nevek2 név "L lista 1 :n név "nevek2 utolsónak "* :nevek2 ciklus "i :L ~ [név "j 1 ~ amíg[és (:j <= :m)((elem :i :nevek1)<>(elem :j nevek2))]~ [név "j :j + 1] ~ ha :j <= :m ~ [név "különórán utolsónak(elem :i :nevek1) :különórán]~ []] ki "Mindkét foglalkozásra járnak: ks :különórán vége A Comenius Logo lehetıségei miatt nincs szükség a db változóra, hiszen az

általános algoritmusban is csak azt a célt szolgálja, hogy hányadik elemként kell az eredményhalmaz végére beszúrni az éppen oda irányított elemet. A Comenius Logonak van utolsónak utasítása (tulajdonképpen beépített függvénye), ezzel megtakarítjuk az eredmény elemeinek a számlálását. Ha pedig az eredmény halmaz elemeinek a száma kell, azt is könnyedén megkaphatjuk az elemszám beépített függvény segítségével. Ellenırizd tudásod! 1. Az unió és a metszet tételek bemenı és kimenı adatok szempontjából milyen hasonlóságot mutatnak egymáshoz, és miben különböznek a könyvünk elsı három tételétıl? 2. Van két halmazom: A és B C a két halmaz uniója, D a metszete Mi lesz a végeredmény, ha C és D unióját állítom elı? Mi lesz az eredmény, ha C és D metszetét állítom elı? 3. Miért kell képzetes utolsó utáni elemet használni mindkét tétel programozásánál? 4. Hány ciklust és milyeneket tartalmaz az unió és a

metszet tétele? 5. Ha tüzetesen megnézzük a metszet és unió tételeket, akkor azt látjuk, hogy a már korábban tanult tételek felfedezhetık bennük. Ezek kombinációjából áll elı a fenti két tétel. Mely korábban tanult tételeket fedezhetjük fel az unió és melyeket a metszet algoritmusában? 156 Feladatok ☺ 1. Két kutatócsoport egy idıben az ország két különbözı részén virágokat győjt. Milyen virágokat sikerült a két csoportnak begyőjteni? Készíts programot a feladat megoldására! ☺ 2. Az elızı feladat kutatócsoportjai milyen virágokat találtak meg mindketten? Készíts programot a feladat megoldására!  3. Az elızı fejezet 8 feladatában ismertettük a Fibonacci-számsort Adott ennek a számsornak az elsı 25 eleme és adott az összes 10000nél kisebb prímszám. Melyek azok a prímek, amelyek a Fibonacciszámsor halmazának is tagjai? ☺ 4. Készíts programot, amely elıállít egy véletlenszerő 6-os lottóhúzást

Elıbb kér tıled egy tippet, majd kiírja a nyerı eredményeket és a találataidat. (Milyen tételeket használsz?)  5. Készíts programot, amely bekér tıled egy versidézetet (soronként) és elkészíti a szöveg teljes szótárát (azaz szókészletét). 157 Rendezés Adott egy halmaz. Rendezd növekvı (vagy csökkenı) sorrendbe! Néhány példa: – Adott egy osztály. Rendezd ábécé szerinti sorrendbe a neveket! – Van egy cég. Rendezd a bérek szerint csökkenı sorrendbe az alkalmazottakat! – A polcon rakd a címek szerint ábécé sorrendbe a könyveket! – Egy számítástechnikai szaküzlet kínálatából rakd csökkenı árak szerint sorba a monitorokat az árlistán! Ezt a tételt könnyő felismerni. Ahol valamilyen sorba rakásról, elrendezésrıl van szó, az sorba rendezési tétel. Rendszerint a feladat szövege maga is tartalmazza a „sorba rendezni” kifejezést. Talán ez a legkönnyebben felismerhetı és az eddigiek közül a

legbonyolultabban algoritmizálható tétel. Itt ismét csak egyetlen halmazon végzünk mőveleteket. Általában a bemenı halmazt rendezzük és így ez egyben a kimenı adatok halmaza is, csak ott már rendezett formában. Itt a halmazunk ismét tartalmazhat egy-egy elemet több példányban is. (Pl több alkalmazottnak is lehet azonos a bére, több monitor típusnak is lehet azonos ára.) A végeredménytıl azt követeljük meg, hogy növekvı sorrend esetében a kisebb sorszámú elem kisebb vagy egyenlı legyen a következıhöz képest. Csökkenı sorrendnél ez nagyobb vagy egyenlı reláció. A sorba rendezéshez végig kell pásztázni az egész halmazt. Ebbıl máris gondolhatjuk, hogy számlálós ciklust tartalmaz az algoritmus. Egy végigfutással azonban nem tudjuk kialakítani a végsı sorrendet. A számlálós ciklus belsejében egy másik számlálós ciklust kell elhelyezni. A külsı ciklus valamelyik végén minden egyes ismétléskor egy-egy elemet a végsı

rendezettség szerinti helyre rak. A belsı ciklus azonban a még rendezetlen részt ismét és ismét végigpásztázza. Kicsit bonyolultnak tőnik és az is A két egymásba helyezett számlálós ciklus arra enged következtetni, hogy ez idıigényesebb algoritmus, mint az eddigiek. Elég sok lépés szükséges a rendezett állapot kialakításához. Több rendezı algoritmus ismert. A tételnek több jó algoritmus lehet a megoldása. Ezek azért születtek, hogy megkíséreljenek egy gyorsabb megoldást találni a feladat végrehajtására. Mindegyik rendezı algoritmusnak van valami elınyös és van valami hátrányos oldala a többihez képest. Nem mondhatjuk rá egyikre sem, hogy ez az igazán jó megoldás. Van, amelyik 158 enyhén rendezetlen sorokat gyorsabban rendez, mint a többi, van, amelyiket inkább nagyon rendezetlen sorok rendezéséhez célszerő használni. Mi itt csak egy rendezési elvet (algoritmust) tekintünk át: az un. „buborék elvő” rendezést.

Ezt azért nevezik így, mert ha a végérıl kezdik el visszafelé a pásztázást, akkor a legelején kezd kialakulni a rendezett (legkisebb) elemekbıl álló sorozat, azaz a legkönnyebb elemek „felszállnak” az elejére, mint a buborék. Mi az algoritmus bemutatásánál inkább az elejérıl kezdjük a pásztázást, ezért aztán a legnagyobb elemek kerülnek a végére, azaz a „nagyok süllyednek le”. Az algoritmus úgy mőködik, hogy páronként veszi a két szomszédos sorszámú elemet. Ha az elsı nagyobb, akkor felcseréli Egy végigfutással a legnagyobb rögtön a végére kerül. Ezután már csak az utolsó elıttiig kell ugyanezt tenni és így tovább. Egy segéd eljárást is használnunk kell, amely a halmaz paraméterként megadott sorszámú elemeit felcseréli (cserél (k,l)). Rendezés: n = az X elemszáma ciklus i = 2 -tıl n -ig ciklus j = 1 -tıl (n - i + 1 ) -ig ha Xj > Xj+1 akkor cserél ( j, j+1) ciklus vége ciklus vége eljárás vége

Cserél( k, l ) puffer = Xk Xk= Xl Xl= puffer eljárás vége Érdemes „eljátszani” az algoritmust. Vegyünk különbözı mérető tárgyakat pl. kavicsokat és rakjuk ki tetszıleges sorrendben Ez a bemenı adathalaz. Ezután próbáljuk meg követni az algoritmus leírás szerint a teendıket. A blokkdiagramon még könnyebb követni, hogy éppen hol tartunk az algoritmus lépései között. Az elejétıl kezdve akkor cserélünk két szomszédos kavicsot, ha az elsı nagyobb, mint a második. Egy végigfutással a legnagyobb kavics a végére kerül. Ezután ismét az elejétıl kezdjük, de már csak az utolsó elıttiig. Minden nekifutásban az elejétıl addig pásztázzuk végig a kavicssort, amíg a végén alakuló már rendezett sorozatrészletig nem érünk, azaz minden újrakezdésnél eggyel kevesebbig. 159 Az általános algoritmus blokkdiagramja: 35. ábra: Rendezés folyamatábrája A mintapéldánknál ismét a névsoros feladatkörhöz fordulunk: FELADAT:

Adott egy osztály. Rakd ábécé sorrendbe a tanulók neveit! Mint több elızı példánkban is, itt is a szavak közti <, > relációkat használjuk ki. Egy szó akkor „nagyobb” a másiknál, ha az ábécé sorrendben utána következik. Bemenı adataink a tanulók nevei egy lista típusú változóban (nevek). A családnév után itt se felejtsünk el jelet tenni, hogy egyetlen szóvá főzze össze a család- és a keresztnevet. A feladat programmá formálásakor már itt sem kell semmi mást tenni, mint behelyettesíteni az általános algoritmus leírásba a megfelelı változók neveit: 160 NevekRendez: bekér: nevek n = a nevek elemszáma ciklus i = 2 -tıl n -ig ciklus j = 1 -tıl (n - i + 1 ) -ig ha nevekj > nevekj+1 akkor ciklus vége ciklus vége eljárás vége cserél ( j, j+1) Cserél( k, l ) puffer = nevekk nevekk= nevekl nevekl= puffer eljárás vége A programmá írásnál is csak a szöveges leírásba kell behelyettesíteni a megfelelı Logo

utasításokat: tanuld NevekRendez tí kiírbelsı [A tanulók nevei] név "nevek olvaslista név "n elemszám :nevek név "Lk lista 2 :n ciklus "i :Lk ~ [név "Lb lista 1 ( :n - :i + 1 ) ~ ciklus "j :Lb ~ [ha ( elem :j :nevek ) > ( elem ( :j + 1 ) :nevek ) ~ [cserél :j ( :j + 1 )][]]] ks :nevek vége tanuld cserél :k :l név "puffer elem :k :nevek név "nevek csere :k :nevek ( elem :L :nevek ) név "nevek csere :L :nevek :puffer vége A program egyszerőbbnek tőnik, mint a blokkdiagram. A program rövidsége ne tévesszen meg bennünket! Elég sok adat, elég rendezetlen kezdı sorozat esetén bizony a futási idı is elég hosszadalmassá válhat. 161 Ellenırizd tudásod! 1. Mi a bemenete és a kimenete a rendezés tételnek? 2. Mit kell változtatni az algoritmuson, hogy csökkenı rendezettséget kapjunk? 3. Hány ciklust és milyeneket tartalmaz a rendezési algoritmus? 4. A fent ismertetett algoritmus legrosszabb esetben

hány cserét tartalmazhat? 5. Kétszer akkora rendezetlen halmaz rendezése nagyjából kétszer annyi ideig tart-e? 6. Próbálj meg más rendezı algoritmust kitalálni! Feladatok ☺ 1. A kidolgozott feladatot módosítsuk úgy, hogy a nevek hossza szerint rendezze a névsort a program!  2. Van egy méréssorozatod Kiszámítod a mért adat átlagát Rendezd a növekvı szórások szerint sorba az adatokat! (Az átlagtól való eltérés elıjelét ne vedd figyelembe!) Készítsd el a programját! ☺ 3. Készíts eljárást, amely az elızı fejezet 1 és 2 feladatának végeredményében szereplı virágneveket ábécé sorrendben írja ki.  4. Ha egy adatsort többféle szempontból szeretnénk rendezetten látni, akkor nem magát az adatsort rendezzük annyiszor, hanem csak az eredeti sor sorszámait vesszük föl a rendezést biztosító sorba. ( Pl. Peti Anni Dóri Tomi ábécés rendezésére a 2 3 1 4 sort, mert a 2 az ábécé szerinti sor elsı eleme, a 3. a második

és így tovább) Készíts programot, amely neveket ilyen sorszámokkal rendez ábécé és hosszúság szerint! Milyen tételt használsz a két rendezett sor kiíratásakor? 162 163 Fájlkezelési mőveletek Nem lenne teljes a kép, ha nem térnénk ki arra a kérdéskörre, hogy hol is van a helye az adatoknak. Attól függ, hogy a programunk párbeszédes módban csak néhány adatot kér-e tılünk. Ekkor ugyanis az a legegyszerőbb, ha a program ezt futás közben megkérdezi, mi pedig begépeljük. Van azonban olyan feladat is, amikor nagyon sok adatot kell megadni a programnak. Ilyenkor mindig begépelgetni nagyon kényelmetlen lenne, nem is beszélve a hibák lehetıségérıl. Sokkal célszerőbb, ha egy külön fájlba helyezzük el az adatokat, és a program onnan olvassa be és végzi el a szükséges mőveleteket. A program általános, a különbözı adatsorok külön fájlban találhatók, a programnak csak a fájl nevét (és elérési útvonalát) kell

megadni. Bemenı adataink tehát külön fájlban is kaphatnak helyet Hasonló helyzet áll elı olyankor is, ha a program kimenı adatainak olyan nagy a száma, hogy nehezen áttekinthetıek, sıt késıbb is szükség lehet rájuk. Ilyenkor a program a kimenı adatait egy fájlba írja, ahol bármikor hozzáférhetıek lesznek. A programírásnak egy fontos alapelve, hogy a programot és az adatokat, amelyeken a program valamilyen munkát végez, válasszuk el egymástól. Ennek egyik kézenfekvı eszköze a fájlból történı beolvasás és a fájlba írás. A Comenius Logo csak egyféle fájlt képes kezelni, az úgynevezett szöveges (szekvenciális) fájlt. A különféle programnyelvek általában ennél bıvebb fájlkezelési lehetıséggel rendelkeznek. Több féle fájltípus is létezik, például olyan is, amelyben a számadatok nem karakteresen, hanem a számítógép belsı számábrázolása szerint vannak eltárolva. A Logo ilyen lehetıséggel nem rendelkezik,

pusztán karakterenként szöveges formában tud fájlba írni, illetve ilyen formájú fájlból tud csak olvasni. Ez a fájlkezelési lehetıség is elegendı azonban. Szinte semmirıl nem kell lemondanunk, mert ezzel is megoldható a legtöbb feladat. Fájl létrehozása és írás fájlba Comenius Logoban rendkívül egyszerő létrehozni egy fájlt. Mindössze annyi történik, hogy a kiírni kívánt adatokat a képernyı helyett a megnevezett fájlba irányítjuk át, azaz a képernyı helyett a létrehozni kívánt fájlt nevezzük meg kimeneti eszközként. Ki kell tehát adni a: kiíróeszköz "fájlnév utasítást. Ennek hatására létrejön a megadott névvel egy üres fájl és ezután 164 minden kiíratás jellegő utasítás a fájlba ír mindaddig, amíg vissza nem veszzük a kiíratás célpontjának a képernyıt: kiíróeszköz [] Ez egyben a fájlt is bezárja. Ezt az utasítást kell használnunk fájl bezárásra Tegyük is meg az elsı olyan

alkalommal, amikor már nem szükséges, hogy a fájl nyitva legyen, ugyanis a nyitott fájl sérülékeny. Ha ezután a már bezárt fájlt ismét meg akarnánk nyitni a kiíróeszköz "fájlnév utasítással, akkor azt tapasztalnánk, hogy üres a fájlunk. Ne lepıdjünk meg. A Comenius Logo nem teszi lehetıvé, hogy egy létezı fájlhoz főzzünk hozzá további adatokat. A fájlkezelési fejezet végén majd arra is látunk egy példát, hogyan hidalható át ez az akadály. Hol jön létre a fenti módon létrehozott fájl? Természetesen, mint minden hasonló esetben, abban a könyvtárban (mappában), ahol az a program elhelyezkedik, amelybıl létrehoztuk. A Comenius Logo alapértelmezésben a PROJEKT könyvtárban helyezi el a Logo programokat, ezért a létrejövı fájlunk is ott fog megjelenni. Ha azt szeretnénk, hogy egy másik (akár távoli) könyvtárban jöjjön létre a fájlunk, akkor a nevével együtt meg kell adni az elérési útvonalat. Ez egy kicsit

más, mint minden más esetben A Comenius Logoban az útvonal elemeit tagoló backslash ( ) jeleket duplán kell alkalmazni: kiíróeszköz "meghajtó:\könyvtár\alkönyvtár\fájlnév A fenti módon létrehozott fájl olvasható mindazokkal az eszközökkel, amellyel egy szöveges fájl olvasható. Ezek közül a legegyszerőbb talán a Windows Jegyzettömbje. Felmerülhet még az a kérdés, hogy mi történik olyankor, ha az írószínt, a kurzorhelyet is beállítjuk fájlba történı íráskor? A válasz az, hogy semmi. Ezek az utasítások természetesen értelmüket vesztik, ezért semmilyen hatással nincsenek a fájlba írásra. A rajzlapra történı írás sem irányítódik át a fájlba, azaz betőzd utasítással nem lehet fájlba írni. I. FELADAT: A "Számlálós ciklus" fejezet I./b feladatát alakítsuk át úgy, hogy a különleges szorzótáblát egy "sztabla.txt" nevő fájlba írja • • Értelmezés: A feladat egyértelmő, még a

létrehozandó fájl nevét is megadta. Bemenı adatok: Itt is a szorzó. 165 • • • • Kimenı adatok: Valójában a Sztabla.txt fájl a kimenet, amely szorzótábla elemeit fogja tartalmazni. Elıfeltétel: A szorzó pozitív egész szám legyen, (bár minden számra mőködik az algoritmus, csak nem szokás negatív vagy tört szorzótábláról beszélni). Utófeltétel: Helyes legyen a fájlban létrejövı szorzótábla! Algoritmus: Szöveges leírás: Szorzótábla3: Bekér: szorzó Bekér: kezdıért végért lépésköz Megnyit "sztabla.txt" ciklus i = kezdıért -tıl végért -ig lépésköz -önként fájlba ír i * szorzó ciklus vége Bezár "sztabla.txt" fájlt Eljárás vége Láthatóan csak a fájlba irányítás és a fájl bezárás sora került bele a már ismert programszövegbe. Az eljárás programja: tanuld szorzótábla3 kiírbelsı [milyen szorzótábla legyen?] név "szorzó osz kiírbelsı [Add meg a kezdı és

végértéket és a lépésközt] kiíróeszköz "sztabla.txt név "L olvaslista ciklus "i :L [( ki :i "* :szorzó "= :i :szorzó )] kiíróeszköz [] vége Megtekinthetjük a Jegyzettömb segítségével, hogy hogyan is fest a szorzótábla az általunk létrehozott fájlban. Adatok beolvasása fájlból A fájlból történı adat beolvasás sem jelent nagyobb nehézséget, mint a fájlba írás. Természetesen csak szövegfájlból tud a Comenius Logo adatot beolvasni. Ezt a fájlt egy másik Logo programmal hozhatjuk létre, de akár egy egyszerő szövegszerkesztıvel mi is begépelhetjük. Elsısorban a Windows Jegyzettömbje ajánlható erre a célra, de a Comenius Logonak is 166 van egy szövegszerkesztı ablaka, amelyet az átírfájl paranccsal lehet elıhívni. Ha utána idézıjellel kezdve megadjuk a fájlnevet, akkor azzal a névvel nyit meg egy üres fájlt. Bizonyára könnyő kitalálni, hogy fájlból olvasáskor olvasó eszközt kell

megnyitni. A fájl megnyitása olvasásra az olvasóeszköz "fájlnév utasítással történik. Természetesen csak létezı fájl nyitható meg olvasásra Ha nem létezı fájlnevet adunk meg (vagy inkább elgépeltük a fájl nevét), akkor hibaüzenetet kapunk: Hiba: Problémáim vannak a(z) fájlnév fájllal A fájl bezárásáról szintén gondoskodni kell. Ez is hasonlóképpen történik, mint a fájlok írásánál. Vissza kell adni az olvasóeszköz feladatot a billentyőzetnek az olvasóeszköz [] utasítással. Kissé kényelmetlen, hogy egyszerre csak egy fájl lehet nyitva olvasásra (de írásra is), mivel ha egy újat megnyitunk, akkor a másik automatikusan bezáródik, és ha újból visszatérünk az elsıként megnyitott fájlhoz az olvasóeszköz utasítással, akkor megint az elejérıl kezd olvasni belıle a program. Ha fájlból olvassuk az adatokat, akkor ügyelnünk kell rá, hogy csak addig tudunk olvasni a fájlból, amíg el nem értük a végét.

A fájl végét egy fájlvég karakter jelzi, amit a fájlkezelı helyez el ott. Nekünk külön nem kell vele foglalkoznunk, viszont a programunknak figyelni kell, hogy nem értük-e el? Ezért ismeretlen számú adatot feltételes ciklussal olvasunk a fájlból: amíg [nem fájlvége?][a ciklus utasításai] Adatbevitelre itt is a szokásos olvasszó (osz), olvaslista (ol), olvasjel (oj) utasítások használhatók, amelyek az olvasó eszköz átállítása után a fájlból olvassák az adatokat. I. FELADAT: Adott egy vers egy szövegfájlban. a) Írassuk ki az írólapra szavanként, b) soronként. 167 • Értelmezés: Egyszerő feladat. Nekünk kell gondoskodni a versrıl Esetünkben nyissuk meg a Windows Jegyzettömbjét és gépeljük be mondjuk Weöres Sándor Az ábécé 25 betőjére írt versciklusából az A címőt. Minden sor végén üssünk ENTER-t! Mentsük el a ComLogo PROJEKT könyvtárába alma.txt néven A program kérdezze meg a fájl címét, így

tetszıleges fájlra általános megoldást készítünk. • Bemenı adatok: Valójában a fájl neve (fn) a meghatározó bemenı adat. Ez meghatározza a fájlban található adatokat, mint másodlagos bemenı adatokat. Kimenı adatok: a) A vers szavai (az írólapon). b) A vers sorai (az írólapon) Elıfeltétel: Létezzen a megadott fájl (a PROJEKT alkönyvtárban) és ne legyen üres. Utófeltétel: Helyesen és valóban a) szavanként b) valódi verssoronként tördelve írja ki a program a szöveget! Algoritmus: Szöveges leírás: • • • • 168 . Szavanként bekér: fn fn nevő fájl megnyitása amíg nem fájlvége kiír fájlból olvasott szót ciklus vége fn fájl bezárása eljárás vége Soronként: bekér: fn fn nevő fájl megnyitása amíg nem fájlvége kiír fájlból olvasott sor ciklus vége fn fájl bezárása eljárás vége • Az eljárások programja: tanuld szavanként kiírbelsı [A fájl neve] név "fn osz olvasóeszköz :fn

amíg [nem fájlvége?] ~ [ki osz] olvasóeszköz [] vége tanuld soronként kiírbelsı [A fájl neve] név "fn osz olvasóeszköz :fn amíg [nem fájlvége?] ~ [kiír ol] olvasóeszköz [] vége Látható, hogy az olvasszó utasítás szavanként olvas attól függetlenül, hogy hogyan van sorokra tördelve a szöveg. Az olvaslista (ol) pedig soronként olvassa ki a fájlból a szöveget. Ha kiír helyett ki utasítást írtunk volna a soronként nevő eljárásba, akkor a sorokat szögletes zárójelbe téve írta volna ki. II. FELADAT: A Szópóker program Választ eljárását módosítsuk úgy, hogy fájlban tárolt szavak közül válasszon véletlenszerően feladványt! • Értelmezés: Már ismeretes, hogy milyen célt szolgál az eljárás. Most úgy szeretnénk 169 • • igazán "profivá" tenni a programunkat, hogy a már említett elv szerint el akarjuk választani a programot és az adatokat. Jegyzettömbbel írunk egy fájlt, amelyben

felsoroljuk a lehetséges feladvány szavakat. (Minden szó új sorba, bár nincs igazán jelentısége.) Megkönnyíti a dolgunkat, ha a fájl elején az elsı sorban elhelyezzük a fájlban található szavak számát, és ezzel megtakarítjuk, hogy nekünk kelljen megszámlálni (egy végigfutás), majd annyi lehetséges szóból választani, ahányat találtunk (újabb végigfutás). Tároljuk ezeket a feladvány szavakat egy szavaktxt nevő fájlban. Azt a módszert követjük, hogy a fájl elsı sorából kiolvassuk a szavak számát, majd véletlen számot hozunk létre a szavak számának határáig és egy számlálós ciklusban annyi szót olvasunk ki a fájlból, amennyi a véletlen szám volt. Az utoljára kiolvasott szó lesz a feladvány Bemenı adatok: A fájl neve (szavak.txt) Kimenı adatok: feladvány • • • Elıfeltétel: A szopoker.lgp programmal azonos könyvtárban szerepeljen a szavak.txt fájl A fájl elsı sora helyesen tartalmazza a benne szereplı

szavak számát. A szavak ötbetősek legyenek! Utófeltétel: A feladvány egy ötbetős magyar szó legyen. Algoritmus: Szöveges leírás: Választ: megnyitni a szavak.txt fájlt olvasásra beolvas fájlból n ciklus i = 1 -tıl (véletlenszám n) + 1-ig beolvas fájlból feladvány ciklus vége bezárni a szavak.txt fájlt eljárás vége tanuld választ olvasóeszköz "szavak.txt név "n osz név "L lista 1 ( 1 + véletlenszám :n ) ciklus "i :L [név "feladvány osz] olvasóeszköz [] vége 170 Ha a szavak.txt fájlt rejtett attribútumúra állítjuk, akkor a játékosok nem láthatnak bele a lehetséges feladványokba. Fájlok bıvítése A Comenius Logoban nincs olyan utasítás, ami arra szolgálna, hogy létezı fájl tartalmához további adatokat főzzünk hozzá. Általában hozzáfőzési mőveletnek szokás ezt nevezni és néhány programnyelv külön utasítást biztosít rá. A Comenius Logoban bizony nekünk kell megszervezni Milyen

lépésekbıl áll a feladat általános végrehajtása? 1.) A fájl megnyitása olvasásra, 2.) egy segédfájl megnyitása írásra 3.) a segédfájlba írni a fájl tartalmát 4.) a segédfájlba írni a hozzáfőzni kívánt adatokat, 5.) bezárni mindkét fájlt, 6.) olvasásra nyitni a segédfájlt, írásra a fájlt (ezzel felülíródik), 7.) a fájlba írni a segédfájl tartalmát, 8.) bezárni mindkét fájlt, 9,) kitörölni a segédfájlt. A fentiek véghezviteléhez már mindent tudunk, mindössze a fájl törlését kell megismerni: törölfájl "fájlnév utasítással hajtható végre. Érdemes odafigyelni arra, hogy a fájlok megnyitása elıtt érdemes a hozzáfőzni kívánt adatokat beolvasni változó(k)ba, mert különben nem biztos, hogy azt fogjuk találni a kibıvített fájlban, amit oda szántunk. FELADAT: Írj programot, amely a Szópóker feladvány szavait tartalmazó szava.txt fájl bıvítését biztosítja további feladvány szavakkal. • •

• • Értelmezés: A fentiekben már tulajdonképpen tisztáztuk, hogy mit jelent a hozzáfőzési feladat. Bemenı adatok: szavak.txt fájl, újszavak adatlista Kimenı adatok: A (kibıvített) szavak.txt fájl Elıfeltétel: A szavak.txt fájl létezik, az újszavak adatlista valóban ötbetős magyar 171 • • közneveket tartalmaz, az elsı sorában pedig helyesen szerepel a benne levı szavak száma. Utófeltétel: A kibıvített szavak.txt fájl valóban tartalmazza a régi fájl szavait és az összes újszavak adatlistán szereplı szót. A fájl elsı sorában szereplı szám valóban a fájlban található szavak darabszáma. Algoritmus: A konkrét feladat annyi többletfeladatot jelent, hogy ki kell olvasni a fájl elsı sorából a benne található szavak számát és a segédfájlba már az újszavak számával megnövelt számot kell írni. Szöveges leírás: Hozzáfőzés: bekér újszavak adatlistát núj = újszavak elemszáma megnyitja olvasásra a

szavak.txt fájlt megnyitja írásra a segédf.000 fájlt beolvas a szavak.txt fájlból: nszavak kiír a segédf.000 fájlba: (nszavak + núj) ciklus i = 1 -tıl nszavak -ig kiír a segédf.000 fájlba: a szavaktxt fájlból olvasott szót ciklus vége ciklus i = 1 -tıl núj -ig kiír a segédf.000 fájlba: újszavaki ciklus vége bezár szavak.txt fájlt bezár segédf.000 fájlt megnyit olvasásra segédf.000 fájl megnyit írásra szavak.txt fájlt ciklus amíg nem fájlvége? kiír a szavak.txt fájlba: a segédf000 fájlból olvasott szót ciklus vége bezár szavak.txt fájlt bezár segédf.000 fájlt kitöröl segédf.000 fájlt eljárás vége 172 Az eljárásprogramja: tanuld Hozzáfőzés kiírbelsı [Add meg az új szavakat] név "újszavak ol név "núj elemszám :újszavak olvasóeszköz "szavak.txt kiíróeszköz "segédf.000 név "nszavak osz ki ( :nszavak + :núj ) ciklus "i lista 1 :nszavak [ki osz] ciklus "i lista 1 :núj [ki

( elem :i :újszavak )] kiíróeszköz [] olvasóeszköz [] olvasóeszköz "segédf.000 kiíróeszköz "szavak.txt amíg [nem Fájlvége?][ki osz] kiíróeszköz [] olvasóeszköz [] törölfájl "segéd.000 vége Programjainkat célszerő úgy megírni, hogy különválasszuk egymástól a programot és az adatokat, amelyeken a program valamilyem mőveleteket végez. Ennek egyik módja, hogy a nagyobb adatmennyiség külön fájlba kerüljön. Programból létrehozható szöveges fájl a kiíróeszköz "fájlnév utasítással. Szöveges fájlt olvasásra az olvsóeszköz "fájlnév utasítással nyitható meg. Fájlba írásra a ki, kiír, kiírbelsı utasítások, fájlból olvasásra az olvasszó (osz), olvaslista (ol) olvasjel (oj) és az utasítások szolgálnak. Fájlokat célszerő a használatuk után közvetlenül bezárni. Erre a kiíróeszköz [] olvsóeszköz [] utasítások használatosak. Ellenırizd tudásod! 1. Miért célszerő adatokat

fájlban tárolni? 173 2. Miért célszerő elválasztani az adatokat a programtól? 3. Milyen formában tárol adatokat a Comenius Logoban használható adatfájl? Feladatok ☺ 1. Készíts programot, amely fájlban négyzet táblázatot készít! ☺ 2. Készíts programot, amely fájlban négyzetgyök táblázatot készít!  3. Tárold el a féléves bizonyítványodat egy szöveges fájlban úgy, hogy minden sorban elıl a tantárgy neve, utána helyközzel elválasztva a félévi (év végi) jegy legyen. Készíts programot, amely ebbıl a fájlból kiszámítja az átlagot!  4. Módosítsd a Szópóker programot úgy, hogy kezdetben kérdezze meg a játékos nevét, majd tárolja el az elért eredményét egy fájlban. Az igazi az a megoldás, ahol hozzáír a korábbi eredményekhez. 5. Készíts programot, amely ismerısök nevét, lakcímét, telefonszámát tárolja el fájlba. Oldd meg, hogy új személy adatai is felvehetıek legyenek ebbe a nyilvántartásba! 174

175 Kedvcsináló Mire a könyvnek ehhez a fejezetéhez érünk, már elmondhatjuk, hogy szereztünk némi jártasságot a Comenius Logo programozásban. Megismertünk jó néhány programutasítást. Megismerkedtünk algoritmikus vezérlıszerkezetekkel, néhány tipikus algoritmussal (programozási tétellel). Mindez biztos alapot jelenthet ahhoz, hogy komolyan belevessük magunkat a programírás kalandjaiba, ha kedvet érzünk hozzá. Valóban kalandos vállalkozás. Nehéz feladatok elé állít, próbára teszi a türelmünket, ötletességünket, logikus gondolkodásunka, de azt az örömöt is csak megismerni lehet, amivel egy jól mőködı saját program megajándékoz, elmesélni nem lehet. Mi mindenre használható még a Comenius Logo? Az alábbiakban rövid áttekintés következik a teljesség igénye nélkül, hogy a Comenius Logonak mi mindenre vannak eszközei, milyen további erısségei vannak. Az itt felsorolt területeknek utána lehet nézni a Súgóban

Alapos kifejtésük egy további könyvet igényelne. Egérkezelés A Comenius Logo grafikus felületet kezelı ("Windowsos") program, ezért az egér fontos szerepet kap. Lekérdezhetı az egérkurzor helye, követhetı, hogy lenyomtuk-e az egér valamelyik gombját, rákattintottunk-e valamilyen képernyı területre. Beállítható az egérkurzor alakja, sıt önállóan (az egérmozgatástól függetlenül is) pozícionálható. Ezekkel a lehetıségekkel teljes értékő egérkezelés oldható meg. Elıugró ablakok Ezeket a Comenius Logo "üzenı ablakoknak" nevezi. Kétféle ilyen ablak létezik: olyan üzenı ablak, amelyik csak valamilyen szöveges üzenetet tartalmaz, amelyet ha elolvastunk, akkor az OK gombra kattintunk, és ezzel bezárul az ablak. A másik adatbevitelre szolgál (Más nyelvek szokták "InputBox"-nak is nevezni.) Gombsor Függılegesen elhelyezkedı gombsor, amelynek minden gombjára szöveges felirat vagy ikon kerülhet. A

gombokhoz utasítások vagy eljárások rendelhetık. Menü vezérelt programok használhatják 176 Animáció Az egyik igazi erıssége a Comenius Logonak. A teknıs általunk megrajzolt figurára cserélhetı. Maximálisan 4 ezer teknıs helyezhetı el a rajzlapon. Ezek mind külön-külön és együttesen is irányíthatóak Képesek érzékelni az ütközést a másik figurával, sıt azt is, hogy melyikkel. A mozdulatoknak fázisai lehetnek, azaz valódi animáció valósítható meg. Ezekkel a lehetıségekkel nyitva áll a kapu játékok megszerkesztésére vagy szimulációk tervezésére. Koordináta geometria A teknıs(ök) nem csak robot-elvően, de a koordináta geometria szabályai szerint is mozgathatók a képernyın, azaz a képernyı koordináták szerint. A képernyı közepe a koordináta rendszer origója A teknıs megadott koordinátájú pontra küldhetı, ill. lekérdezhetı az éppen aktuális helyzete, sıt iránya is. További programozás-technikai

lehetıségek A programozásnak csak az alapjaiba kóstoltunk bele. A programkészítés fogásaiban csak ezt követıen mélyedhetnénk el. Ha egy változót létrehoztunk, akkor az az összes eljárás számára hozzáférhetı volt. Lehet a Comenius Logoban un lokális változókat létrehozni, amelyek csak az adott eljárásból láthatóak. Komolyabb programozási nyelvekben lehetıség van az un. moduláris programírásra. Ez azt jelenti, hogy gyakran használt eljárások egy-egy csokrát külön modulba lehet elmenteni. Az újabb programok már csak ezekhez a "modulokhoz" fordulnak és használhatják a már elkészített eljárásaikat. A Comenius Logoban is van lehetıség arra, hogy szöveges formában el lehet menteni eljárások csoportjait. Az így elmentett eljárások betölthetık másik Logo programba is, azaz "program könyvtárak" alakíthatók ki, nem szükséges mindig újraírni a már kipróbált eljárásokat, függvényeket. Van a Comenius

Logonak egy elég veszélyes, de nagyon hasznossá tehetı szolgáltatása (utasítása), amellyel egy változóban szövegként megadott sor utasítássá alakítható. Ezzel a lehetıséggel egy programfutás közben képes saját magát (azaz a programszöveget) módosítani. Veszélyes vállalkozás, de ha jól csinálják, akkor önmagát fejlesztı program írható vele. Fontos még megemlíteni a Logo függvényeit. Ezek egy önálló programozási elvet is képesek megvalósítani: a függvény-elvő programozást. Egy-egy program felfogható olyan függvényként, ahol a bemenı adatok a függvény paraméterei, a függvény értéke a kimenet, amely újabb függvény bemenete lehet. 177 Ez a könyv az un. Neumann-elvő programozás alapjait ismertette Ennek a lényege az elızı fejezetekben megismert algoritmikus vezérlıszerkezetekbıl való építkezés. A függvény-elvő programozás másként látja a világot: egymásba épített függvényekkel oldja meg a

feladatot. Nem ismer ciklust, csak önmagukra hivatkozó függvényeket ("rekurzió"). Nagyon hasznos lehet bizonyos típusú feladatok megoldásánál ez a szemlélet és módszer. Ha nem is törekszünk teljes függvény-elvő programok készítésére, de nagyon jól jöhet egy-egy olyan program rész, ahol kihasználjuk ezt a lehetıséget, mert ott éppen az az egyszerőbb. A függvény-elvő programozás magában is megérdemelne egy külön könyvet. Remélhetıleg sikerült felkelteni az érdeklıdést. Nem az út végén, hanem az elején állunk! 178 Függelék 179 A Segítség használata Ha nem ismerjük egy parancs használatát, ha elfelejtettünk valamit, ha többet szeretnénk megtudni, akkor mindig rendelkezésre áll egy lehetıség: forduljunk a Segítséghez! Más magyar nyelvő Windows felhasználásokban ezt Súgónak hívják. A Comenius Logoban a Segítség nevet kapta az angol „Help” szó közvetlen fordításaként. Ez egy sajátos

használati módú beépített kézikönyv, amelyben a legtöbb kérdésünkre lehet választ találni, csak tudni kell, hogyan. Többféle céllal használhatjuk. Más módon kell eljárnunk, ha csak egy parancs használati módjának akarunk utánanézni és másként, ha új ismereteket szeretnénk szerezni egy-egy programozási területen. Háromféle módon léphetünk be ebbe a Segítségbe: az egyik mód, hogy az ikonsor legelsı Help ikonjára kattintunk, a másik mód, hogy a menüsor Segítség menüpontjából választjuk ki a megfelelı almenüpontot. A harmadik módszer: az F1 gyorsbillentyő éppen oda visz, mintha a Help ikonra kattintottunk volna. Nézzük most meg, hogy különbözı céljainkhoz milyen stratégiát lehet javasolni! A Comenius Logo fejlesztıi környezet használata Ilyenkor kattintsunk a Help ikonra vagy nyomjuk meg az F1 gombot! Ekkor a Segítség címlapjára kerülünk. A címlap közepén két sort láthatunk: A Comenius Logo környezet sorra

kattintva újabb kínálat jelentkezik, ahol választhatunk, hogy a Fıablak, a Memóriaablak használatáról vagy a program elindításáról akarunk-e többet megtudni. További Logo környezettel kapcsolatos ismerethez is juthatunk még itt a többi pont segítségével, de ezek már csak a haladóknak nyújthatnak értékes eligazítást. 180 Egy utasítás használatát áttekinteni: a.) Csak az angol utasításszót ismerjük, mi a magyar megfelelıje és hogyan kell használni? Menjünk a fent leírt módon a Segítség címlapjára. Ott a fölsı menüsorban találunk két fontos menüpontot: ABC Magyar és ABC Angol Ez utóbbit válasszuk ki és megkapjuk a Comenius Logo angol nyelvő utasításainak ábécé sorrendő felsorolását, jobbról mellette a magyar megfelelıjével. Ha a magyar utasítás használatára is kíváncsiak vagyunk, akkor csak rá kell kattintani a szóra. b.) Egy utasításszó használatáról kívánunk többet megtudni • A Segítség

címlapjára lépünk, ott az ABC Magyar menüpontot válasszuk • A Segítség menüpont Alapszavak ABC listája almenüpontot válasszuk. A szavak listájáról kiválasztjuk azt, amelyikre kíváncsiak vagyunk és rákattintunk. Egy leírást kapunk az utasítás használatáról Legyen pl az amíg szó a kiválasztott: Ekkor a leírás fölött néhány további ikon jelenik meg. – Könyvespolc ikon: Egy felsorolást ad, hogy milyen témaköröknél találkozhatunk ezzel az utasítással ill. mely témakörökkel áll közeli kapcsolatban. Ha a felsorolt témakörök valamelyikére kattintunk, akkor ott további leírásokhoz, értékes információkhoz juthatunk. Akkor használjuk, ha el szeretnénk mélyedni a témakörrel kapcsolatos utasítások használatában. – Szemüveg ikon: Néhány további utasítást sorol fel, amelyek kapcsolatban állnak az éppen tanulmányozott utasítással. – Teknıc ikon Pl. felirattal a hátán: Néhány példát mutat be az utasítás

használatáról. Ez lehet a nem túl gyakorlott tanuló számára a leghasznosabb Ami esetleg nem volt világos a szöveges leírásból, az itt néhány egyszerő vagy bonyolultabb példa után talán érthetıvé válik. 181 Nem értünk néhány kifejezést a Segítség leírásaiban: Ha a leírások olyan kifejezéseket használnak, aminek nem vagyunk tisztában a jelentésével, akkor ezeknek a kifejezéseknek is utánanézhetünk szintén a Segítségben. Lépjünk a Segítség címlapjára, ott válasszuk a Kifejezések menüpontot. Ekkor a Logo leírására használatos kifejezések listája jelenik meg ábécé sorrendben. Ha például egy leírásban találkozol a logikai érték kifejezéssel és nem tudod, hogy ezen mit kell érteni, akkor itt az L betőbél kikeresheted és elolvashatod ennél a címszónál a magyarázatát. Egy programozási témakörrıl szeretnénk bıvebb ismereteket szerezni: Ha olyan feladat elıtt állunk, amirıl még nem tanultunk ez

idáig semmit vagy eleget, akkor, ha elég elszántak vagyunk nekiindulhatunk új terepeket felderíteni. Pl az animációról szeretnél többet megtudni: • A Segítség címlapjának Search menüpontjára kattintunk • A Segítség menüpont Témakörök keresése alpontjára kattintunk Ekkor egy oldalt gördítısávos ablak jelenik meg, benne ábécé sorrendbe rendezetten különféle témakörök felsorolása. Ha a felsorolás fölötti sorba beírjuk a minket érdeklı témakört, akkor ha talál olyat, rögtön odaugrik. Pl beírjuk az animáció szót és máris megjelenik a felsorolás animációval kapcsolatos néhány tárgyszava. Ezekre kattintva elolvashatjuk a tudnivalókat A Back menüponttal mindig visszatérhetünk az elızı helyre. Egy tématerület további utasításait szeretnénk megismerni: Ha nagyjából besorolható valamilyen tématerületre, amivel kapcsolatban további utasításokat szeretnénk megismerni, akkor: lépjünk a Segítség menü

Alapszavak témakörönként alpontjába. Itt az összes Comenius Logo utasítást és függvényt 19 csoportba sorolták. Az almenüpontba belépve ez a felsorolás jelenik meg Ha valamelyik témacsoportra kattintunk, akkor az oda tartozó utasítások, függvények felsorolása jelenik meg. 182 Egyszerően csak gazdagítani kívánjuk ismereteinket a Comenius Logo területén: Ha egyszerően csak tanulni szeretnénk, többet és még többet megtudni, akkor ehhez is kapunk segítséget, de ne számítsunk könnyő elıretörésre. Nehéz és fáradságos munka. Igaz, nincsen tudás fáradozások nélkül Az marad meg igazán sokáig az emlékezetünkben, amiért keményen megdolgoztunk. Felderítı útra indulhatunk: Lépjünk a Segítség címlapjára. Ott kattintsunk a Comenius Logo nyelv sorra. Ekkor egy felsorolás nyílik meg a sor alatt, amelynek néhány tagjával már foglalkoztunk korábban. Van azonban néhány felkínált továbblépési terület, amelyet, ha célba

veszünk, biztosan sokat tanulhatunk belıle. Ilyenek pl. :a „Logo nyelvi alapok” és a „Programozás Comenius Logoban” pontok Találunk még ezen kívül néhány fontos és hasznos pontot um. „Hibaüzenetek listája”, „Színtranszformációk.” Ezekre akkor fordítunk figyelmet, ha éppen olyan problémánk merül föl. 183 Tárgymutató ~ ~, 47 A,Á adatbevitel utasítása, 43 alapszavak, 26, 35, 37 algoritmus, 31 ábrázolása, 15 alapvetı ~ok, 106 buborék elv, 159 ciklus, 60 egyesítés (unió), 150 eldöntés, 117 feltételes ciklus, 70 fogalma, 7 grafikus ábrázolása, 10 hatékonysága, 76 keresés, 121 kiválasztás, 113 másolás, 143 megszámlálás, 131 metszet, 154 mikor jó?, 81 rendezés, 159 sorozatszámítás, 141 számlálós ciklus, 61, 68 szélsıérték kiválasztás, 137 tervezése, 13 vezérlıszerkezetek, 34, 82 amíg, 71, 73, 79, 80, 92, 114, 116, 120, 123, 124, 128, 152, 156 átírfájl, 98 B bemenet, 14 bemenı adatok, 14 betőzd,

36, 37 blokkdiagram, 10, 15 ciklus, 60 elágazás, 47 eldöntés, 119 feltételes ciklus, 70 kiválasztás, 113 kiválogatás, 126 184 másolás, 144 megszámlálás, 131 metszet, 154 rendezés, 160 sorozatszámítás, 141 számlálós ciklus, 61, 68 szélsıérték kiválasztás, 137 unió, 151 utasítás sorozat, 46 C ciklus, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 77, 78, 79, 80, 88, 89, 91, 92, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 123, 124, 125, 127, 128, 129, 130, 131, 132, 133, 134, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 149, 150, 152, 153, 154, 155, 156, 158, 159, 161 ciklusmag, 61, 62, 68, 70, 74 ciklusváltozó, 61 compiler, 32 E,É egészhányados, 40, 146 eh, 40 elágazás, 11, 12, 47, 49, 52, 57, 78, 91, 121, 123, 129, 130, 133, 138, 139, 150, 152, 154, 155 eldöntendı kérdés, 8 eldöntés, 112, 117, 119, 120, 121, 123, 125, 134 elem, 72, 73, 92, 107, 108, 112, 113, 114, 117, 118, 121, 122, 123, 125,

127, 132, 138, 145, 146, 149, 150, 152, 154, 156, 158, 161 eleme?, 135, 147 elemszám, 72, 73, 92, 123, 125, 127, 131, 132, 138, 145, 152, 156, 161 eljárás, 83, 84 építkezés ~ okból, 87 szerkesztése, 34 elıfeltétel, 14 elsınek, 56, 72 eredmény, 17, 40, 55, 86, 93, 108, 111, 114, 120, 153, 155, 156 értékadás, 44 értelmezés feladat, 14 ÉS, 53 F fájl bezárása, 96, 98 bıvítése, 102 elérési útvonal, 95, 96 hozzáfőzés, 102 írás fájlba, 95 létrehozása, 95 olvasás soronként, 100 olvasás szavanként, 100 olvasása, 97, 98 törlése, 102 fájlkezelés, 95 fájlvége?, 98 feladat, 13, 31 feltétel, 11, 18, 47, 52, 53, 57, 58, 60, 61, 70, 71, 74, 91, 114, 128 feltételes ciklus, 70, 73, 74, 78, 79, 112, 115, 118, 119, 125, 147, 150, 153, 154 fıprogram, 84, 92 függvény, 40, 54, 55, 69, 75, 86, 88, 89, 91, 93, 94, 110, 111, 113, 114, 117, 119, 120, 123, 127, 128, 143, 156 Gy gyök, 69, 80 H hangsor, 144, 147 I,Í idı, 57, 59, 80, 161 ikon, 168

ikonsor, 25, 27, 167 indító, 84 írólap, 25, 26, 27, 30, 35, 38, 120 írószín!, 38, 39, 92, 93, 146 J Jegyzettömb, 97 K képernyı, 25, 30, 88, 109, 120 keresés, 112, 119, 121, 122, 123, 124, 125, 134 ki, 3, 7, 13, 14, 16, 17, 26, 27, 28, 32, 34, 35, 36, 37, 38, 39, 40, 41, 42, 44, 45, 47, 48, 49, 50, 51, 52, 54, 56, 57, 60, 61, 62, 63, 65, 66, 67, 70, 72, 73, 76, 77, 78, 79, 80, 82, 84, 86, 87, 91, 92, 94, 104, 108, 112, 114, 115, 120, 121, 123, 124, 126, 127, 132, 133, 135, 137, 138, 139, 140, 141, 143, 144, 146, 147, 150, 152, 153, 156, 159, 160, 162, 167, 168 kiír, 104 kiír, 37, 38, 39, 51, 55, 56, 57, 63, 64, 66, 72, 77, 78, 79, 80, 85, 86, 89, 93 kiír, 117 kiír, 118 kiír, 121 kiír, 123 kiír, 123 kiír, 124 kiír, 127 kiír, 127 kiír, 131 kiír, 132 kiír, 132 kiír, 133 kiír, 134 kiír, 134 kiír, 137 kiír, 138 kiír, 138 kiír, 139 kiír, 141 kiír, 142 kiír, 142 kiír, 143 kiír, 144 kiír, 145 kiír, 145 kiíratás írólapra, 37 rajzlapra, 35 utastásai,

35 kiírbelsı, 38, 39, 44, 49, 57, 63, 65, 67, 73, 77, 78, 79, 80, 115, 120, 123, 124, 127, 128, 132, 133, 138, 140, 145, 152, 156, 161 kiíróeszköz, 104 kiíróeszköz, 95 kimenet, 15 kimenı adatok, 15 kiválasztás, 108, 112, 113, 115, 116, 121, 125, 134, 136, 137, 139 kiválogatás, 112, 127, 130, 134 kivonás, 39 185 kurzorhely, 38, 39, 92, 93, 145, 146 L lista, 35, 65, 67, 71, 74, 77, 78, 86, 114, 127, 130, 132, 133, 138, 140, 145, 146, 151, 152, 156, 160, 161 logikai mőveletek, 53 M maradék, 40, 52, 56, 57, 76, 77, 78, 79, 80, 146 másolás, 136, 144, 146, 147 megszámlálás, 112, 130, 131, 133, 134 memóriaablak, 26, 27, 34, 114 metszet, 149, 156 N NEM, 55 O,Ó oj, 98, 104 ol, 98, 104 ol, 67, 72 olvasjel, 98, 104 olvaslista, 98, 104 olvaslista, 67, 72, 73 olvaslista, 123 olvaslista, 127 olvaslista, 132 olvaslista, 138 olvaslista, 145 olvaslista, 152 olvaslista, 156 olvaslista, 161 olvasóeszköz, 104 olvasóeszköz, 98 olvasszó, 98, 104 olvasszó, 43, 44, 49, 67

olvasszó, 115 olvasszó, 120 olvasszó, 128 olvasszó, 133 osz, 98, 104 osz, 43, 44, 49, 57, 63, 65, 67, 77, 78, 79, 80, 92 osz, 124 osztás, 39, 146 osztott ablak, 29, 30, 132 186 Ö,İ összeadás, 39, 141 P paraméter, 85, 93, 114, 132 pozícionálás, 146 probléma, 13, 31 processzor, 8 program, 31 programnyelv, 31, 32 programozás, 31 programozási tételek, 107 egyesítés (unió), 149 eldöntés, 117 keresés, 120 kiválasztás, 112 kiválogatás, 124 másolás, 142 megszámlálás, 130 metszet, 153 rendezés, 158 sorozatszámítás, 140 szélsıérték kiválasztás, 136 R rajzlap, 25, 26, 27, 29, 35, 75, 119 rendezés, 162 S sorozatszámítás, 136, 140, 141, 142, 147 sortörési jel, 47 strukturált programozás, 82, 94 Sz számlálós ciklus, 61, 62, 63, 66, 67, 68, 69, 70, 74, 91, 109, 125, 134, 136, 137, 141, 142, 143, 144, 146, 149, 150, 153, 158 számtani mőveletek, 39 szélsıérték kiválasztás, 136 szerkesztés, 16, 17, 22 szín, 107, 109, 110, 111, 113,

114, 115, 116, 119, 120, 124, 128, 129, 133, 139 színkód, 37, 111 szorzás, 39, 142 szövegszerkesztı ablak, 98 T tí, 37, 39, 93, 123, 127, 132, 138, 145, 146, 152, 156, 161 tizedesjegy!, 42 tollszín!, 37, 110, 115 törölfájl, 102 törölfájl, 104 törölírólap, 37, 38, 92 tsz!, 37 U,Ú unió, 149, 151, 156 utasítás, 10, 17, 27, 37, 38, 39, 43, 44, 45, 47, 49, 58, 60, 61, 62, 67, 71, 80, 82, 115, 147, 168 utasítás sorozatok, 44 utófeltétel, 15 utolsónak, 72, 73, 78, 123, 152, 155, 156 V VAGY, 54 változó, 61, 85 fogalma, 40 véletlenszám, 50, 51, 52, 92, 110, 115 vsz, 50, 52 187 Irodalom Hubert-PfeifferMód: Penrose, R.: (Sz)Ámítástechnika 1.1 Papert, S.: Észrengés Szlávi P.- Zsakó L: Módszeres programozás: Programozási tételek Mikrológia 19 1991 Szlávi P.- Zsakó L: Módszeres programozás: Programozási bevezetı Mikrológia 18 1991 Szlávi P.- Zsakó L: Programozási nyelvek: Alapfogalmak Mikrológia 22 1994

Turcsányiné-Zsakó: Comenius Logo gyakorlatok Kossuth 1997 Zsakó László: Módszeres programozás: Hatékonyság Mikrológia 6 1991 Számítástechnika középfokon OMIKK 1987 Programozási feladatok I-II. Kossuth 1997 188 A császár új elméje Kvassai Jenı MSZKI Akadémiai Kiadó SZÁMALK 1992 1993 1988 189 Tartalom BEVEZETÉS . 2 Miért tanulunk programozni? . 2 A könyv használata . 4 ALAPFOGALMAK. 6 AZ ALGORITMUSOK FOGALMA . 7 ALGORITMUSOK GRAFIKUS ÁBRÁZOLÁSA BLOKKDIAGRAMMAL . 10 HOGYAN KEZDJÜNK HOZZÁ EGY ALGORITMUS MEGTERVEZÉSÉHEZ? . 13 Néhány egyszerő példa . 16 A COMENIUS LOGO PROGRAMOZÁS ALAPJAI. 24 A COMENIUS LOGO PROGRAM HASZNÁLATA . 25 NÉHÁNY SZÓ A PROGRAMOZÁSRÓL. 31 FİBB ALGORITMUSÉPÍTİ SZERKEZETEK. 34 Utasítás sorozatok. 34 Elágazások. 47 Összetett feltételek. 53 Ciklusok . 60 ALGORITMUSOK HATÉKONYSÁGA . 76 Mikor jó egy algoritmus?. 81 AZ ALGORITMUSVEZÉRLİ-SZERKEZETEKRİL . 82 ELJÁRÁSOK ÉS FÜGGVÉNYEK .

84 Paraméterek. 85 Függvények . 85 FELADAT RÉSZEKRE BONTÁSA. ÉPÍTKEZÉS ELJÁRÁSOKBÓL 87 Fájlkezelési mőveletek . 95 ALAPVETİ ALGORITMUSOK. 106 VANNAK KAPTAFÁK. 107 KIVÁLASZTÁS, ELDÖNTÉS, KERESÉS, KIVÁLOGATÁS, MEGSZÁMLÁLÁS . 112 Kiválasztás . 112 Eldöntés . 117 Keresés. 120 Kiválogatás . 124 Megszámlálás. 130 SZÉLSİÉRTÉK KIVÁLASZTÁS, SOROZATSZÁMÍTÁS, MÁSOLÁS . 136 Szélsıérték (maximum, minimum) kiválasztás . 136 Sorozatszámítás . 140 Másolás. 142 HALMAZOK EGYESÍTÉSE ÉS METSZETE . 149 Egyesítés (unió). 149 Metszet . 153 RENDEZÉS . 158 FÁJLKEZELÉSI MŐVELETEK . 164 190 KEDVCSINÁLÓ . 176 FÜGGELÉK. 179 A SEGÍTSÉG HASZNÁLATA. 180 TÁRGYMUTATÓ . 184 IRODALOM . 188 TARTALOM . 190 191