Professional Documents
Culture Documents
Programozas Elmelet
Programozas Elmelet
1
Programozás elmélet
Programozási gondolkodásmód
2
Programozás elmélet
Alapfogalmak
3
Programozás elmélet
Néhány nevezetes adattípus
Természetes szám típus. Típusérték-halmaza a természetes számokat
(pozitív egész számokat és a nullát) tartalmazza, jele: N (N+ a nullát nem
tartalmazó természetes számok halmaza).
Típusműveletei az összeadás (+), kivonás (–), szorzás (*), az egész osztás
(div), az osztási maradékot előállító művelet (mod), esetleg a hatványozás,
valamint megengedett két természetes szám összehasonlítása (=, ≠, <, ≤, >,
≥).
Egész szám típus. Típusérték-halmaza (jele: Z) az egész számokat
tartalmazza (Z + a pozitív, Z- a negatív egész számok halmaza).
Típusműveletei a természetes számoknál bevezetett műveletek.
Valós szám típus. Típusérték-halmaza (jele: R) a valós számokat tartalmaz-
za (R + a pozitív, R- a negatív valós számok halmaza, R a 0pozitív valós
számokat és a nullát tartalmazó halmaz).
Típusműveletei az összeadás (+), kivonás (–), szorzás (*), osztás (/), a
hatványozás, valamint megengedett két valós szám összehasonlítása (=, ≠,
<, ≤, >, ≥) is.
4
Programozás elmélet
Logikai típus. Típusérték-halmaza (jele: L) a logikai értékeket tartalmazza.
Típusműveletei a logikai „és” (), logikai „vagy” (v), a logikai „tagadás” (¬) és
logikai „egyenlőség” (=) illetve „nem-egyenlőség” (≠).
Karakter típus. Típusérték-halmaza (jele: K) a karaktereket (a nagy és
kisbetűk, számjegyek, írásjelek, stb.) tartalmazza.
Típusműveletei a két karakter összehasonlításai (=, ≠, <, ≤, >, ≥).
Halmaz típus. Típusértékei olyan véges elemszámú halmazok, amelyek egy
meghatározott alaphalmaz részei. E alaphalmaz esetén a jele: 2E.
Típusműveletek a szokásos elemi halmazműveletek: halmaz ürességének
vizsgálata, elem kiválasztása halmazból, elem kivétele halmazból
(kivonás), elem berakása a halmazba (unió).
Sorozat típus. Típusértékei olyan véges hosszúságú sorozatok, amelyek
egy meghatározott alaphalmaz elemeiből állnak. E alaphalmaz esetén a
jele: E*.
Típusműveletei: egy sorozat hosszának (elemszámának) lekérdezése (|s|);
sorozat adott sorszámú elemére történő hivatkozás (s), azaz az elem
kiolvasása illetve megváltozatása; sorozatba új elem beillesztése; adott
elem kitörlése.
5
Programozás elmélet
Vektor típus. (Egydimenziós tömb) Típusértékei olyan véges, azonos
hosszúságú sorozatok, más néven vektorok, amelyek egy meghatározott
alaphalmaz elemeiből állnak. A sorozatokat m-től n-ig terjedő egész
számokkal számozzuk meg, más néven indexeljük. Ezeknek halmazát E
alaphalmaz esetén az Em..n jelöli, m = 1 esetén egyszerűen En.
Típusművelete egy adott indexű elemre történő hivatkozás, azaz az elem
kiolvasása illetve megváltozatása. A vektor első és utolsó eleme
indexének (az m és az n értékének) lekérdezése is lényegében egy-egy
típusművelet.
Mátrix típus. (Kétdimenziós tömb) Vektorokat tartalmazó vektor. Speciális
esetben azonos módon indexelt El..m -beli vektoroknak (úgynevezett
soroknak) a vektora (E vagy másképp El..m x k..n, ahol E az elemi értékek
halmazát jelöli), amelyet k=l=1 esetén egyszerűen Em x n-mel is
jelölhetünk.
Típusművelete egy adott sorbeli adott elemre (oszlopra) történő hivatkozás,
azaz az elem kiolvasása, illetve megváltoztatása. Típusművelet még a
mátrix egy teljes sorára történő hivatkozás, valamint a sorokat tartalmazó
vektor indextartományának illetve az egyes sorok indextartományának
lekérdezése.
6
Programozás elmélet
Állapottér
Amikor egy feladat minden lényeges adata felvesz egy-egy értéket, akkor
ezt az érték-együttest a feladat egy állapotának nevezzük.
Az állapotteret megadhatjuk úgy, hogy felsoroljuk a komponenseit, azaz az
állapottér lényeges adatainak típusérték-halmazait egyedi címkékkel ellátva.
Az állapottér címkéit a továbbiakban az állapottér változóinak nevezzük.
Az összes lehetséges állapot alkotja az állapotteret.
Feladat
A feladat egy olyan kapcsolat (leképezés), amelyik bizonyos állapotokhoz
(kezdőállapotokhoz) állapotokat (célállapotokat) rendel.
Megoldás
Egy program akkor old meg egy feladatot, ha a feladat bármelyik
kezdőállapotából elindulva biztosan terminál, és olyan állapotban áll
meg, amelyet célállapotként a feladat az adott kezdőállapothoz rendel.
7
Programozás elmélet
Program fogalma
A program kiinduló állapotainak terét a program alap-állapotterének
nevezzük, változói az alapváltozók. A működés során megjelenő újabb
komponenseket segédváltozóknak fogjuk hívni. Egy új segédváltozó
nevének különböznie kell a többi változó nevétől, kezdő értéke a
megjelenésekor nem-definiált (tetszőleges).
8
Programozás elmélet
Specifikáció
A feladat specifikálása során meghatározzuk a bemenő adatok
tetszőlegesen rögzített értékeihez tartozó kezdőállapotok halmazát,
valamint az ehhez tartozó célállapotok halmazát. A feladat specifikációja
tartalmazza:
1. az állapotteret, azaz a feladat lényeges adatainak típusérték-halmazait az
egyes adatokhoz tartozó változó nevekkel együtt
2. az előfeltételt, amely a kezdőállapotok azon halmazát leíró logikai állítás,
amely rögzíti a bemenő változók egy lehetséges, de tetszőleges kezdőérté-
két (ezeket általában a megfelelő változónév vesszős alakjával jelöljük)
3. az utófeltételt, amely a fenti kezdőállapotokhoz rendelt célállapotok
halmazát megadó logikai állítás
9
Programozás elmélet
Programozási tételek
10
Programozás elmélet
Programozási tételek főbb típusai
I. Sorozathoz érték rendelése:
1. Sorozatszámítás
2. Eldöntés
3. Kiválasztás
4. Lineáris keresés (Logaritmikus keresés)
5. Megszámlálás
6. Maximumkiválasztás
II. Sorozathoz sorozat rendelése
1. Másolás
2. Kiválogatás
1. Sorszámok kiválogatása
2. Elemek kiválogatása
3. Kiválogatás helyben
4. Kiválogatás kihúzással
III. Sorozathoz sorozatok rendelése
1. Szétválogatás
1. Két tömbbe
2. Egy tömbbe
3. Helyben
11
Programozás elmélet
IV. Sorozatokhoz sorozat rendelése
1. Metszet
2. Unió
3. Összefuttatás
4. Összefésülés (A ∩ B = { 0 })
5. Visszalépéses keresés (Backtrack)
Rendezések
1. Egyszerű cserés
2. Minimumkiválasztásos
3. Buborékos
4. Javított buborékos
5. Beillesztéses (kártyás)
6. Javított beillesztéses (javított kártyás)
Speciális rendezések:
1. Szétosztó
2. Számlálva szétosztó
3. Számláló
4. Shell
12
Programozás elmélet
I. Sorozathoz érték rendelése
I/1 Sorozatszámítás
Adott egy N elemű sorozat, és a sorozaton értelmezett ƒ függvény. Adjuk meg a
bemeneti sorozatra az ƒ függvény értékét!
Specifikáció:
Bemenet: N Є N0, X Є HN, ƒ : H* → G
Kimenet: SЄG
Ef.: ƒ 0 Є G ƒ() = ƒ 0 ƒ : G x H → G
ƒ(X1,…,XN) = ƒ (ƒ(X1,…,XN-1), XN)
Uf.: S = ƒ(X1,…,XN)
Sorozatszámítás (N, X, S):
S:= ƒ 0
Ciklus i=1-től N-ig
S:= ƒ (S, X( i ))
Ciklus vége
Eljárás vége
13
Programozás elmélet
I/2 Eldöntés (a)
a. Adott egy N elemű sorozat, és a sorozat elemein értelmezett T tulajdonság.
Adjuk meg, hogy a bemeneti sorozatnak van-e T tulajdonságú eleme!
Specifikáció:
Bemenet: N Є N0, X Є HN, T: H → L
Kimenet: VAN Є L
Ef.: -
Uf.: VAN ≡ ( i (1 ≤ i ≤ N): T(Xi)
14
Programozás elmélet
I/2 Eldöntés (b)
b. Adott egy N elemű sorozat, és a sorozat elemein értelmezett T tulajdonság.
Adjuk meg, hogy a bemeneti sorozatban az összes elem T tulajdonságú-e!
15
Programozás elmélet
I/3 Kiválasztás
Adott egy N elemű sorozat, és a sorozat elemein értelmezett T tulajdonság.
Tudjuk, hogy a sorozatnak van T tulajdonságú eleme. Adjuk meg ennek az
elemnek az indexét (sorszámát)!
Specifikáció:
Bemenet: N Є N0, X Є HN, T: H → L
Kimenet: SORSZ Є N0
Ef.: i (1 ≤ i ≤ N): T(Xi)
Uf.: 1 ≤ SORSZ ≤ N) T(XSORSZ)
16
Programozás elmélet
I/4 Lineáris keresés
Adott egy N elemű sorozat, és a sorozat elemein értelmezett T tulajdonság.
Adjuk meg, hogy a sorozatban van-e T tulajdonságú elem, és ha igen, akkor
adjuk meg az indexét (sorszámát) is!
Specifikáció:
Bemenet: N Є N0, X Є HN, T: H → L
Kimenet: VAN Є L, SORSZ Є N0
Ef.: -
Uf.: (VAN ≡ ( i (1 ≤ i ≤ N): T(Xi) )) (1 ≤ SORSZ ≤ N T(XSORSZ))
Uf.: DB= X
i 1
i
18
Programozás elmélet
I/6 Maximumkiválasztás
Adott egy N elemű sorozat. Adjuk meg a sorozat legnagyobb elemének indexét
(sorszámát)!
Specifikáció:
Bemenet: N Є N0, X Є HN
Kimenet: MAXINDEX Є N0
Ef.: H-n értelmezhető egy rendezési reláció, N ≥ 1
Uf.: 1 ≤ MAXINDEX ≤ N i (1 ≤ i ≤ N): XMAXINDEX ≥ Xi
19
Programozás elmélet
II. Sorozathoz sorozat rendelése
II/1 Másolás
Adott egy N elemű sorozat, és a sorozaton értelmezett F függvény. Állítsunk
elő egy másik sorozatot, amely a bemenő sorozat elemeit tartalmazza az ƒ
függvénnyel megváltoztatva!
Specifikáció:
Bemenet: N Є N0, X Є HN, ƒ: H → G
Kimenet: Y Є GN
Ef.: -
Uf.: i (1 ≤ i ≤ N): Yi = ƒ( Xi )
Másolás (N, X, Y):
Ciklus i=1-től N-ig
Y( i ) := ƒ ( X( i ))
Ciklus vége
Eljárás vége
20
Programozás elmélet
II/2 Kiválogatás
a. Adott egy N elemű sorozat, és a sorozaton értelmezett T tulajdonság.
Válogassuk ki egy másik sorozatba a T tulajdonságú elemek sorszámát!
Specifikáció: 1, ha T(Xi)
Bemenet: N Є N0, X Є HN, T: H → L, : H → {0,1} (x) =
0, egyébként
Kimenet: DB Є N0, Y Є {1..N}N
Ef.: - N
Uf.: DB= X
i 1
i , j (1 ≤ j ≤ DB): T( X Yi)
22
Programozás elmélet
II/2 Kiválogatás
d. Kiválogatás kihúzással: adott egy N elemű sorozat, és a sorozaton értelmezett
T tulajdonság. Válogassuk ki a T tulajdonságú elemeket ugyanebben a
sorozatban úgy, hogy a nem T tulajdonságú elemek helyére tegyünk egy
speciális értéket!
23
Programozás elmélet
III. Sorozathoz sorozatok rendelése
III/1 Szétválogatás
a. Szétválogatás két tömbbe: adott egy N elemű sorozat, és a sorozaton értelmezett
T tulajdonság. Válogassuk szét két külön sorozatba a T, illetve nem T tulajdonságú
elemeket!
Specifikáció: 1, ha T(Xi)
Bemenet: N Є N0, X Є HN, T: H → L, : H → {0,1} (x) =
0, egyébként
Kimenet: DBY Є N0, DBZ Є N0, Y Є HN, Z Є HN
Ef.: - N
j (1 ≤ j ≤ DBY): T( Y i) j (1 ≤ j ≤ DBZ): ¬ T( Z j)
Szétválogatás_két_tömbbe (N, X, DBY, Y, DBZ, Z):
DBY:=0 : DBZ:=0
Ciklus i=1-től N-ig
Ha T( X( i )) akkor DBY := DBY + 1 : Y( DBY ) := X( i )
különben DBZ := DBZ + 1 : Z( DBZ ) := X( i )
Ciklus vége
Eljárás vége 24
Programozás elmélet
III/1 Szétválogatás
25
Programozás elmélet
III/1 Szétválogatás
c. Szétválogatás helyben: adott egy N elemű sorozat, és a sorozaton értelmezett T
tulajdonság. Válogassuk szét a T, illetve nem T tulajdonságú elemeket a bemenő
sorozatban úgy, hogy a sorozat elején legyenek a T, a sorozat végén pedig a nem T
tulajdonságú elemek!
Szétválogatás_helyben (N, X, DB):
E := 1 : U :=N : segéd := X( E )
Ciklus amíg E < U
Ciklus amíg E < U és nem T( X (U ))
U := U -1
Ciklus vége
Ha E < U akkor
X( E ) := X( U ) : E := E +1
Ciklus amíg E < U és T( X ( E ))
E := E + 1
Ciklus vége
Ha E < U akkor X( U ) := X( E ) : U := U – 1
Elágazás vége
Ciklus vége
X( E ) := segéd
Ha T( X ( E )) akkor DB := E különben DB := E - 1
26
Eljárás vége Programozás elmélet
I. Sorozatokhoz sorozatok rendelése
III/1 Szétválogatás
a. Szétválogatás két tömbbe: adott egy N elemű sorozat, és a sorozaton értelmezett
T tulajdonság. Válogassuk szét két külön sorozatba a T, illetve nem T tulajdonságú
elemeket!
Specifikáció: 1, ha T(Xi)
Bemenet: N Є N0, X Є HN, T: H → L, : H → {0,1} (x) =
0, egyébként
Kimenet: DBY Є N0, DBZ Є N0, Y Є HN, Z Є HN
Ef.: - N
j (1 ≤ j ≤ DBY): T( Y i) j (1 ≤ j ≤ DBZ): ¬ T( Z j)
Szétválogatás_két_tömbbe (N, X, DBY, Y, DBZ, Z):
DBY:=0 : DBZ:=0
Ciklus i=1-től N-ig
Ha T( X( i )) akkor DBY := DBY + 1 : Y( DBY ) := X( i )
különben DBZ := DBZ + 1 : Z( DBZ ) := X( i )
Ciklus vége
Eljárás vége 27
Programozás elmélet
IV. Sorozathoz sorozatok rendelése
Halmazfelsorolás
Adott egy sorozat, amelyben lehetnek azonos elemek, készítsünk egy új sorozatot,
amelyben az eredeti sorozat minden eleme csak egyszer fordul elő!
28
Programozás elmélet
IV. Sorozathoz sorozatok rendelése
IV/1 Metszet
Adott két sorozat, amelyek egy-egy halmazt reprezentálnak. Adjuk meg egy
harmadik sorozatban a két halmaz metszetét!
Specifikáció: 1, ha x Є Y
Bemenet: N Є N0, X Є HN, M Є N0, Y Є HN, : H → {0,1} (x) =
0, egyébként
Kimenet: DB Є N0, Z Є Hmin(N,M)
Ef.: X és Y halmazfelsorolás
N
Xi
Uf.: DB= i 1 Z halmazfelsorolás j (1 ≤ j ≤ DB): (Zj Є X Zj Є Y)
Metszet (N, X, M, Y, DB, Z):
DB:= 0
Ciklus i= 1-től N-ig
j := 1
Ciklus amíg j ≤ M és X( i ) ≠ Y(j )
j := j + 1
Ciklus vége
Ha j ≤ M akkor DB := DB + 1 : Z( DB ) := X( i )
Ciklus vége
29
Eljárás vége Programozás elmélet
IV/1 Unió
Adott két sorozat, amelyek egy-egy halmazt reprezentálnak. Adjuk meg egy
harmadik sorozatban a két halmaz unióját!
Specifikáció: 1, ha y X
Bemenet: N Є N0, X Є HN, M Є N0, Y Є HN, : H → {0,1} (y) =
0, egyébként
Kimenet: DB Є N0, Z Є H N + M
Ef.: X és Y halmazfelsorolás
M
Uf.: DB= N + (Y )
j 1
j Z halmazfelsorolás i (1 ≤ i ≤ DB): (Zi Є X Zi Є Y)
33
Programozás elmélet
IV/2 Összefésülés
Amennyiben feltesszük, hogy a két sorozatban (halmazban) nincs közös elem
(nincs metszetük), akkor egyszerűbben is megoldható a feladat.
Összefésülés (N, X, M, Y, DB, Z):
DB:= 0 : i := 1 : j :=1
X( N + 1) := + : Y( M + 1) := + (az elemtípus maximális értéke)
Ciklus amíg i < N + 1 vagy j < M + 1
DB := DB + 1
Ha X( i ) < Y( j ) akkor
Z( DB ) := X( i ) : i := i + 1
különben
Z( DB ) := Y( j ) : j := j + 1
Elágazás vége
Ciklus vége
Eljárás vége
34
Programozás elmélet
Rendezések
•Cserés
•Minimum-kiválasztásos
•Buborék
•Javított buborék
•Beillesztéses (kártyás)
•Javított beillesztéses
•Szétosztó
•Számlálva szétosztó
•Számláló
35
Programozás elmélet
1. Cserés rendezés
Lényege:
A sorozat első elemét összehasonlítjuk a mögötte állókkal. Ha az első elem
nagyobb valamelyiknél akkor kicseréljük őket. Így előre jön a legkisebb elem.
Ezután ezt a műveletet ismételjük a sorozat maradék elemeivel, egészen a
végéig. A kisebb elemek sorban előre kerülnek növekvő sorrendben.
Algoritmus
Cserés:
Ciklus i = 1-től N-1-ig
Ciklus j = i + 1-től N-ig
Ha X( j ) < X( i ) akkor Csere ( X( j ), X( i ))
Ciklus vége
Ciklus vége
Eljárás vége
Sebesség
hasonlítások száma: N 1 N 2 ... 1 N N 1
2
N 1
mozgatások száma: 0… 3 N
2
- egy csere három mozgatásból áll
36
Programozás elmélet
Egyszerű cserés példa
Algoritmus
III. i=3
Cserés: I. j=5
j=4
Ciklus i = 1-től N-1-ig
Ciklus j = i + 1-től N-ig 2; 3; 12; 6; 7; cs=1
Ha X( j ) < X( i ) akkor Csere ( X( j
), X( i )) IV. i=4
Ciklus vége I. j=5
Ciklus vége 2; 3; 6; 12; 7; cs=1
Eljárás vége
Sorozat: 6; 3; 12; 2; 7
I.i=1
j=2
j=4
I. j=5
j=3
6; 3; 12; 2; 7; cs=2
II. i=2
I. j=5
j=4
j=3
2; 6; 12; 3; 7; cs=1
37
Programozás elmélet
2. Minimum - kiválasztásos rendezés
Lényege:
A sorozatból kiválasztjuk a legkisebbet és ezt kicseréljük a legelső elemmel.
Ezután a ezt a műveletet ismételjük a sorozat maradék tagjaira.
Algoritmus
Minimum - kiválasztásos:
Ciklus i = 1-től N-1-ig
min:= i
Ciklus j = i + 1-től N-ig
Ha X( j ) < X( min ) akkor min:= j
Ciklus vége
Csere ( X( i ), X( min ))
Ciklus vége
Eljárás vége
Sebesség N 1
hasonlítások száma: N
2
3 N 1
mozgatások száma:
- egy csere három mozgatásból áll
38
Programozás elmélet
Minimum - kiválasztásos példa
Algoritmus II. i=2
Minimum - kiválasztásos: I. min= 2 j= 4
35
Ciklus i = 1-től N-1-ig
2; 3; 12; 6; 7;
min:= i
Ciklus j = i + 1-től N-ig
Ha X( j ) < X( min ) akkor min:= j
III. i=3
Ciklus vége I. min= 4
3 j= 45
Csere ( X( i ), X( min ))
2; 3; 12; 6; 7;
Ciklus vége
Eljárás vége
Sorozat: 6; 3; 12; 2; 7 IV. i=4
I.i=1 I. min= 4 j= 5
I. min= 4 1
2 j= 4
2
3
5
2; 3; 6; 12; 7;
6; 3; 12; 2; 7;
39
Programozás elmélet
3. Buborék rendezés
Lényege:
A sorozat legnagyobb eleme többszörös cserékkel átkerül a sorozat végére,
majd a maradék N-1 elemből a legnagyobb átkerül az utolsó előtti helyre, és így
tovább.
Algoritmus
Buborék:
Ciklus i = N-től 2-ig visszafelé
Ciklus j = 1-től i - 1-ig
Ha X( j ) > X( j + 1 ) akkor Csere ( X( j ), X( j + 1 ))
Ciklus vége
Ciklus vége
Eljárás vége
Sebesség N 1
N
hasonlítások száma: 2
N 1
mozgatások száma: 0… 3 N 2
- egy csere három mozgatásból áll
40
Programozás elmélet
3. Javított buborék rendezés
Lényege:
A módszer kihasználja ha a sorozat egy része, vagy esetleg az egész sorozat rendezett.
Ilyen esetben gyorsabb a hagyományos buborék rendezésnél, teljesen rendezetlen sorozat
esetén viszont nem. A következő ciklus mindig csak az előző csere helyéig rendez, hiszen
ez után a sorozat már rendezett.
Sebesség N 1
Algoritmus N 1 N
hasonlítások száma: … 2
Javított buborék: N 1
3 N
mozgatások száma: 0… 2
i:= N - egy csere három mozgatásból áll
Ciklus amíg i > 1
cs:= 0
Ciklus j = 1-től i - 1-ig
Ha X( j ) > X( j + 1 ) akkor
Csere ( X( j ), X( j + 1 ))
cs:= j
elágazás vége
Ciklus vége
i:= cs
Ciklus vége
Eljárás vége
41
Programozás elmélet
3. Beillesztéses (kártyás) rendezés
Lényege:
Az eddigi módszerekkel szemben ennek a módszernek nincs szüksége a rendezéshez a
sorozat összes elemére. A sorozat elejéről kezdjük a rendezést és így egyre hosszabb
rendezett részsorozatokat kapunk. A következő elemet mindig a megfelelő helyre visszük.
Sebesség N 1
Algoritmus N
hasonlítások száma: N 1 … 2
Beillesztéses: N 1
mozgatások száma: 0… 3 N 2
Ciklus amíg i = 2-től N-ig - egy csere három mozgatásból áll
j:= i - 1
Ciklus amíg j > 0 és X( j ) < X( j + 1 )
Csere ( X( j ), X( j + 1 ))
j:= j - 1
Ciklus vége
Ciklus vége
Eljárás vége
42
Programozás elmélet
3. Javított beillesztéses rendezés
Lényege:
A beillesztendő elemet nem tesszük be egyből a sorozatba, hanem először a többi elemet
hátratoljuk az adott lépésben végleges helyére, majd csak ezután helyezzük el a
beillesztendő elemet.
Sebesség N 1
Algoritmus N 1 … N 2
hasonlítások száma:
Javított beillesztéses: N 1
2 N 1 2 N 1 N
mozgatások száma: … 2
Ciklus amíg i = 2-től N-ig - egy csere három mozgatásból áll
y:= X( i )
j:= i - 1
Ciklus amíg j > 0 és X( j ) < y
X( j + 1 ):= X( j )
j:= j - 1
Ciklus vége
X( j + 1):= y
Ciklus vége
Eljárás vége
43
Programozás elmélet