IMPERATÍV PROGRAMOZÁS Bánsághi Anna anna.bansaghi@mamikon.net 2. ELŐADÁS - IMPERATÍV PARADIGMA 2014 Bánsághi Anna 1 of 70
TEMATIKA I. ALAPFOGALMAK, TUDOMÁNYTÖRTÉNET II. IMPERATÍV PROGRAMOZÁS Imperatív paradigma Procedurális paradigma Generikus paradigma III. STRUKTÚRÁLT PROGRAMOZÁS Moduláris paradigma Objektumorientált paradigma 2014 Bánsághi Anna 2 of 70
II. IMPERATÍV PROGRAMOZÁS 1. 2. 3. 4. 5. IMPERATÍV PARADIGMA Jelkészlet Lexikális elemek Utasítások, vezérlési szerkezetek Elemi és összetett típusok Érték- és referencia típusok 6. Programozási tételek 7. Adatfolyamok kezelése 2014 Bánsághi Anna 3 of 70
a nyelv a 1. JELKÉSZLET ábécéje tetszőleges szimbólumok véges halmaza szó az ábécé elemeiből képzett véges sorozat tetszőleges program az adott nyelv szintaktikai és szemantikai szabályait kielégítő szó a karakterek neve, szimbóluma, kódja karaktertáblában: ASCII kód 256 elemű karakterkészlet Asterisk * 42 Unicode 17 szint, szintenként 65 536 karakter Asterisk * \u002a egy programozási nyelv jelkészlete (ábécéje) valamely karakterkészlet részhalmaza 2014 Bánsághi Anna 4 of 70
A KORAI NYELVEK JELKÉSZLETE angol ábécé betűi, számjegyek, néhány speciális karakter szóköz, zárójelek, aritmetikai operátorok jelei A MAI NYELVEK JELKÉSZLETE különböző nemzetek speciális karakterei is (Unicode) 2014 Bánsághi Anna 5 of 70
2. LEXIKÁLIS ELEMEK a nyelv szintaxisának és szemantikájának megfelelő karaktersorozatok két határolójel között HATÁROLÓJELEK szóköz, tabulátor, sorvége < > = + - * / ( ) { } & ; :,.? << >> <= >= == ++ -- += -= *= /= = &= && 2014 Bánsághi Anna 6 of 70
LEXIKÁLIS ELEMEK CSOPORTOSÍTÁSA fenntartott szavak azonosítók literálok megjegyzések 2014 Bánsághi Anna 7 of 70
FENNTARTOTT SZAVAK nem használhatók azonosítóként a múlt árnyai: Java-ban goto jövőbeni fejlesztésekhez KULCSSZAVAK speciális jelentéssel bírnak a nyelv szintaxisának részei if for while class const break try yield A KULCSSZAVAK EGYBEN FENNTARTOTT SZAVAK IS 2014 Bánsághi Anna 8 of 70
AZONOSÍTÓK változók, konstansok, típusok, alprogramok nevei NYELVFÜGGŐ KÉRDÉSEK melyek a megengedett karakterek mi a megengedett szintaxis melyek a kódolási konvenciók különböznek-e a kis- és a nagybetűk van-e hosszúsági korlát melyek a fenntartott szavak 2014 Bánsághi Anna 9 of 70
AZONOSÍTÓK int összeg = 123; // azonosítója Könyv könyv = new Könyv("Pi élete"); // objektumvazonosító const Color FEHÉR = new Color("white"); class Könyv {...} int OldalakSzáma(Könyv könyv) {...} namespace Példa {...} // konstans azonosítója // típus neve // függvény neve // névtér azonosítója 2014 Bánsághi Anna 10 of 70
LITERÁLOK numerikus literálok (számok) karakterliterálok (karakterek) karaktersorozatok (szövegek) 2014 Bánsághi Anna 11 of 70
NUMERIKUS LITERÁLOK '0'..'9' és 'A'..'F' számjegyek '+', '-', '.' kitevőrész, típusjelölés -52 0.4342 1.234E+2 egész és valós számok 2014 Bánsághi Anna 12 of 70
KARAKTERLITERÁLOK karakterek és escape szekvenciák aposztrófok között akár közvetlen karakterkódolás is 'x' 'A' '\n' '\u2318' KARAKTERLÁNCOK karaktersorozatok macskakörmök között "Akár japánul 世界您好 vagy {valtozo}" 2014 Bánsághi Anna 13 of 70
MEGJEGYZÉSEK generált vagy a programozó által írt magyarázó szövegek a fordítóprogram nem veszi figyelembe növelik a karbantarthatóságot, dokumentáció generálható speciális jeltől a sor végéig terjedő: kutya.eszik(étel); // Kutya::eszik metódus hívása speciális jelek között: /** * Növeli az energiát * * @param étel Étel */ void Eszik(Étel étel) {...} 2014 Bánsághi Anna 14 of 70
3. UTASÍTÁSOK, VEZÉRLÉSI SZERKEZETEK a vezérlésszervezés eszközei lexikális elemekből épülnek fel 2014 Bánsághi Anna 15 of 70
EGYSZERŰ UTASÍTÁSOK értékadás kifejezés-utasítás ÖSSZETETT UTASÍTÁSOK szekvencia és blokk utasítás elágazási szerkezetek ciklusszerkezetek STRUKTÚRÁLATLAN UTASÍTÁSOK vezérlésátadás 2014 Bánsághi Anna 16 of 70
ÉRTÉKADÁS általánosan <változó> <értékadásjel> <kifejezés> konkrétan x = 123 y = x * 5 + 3 z = add(y, 10) 2014 Bánsághi Anna 17 of 70
KIFEJEZÉS lexikális elemekből épül fel kiértékelés után eredményt ad vissza dinamikusan típusos nyelvek esetén: kifejezés = érték statikusan típusos nyelvek esetén: kifejezés = típus + érték változó- és konstans-kiértékelések aritmetikai, logikai, relációs kifejezések függvényhívások ezek kombinációival, egymásba ágyazásával építhetők fel 2014 Bánsághi Anna 18 of 70
KIFEJEZÉSEK csoportosíthatók az argumentumaik száma (aritás) szerint nulláris, unáris, bináris, k-áris OPERÁTOROK speciális, szimbólumokkal jelölt függvények + - * / ++ -- < > && 2014 Bánsághi Anna 19 of 70
OPERÁTOROK HASZNÁLATA prefix, kiértékelés balról jobbra -*bb**4ac postfix, kiértékelés lengyel formanak megfelelően bb*4a*c*- infix, kiértékelés precedencia és asszociativitás szerint b*b-4*a*c mixfix feltétel? kifezés_1 (igaz ág) : kifejezés_2 (hamis ág) 2014 Bánsághi Anna 20 of 70
PREFIX KIÉRTÉKELÉS - * 5 5 * * 4 3 2-25 * * 4 3 2-25 * * 4 3 2-25 * 12 2-25 * 12 2-25 24-25 24 1 2014 Bánsághi Anna 21 of 70
POSTFIX KIÉRTÉKELÉS 5 5 * 4 3 * 2 * - 25 4 3 * 2 * - 25 4 3 * 2 * - 25 12 2 * - 25 12 2 * - 25 24-25 24-1 2014 Bánsághi Anna 22 of 70
KIFEJEZÉS-UTASÍTÁS értékadás mint operátor // asszociativitási szabály szerint egyenértékűek x = y = 7; x = (y = 7); // egyenértékűek x = x + 2; x += 2; 2014 Bánsághi Anna 23 of 70
SZEKVENCIA utasítások egymás utáni kötött sorrendű végrehajtása utasítások lezárása: pontosvessző, új sor BLOKK UTASÍTÁS ahol szintaktikailag egyetlen utasítás állhat, ott használható a fordítóprogram számára egyetlen utasításnak minősül utasításcsoportosító, egymásba ágyazható 2014 Bánsághi Anna 24 of 70
BLOKK UTASÍTÁS utasítások begin utasítások end utasítások { utasítások } 2014 Bánsághi Anna 25 of 70
VEZÉRLÉSÁTADÁS az utasítások kötött sorrendű végrehajtása megszakad utasítások goto cimke utasítások cimke: utasítások utasítások goto feltétel nélküli vezérlésátadás break kiugrik a vezérlési szerkezetből continue ciklusfeltétel újrakiértékelése return visszatérés a hívóhoz 2014 Bánsághi Anna 26 of 70
ELÁGAZÁSI SZERKEZETEK feltétel logikai értékétől függően valamilyen (blokk) utasítás végrehajtása EGYIRÁNYÚ ELÁGAZÁS if logikai kifejezés then (blokk) utasítás KÉTIRÁNYÚ ELÁGAZÁS if logikai kifejezés then egyik (blokk) utasítás else másik (blokk) utasítás end if 2014 Bánsághi Anna 27 of 70
TÖBBIRÁNYÚ ELÁGAZÁS if egyik logikai kifejezés then egyik (blokk) utasítás else if másik logikai kifejezés then másik (blokk) utasítás else if harmadik logikai kifejezés then harmadik (blokk) utasítás else negyedik (blokk) utasítás end if 2014 Bánsághi Anna 28 of 70
ESETKIVÁLASZTÁSOS ELÁGAZÁS szelektor diszkrét típusú értékétől függően osztályoz switch diszkrét típusú kifejezés case egyik érték : egyik (blokk) utasítás break case másik érték : case harmadik érték : másik (blokk) utasítás break default : harmadik (blokk) utasítás break endswitch 2014 Bánsághi Anna 29 of 70
ELÁGAZÁSI SZERKEZETEK NYELVFÜGGŐ KÉRDÉSEI milyen típusú elágazási szerkezeteket definiál a nyelv megadható-e esetkiválasztásos esetben alapértelmezett ág megadható-e azonos érték több ágon megadható-e több érték ugyanazon ágon vajon a vezérlés lecsorog a következő ágra, vagy csak az egyik ág hajtódik végre 2014 Bánsághi Anna 30 of 70
CIKLUSSZERKEZETEK amíg egy adott feltétel teljesül, addig valamilyen (blokk) utasítás végrehajtása előre ismert lépésszámú elöltesztelő hátulteszteló iterátor 2014 Bánsághi Anna 31 of 70
SZÁMLÁLÁSOS CIKLUS for inicializálás; ciklusfeltétel; ciklusváltozó frissítése ciklusmag for( int i = 0; i < 10; ++i ) { Console.WriteLine(i); } for( int i = 1, j = 2; i < 10 && j+i!= 4; i += 3, ++j ) { Console.WriteLine("i: " + i); Console.WriteLine("j: " + j); } for(;;) { Console.WriteLine("végtelen ciklus"); } 2014 Bánsághi Anna 32 of 70
ELÖLTESZTELŐ CIKLUS a ciklusmag végrehajtása előtt ellenőrzi a ciklusfeltételt, ezért előfordulhat az is, hogy a ciklusmag egyszer sem fut le while ciklusfeltétel ciklusmag int i = 0; // ciklusváltozó inicializálása while( i < 10 ) // ciklusfeltétel { Console.WriteLine(i); ++i; // ciklusváltozó növelése } while( true ) { Console.WriteLine("végtelen ciklus"); } 2014 Bánsághi Anna 33 of 70
HÁTULTESZTELŐ CIKLUS a ciklusmag végrehajtása után ellenőrzi a ciklusfeltételt, ezért a ciklusmag egyszer mindenképpen lefut do ciklusmag while ciklusfeltétel int i = 0; do { Console.WriteLine(i); ++i; } while( i < 10 ); do { Console.WriteLine("végtelem ciklus"); } while( true ); 2014 Bánsághi Anna 34 of 70
BEJÁRÓ CIKLUS / ITERÁTOR az iterációs változó felveszi az iterált gyűjtemény aktuális elemének értékét, ezért a gyűjtemény elemei nem módosíthatók a ciklusmagon belül foreach iterációs változó in gyűjtemény ciklusmag string ábécé = "abcdefghijklmnopqrstuvwxyz"; foreach( char karakter in ábécé ) { Console.WriteLine(karakter); } 2014 Bánsághi Anna 35 of 70
VEZÉRLÉSÁTADÁS CIKLUSBAN for( int i = 0; i < 10; ++i ) { if( 3 == i ) break; // kilép a ciklusból Console.WriteLine(i); } for( int i = 0; i < 10; ++i ) { if( 3 == i ) continue; // kilép az iterációból Console.WriteLine(i); } 2014 Bánsághi Anna 36 of 70
CIKLUSSZERKEZETEK NYELVFÜGGŐ KÉRDÉSEI milyen típusú ciklusszerkezeteket definiál a nyelv vajon a ciklusfeltétel kötelezően logikai értékű vajon a ciklusmag kötelezően blokk beállítható-e a ciklusváltozó alsó és felső értéke, lépésszáma definiált-e a ciklusváltozó értéke kilépéskor létezik-e break, continue 2014 Bánsághi Anna 37 of 70
4. ELEMI ÉS ÖSSZETETT TÍPUSOK a nyelvek számtalan beépített típust definiálnak, hogy a memóriarekeszeknél összetettebb fogalmakkal dolgozhasson a programozó int i = 123 char c = 'a' string s = "rövid szöveg" 2014 Bánsághi Anna 38 of 70
TÍPUSÉRTÉKEK ÉS TÍPUSMŰVELETEK a típus definiálása két részből áll meg kell adni a lehetséges típusértékek halmazát meg kell adni a típusértékeken végezhető műveleteket int i = 123 int j = i + 12 // operátorral definiált (asszociatív) művelet string s1 = "alma" string s2 = "fa" string s3 = s1.concat( s2 ) // alprogrammal definiált (men asszociatív) művelet 2014 Bánsághi Anna 39 of 70
A TÍPUS TULAJDONSÁGAI kódolás a memóriában való ábrázolás méret szerkezet a memóriában elfoglalt méret az összetevőkre való hivatkozás összetett típusnál specifikáció a típusértékhalmaz és a típusműveletek halmaza reprezentáció a típus ábrázolása a memóriában, a típus megvalósítása programnyelvi eszközökkel 2014 Bánsághi Anna 40 of 70
EDDIG LÁTOTT PÉLDÁK ÉRTÉKHALMAZ + MŰVELETHALMAZ = TÍPUS egész számok + összeadás, kivonás, összehasonlítás valós számok + összeadás, kivonás, szorzás, osztás, összehasonlítás igaz, hamis + negáció, konjunkció, diszjunkció, implikáció karakterláncok + konkatenáció, összehasonlítás 2014 Bánsághi Anna 41 of 70
ERŐSEN TÍPUSOS NYELV változók típusa fordítási időben meghatározott csak az adott típus műveletei megengedettek int i = 8 string s = "42" return i + s return s.concat( i ) // fordítási hiba // fordítási hiba GYENGÉN TÍPUSOS NYELV tetszőleges művelet megengedett tetszőleges típuson csak futási időben derül fény a hibára int i = 8 string s = "42" return i + s // eredmény: 50 return s.concat( i ) // eredmény: "428" 2014 Bánsághi Anna 42 of 70
ELEMI TÍPUSOK szerkezet nélküliek, logikailag felbonthatatlanok ÖSSZETETT TÍPUSOK meglévő típusokból tevődnek össze típuskonstrukciók segítségével ABSZTRAKT ADATTÍPUSOK meglévő típusokból tevődnek össze típuskonstrukciókkal és új műveletek megvalósításával 2014 Bánsághi Anna 43 of 70
2014 Bánsághi Anna 44 of 70
ELEMI TÍPUSOK szinte minden programozási nyelv támogatja, mert nem is a nyelv, hanem a számítógépek processzorai valósítják meg értékadás ELEMI TÍPUSOK MŰVELETEI transzformációs függvények rendezett halmazokon értelmezett függvények típuskonverzió 2014 Bánsághi Anna 45 of 70
ÉRTÉKADÁS ekvivalens típusúak közötti érték-hozzárendelés, másolatkészítés int i = 12 int j = i i = "szöveg" // fordítási hiba 2014 Bánsághi Anna 46 of 70
TRANSZFORMÁCIÓS FÜGGVÉNYEK adott típust vagy annak direkszorzatát képezik a típusra T T T típusonként változik ezen függvények, műveletek halmaza egészeken az összeadás, kivonás logikai értékeken a logikai műveletek... 2014 Bánsághi Anna 47 of 70
RENDEZETT HALMAZOKON ÉRTELMEZETT FÜGGVÉNYEK relációs operátorok < > = minimális és maximális elem meghatározása rákövetkező és megelőző elem meghatározása 2014 Bánsághi Anna 48 of 70
TÍPUSKONVERZIÓ típus megváltoztatása (konvertálása) egy másik típusra T 1 T 2 implicit típuskonverzió: a futási idejű környezet végzi el float x x = 2.2 + 1 // bővítő típuskonverzió: 2.2 + 1.0 int i i = 2.2 + 1 // bővítő típuskonverzió: 2.2 + 1.0 // szűkítő típuskonverzió: i = 3 explicit típuskonverzió: a programozó hatásköre int x = 3 string s = "12" int y = x + (int)s 2014 Bánsághi Anna 49 of 70
DISZKRÉT TÍPUSOK értékhalmaz rendezhető értékek műveletek rendezett halmazokon értelmezett függvények 2014 Bánsághi Anna 50 of 70
EGÉSZ TÍPUSOK értékhalmaz Z műveletek + - * div ^ mod unáris mínusz rendezett halmazokon értelmezett függvények reprezentáció általában 32 bites előjeles egészek 2014 Bánsághi Anna 51 of 70
FELSOROLÁSI TÍPUSOK értékhalmaz az elemek felsorolásával adjuk meg szinek = {"kék", "zöld", "piros"} műveletek rendezett halmazokon értelmezett függvények típuskonverzió egészekre és vissza 2014 Bánsághi Anna 52 of 70
KARAKTER TÍPUSOK értékhalmaz Ch műveletek rendezett halmazokon értelmezett függvények reprezentáció általában 16 bites Unicode karakterkódolás 2014 Bánsághi Anna 53 of 70
LOGIKAI TÍPUSOK értékhalmaz L = {igaz, hamis} műveletek logikai műveletek, úgymint rendezett halmazokon értelmezett függvények reprezentáció hamis 0 igaz -1 (néha 1) 2014 Bánsághi Anna 54 of 70
LOGIKAI KIFEJEZÉSEK KIÉRTÉKELÉSE lusta kiértékelésű operátorok bool A = false, B = true bool C = A B // B-t nem értékeli ki a nyelv mohó kiértékelésű operátorok bool A = false, B = true bool C = A B // B-t is kiértékeli a nyelv 2014 Bánsághi Anna 55 of 70
VALÓS TÍPUSOK értékhalmaz R műveletek + - * / ^ unáris mínusz rendezett halmazokon értelmezett függvények reprezentáció lebegőpontos ábrázolás e * M * a k -167,2 = -1 * 0,1672 * 10 3 előjelbit, mantissza, abszcissza, kitevő 2014 Bánsághi Anna 56 of 70
ÖSSZETETT TÍPUSOK típuskonstrukciós eszközökkel, elemi és összetett típusokból épített új típusok T = ( T 1, T 2,, T n ) ÖSSZETETT TÍPUSOK MŰVELETEI konstrukciós függvények: összetett típusérték létrehozása komponenseiből a new operátorral és konstruktorral szelekciós függvények: összetett típusérték komponenseinek kiválasztása a. operátorral önmagukban csak értékhalmazt definiálnak 2014 Bánsághi Anna 57 of 70
REKORD értékhalmaz azonos vagy különböző típusú elemek direktszorzata T = T 1 T 2 T n szelektorok ( t 1, t 2,, t n ) = t T esetén hozzáférés a t i s i : T T i s i (t) = t i (másik jelölés: t. s i ) adott komponenshez az reprezentáció szelektorokkal úgy, hogy a komponensek megadásuk sorrendjében helyezkednek el a memóriában, bármely komponens elérhető a mezőnév alapján 2014 Bánsághi Anna 58 of 70
REKORD PÉLDÁK térbeli pontok halmaza, ahol a 3 koordinátát 3 double típusú szám reprezentálja komplex számok halmaza, ahol a valós és a képzetes részt egy-egy int típusú szám reprezentálja dátumok halmaza, év, hónap és nap reprezentálására egy-egy int típusú szám telefonkönyv, ahol a nevet egy string, a telefonszámot egy int típusú adat reprezentálja 2014 Bánsághi Anna 59 of 70
REKORD SZERKEZETE a rekordba helyezett értékeket nevezzük a rekord adattagjainak vagy mezőinek mezője lehet bármilyen, már deklarált típus (egyszerű, összetett, illetve más rekord is) a mező automatikusan létrejön, a megfelelő szelektorral külön lekérdezhető és módosítható 2014 Bánsághi Anna 60 of 70
REKORD DEKLARÁLÁSA C#-BAN blokkon belül deklaráljuk a rekord mezőit struct <rekordnév> { <típus_1> <mezőnév_1>; <típus_2> <mezőnév_2>; <típus_3> <mezőnév_3>; } a rekordok új típusok lesznek, amelyek tetszőlegesen felhasználhatóak, ezért célszerű globálisan deklarálni őket 2014 Bánsághi Anna 61 of 70
Valósítsuk meg a komplex számok típusát struct KomplexSzám { public int valós; public int képzetes; } public static void Main() { KomplexSzám c = new KomplexSzám(); c.valós = 0; c.képzetes = 1; } Console.WriteLine( "Valós rész: {0}, képzetes rész: {1}", c.valós, c.képzetes ); 2014 Bánsághi Anna 62 of 70
TÖMB azonos típusú elemek véges sorozata értékhalmaz {v : H T} leképezés egy indexhalmazról a típusra adott szelektorok i H i v(i) esetén hozzáférés a -edik elemhez a helyettesítést jelenti másik jelölés: v[i] reprezentáció az elemek az indexelésnek megfelelő sorrendben helyezkednek el a memóriában, bármely elem elérhető az index alapján 2014 Bánsághi Anna 63 of 70
TÖMB PÉLDÁK // 5 hosszú tömb deklarációja, melyben karakterek lesznek char[] karakterek = new char[5]; // 2x3-as kétdimenziós tömb deklarációja, melyben egész számok lesznek int[,] mátrix = new int[2,3]; // tömb definíciója és inicializációja egy lépésben int[] számok = new int[] { 3, 5, 8, 13 }; a tömbök hossza rögzített, nem lehet dinamikusan változtatni 2014 Bánsághi Anna 64 of 70
Valósítsuk meg a komplex számok típusát, és hozzunk létre egy három elemű, komplex számokat tartalmazó tömböt struct KomplexSzám { public int valós; public int képzetes; } public static void Main() { KomplexSzám[] számok = new KomplexSzám[3]; for( int i = 0; i < számok.length; ++i ) { számok[i].valós = i; számok[i].képzetes = 2*i; } } foreach( KomplexSzám szám in számok ) { Console.WriteLine( "{0} + {1}*i", szám.valós, szám.képzetes ); } 2014 Bánsághi Anna 65 of 70
5. ÉRTÉK- ÉS REFERENCIA TÍPUSOK a típusokat csoportosíthatjuk aszerint is, hogy hogyan érhetők el a memóriában az az értéktípusok változói közvetlenül érik el az értéküket referencia típusok változói közvetetten, egy referencián keresztül érik el az értéküket 2014 Bánsághi Anna 66 of 70
ÉRTÉKTÍPUS PÉLDA int i = 13; int j = i; i = 123; // az értékadás után mi lesz j értéke? értékadás előtt a memória állapota értékadás után a memória állapota 2014 Bánsághi Anna 67 of 70
REFERENCIA TÍPUS PÉLDA int[] t1 = new int[] { 13, 1, 3 }; int[] t2 = t1; t1[0] = 123; // az értékadás után mi lesz t2[0] értéke? értékadás előtt a memória állapota értékadás után a memória állapota 2014 Bánsághi Anna 68 of 70
A C# ÉRTÉK- ÉS REFERENCIA TÍPUSAI ÉRTÉKTÍPUS elemi és iterált típusok, rekord értéket tárol típusműveletek deklarálható típusos REFERENCIA TÍPUS tömb és felhasználói típusok memóriacímet tárol típusműveletek deklarálható típusos 2014 Bánsághi Anna 69 of 70
A C# REFERENCIA TÍPUSAI 2014 Bánsághi Anna 70 of 70