Távoktatás PROGRAMOZÁSI ALAPFOGALMAK ÉS ALGORITMUSOK



Hasonló dokumentumok
Bevezetés a programozásba Tartalomjegyzék

Adatbázis és szoftverfejlesztés elmélet. Programozási tételek

Programozási segédlet

Programozási tételek. Dr. Iványi Péter

PROGRAMOZÁSI TÉTELEK

A számrendszerekrl általában

Pásztor Attila. Algoritmizálás és programozás tankönyv az emeltszintű érettségihez

Előfeltétel: legalább elégséges jegy Diszkrét matematika II. (GEMAK122B) tárgyból

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós augusztus 29. Széchenyi István Egyetem, Gy r

Egyszerű programozási tételek

ELEMI PROGRAMOZÁSI TÉTELEK

Bánsághi Anna 2014 Bánsághi Anna 1 of 68

Keresés és rendezés. A programozás alapjai I. Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán

B I T M A N B I v: T M A N

Tartalom Keresés és rendezés. Vektoralgoritmusok. 1. fejezet. Keresés adatvektorban. A programozás alapjai I.

1. előadás. Lineáris algebra numerikus módszerei. Hibaszámítás Számábrázolás Kerekítés, levágás Klasszikus hibaanalízis Abszolút hiba Relatív hiba

Bevezetés a programozásba. 5. Előadás: Tömbök

Bevezetés a programozásba I.

OOP I. Egyszerő algoritmusok és leírásuk. Készítette: Dr. Kotsis Domokos

Informatika érettségi vizsga

Térinformatikai algoritmusok Elemi algoritmusok

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter

Rendezések. A rendezési probléma: Bemenet: Kimenet: n számot tartalmazó (a 1,a 2,,a n ) sorozat

Programozás alapjai (ANSI C)

Térinformatikai algoritmusok Elemi algoritmusok

Tömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása

Algoritmizálás, adatmodellezés tanítása 1. előadás

Összetett programozási tételek Rendezések Keresések PT egymásra építése. 10. előadás. Programozás-elmélet. Programozás-elmélet 10.

Bevezetés az informatikába gyakorló feladatok Utoljára módosítva:

Alkalmazott modul: Programozás. Programozási tételek, rendezések. Programozási tételek Algoritmusok és programozási tételek

Felvételi vizsga mintatételsor Informatika írásbeli vizsga

Aritmetikai utasítások I.

Algoritmusok. Dr. Iványi Péter

1. Jelölje meg az összes igaz állítást a következők közül!

4. Fejezet : Az egész számok (integer) ábrázolása

Programozás I. Sergyán Szabolcs Óbudai Egyetem Neumann János Informatikai Kar szeptember 10.

Programozás I. Sergyán Szabolcs Óbudai Egyetem Neumann János Informatikai Kar szeptember 10.

Bevezetés az informatikába gyakorló feladatok Utoljára módosítva:

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós április 4. Széchenyi István Egyetem, Gy r

Függvények július 13. f(x) = 1 x+x 2 f() = 1 ()+() 2 f(f(x)) = 1 (1 x+x 2 )+(1 x+x 2 ) 2 Rendezés után kapjuk, hogy:

LEBEGŐPONTOS SZÁMÁBRÁZOLÁS

ALGORITMIKUS SZERKEZETEK ELÁGAZÁSOK, CIKLUSOK, FÜGGVÉNYEK

Assembly programozás: 2. gyakorlat

2. Fejezet : Számrendszerek

Változók. Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai):

Bevezetés a programozásba I 3. gyakorlat. PLanG: Programozási tételek. Programozási tételek Algoritmusok

5. Fejezet : Lebegőpontos számok

5. Fejezet : Lebegőpontos számok. Lebegőpontos számok

Felvételi tematika INFORMATIKA

Algoritmizálás. Horváth Gyula Szegedi Tudományegyetem Természettudományi és Informatikai Kar

The Architecture of Computer Hardware and Systems Software: An InformationTechnology Approach 3. kiadás, Irv Englander John Wiley and Sons 2003

A C programozási nyelv III. Pointerek és tömbök.

Adatbázis rendszerek Gy: Algoritmusok C-ben

5-6. ea Created by mrjrm & Pogácsa, frissítette: Félix

Java programozási nyelv

Adatok ábrázolása, adattípusok

Programozási nyelvek 6. előadás

Adatszerkezetek 1. Dr. Iványi Péter

3. gyakorlat. Kettes számrendszer: {0, 1} Tízes számrendszer: {0, 1, 2,..., 9} 16-os (hexadecimális számrendszer): {0, 1, 2,..., 9, A, B, C, D, E, F}

A C programozási nyelv III. Pointerek és tömbök.

Programozás I. 1. előadás: Algoritmusok alapjai. Sergyán Szabolcs

SZÁMÍTÓGÉPEK BELSŐ FELÉPÍTÉSE - 1

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós február 18. Széchenyi István Egyetem, Gy r

