IMPERATÍV PROGRAMOZÁS Bánsághi Anna anna.bansaghi@mamikon.net 3. ELŐADÁS - PROGRAMOZÁSI TÉTELEK 2014 Bánsághi Anna 1 of 68
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 68
II. IMPERATÍV PROGRAMOZÁS IMPERATÍV PARADIGMA 1. Jelkészlet 2. Lexikális elemek 3. Utasítások, vezérlési szerkezetek 4. Elemi és összetett típusok 5. Programozási tételek 6. Adatfolyamok kezelése 2014 Bánsághi Anna 3 of 68
5. PROGRAMOZÁSI TÉTELEK általánosságban megfogalmazott algoritmusok, kicsit átalakítjuk a konkrét feladatunkhoz tételek, mert formálisan bizonyítható a helyességük 2014 Bánsághi Anna 4 of 68
FELADATOSZTÁLYOK CSOPORTOSÍTÁSA egy bemeneti sorozathoz egyetlen értéket rendel egy bemeneti sorozathoz egy kimeneti sorozatot rendel egy bemeneti sorozathoz több kimeneti sorozatot rendel több bemeneti sorozathoz egy kimeneti sorozatot rendel egy bemeneti sorozat rendezése 2014 Bánsághi Anna 5 of 68
EGY BEMENETI SOROZATHOZ EGYETLEN ÉRTÉKET 2014 Bánsághi Anna 6 of 68
ÖSSZEGZÉS - FELADAT adjuk meg n darab tetszőleges természetes szám összegét adjuk meg az első n természetes szám szorzatát (n!) adjuk meg n darab tetszőleges szám átlagát fűzzünk össze n darab karaktert egy szöveg típusú változóba 2014 Bánsághi Anna 7 of 68
bemenet, kimenet ÖSSZEGZÉS - SPECIFIKÁCIÓ x : T n F : T y : T T n előfeltétel n 0, y 0 : T neutrális elem T -ben és hogy f : T T T F( x 1,, x n ) = f(f( x 1,, x n 1 ), x n ) utófeltétel y = F( x 1,, x n ) 2014 Bánsághi Anna 8 of 68
ÖSSZEGZÉS - ALGORITMUS y = y 0 ciklus i = 1-től n-ig y = f(y, x ) ciklus vége i 2014 Bánsághi Anna 9 of 68
ÖSSZEGZÉS - FORRÁSKÓD adjuk meg n darab tetszőleges természetes szám összegét public static void Main() { int[] x = new int[] { 1, 3, 6, 10, 15 ; int y = 0; foreach( int i in x ) { y += i; Console.WriteLine( y ); 2014 Bánsághi Anna 10 of 68
SZÁMLÁLÁS - FELADAT számoljuk meg, hogy egy számnak hány osztója van adjuk meg, hogy egy bitsorozat hányszor vesz fel 1-es értéket adjuk meg egy szöveg magánhangzóinak számát számoljuk meg, hogy hány e betű van egy szövegben 2014 Bánsághi Anna 11 of 68
SZÁMLÁLÁS - SPECIFIKÁCIÓ bemenet, kimenet előfeltétel utófeltétel x : T n darab : T n 0 F : T L darab = F( ) n i=1 F( )=igaz x i x i 2014 Bánsághi Anna 12 of 68
SZÁMLÁLÁS - ALGORITMUS darab = 0 ciklus i = 1-től n-ig ha F(x ) akkor darab += 1 elágazás vége ciklus vége i 2014 Bánsághi Anna 13 of 68
SZÁMLÁLÁS - FORRÁSKÓD adjuk meg, hogy egy bitsorozat hányszor vesz fel 1-es értéket public static void Main() { string s = "00011101011"; int darab = 0; foreach( char c in s ) { if( '1' == c ) { darab += 1; Console.WriteLine( darab ); 2014 Bánsághi Anna 14 of 68
SZÉLSŐÉRTÉK KIVÁLASZTÁS - FELADAT adjuk meg n darab tetszőleges természetes szám minimális / maximális elemét adjuk meg n darab tetszőleges karakter közül az ábécé szerinti elsőt / utolsót adjuk meg n darab tetszőleges karakterlánc közül az ábécé szerinti elsőt / utolsót 2014 Bánsághi Anna 15 of 68
MAXIMUM KIVÁLASZTÁS - SPECIFIKÁCIÓ bemenet, elemei rendezhetők (< > összehasonlítások megengedett műveletek) kimenet előfeltétel utófeltétel x : T n T maximum : T n 1 x i x : maximum x i 2014 Bánsághi Anna 16 of 68
MAXIMUM KIVÁLASZTÁS - ALGORITMUS maximum = x ciklus i = 2-től n-ig ha maximum < x maximum = x elágazás vége ciklus vége 1 i i akkor 2014 Bánsághi Anna 17 of 68
MAXIMUM KIVÁLASZTÁS - FORRÁSKÓD adjuk meg n darab tetszőleges sztring közül az ábécé szerinti utolsót public static void Main() { string[] szavak = new string[] { "eper", "körte", "alma" ; string maximum = szavak[0]; for( int i = 1; i < szavak.length; ++i ) { if( String.Compare( maximum, szavak[i] ) < 0 ) { maximum = szavak[i]; Console.WriteLine( maximum ); 2014 Bánsághi Anna 18 of 68
FELTÉTELES SZÉLSŐÉRTÉK KIVÁLASZTÁS - FELADAT adjuk meg n darab tetszőleges természetes szám minimális / maximális elemét azon elemek közül, melyekre teljesül egy bizonyos feltétel 2014 Bánsághi Anna 19 of 68
FELTÉTELES MAXIMUM KIVÁLASZTÁS - SPECIFIKÁ CIÓ bemenet,, elemei rendezhetők (< > összehasonlítások megengedett műveletek) kimenet előfeltétel utófeltétel x : T n maximum : T n 0 F : T L T x i x, F( x i ) = igaz : maximum x i 2014 Bánsághi Anna 20 of 68
FELTÉTELES MAXIMUM KIVÁLASZTÁS - ALGORITMUS teljesül = hamis ciklus i = 1-től n-ig ha nem F(x ) akkor continue i ha teljesül akkor ha maximum < x maximum = x elágazás vége különben teljesül = igaz maximum = x elágazás vége ciklus vége i i i akkor 2014 Bánsághi Anna 21 of 68
FELTÉTELES MAXIMUM KIVÁLASZTÁS - FORRÁSKÓD adjuk meg n darab tetszőleges sztring közül azt, amelyik e betűvel kezdődik, és első az e betűvel kezdődők között public static void Main() { string[] szavak = new string[] { "eper", "körte", "egres", "alma" ; string maximum = ""; bool teljesul = false; foreach( string szo in szavak ) { if(! szo.startswith("e")) continue; if( teljesul ) { if( String.Compare( maximum, szo ) > 0 ) { maximum = szo; else { teljesul = true; maximum = szo; Console.WriteLine( maximum ); 2014 Bánsághi Anna 22 of 68
ELDÖNTÉS (LÉTEZIK) - FELADAT döntsük el egy számról, hogy prím-e döntsük el n tetszőleges számról, hogy van-e köztük páros döntsük el n tetszőleges karakterláncról, hogy van-e köztük üres 2014 Bánsághi Anna 23 of 68
ELDÖNTÉS (LÉTEZIK) - SPECIFIKÁCIÓ bemenet, kimenet előfeltétel utófeltétel x : T n létezik : L n 0 F : T L létezik = ( i [1..n] : F( x i ) = igaz) 2014 Bánsághi Anna 24 of 68
ELDÖNTÉS (LÉTEZIK) - ALGORITMUS i = 1 ciklus amíg i n és nem F(x ) ++i ciklus vége létezik = (i n) i 2014 Bánsághi Anna 25 of 68
ELDÖNTÉS (LÉTEZIK) - FORRÁSKÓD döntsük el n tetszőleges számról, hogy van-e köztük páros public static void Main() { int[] szamok = new int[] { 1, 2, 3, 4 ; int i = 0; while( i < szamok.length && szamok[i] % 2!= 0 ) { ++i; bool letezik = (i < szamok.length ); Console.WriteLine( letezik ); 2014 Bánsághi Anna 26 of 68
ELDÖNTÉS (MINDEGYIK) - FELADAT döntsük el n tetszőleges számról, hogy mind páros-e döntsük el n tetszőleges számról, hogy monoton növekedő sorrendben vannak-e döntsük el egy tetszőleges karaktersorozatról, hogy ábécé sorrendbe rendezett-e 2014 Bánsághi Anna 27 of 68
ELDÖNTÉS (MINDEGYIK) - SPECIFIKÁCIÓ bemenet, kimenet előfeltétel utófeltétel x : T n F : T L mindegyik : L n 0 mindegyik = ( i [1..n] : F( x i ) = igaz) 2014 Bánsághi Anna 28 of 68
ELDÖNTÉS (MINDEGYIK) - ALGORITMUS i = 1 ciklus amíg i n és F(x ) ++i ciklus vége mindegyik = (i > n) i 2014 Bánsághi Anna 29 of 68
ELDÖNTÉS (MINDEGYIK) - FORRÁSKÓD döntsük el n tetszőleges számról, hogy mind páros-e public static void Main() { int[] szamok = new int[] { 1, 2, 3, 4 ; int i = 0; while( i < szamok.length && szamok[i] % 2 == 0 ) { ++i; bool mindegyik = (i >= szamok.length ); Console.WriteLine( mindegyik ); 2014 Bánsághi Anna 30 of 68
LINEÁRIS KERESÉS - FELADAT adjuk meg egy szám első valódi osztóját keressük ki n tetszőleges szám közül az első párosat keressük ki n tetszőleges karakterlánc közül az első üreset 2014 Bánsághi Anna 31 of 68
bemenet, LINEÁRIS KERESÉS - SPECIFIKÁCIÓ kimenet és előfeltétel x : T n F : T L létezik L index 0 n 0 utófeltétel létezik = ( i [1..n] : F( x i ) = igaz) és létezik (index [1..n] F( x index ) = igaz) 2014 Bánsághi Anna 32 of 68
LINEÁRIS KERESÉS - ALGORITMUS i = 1 ciklus amíg i n és nem F(x ) ++i ciklus vége létezik = (i n) i ha létezik akkor index = i 2014 Bánsághi Anna 33 of 68
LINEÁRIS KERESÉS - FORRÁSKÓD adjuk meg egy szám legkisebb valódi osztóját public static void Main() { int szam = 8; int oszto = 2; while( oszto < szam && szam % oszto!= 0 ) { ++oszto; bool letezik = (oszto < szam ); if( letezik ) { Console.WriteLine( oszto ); 2014 Bánsághi Anna 34 of 68
EGY BEMENETI SOROZATHOZ EGY KIMENETI SOROZATOT 2014 Bánsághi Anna 35 of 68
MÁSOLÁS - FELADAT adott egy karakterlánc, cseréljük le az összes magánhangzót e betűre tetszőleges tömb bizonyos tulajdonságú elemeit cseréljük le egy másik elemre 2014 Bánsághi Anna 36 of 68
MÁSOLÁS - SPECIFIKÁCIÓ bemenet, kimenet előfeltétel utófeltétel x : T n y : T n n 0 F : T T i [1..n] : y i = F( x i ) 2014 Bánsághi Anna 37 of 68
MÁSOLÁS - ALGORITMUS ciklus i = 1-től n-ig y = F(x ) i ciklus vége i 2014 Bánsághi Anna 38 of 68
MÁSOLÁS - FORRÁSKÓD adott egy karakterlánc sorozat, alakítsuk át nagybetűsre a szavakat public static void Main() { string[] nevek = new string[] { "Bence", "Brigi" ; for( int i = 0; i < nevek.length; ++i ) { nevek[i] = nevek[i].toupper(); foreach( string nev in nevek ) { Console.WriteLine( nev ); 2014 Bánsághi Anna 39 of 68
KIVÁLOGATÁS - FELADAT adott n tetszőleges szám, válogassuk ki a negatívakat adott egy karakterlánc, válogassuk ki a magánhangzókat tetszőleges tömb bizonyos tulajdonságú elemeit tegyük egy másik tömbbe 2014 Bánsághi Anna 40 of 68
bemenet, kimenet és előfeltétel KIVÁLOGATÁS - SPECIFIKÁCIÓ x : T n m 0 n 0 F : T L y : T m n utófeltétel m = (F( x i ) = igaz) és y x és i=1 j [1..m] : F( y j ) = igaz 2014 Bánsághi Anna 41 of 68
KIVÁLOGATÁS - ALGORITMUS m = 0 ciklus i = 1-től n-ig ha F(x ) akkor i ++m y = x m elágazás vége ciklus vége i 2014 Bánsághi Anna 42 of 68
KIVÁLOGATÁS - FORRÁSKÓD adott egy szó, válogassuk ki a magánhangzókat public static void Main() { const string maganhangzok = "aáeéiíoóöőuúüű"; string szo = "patakhíd"; string mghbetuk = ""; foreach( char betu in szo ) { if( maganhangzok.contains( Char.ToString( Char.ToLowerInvariant( betu )))) { mghbetuk += betu; Console.WriteLine( mghbetuk ); 2014 Bánsághi Anna 43 of 68
EGY BEMENETI SOROZATHOZ TÖBB KIMENETI SOROZATOT 2014 Bánsághi Anna 44 of 68
SZÉTVÁLOGATÁS - FELADAT adott n tetszőleges szám, válogassuk szét a párosakat és a páratlanokat adott n tetszőleges dátum, válogassuk szét ezeket a hét napjainak megfeleően tetszőleges tömb elemeit válogassuk szét valamely tulajdonság alapján 2014 Bánsághi Anna 45 of 68
bemenet, kimenet előfeltétel és SZÉTVÁLOGATÁS - SPECIFIKÁCIÓ x : T n F : T { u 1, u 2,, u s k [1..s] : m k 0, y k : T m k n 0 s 1 n utófeltétel k [1..s] : m k = (F( x i ) = u k ) és y k x és i=1 j [1.. m k ] : F( y j ) = u k 2014 Bánsághi Anna 46 of 68
SZÉTVÁLOGATÁS - ALGORITMUS m1, m2,..., ms = 0 ciklus i = 1-től n-ig szelekció F(x ) alapján eset u1 ++m1 eset u2... y1 = x ++m2 y2 = x eset us ++ms ys = x szelekció vége ciklus vége m_1 m_2 m_s i i i i 2014 Bánsághi Anna 47 of 68
bemenet, SZÉTVÁLOGATÁS - SPECIFIKÁCIÓ S = 2 kimenet és és előfeltétel x : T n F : T L m 1, m 2 0 y 1 : T m 1 y 2 : T m 2 n 0 n utófeltétel m 1 = (F( x i ) = igaz) és y 1 x és i=1 j 1 [1.. m 1 ] : F( y j1 n = igaz) és m 2 = ( F( x i ) = hamis) és y 2 x és i=1 j 2 [1.. m 2 ] : F( y j2 = hamis) 2014 Bánsághi Anna 48 of 68
SZÉTVÁLOGATÁS - ALGORITMUS S = 2 m1, m2 = 0 ciklus i = 1-től n-ig ha F(x ) akkor i ++m1 y1 = x m1 különben ++m2 y2 = x m2 elágazás vége ciklus vége i i 2014 Bánsághi Anna 49 of 68
TÖBB BEMENETI SOROZATHOZ EGY KIMENETI SOROZATOT 2014 Bánsághi Anna 50 of 68
METSZET - FELADAT adott két tetszőleges számsorozat, adjuk meg a közös elemeket adott két vagy több halmaz, adjuk meg a metszetüket 2014 Bánsághi Anna 51 of 68
bemenet METSZET - SPECIFIKÁCIÓ x k : T n k (k [1..s]) m 0 kimenet és y : T m előfeltétel és s 2 k [1..s] : 0 utófeltétel és n k m = x k j [1..m] : 1 k s y j 1 k s x k 2014 Bánsághi Anna 52 of 68
METSZET - ALGORITMUS S = 2 m = 0 ciklus i = 1-től n1-ig j = 1 ciklus amíg j n ++j ciklus vége ha j < n2 akkor ++m y = x m elágazás vége ciklus vége i és x1 x2 2 i j 2014 Bánsághi Anna 53 of 68
UNIÓ - FELADAT adott két vagy több halmaz, adjuk meg az egyesítésüket 2014 Bánsághi Anna 54 of 68
bemenet UNIÓ - SPECIFIKÁCIÓ x k : T n k (k [1..s]) m 0 kimenet és y : T m előfeltétel és s 2 k [1..s] : 0 utófeltétel és n k m = x k j [1..m] : 1 k s y j 1 k s x k 2014 Bánsághi Anna 55 of 68
UNIÓ - ALGORITMUS S = 2 y = x1 m = n1 ciklus j = 1-től n2-ig i = 1 ciklus amíg i n1 és x1 x2 ++i ciklus vége ha i > n1 akkor ++m y = y m elágazás vége ciklus vége j i j 2014 Bánsághi Anna 56 of 68
SOROZATOK RENDEZÉSE 2014 Bánsághi Anna 57 of 68
RENDEZÉS - FELADAT rendezzük sorba egy n elemű sorozat elemeit 2014 Bánsághi Anna 58 of 68
bemenet kimenet x : T n y : T n n 0 RENDEZÉS - SPECIFIKÁCIÓ T előfeltétel és elemei rendezhetők (< > összehasonlítások megengedett műveletek) y P ermutáció(x) utófeltétel és Rendezett(y) 2014 Bánsághi Anna 59 of 68
HATÉKONYSÁG több - hatékonyságában eltérő - rendezési algoritmus létezik az algoritmusok összehasonlíthatók tárigény (a rendezésben részt vevő tárolóhelyek száma), valamint végrehajtási idő (hasonlítások száma, mozgatások száma) szerint 2014 Bánsághi Anna 60 of 68
CSERÉS RENDEZÉS hasonlítsuk össze az első elemet a mögötte levő többi elemmel, és ha valamelyik kisebb nála, akkor cseréljük meg azzal ciklus i = 1-től n-1-ig ciklus j = i+1-től n-ig ha x > x akkor Csere( x, x ) ciklus vége ciklus vége i j i j 2014 Bánsághi Anna 61 of 68
CSERÉS RENDEZÉS rendezzük nagyság szerint növekedő sorba egy n elemű számsorozat elemeit public static void Main() { int[] szamok = new int[] { 3, 2, 5, 1, 3, 6, 4 ; int tmp; for( int i = 0; i < szamok.length-1; ++i ) { for( int j = i+1; j < szamok.length; ++j ) { if( szamok[i] > szamok[j] ) { tmp = szamok[i]; szamok[i] = szamok[j]; szamok[j] = tmp; 2014 Bánsághi Anna 62 of 68
MAXIMUM KIVÁLASZTÁSOS RENDEZÉS hasonlítsuk egymással a szomszédos elemeket, és ha a sorrendjük nem jó, akkor cseréljük meg őket ciklus i = n-től 2-ig -1-esével max = 1 ciklus j = 2-től i-ig ha x > x akkor max = j ciklus vége Csere( x, x ) ciklus vége max i max j www.sorting-algorithms.com/selection-sort 2014 Bánsághi Anna 63 of 68
MAXIMUM KIVÁLASZTÁSOS RENDEZÉS rendezzük nagyság szerint növekedő sorba egy n elemű számsorozat elemeit public static void Main() { int[] szamok = new int[] { 3, 2, 5, 1, 3, 6, 4 ; int tmp; for( int i = szamok.length-1; i > 0; --i ) { int max = 0; for( int j = 1; j <= i; ++j ) { if( szamok[max] < szamok[j] ) { max = j; tmp = szamok[i]; szamok[i] = szamok[max]; szamok[max] = tmp; 2014 Bánsághi Anna 64 of 68
NAÍV BUBORÉKOS RENDEZÉS hasonlítsuk össze az első elemet a mögötte levő többi elemmel, de azok közül csak a legkisebbel cseréljük meg ciklus i = n-től 2-ig -1-esével ciklus j = 1-től i-1-ig ha x > x akkor Csere( x, x ) ciklus vége ciklus vége j j+1 j j+1 www.sorting-algorithms.com/bubble-sort 2014 Bánsághi Anna 65 of 68
NAÍV BUBORÉKOS RENDEZÉS rendezzük nagyság szerint növekedő sorba egy n elemű számsorozat elemeit public static void Main() { int[] szamok = new int[] { 3, 2, 5, 1, 3, 6, 4 ; int tmp; for( int i = szamok.length-1; i > 0; --i ) { for( int j = 0; j < i; ++j ) { if( szamok[j] > szamok[j+1] ) { tmp = szamok[j]; szamok[j] = szamok[j+1]; szamok[j+1] = tmp; 2014 Bánsághi Anna 66 of 68
NAÍV BESZÚRÓ RENDEZÉS ha van egy rendezett részsorozatunk, akkor abba a nagyság szerinti helyére illesszük be a soron következő elemet ciklus i = 2-től n-ig j = i - 1 ciklus amíg j > 0 és x > x --j ciklus vége ciklus vége Csere( x, x ) j j+1 j j+1 www.sorting-algorithms.com/insertion-sort 2014 Bánsághi Anna 67 of 68
NAÍV BESZÚRÓ RENDEZÉS rendezzük nagyság szerint növekedő sorba egy n elemű számsorozat elemeit public static void Main() { int[] szamok = new int[] { 3, 2, 5, 1, 3, 6, 4 ; int tmp; int j; for( int i = 0; i < szamok.length-1; ++i ) { j = i; while( j >= 0 && szamok[j] > szamok[j+1] ) { tmp = szamok[j]; szamok[j] = szamok[j+1]; szamok[j+1] = tmp; --j; 2014 Bánsághi Anna 68 of 68