Programozási tételek Dr. Iványi Péter 1
Programozási tételek A programozási tételek olyan általános algoritmusok, melyekkel programozás során gyakran találkozunk. Az algoritmusok általában számsorozatokkal, tömbökkel foglalkoznak, legyen tehát T egy N elemű tömb (1..N) 2
Összegzés Elmúlt hónap bevásárlásai, pl. 30-szor vásároltunk Mennyit költöttünk? Számológép segítségével Lenullázom a számológépet Következő lépéseket 30-szor végezzük Előveszem a számlát Hozzáadom az összeghez Számológép kijelzi az összeget 3
Összegzés, megoldás Változók: i, összeg /* gép nullázása*/ Összeg = 0 /* 30-szor hajtsuk végre */ Ciklus i = 1-től 30-ig /* számla hozzáadás az összeghez */ összeg = összeg + számla(i) /* összeg kijelzése */ Ki: összeg 4
Bejövő adatok: Összegzés, adatok Hány adat van? (Számlák száma) Maguk az adatok (Számlán szereplő értékek) Végzendő művelet (számlák összeadása) Kimenő adat összeg 5
Összegzés, formálisan Adott egy "N" elemű "T" sorozat. Ezen sorozat elemeinek összegét, szorzatát, unióját stb. kell előállítani. s:= F0 Ciklus i:=1...n s:=f(s,t[i]) Ki: s 6
Összegzés, feladatok Egy tömb elemeinek összegzése s:=0 Ciklus i:=1...n s:=s+t[i] Ki: s 7
Összegzés, feladatok Számoljuk ki az első N szám összegét s:=0 Ciklus i:=1...n s:=s+i Ki: s 8
Összegzés, feladatok Számoljuk ki az első N szám szorzatát s:=1 Ciklus i:=1...n s:=s*i Ki: s 9
Összegzés, feladatok Számoljuk ki egy tanuló év végi átlagát, az osztályzatai ismeretében Osztályzatok egy tömbben vannak s:=0 Ciklus i:=1...n s:=s+t[i] atlag:=s/n Ki: atlag 10
Számlálás Egy 20 betűs mondatban hány darab e betű van? Kezdetben egy e betű sincs Minden karaktert megnézünk Ha találunk egy e betűt, húzzunk egy vonalat egy lapra 11
Számlálás, megoldás Változók: i, db db := 0 Ciklus i := 1-től 20-ig ha mondat[i] == e db := db + 1 Ki: db 12
Bemenő adatok Mondat betűinek száma Számlálás, adatok A betűket tartalmazó tömb Műveletek A feltétel, milyen betűket számlálunk Művelet ami a feltételt kielégítő tömb elemekhez 1-et, a többihez 0-át rendel Kimenő adat A darabszám 13
Számlálás, formálisan Rendelkezésünkre áll egy N elemű sorozat és egy, a sorozat elemein értelmezett F tulajdonság. Az a feladatunk, hogy az F tulajdonsággal rendelkező elemeket számoljuk meg. db:= 0 Ciklus i:=1...n ha F(T[i]) akkor db = db + 1 Ki: db 14
Számlálás, feladatok Megszámolja, hogy a tömbben hány negatív szám van s:=0 Ciklus i:=1..n Ha T[i]<0 akkor s:=s+1 Ki: s 15
Számlálás, feladatok A múlt hónapban minden nap vásároltam. Hányszor vásároltam 5000 Ft felett? db:=0 Ciklus i:=1..30 /* 30 nap */ Ha ár[i]>5000 akkor db:=db+1 Ki: db 16
Számlálás, feladatok Egy kutyaversenyen kizárják azokat a kutyákat, akik a verseny első fordulójában 20 pont alatt teljesítettek. Hány ilyen kutya volt? db:=0 Ciklus i:=1..n Ha kutya[i]<20 akkor db:=db+1 Ki: db 17
Számlálás, feladatok Számoljuk meg, hogy hány B betűvel kezdődő szó van egy szavakból álló listában! db:=0 Ciklus i:=1..n szó = szavak(i) Ha szó[1]== B akkor db:=db+1 Ki: db 18
Eldöntés Egy tanuló érdemjegyei alapján szeretnénk eldönteni, hogy kitűnő-e, vagy sem. Kétféle megoldás: 1. Ha a jegyei közt van olyan, ami nem ötös, akkor nem kitűnő. 2. Ha minden jegye ötös, akkor kitűnő. 19
Eldöntés 1. Nézzük végig a jegyeket, először az elsőt, majd sorra a többit és ellenőrizzűk, hogy ötös-e. Ha találtunk olyat, ami nem ötös, akkor nem kell megnézni a további jegyeket, mert van nem ötös osztályzat, azaz nem kitűnő 20
Eldöntés 1., megoldás van=nem i:=1 /* első jeggyel kezdjük */ Ciklus amíg i <= tantárgy és jegy[i] == 5 i:=i+1 /* végignézzük a jegyeket */ van = (i<=n) ki: van 21
Bemeneti adat: Eldöntés, adatok A tantárgyak száma Jegyek tömbje Egy tulajdonság a döntéshez Kimeneti adat: Egy logikai változó, hogy van-e 22
Eldöntés 1., formálisan Adott egy N elemű sorozat és egy, a sorozat elemein értelmezett Ftulajdonság.A feladat annak az eldöntése, hogy létezik-e ilyen (Ftulajdonságú) elem. 23
Eldöntés 1., formálisan i:= 1 Ciklus amíg i<=n és nem F(T[i]) i = i + 1 van = (i<=n) ki: van Fontos feltételek sorrendje!! 24
Eldöntés 2. Nézzük végig a jegyeket, először az elsőt, majd sorra a többit és ellenőrizzűk, hogy ötös-e. Ha minden elemet megvizsgáltunk akkor kitűnő 25
Eldöntés 2., megoldás mind=nem i:=1 /* első jeggyel kezdjük */ Ciklus amíg i <= tantárgy és jegy[i] == 5 i:=i+1 /* végignézzük a jegyeket */ mind = (i>n) ki: mind 26
Eldöntés 2., formálisan i:= 1 Ciklus amíg i<=n és nem F(T[i]) i = i + 1 mind = (i>n) ki: mind 27
Eldöntés, feladatok A múlt hónapban minden nap megmértük a Duna hőmérsékletét. Döntsük el, hogy a víz hőmérséklete folyamatosan emelkedett-e? i:= 1 Ciklus amíg i<n és ho[i] < ho[i+1] i = i + 1 mind = (i >= N) ki: mind 28
Eldöntés, feladatok A múlt héten minden nap vásároltunk. Volt-e olyan nap, hogy pontosan 2000 Ft-t fizettünk? i:= 1 Ciklus amíg i<=n és nem ar[i] == 2000 i = i + 1 van = (i <= N) ki: van 29
Kiválasztás Egy osztály matematika dolgozatai közül válasszuk ki az egyik ötös dolgozatot. Nézzük végig a dolgozatokat, először az elsőt, majd sorra a többit, amíg nem találunk ötös dolgozatot Amikor megtaláltunk egy ötöst, akkor ő lesz a kiválasztott. 30
Kiválasztás, megoldás i:=1 /* első jeggyel kezdjük */ Ciklus amíg i <= dolgozatok és jegy[i]!= 5 i:=i+1 /* végignézzük a jegyeket */ sorszám = i 31
Bemeneti adatok: Kiválasztás, adatok Dolgozatok száma A jegyek tömbje Egy tulajdonság, mely minden dolgozatra alkalmazható FONTOS: van legalább egy 5-ös dolgozat!!! Kimenet A dolgozat sorszáma 32
Kiválasztás, formálisan Adott egy N elemű sorozat és egy, a sorozat elemein értelmezett Ftulajdonság. Azt is tudjuk, hogy a sorozatban van legalább egy Ftulajdonságú elem. A feladat ezen elem sorszámának meghatározása. 33
Kiválasztás, formálisan Az algoritmus megadja, hogy a tömbben egy bizonyos elem hol (hányadik helyen) van. Csak akkor működik, ha biztosan van ilyen elem i:=1 Ciklus amíg nem F(T[i]) i:=i+1 ki: i 34
Kiválasztás, feladatok A múlt hónapban minden nap megmértük a Duna hőmérsékletét. Adjunk meg egy napot amikor a hőmérséklet nem érte el a 20 fokot! i:= 1 Ciklus amíg i<=n és ho[i] >= 20 i = i + 1 sorszam=i ki: sorszam Mi van ha nem volt ilyen nap? 35
Keresés Az előzőnél biztonságosabb algoritmus: megadja, hogy van-e olyan elem, és ha igen, hányadik. (többféle kereső algoritmus van) 36
Keresés Ismerjük egy üzlet januári napi bevételeit. Adjunk meg egy olyan napot -ha van-, amikor a bevétel több volt, mint 20000Ft. Nézzük végig a bevételeket, először az elsőt, majd sorra a többit, amíg nem találunk 20000Ft-nál nagyobbat. Ha találtunk ilyet, akkor van megoldás, és a megoldás a megtalált bevétel sorszáma különben nincs megoldás 37
Keresés, megoldás i:=1 Ciklus amíg i<=n_bevetel és bevetel[i]<=20000 i:=i+1 van=(i<=n_bevetel) Ha van sorszám = i ki: van, sorszám 38
Bemeneti adat: Keresés, adatok Bevételek száma A bevételek tömbje Egy tulajdonság a kereséshez Kimenet Van: logikai változó Sorszám: annak az elemnek a száma amit találtunk 39
Keresés, formálisan Lineáris keresés (keresés rendezetlen sorozatban) Adott egy N elemű sorozat és egy, a sorozaton értelmezett Ftulajdonság. A feladat : keressünk a sorozatban egy adott Ftulajdonságú elemet. (Nem biztos, hogy a sorozatban van ilyen elem.) 40
Keresés, formálisan i:=1 Ciklus amíg i<=n és nem( F(T[i]) ) i:=i+1 van = (i <= N) Ha van akkor sorszám = i 41
Keresés, formálisan Ha összetett a feltétel, akkor cikluson kívűl is számolhatjuk i := 0 felt := hamis Ciklus amíg i<=n és nem( felt ) i:=i+1 felt := F(T[i]) van := felt Ha van akkor sorszám := i 42
Keresés, feladatok Adjuk meg, hogy januárban mikor van, ha van, Mária nap! i:=1 Ciklus amíg i<=n és nevnap[i]!= Maria i:=i+1 van = (i <= N) Ha van akkor sorszám = i 43
Logaritmikus keresés Adott egy N elemű rendezett T() sorozat és egy keresett eleme (X). A feladat : keressünk a sorozatban az adott X elemet. (Nem biztos, hogy a sorozatban van ilyen elem.) 44
Logaritmikus keresés ah := 1 fh := N Ciklus k := (ah + fh)/2 egész része ha A(k) < X, akkor ah := k + 1 ha A(k) > X, akkor fh := k - 1 Ciklus amíg ah > fh vagy A(k)=X VAN := (A(k) == X) Ha VAN akkor SORSZÁM:=k 45
Maximum kiválasztás A térképről kiírtunk hegy magasságokat. Válasszuk ki a legmagasabb hegyet! Megjegyzem az első hegy magasságát. Ezt tekintem a legmagasabbnak. A többi hegyet sorra végignézem: Ha valamelyik magasabb, mint az eddigi legmagasabb, akkor az eddigi legmagasabbat elfelejtem, és az újat jegyzem meg. A végén pont a legmagasabb hegyet jegyeztük meg. 46
Maximum kiválasztás m := 1 maxert := magassag(m) Ciklus i:=2..n Ha magassag[i] > maxert akkor m:=i maxert:=magassag[i] Ki: m, maxert m: a pillanatnyilag talált legnagyobb elem helyét mutatja 47
Maximum kiválasztás, adatok Bemeneti adat Ismerni kell az adatok számát Az adatok a magassag tömbben vannak Kimenő adat A legmagasabb hegy indexe A legmagasabb hegy magassága Gyakorlatban, lehet hogy csak az egyiket határozzuk meg 48
Maximum kiválasztás, formálisan Adott egy "N" elemű "T" sorozat és egy, a sorozat elemei közt értelmezett kisebb-nagyobb reláció. A feladat ezen sorozat legnagyobb eleme sorszámának meghatározása. (Néha az elem értékére, az úgynevezett maximumra is szükség lehet). 49
Maximum kiválasztás, formálisan m := 1 maxert := T(m) Ciklus i:=2..n Ha T[i] > maxert akkor m:=i maxert:=t[i] Ki: m, maxert m: a pillanatnyilag talált legnagyobb elem helyét mutatja 50
Összetett tételek 51
Kiválogatás Ez az algoritmus egy tömb bizonyos tulajdonságú elemeit teszi egy másik tömbbe. db változó számolja, hogy a másik tömbbe hány elem került válogassuk ki a negatív számokat. Az eredmény a B tömbben lesz deklarációnál a B tömböt N eleműre kell választani, hacsak nem tudjuk előre, hány negatív szám van T-ben 52
Kiválogatás db:=0 Ciklus i:=1..n Ha T[i]<0 akkor db:=db+1 B[db]:=T[i] Ha vége 53
Szétválogatás Kiválogatáshoz hasonló, de a nem megfelelő elemeket is tömbbe tesszük Szétválogatás két tömbbe, mindkét tömb mérete azonos dbb:=0 dbc:=0 Ciklus i:=1..n Ha T[i]<0 akkor dbb:=dbb+1, B[dbb]:=T[i] különben dbc:=dbc+1, C[dbc]:=T[i] 54
Metszet két tömb (A[1..N] és B [1..M]) azonos elemeinek kiválogatása C tömbbe Az algoritmus lényege: menjünk végik A tömb elemein, és válogassuk ki azokat (kiválogatás), melyek szerepelnek B-ben (eldöntés). Visszavezethető a korábbi feladatokra C maximális elemszáma N és M közül a kisebbik 55
Metszet db:=0 Ciklus i:=1..n j:=1 Ciklus amíg j<=m és B[j]<>A[i] j:=j+1 Ha j<=m akkor db:=db+1, C[db]:=A[i] 56
Unió A és B tömb összes elemét C tömbbe tenni Tegyük be C-be A összes elemét, majd B-ből azokat, melyek nem szerepelnek A-ban. C elemszáma legfeljebb N+M. 57
Unió Ciklus i:=1..n C[i]:=A[i] db:=n Ciklus j:=1..m i:=1 Ciklus amíg i<=n és B[j]<>A[i] i:=i+1 Ha i>n akkor db:=db+1, C[db]:=B[j] 58
Sokféle van Rendezés Különböző adatokra Különböző rendezettségre stb 59
Rendezés maximum kiválasztással Az elv: kiválasztjuk a tömb legnagyobb elemét, és berakjuk a tömb végére (vagyis kicseréljük az utolsó elemmel) Ezt az eljárást ismételjük a maradék tömbre i változó adja meg, hogy hányadik elem fog a helyére kerülni A Csere(i,m) eljárás kicseréli a tömb i. és m. elemét 60
Rendezés maximum kiválasztással Ciklus i:=n..2 m:=1 Ciklus j:=2..i Ha T[j]>T[m] akkor m:=j Csere(i,m) 61
Buborékos rendezés Végigmegy a tömbön, és ha szomszédos elemeknél rossz a sorrend, megcseréli őket. Ez a csere, mint egy buborék, végighalad a tömbön, és a legnagyobb elemet biztosan a tömb végére teszi. i változó ismét azt jelzi, hányadik elem kerül a helyére. 62
Buborékos rendezés Ciklus i:=n..2 Ciklus j:=1..i-1 Ha T[J]>T[J+1] akkor Csere(j,j+1) 63