Hatékonyság 1. előadás

Digitális technika VIMIAA hét

Programozási nyelvek a közoktatásban alapfogalmak I. előadás

Bevezetés az informatikába Tételsor és minta zárthelyi dolgozat 2014/2015 I. félév

Készítette: Nagy Tibor István

A valós számok halmaza

Digitális technika VIMIAA hét

Adatszerkezetek. Nevezetes algoritmusok (Keresések, rendezések)

Programozás I. Egyszerű programozási tételek. Sergyán Szabolcs

Harmadik gyakorlat. Számrendszerek

Bevezetés az informatikába

Programozás I. Matematikai lehetőségek Műveletek tömbökkel Egyszerű programozási tételek & gyakorlás V 1.0 OE-NIK,

Segédlet az Informatika alapjai I. című tárgy számrendszerek fejezetéhez

Sorozatok határértéke SOROZAT FOGALMA, MEGADÁSA, ÁBRÁZOLÁSA; KORLÁTOS ÉS MONOTON SOROZATOK

9. előadás. Programozás-elmélet. Programozási tételek Elemi prog. Sorozatszámítás Eldöntés Kiválasztás Lin. keresés Megszámolás Maximum.

LINEÁRIS PROGRAMOZÁSI FELADATOK MEGOLDÁSA SZIMPLEX MÓDSZERREL

Analízis előadás és gyakorlat vázlat

Változók. Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai):

Érdekes informatika feladatok

Programozás alapjai. 5. előadás

A programozás alapjai előadás. Amiről szólesz: A tárgy címe: A programozás alapjai

(jegyzet) Bérci Norbert szeptember 10-i óra anyaga. 1. Számrendszerek A számrendszer alapja és a számjegyek

C programozás. { Márton Gyöngyvér, 2009 } { Sapientia, Erdélyi Magyar Tudományegyetem }

SZÁMÉRTÉKEK (ÁT)KÓDOLÁSA

Haladó rendezések. PPT 2007/2008 tavasz.

22. GRÁFOK ÁBRÁZOLÁSA

C programozási nyelv Pointerek, tömbök, pointer aritmetika

1. Alapfogalmak Algoritmus Számítási probléma Specifikáció Algoritmusok futási ideje

Rendezések. Összehasonlító rendezések

SZÁMRENDSZEREK KÉSZÍTETTE: JURÁNYINÉ BESENYEI GABRIELLA

B I T M A N B I v: T M A N

Informatikai Rendszerek Alapjai

Halmazelméleti alapfogalmak

Vektorok. Octave: alapok. A fizika numerikus módszerei I. mf1n1a06- mf1n2a06 Csabai István

Összetett programozási tételek

Fixpontos és lebegőpontos DSP Számrendszerek

Rendezések. Sergyán Szabolcs Óbudai Egyetem Neumann János Informatikai Kar október 24.

Átírás:

Budapesti Mszaki Fiskola Regionális Oktatási és Innovációs Központ Távoktatás PROGRAMOZÁSI ALAPFOGALMAK ÉS ALGORITMUSOK Segédlet Készítette: Burián Ágnes Villamosmérnök és mszaki menedzser szak 5. félév 1. kiadás Székesfehérvár 2002. 1

Programozási alapismeretek A programok végrehajtása A számítógépet a program mködteti. A processzor közvetlenül csak a gépi kódú programokat tudja értelmezni. A gépi kódú program egy utasítása a mvelet kódjából és a mvelet operandusaiból áll. Az utasítások ugyanúgy, mint az adatok 0-k és 1-ek sorozata. A végrehajtható utasítások az operatív tárban vannak. Ha a tár egy részének tartalmát kiírjuk, nem tudjuk eldönteni, hogy program vagy adat! Utasításkészlet: a processzor által értelmezhet+ utasítások összessége. A gépi kód a leg+sibb programozási nyelv. Ma már csak szimbolikus nyelvben írjuk a programokat, ezeket a programokat a fordító program teszi át gépi kódba. A memória (operatív tár) - csak olvasható memória (ROM): kikapcsoláskor nem veszti el tartalmát, ezért olyan programokat tárolnak benne, amelyre a számítógépnek mindig szüksége van. - közvetlen elérés memória (RAM): írható, olvasható. Kikapcsoláskor elveszti tartalmát. A RAM a programozó rendelkezésére álló tár. Itt helyezkednek el a felhasználó által írt programok és az operációs rendszer felhasználó által látható részei. A tár legkisebb címezhet+ egysége a bájt, minden bájtnak önálló címe van. Az adatok általában több bájt hosszúságúak, de ugyanúgy az utasítások is. A memória közvetlen elérés tároló, mert bármely tárrekesz tartalmát a processzor egyetlen lépésben megtalálja a címe segítségével. A vezérl+egység speciális tároló rekeszei a regiszterek. Adatok tárolása a számítógépben A számítógépen az adatokat nullák és egyesek, bitek kombinációjaként (binárisan) tároljuk, dolgozzuk fel és továbbítjuk. Információs rendszereinkben viszont az adatok betkb+l, számjegyekb+l és írásjelekb+l állnak. (karakterek) A karakterek ábrázolása számítógépen a kódjukkal történik (bináris szám)! Szabványos kódrendszerek (ASCII, EBCDIC) a számítástechnika alappillérei. A kódrendszerek lényege, hogy minden karakterhez kölcsönösen egyértelm megfeleltetéssel hozzá van rendelve egy 8 bites (bájtos) kódérték. A karaktereket a kódjukkal azonosítjuk. Gépi számábrázolás: fixpontos lebeg+pontos Fixpontos számábrázolás (egész) 2 vagy 4 bájton történik. Ha csak negatív számokat kellene ábrázolni: 0 2 16-1 a 2 bájtos tartomány. A negatív számokat olyan formában célszer tárolni, hogy a gépi kivonás összeadással legyen helyettesíthet+, mert akkor a számítógépnek csak az összeadást kell tudnia elvégezni. Az el+jeles egész számok ábrázolására Neumann János dolgozta ki a kettes komplemens képzés (más néven nullára történ+ kiegészítés) módszerét. Komplemens képzés: a bináris szám minden jegyét átfordítjuk a másik jegyre. Például: 0101 0001 1010 1110 (Ezt egyes komplemensnek is szokás nevezni.) Ha a komplemenshez még 1-et hozzáadunk kettes komplemens alak jön létre. Pl.: 89 = 0101 1001 1010 0110 komplemens + 1 1010 0111 kettes komplemens 2

Vegyük észre, hogy ha a számot és kettes komplemensét összeadjuk, akkor az adott méretben (példánkban 8 biten) az eredmény 0 lesz! 0101 1001 +1010 0111 10000 0000 Vessük össze ezt azzal a matematikában megismert ténnyel, hogy bármely számhoz a negatívját hozzáadva az eredmény 0 lesz! Tehát 89 kettes komplemense lesz a -89. A számítógépek többnyire a kettes komplementerképzésen alapuló eljárással végzik a kivonást. Negatív számok tárolása: láttuk az el+bbiekben, hogy az x 0 esetben -x az x kettes komplemenseként állítható el+. Lássunk egy 16 bites példát (x=12 16 biten ábrázolva): 0000 0000 0000 1010 1111 1111 1111 0101 komplemens 1111 1111 1111 0110 kettes komplemens (-x=-12) Még van egy probléma: hogyan tudjuk eldönteni, hogy egy ilyen szám pozitív-e vagy pedig egy másik pozitív szám kettes komplemense? A felírásból sehogy! Ezért megegyeztünk abban, hogy a nem negatív számok csak az alsó 15 bitet foglalják el, ilyen módon ezek kettes komplemensének legfels+ bitje 1 lesz, azaz ezek lesznek a negatív számok. A 0000 0000 kettes komplemense is 0. Az 1000 0000 negatív szám kettes komplemense : 1000 0000. Tehát a k 16 bites egész: - 32 768 k 32 767 Lebegpontos számábrázolás (valós) A fixpontos számábrázolásnak 2 hátrányos tulajdonsága van: - kicsi az ábrázolható számtartomány - a pontosság er+sen korlátozott: ha a szám végére képzeljük a tizedespontot, az egészek közötti értékek a gép számára nem léteznek. Azaz : 1/3=0 vagy 5/3=1 stb. A lebeg+pontos számábrázolás a számok hatványkitev+s felírásán alapszik. Pl. 1800000000=1.810 9 1100011101.011=0.11000111010112 7 azaz Mp k A képletben k a számrendszer alapszáma (példánkban 10 ill. 2). Hogy egyértelm legyen a felírás M<1 és a tizedesponttól jobbra álló els+ jegy nem 0. A lebeg+pontos szám a számítógépen a bináris számok hatványkitev+s alakja. Ehhez a számot ún. kettes normál alakra kell hozni. Pl. /-12.25/ = 1100.01 2 =0.1100012 4 A szám kettes normál alakjának karakterisztikája 4 = 100 2 így a szám kettes normál alakban: -0.1100012 100 Az ábrázolás a következ+ módon történik: - els+ bit a szám el+jele, - 7 biten a karakterisztika torzítva, - végül 3 bájton a mantissza. A torzítás (a negatív kitev+k miatt kell) 2 6 =64(=100 0000) hozzáadását jelenti a karakterisztikához, így nem lesz soha negatív kitev+! A gépi nulla fogalma Az ábrázolandó szám karakterisztikája olyan kicsiny, hogy a torzítással sem lesz pozitív. A nullává váló szám nagysága tehát a karakterisztika számára rendelkezésre álló bitek számától függ. A gépi nullát úgy ábrázoljuk, hogy a karakterisztikát és a mantisszát is nullának vesszük. A véges hosszú mantissza miatt nem tudjuk az összes valós számot ábrázolni! 3

A számítógép alkalmazása Az adatok önálló, emberi beavatkozás nélküli feldolgozása a számítógép alapfeladata. A feldolgozást irányító, a gép számára végrehajtható formában adott utasítássort nevezzük programnak. Minden program algoritmusokra épül, amelyek egy adott feladat teljes vagy részbeni megoldására szolgáló mveletsort jelentenek. Az algoritmussal szemben támasztott követelmények: - Legyen egyértelm és jól meghatározott, azaz ugyanazon bemen+ adatokra minden esetben ugyanazt az eredményt szolgáltassa! - Legyen id+ben és lépésszámban véges, azaz korlátozott hosszú és végrehajtási idej! - Legyen teljes, általános érvény, azaz különböz+ bemen+ adatokkal is oldja meg a feladatot, ne egy konkrét problémára, hanem probléma osztályra vonatkozzon! A programozás alapjai A programozás elméleti lépései el+tt ismerkedjünk meg a programozási nyelvekkel. Az összes programot így az operációs rendszert és az alkalmazásokat is programozók készítik, valamilyen programozási nyelven. Ezeket a nyelveket a számítógép processzorának nyelvéhez való közeliségük szerint szokás csoportosítani. Programozási nyelvek a) gépi nyelv: a számítástechnika +skorában egyedüli lehet+ség volt a gép bitsorozattal való programozása. b) alacsony szint (assembly) nyelv: a gépi nyelv 0 és 1 jelekb+l álló bitsorai helyett a programozó mnemonikokat (emlékeztet+ rövídítéseket, azaz azonosítókat) ír, amelyek már áttekinthet+bbé, olvashatóbbá teszik a programot. Itt már elegend+ a programozónak a számítógép fontosabb egységeit és paramétereit ismernie. Így a gép lehet+ségeit majdnem teljesen kihasználó programokat írhatunk, és bizonyos mértékben hordozhatóvá is válik a programunk. Cserében a kódsort le kell fordítani gépi nyelvre, amelyet egy assemblernek nevezett program végez el, amit az adott géptípushoz egyedi módon kapcsolódva készítenek el. c) közép szint nyelv: nagy hatékonyságú, de géptípustól függetlenebb programozási nyelvek tartoznak ide. Fordítója az ún. compiler, amely közvetlen módon állítja el+ a gépi kódot. A programozó alkalmazhatja a korszer programozási módszereket, mint a strukturáltság és az objektumorientáltság, de ismernie kell továbbra is a gép legtöbb hardver paraméterét. Ilyen nyelv például a C, amelyen Európában a programok 85%-a íródik, de ilyen a FORTH, SNOBOL és a FAST nyelv is. Az utóbbi kett+ inkább a Távol-Keleten terjedt el. d) magas szint nyelv: a programozó a legkorszerbb programozási módszereket alkalmazva készíthet segítségükkel gépfüggetlen programokat, amelyek ugyan kevésbé hatékonyak, de szabadon hordozhatóak. Vagy teljes fordítást végz+ compilert, vagy soronként értelmez+ interpretert kell használni a gépi nyelvre való lefordításhoz. El+bbi készült a PASCAL és az ADA, utóbbi a BASIC és a LOGO nyelvhez. 4

Algoritmusok Bármilyen programozási módszert alkalmazunk és bármilyen nyelven írjuk is meg a programot, el+ször meg kell terveznünk a probléma megoldására szolgáló elemi lépések sorozatát, azaz az algoritmust! Algoritmusok tervezésére, leírására, szemléltetésére többféle eszköz létezik, közülük a két legismertebb, a: - mondatszer leírás (mondatnyelv) - folyamatábra (blokkdiagram) A következ+kben ezeket az algoritmus-leírási módokat ismertetjük: a mondatszer leírást és a rajzos megadás jelöléseit. Mindkét esetben a legfontosabb algoritmus-leírási szerkezetek jelöléseit adjuk meg: 1, adat be- és kivitel; 2, értékadás; 3, utasítássorozat (szekvencia); 4, feltételes elágazás (szelekció); 5, ismétlési szerkezet (iteráció); 6, eljárás vagy függvény megadása (deklaráció); Mondatszer leírás Az anyanyelvi megfogalmazáshoz hasonló, de annál tömörebb leírási mód. Az él+nyelv pontatlanságait próbáljuk vele kizárni, de még egyszeren értelmezhet+ marad. 1, Adat be- és kivitel: BE: változók [az adatokkal szemben állított követelmények] KI: kifejezések [a kiírás formájára vonatkozó követelmények] 2, Értékadás: változó:=kifejezés Az utasítás hatására a változó felveszi a kifejezés aktuális értékét. 3, Utasítás sorozat: Egymás alá írással adjuk meg az egymás után végrehajtandó utasításokat. 4, Feltételes elágazások: a) Egyágú HA feltétel AKKOR utasítás Ha a feltétel teljesül, akkor az utasítás végrehajtásra kerül, ha nem teljesül, akkor az után folytatódik a program. Az utasítás helyén több utasítás is állhat. b) Kétágú Ha feltétel AKKOR utasítás 1 KÜLÖNBEN utasítás 2 Ha a feltétel teljesül, akkor az utasítás 1 kerül végrehajtásra, ha nem akkor az utasítás 2. Mindkét esetben az után folytatódik a program. 5

c) Többágú ELÁGAZÁS feltétel 1 ESETÉN utasítás 1 feltétel 2 ESETÉN utasítás 2... feltétel n ESETÉN utasítás n EGYÉB ESETBEN utasítás Ha az i-edik, feltétel i teljesül, akkor az utasítás i kerül végrehajtásra, ha egyik feltétel sem teljesül, akkor az utasítás. Bármely esetben az után folytatódik a program. (A feltételeknek egymást kizárónak kell lennie, azaz legfeljebb egy teljesülhet közülük.) 5, Ismétlési szerkezetek: a) Elöltesztel CIKLUS AMÍG feltétel ciklusmag Amíg a feltétel teljesül, addig a ciklusmag végrehajtásra kerül, ha már nem teljesül, akkor a után folytatódik a program. b) Hátultesztel CIKLUS ciklusmag AMÍG feltétel A ciklusmag mindaddig végrehajtásra kerül, amíg a feltétel teljesül. Ha már nem teljesül, akkor a után folytatódik a program. (Egyszer a ciklusmag mindenféleképpen végrehajtódik!) 6, Eljárás vagy függvény megadás: ELJÁRÁS_neve (paraméterek) utasítások Az eljárás vagy függvény hívása nevének és paramétereinek leírásával történik meg. A program egy kitüntetett szerep eljárás (vagy függvény), neve meghatározott: PROGRAM utasítás sorozat PROGRAM VÉGE Megjegyzés: A C programokban ennek a kitüntetett szerep eljárásnak a main() függvény felel meg, amely a belépési pont. 6

Folyamatábra (blokkdiagram) Az egyik legkorábban kialakult megadási mód. Alapjeleit maga NEUMANN dolgozta ki. Az egyes szerkezeti elemek között nyilakkal jelöljük a végrehajtási sorrendet. Ennek köszönhet+en igen vadul ugráló programok is születhetnek, minden átgondolt szerkezet nélkül. Az értékadó utasítás illetve valamilyen eljárás téglalapba, az egy vagy többágú kiválasztás rombuszba vagy lapos hatszögbe, az adatáramlás paralelogrammába, a vezérl+ utasítások körbe kerülnek. Az ismétlési szerkezeteket elrejtve tartalmazza az ábra. Csak nagy odafigyeléssel és következetességgel érhetjük el a strukturáltságot. 1. Adat be- és kivitel: BE: változó KI: kifejezés 2. Mveletvégzés: változó := kifejezés Lehet értékadó, de másfajta utasítás is. Példánkban utasításként az értékadás szerepel: a változó felveszi a kifejezés aktuális értékét. 3. Utasítás sorozat: A nyilak által meghatározott irányban haladva kell végrehajtanunk az utasításokat. 4. Feltételes elágazás: I utasítás1 feltétel H utasítás2 Ha a feltétel teljesül, akk Ha a feltétel teljesül, akkor az utasítás 1 kerül végrehajtásra, ha nem, akkor az utasítás 2. Mindkét esetben folytatódik a program. Megfelel a kétágú feltételnek. Egyágú esetén nincs utasítás a hamis ágban. A többágú elágazás is összeépíthet+ ebb+l. 7

5. Ismétlési szerkezet: A ciklusok a feltételes elágazás segítségével készíthet+k. Például a hátul tesztel+ ciklus a következ+képpen építhet+ fel: ciklusmag feltétel I H A ciklusmag mindaddig végrehajtásra kerül, amíg a feltétel teljesül. Ha nem teljesül, akkor folytatódik a program. (Egyszer a ciklusmag mindenféleképpen végrehajtódik!) 6. Eljárás megadás: eljárásnév utasítások Külön blokkdiagramot készítünk számára. Az eljárás hívása az eljárásnév ovális dobozba írásával történik. A program egy kitüntetett szerep eljárás, kezd+pontja a START, végpontja(i) a VÉGE: 8

START eljárásnév utasítások VÉGE Összehasonlító példák Összefoglalásként megmutatjuk mindkét leíró eszköz segítségével, hogyan lehet megfogalmazni egy ismert feladat megoldását. Keressük meg 10 egymás után beírt valós szám közül a legnagyobbat! A feladatot írjuk le tömörített anyanyelvi formában: 1. olvassuk be az els+ számot, ez lesz egyben eddig a legnagyobb is, amit jelöljön m, i legyen 2, azaz i:=2; 2. olvassuk be a következ+ számot a k-ba; 3. ha a k nagyobb m-nél legyen m értéke k; 4. növeljük meg az i értékét eggyel; 5. ha kell még beolvasni, azaz i<=10, akkor vissza a 2. ponthoz; 6. írjuk ki az m értékét; 7. vége. Mondatszer leírással megadva: PROGRAM BE: m [valós szám] CIKLUS i:=2-tll 10-IG BE: k Ha k>m AKKOR m:=k KI: m "a legnagyobb szám a beírtak közül" PROGRAM VÉGE 9

Folyamatábrával megadva: START BE: m i:=2 BE: k i:=i+1 I k>m H m:=k i<10 I H KI: m a legnagyobb" VÉGE Figyelem: Ezen összehasonlító példákban és a kés+bbi algoritmusoknál is az elemeket sorszámukkal azonosítjuk. Ez pedig nem ugyanaz, mint a tömbindex a C programokban: ott az els+ elem indexe nulla! 10

Adjuk össze 1-t(l 100-ig a számokat! Folyamatábra: START eljárásnév I:=1 N:=100 Összeg:=0 nem I<=N igen I:=I+1 Ki: Összeg Összeg:= Összeg+I VÉGE Mondatszer leírás: PROGRAM I:=1 N:=100 ÖSSZEG:=0 CIKLUS amíg I N ÖSSZEG:= ÖSSZEG+I I:= I+1 Ki: ÖSSZEG PROGRAM VÉGE 11

Adatszerkezetek Minden algoritmus-leírásnak tartalmaznia kell el+írást arra is, hogy milyen tulajdonságú adatokon végzi a mveleteket. Meg kell tehát adnunk, hogy mi az adat értékkészlete, milyen mveleteket végezhetünk a lehetséges értékekkel, valamint azokat milyen módon ábrázolva tároljuk: azaz megadjuk az adattípust. Az adatokat típusuk szerint két csoportba bonthatjuk: elemi adat, tovább nem bontható, azaz nem rendelkezik a felhasználó által kezelhet+ kisebb részekkel, bels+ szerkezettel; összetett adat, az egyes alkotó elemekkel külön is végezhetünk mveleteket, elemi adattípusokból felépül+ szerkezettel rendelkezik. Az elemi és az összetett adattípusokat együtt adatszerkezeteknek szokás nevezni. Az algoritmusok megadásánál megköveteltük az általánosságot a minél nagyobb problémaosztálynak való megfelelést. E cél érdekében az absztrakt adattípusok használatával az algoritmust kiterjeszthetjük, általánosabban értelmezhet+vé tehetjük. Minden konkrét algoritmushoz kialakíthatunk egy neki megfelel+ adattípust. Az elkövetkez+ekben azokat az általánosan használt adattípusokat ismertetjük a rajtuk értelmezett mveletekkel együtt, amelyek a napi munkában leggyakrabban el+fordulnak. Elemi adattípusok Egy adattípus besorolása nagyban függ attól, hogy milyen programozási nyelvvel dolgozunk. A 4 byte méret egész a magas szint nyelvekben elemi adattípus, míg a gépi kódban összetett típusként kell kezelnünk. Hasonló probléma az, hogy míg 2 byte méret egész számok szinte minden nyelvben léteznek, a magas szint nyelvekben értelmezett rajtuk az összeadás, a kivonás, a szorzás, az osztás és a maradékképzés is, addig a gépi kódban az utóbbi mvelet nem. A következ+kben ezért nem biztos, hogy az éppen általunk használt nyelvre is igaz lesz a következ+ csoportosítás. Egész szám Az egész (fixpontos) számokat kettes számrendszerben, a legtöbb számítógépen 2 bájton tárolva ábrázoljuk. Az értékkészlet -32768 és 32767 közötti egész számokból áll. E korlátozás számos hiba forrása lehet; s+t bizonyos nyelvek esetében meglep+ dolgokat tapasztalhatunk: 32767+1 eredményeként 32768 helyett -32768-at kapunk! Valós szám A valós számokat lebeg+pontos módban ábrázoljuk. A valós számok értékkészletére két korlátozás érvényes: az egyik a nagyságrendi korlát, a másik a pontossági korlát. A tárolás a legtöbb nyelvben 4 bájton történik, a kettes normálalakra hozás után. A szám nagyságrendjét a 12

karakterisztika adja, míg pontosságát a mantissza. Ennek véges jegyszáma miatt valójában nem is valós számokat ábrázolunk, hanem minden valós érték helyett egy azt jól közelít+ racionális számot. Az alábbi programkészlet igen szemléletesen mutatja be ennek következményeit: PROGRAM n:=3 [n egész szám] x:=1/n [x valós szám] CIKLUS i:=1-tll 20-IG x:=(1+n)*x-1 KI: x PROGRAM VÉGE A program látszólag egyszer dolgot csinál: hússzor kiírja az egyharmad értéket. Az n jelöli a 3 egész számot, x a reciprokát, majd hússzor vesszük az n+1 x-szeresét és ezt 1-gyel csökkentjük, ez lesz az új értéke az x-nek. A mindenkori x értéket kiírjuk, azaz húsz darab egyharmad értéket kellene látnunk. A programot lefuttatva bármely konkrét nyelvre átkódolva, meglep+dve tapasztaljuk, hogy korántsem a várt eredményt kapjuk! (A jelenség oka az, hogy 1/n az egészek körében nulla!) Karakter Egy darab karakter tárolását lehet+vé tev+ adattípus, mérete 1 bájt. A karakterek ábrázolására ma már legtöbbször az ASCII kódrendszert használjuk, ami 8 bites, így az értékkészlet 0-255. A karakterek összehasonlítása, megel+z+ vagy rákövetkez+ karakter meghatározása, mint mveletek is e kód alapján valósulnak meg. Összetett adattípusok Az összetettebb programokban az elemi adattípusok helyett inkább az összetett adattípusokat alkalmazzák. A következ+kben megismerkedünk a leginkább használt típusokkal és néhány absztrakt szerkezettel is. Az összetett adattípusokkal végezhet+ mveletek megegyeznek az elemein végezhet+ mveletekkel. A konkrét elemtípusok helyett az ELEMTÍPUS megnevezést fogjuk használni. Tömb A legismertebb összetett típus. Gyakorlatilag mindig ezt használjuk, ha azonos típusú adatok sorozatát akarjuk kezelni. Rögzített elemszámú, bármely elemére annak sorszámával, az indexével hivatkozunk, amelynek feladata egyértelmen megadni, hogy tömbön belül az elem pontosan hol helyezkedik el. Az egyindex tömböket szokás vektornak, a kétindex tömböket mátrixnak nevezni. Az azonosításhoz szükséges indexek számát dimenziónak is nevezik. Füzér (string) A füzér vagy sztring típus egy speciális tömb típus, amelynek elemei karakterek, s hossza nem el+re meghatározott. A füzér egyes elemeire sorszámukkal lehet hivatkozni. Általában tényleges tárbeli hossza 1 bájttal nagyobb, mint a füzér karaktereinek a száma, ez a byte vagy a füzér hosszát, vagy egy speciális füzérlezáró karaktert tartalmaz. Tipikus mvelete egy részének kiemelése, illetve két füzér egyesítése. 13

Elemi algoritmusok A számítógépes feladatmegoldás során az algoritmus megtervezésekor bizonyos elemi tevékenységek gyakran felmerülnek megoldandó feladatként. Az ezeket megoldó elemi algoritmusokat (programozási tételeket) mutatjuk meg a következ+kben. Az algoritmusokat mondatszer leírással adjuk meg. Algoritmusok, amelyek egy sorozatból egy adatot állítanak el: Elemek összegzése Adott egy N elem tartalmazza. ELJÁRÁS ÖSSZEGZÉS (A[],N,S) S= 0 I=0 CIKLUS AMÍG I< N S= S +A[I] I=I+1 Lineáris keresés A számsorozat. Határozzuk meg az elemek összegét! A végeredményt az S Adott egy N elem A sorozat, és egy, az elemein értelmezett, T tulajdonság. Döntsük el, hogy van-e olyan eleme a sorozatnak, amely rendelkezik a T tulajdonsággal, és ha van, akkor hányadik! (Ha nincs ilyen tulajdonságú elem, akkor a sorszám értéke legyen -1!) ELJÁRÁS Lineáris_ keresés (A[],N,T,SORSZAM) SORSZAM=-1 I=0 CIKLUS AMÍG I < N ÉS A[I] NEM T tulajdonságú I= I+1 Ha I < N akkor SORSZAM=I Maximum kiválasztása Az el+bbi feladat egy speciális eseteként, egy adott sorozat legnagyobb (vagy esetleg legkisebb) elemének megkeresése is gyakran el+fordul. Adott N elem A számsorozatból keressük ki a legnagyobb elemet! ELJÁRÁS MAXIMUM (A[],N,MAX) MAX= A[0] I=1 CIKLUS AMÍG I < N HA MAX< A[I] AKKOR MAX=A[I] I=I+1 14

Megszámlálás A tulajdonság el+fordulása mellett az is kérdés lehet, hogy hány elem rendelkezik ezzel az adott tulajdonsággal. Legyen adott egy N elem A sorozat és egy, az elemein értelmezett, T tulajdonság. Határozzuk meg a T tulajdonsággal rendelkez+ elemek számát! ELJÁRÁS MEGSZÁMLÁLÁS(A[],N,DB) DB= 0 I=0 CIKLUS AMÍG I < N Ha A[I] T tulajdonságú AKKOR DB= DB+1 I=I+1 PÉLDA: Ha a sorozat: 1, 3, 5, 7 a tulajdonság a párosság, akkor DB=0. Ha a sorozat: 1, 2, 4, 8 a tulajdonság a párosság, akkor DB=3. Algoritmusok, amelyek egy sorozatból egy másik sorozatot állítanak el: Kiválogatás Egy sorozat elemei közül azokat válogatjuk ki egy új sorozatba, amelyek megfelelnek egy adott tulajdonságnak. Legyen adott egy N elem A sorozat és egy, az elemein értelmezett, T tulajdonság. Gyjtsük ki a B sorozatba az A sorozat T tulajdonságú elemeit! A készül+ sorozat elemszáma DB lesz. (Ha az A sorozatban nincs T tulajdonságú elem, akkor DB 0 lesz!) Rendezések ELJÁRÁS KIVÁLOGATÁS (A[],N,T,B[],DB) DB=0 I= 0 CIKLUS AMÍG I < N HA A[I] T tulajdonságú AKKOR B[DB]=A[I] DB=DB+1 I=I+1 Gyakran a rendezett elemekkel való mveletvégzés sokkal hatékonyabb, mint rendezetlen elemek esetében. Ezért nagyon fontosak a sorozat elemeit más sorrendbe el+állító algoritmusok. A kívánt rendezési irány lehet növekv+ vagy csökken+ Valamennyi ismertetésre kerül+ rendezési algoritmusban a növekv( sorrend elérése a cél. A többféle rendezési módszer közül a legismertebbek algoritmusát adjuk meg. A rendezéseket mindig helyben, új sorozat létrehozása nélkül kell megoldani. Ha két sorozattag között a reláció nem a kívánt rendezettség szerinti, akkor a tagok felcserélésére van szükség. 15

Két elem cseréjét a következ+kben az alábbi módon jelöljük: EGYIK A csere megvalósításához egy segéd változót használunk: MÁSIK. EGYIK MÁSIK jelentése tehát: segéd= egyik egyik= másik másik= segéd Minimum-elven alapuló rendezés A minimumkereséses rendezés lényege az, hogy egy adott intervallumban - amely kezdetben a teljes sorozat - megkeressük a legkisebb elemet, s azt tesszük az els+ helyre. A következ+ lépésben eggyel szkítjük az intervallumot (megnöveljük a sorozat alsó határát jelöl+ indexet), és ismét a legkisebb elemet visszük el+re. Végül a rendezend+ adatok elfogynak, a sorozat végére érünk. A mindenkori legkisebb elem keresése lineáris módszerrel történik. (Ha a kívánt sorrend a csökken+ rendezettség, akkor a maximum-elv rendezési algoritmust használjuk, ami csak a relációban különbözik.) ELJÁRÁS Minimum_elv (A[], N) I=0 CIKLUS AMÍG I < N-1 J=I+1 CIKLUS AMÍG J < N HA A[I] > A[J] AKKOR A[I] A[J] J=J+1 I=I+1 Buborék rendezés A buborék rendezés mindig két szomszédos elemet vizsgál, s ha azok a kívánt rendezettségnek nem megfelel+ relációban vannak, felcseréli +ket, majd tovább lépve újabb elempárt vizsgál. Az elejét+l a végéig ismételten végigpásztázva az egész sorozatot, eljutunk a rendezett állapotig, amikor már nincs szükség cserére. A bels+ ciklus egy lefutása után a legnagyobb elem az utolsó helyre kerül. ELJÁRÁS BUBORÉK_ELV(A[],N) I=1 CIKLUS AMÍG I < N J=0 CIKLUS AMÍG J < N-I HA A[J] > A[J+1] AKKOR A[J] J=J+1 I=I+1 A[J+1] 16

Javított buborékos rendezés Ha a buborékos rendezésnél egy teljes bels+ ciklus lefutása alatt egyetlen csere sem volt, akkor a sorozat már rendezett. Ilyenkor feleslegesek a további összehasonlítások. A CSERE változó jelzi azt, hogy a bels+ ciklusban kellett-e cserélni. A bels+ ciklus indulása el+tt, el+készítésként, a változót nullázzuk, és csak akkor lesz újra 1 az értéke, ha cserére volt szükség. Tehát, ha az összes szomszédos elem-pár a kívánt rendezettségnek megfelel+ relációban van, akkor a CSERE változó értéke 0 marad. ELJÁRÁS JOBB_BUBORÉK(A[],N) CSERE = 1 CIKLUS AMÍG CSERE ==1 CSERE = 0 J=0 CIKLUS AMÍG J<N-1 HA A[J]>A[J+1] AKKOR A[J] J=J+1 CSERE =1 A[J+1] Tovább javított buborékos rendezés Mivel a bels+ ciklus egyszeri lefutása után a legnagyobb elem az utolsó helyen áll, ezt az elemet már felesleges vizsgálni. Ebben az algoritmusban a bels+ ciklus minden alkalommal eggyel kevesebb elemre fut le, mert a DB változót a bels+ ciklus befejez+dése után csökkentjük. ELJÁRÁS LEGJOBB_BUBORÉK(A[],N) CSERE = 1 DB = N CIKLUS AMÍG CSERE == 1 CSERE = 0 J=0 CIKLUS AMÍG J< DB -1 HA A[J]>A[J+1] AKKOR A[J] J=J+1 DB = DB-1 CSERE =1 A[J+1] 17