You are on page 1of 45

Adatszerkezetek s Programozsi ttelek

1.1 kiads
rta Fbin Zoltn
Budapest, 2005-01-27

Tartalomjegyzk
1

BEVEZETS.......................................................................................................................................................... 3

ALGORITMUSOK ................................................................................................................................................ 4
2.1
ALGORITMUSELR MDSZEREK, NYELVEK......................................................................................................... 4
2.1.1 Folyamatbra .............................................................................................................................................. 4
2.1.2 Struktogram ................................................................................................................................................. 5
2.1.3 Mondatszer lers ...................................................................................................................................... 5
2.2
AZ ALGORITMUSOK DOKUMENTLSA................................................................................................................ 6

ELEMI ALGORITMUSOK, PROGRAMOZSI TTELEK ............................................................................. 7


3.1
SOR, RTK TTELEK......................................................................................................................................... 7
3.1.1 sszegzs ttel ............................................................................................................................................. 7
3.1.2 tlagszmts............................................................................................................................................... 7
3.1.3 Eldnts....................................................................................................................................................... 8
3.1.4 Keress ........................................................................................................................................................ 8
3.1.5 Megszmlls .............................................................................................................................................. 9
3.1.6 Maximum kivlaszts (minimum kivlaszts) ttele ...................................................................................... 9
3.2
SOR, TBB RTK ............................................................................................................................................ 10
3.2.1 Kivlogats ttele ...................................................................................................................................... 10
3.3
SOR, TBB ELEM ............................................................................................................................................. 10
3.3.1 Kivlogats ttele mdostsa.................................................................................................................... 10
3.3.2 sszefsls............................................................................................................................................... 10
3.4
RENDEZSEK................................................................................................................................................... 12
3.4.1 Egyszer csere ........................................................................................................................................... 12
3.4.2 Ciklikus permutci ................................................................................................................................... 12
3.4.3 Bubork rendezs....................................................................................................................................... 12
3.4.4 Minimum kivlasztsos (maximum kivlaszts) rendezs............................................................................ 13
3.4.5 Beszrsos rendezs................................................................................................................................... 13
3.4.6 Gyorsrendezs ........................................................................................................................................... 14
3.5
PROGRAMOZSI TTELEK ALKALMAZSA ......................................................................................................... 15

ADATSZERKEZETEK, ADATTPUSOK, ADATTROLS .......................................................................... 16


4.1
EGYSZER ADATSZERKEZETEK......................................................................................................................... 16
4.1.1 Numerikus tpusok ..................................................................................................................................... 17
4.1.2 Karakter tpus............................................................................................................................................ 20
4.1.3 Logikai tpus.............................................................................................................................................. 21
4.1.4 Mutatk, pointerek..................................................................................................................................... 21
4.1.5 Megszmllhat s nem megszmllhat adattpusok................................................................................. 22
4.1.6 Konverzik................................................................................................................................................. 22
4.1.7 Globlis- s loklis adatok kezelse, az adatok lthatsga ....................................................................... 22
4.1.8 Paramtertads........................................................................................................................................ 23
4.2
SSZETETT ADATSZERKEZETEK ....................................................................................................................... 24
4.2.1 Tmbk, sorozatok ..................................................................................................................................... 24
4.2.2 Halmaz tpus.............................................................................................................................................. 26
4.2.3 Rekord tpus............................................................................................................................................... 27
4.2.4 Sor adattpus, FIFO ................................................................................................................................... 27
4.2.5 Verem adattpus......................................................................................................................................... 29
4.2.6 Lista adatszerkezet..................................................................................................................................... 30
4.2.7 Fa adattpus............................................................................................................................................... 34
Grf adattpus ........................................................................................................................................................ 36
4.2.8 Fjl adattpus ............................................................................................................................................ 37
4.2.9 Objektumok................................................................................................................................................ 39

REKURZI.......................................................................................................................................................... 41
5.1
5.2
5.3

A REKURZV ELJRSOK, FGGVNYEK ............................................................................................................ 41


REKURZI S A CIKLUSOK ................................................................................................................................ 42
REKURZV ADATSZERKEZETEK ......................................................................................................................... 43

ZRSZ ............................................................................................................................................................ 45

Bevezets

Nincs.
Fbin Zoltn fz@szily.hu
Budapest, 2005. janur 27.

Algoritmusok

Az ember a fejben megbv gondolatokat tevkenysgek sorozatra fordtja le. A fordts eredmnye egy tevkenysg sorozat, amelyet fel tud vzolni magnak valamilyen elre definilt lert mdszerrel. Ezt a rgztett
cselekvssorozatot hvjk algoritmusnak. Az algoritmus elssorban az embernek szl valamifle formlis lers.
Az algoritmusok lersnak jl definilt mdszerei vannak.

2.1

Algoritmuselr mdszerek, nyelvek

Hrom fle algoritmusler mdszer terjedt el Magyarorszgon. Az els lersi mdszert mg a msodik genercis gpek idejn talltk ki, ma is sokan hasznljk. Ez a folyamatbra. Ahogy a programozs egyre inkbb
tudomnny vlt a folyamatbra mr nem felelt meg az egzakt s absztrakt brzolsnak, a programozk kitalltk a struktogram-ot. A struktogram preczen brzolja a folyamatokat, ugyanakkor olvassa esetenknt
nehzkes, a valdi programozstl kicsit elrugaszkodott. A programozs oktatsban vezettk be a mondatszer
lerst. A felsorolt hrom algoritmus-ler mdszer egyenrang, mind a hrom alkalmas arra, hogy kisebbnagyobb rendszerek algoritmusait megfogalmazzuk segtsgkkel.

2.1.1 Folyamatbra
A folyamatbrk hasznlatakor grafikai jelekkel jelljk az egyes programozsi egysgeket. A grafikai jeleket
nyilakkal ktjk ssze, a program futsnak megfelel mdon. ltalban egy program vagy egy eljrs fentrl
lefel vagy balrl jobbra hajtdik vgre, legalbbis a folyamatbra rajzolsnl erre kell trekedni. A szoksos
feldolgozsi lpseket az albbi mdon szimblumokkal jelljk:
start

Az algoritmus elejt gy jelljk:


Egy utasts, az utastsba belerjuk az utastst.

Elgazs - eldnts

felttel

n
Ha a felttel igaz, akkor az i-vel jellt gon a program, egybknt az n-nel jellt gon folyik tovbb.
Ahol kt vgrehajtsi szl tallkozik, azt a kvetkezkppen jelljk:
A ciklusok lersa kln nincsen, kzzel kell sszelltani.
A program vgt a kvetkez szimblum jelli:
stop

2.1.2 Struktogram
A struktogram algoritmus ler mdszer elssorban a professzionlis programozs oktatsa sorn hasznland.
Ennek a ler mdszernek az elnye rendkvl egzakt mdjban s tmrsgben van. Taln kezdk szmra nem
annyira ttekinthet, mint a folyamatbra, de annak hibit kikszbli.
A programban egy elemi lpst a kvetkez jelzi:
Elemi programlps
Feltteles elgazs:
Felttel
i

Elemi programlps

Elemi programlps

A ciklust az albbi mdon jellhetjk:


Felttel, amg a
Elemi lpsek
.

2.1.3 Mondatszer lers


A mondatszer lersnak akkor van rtelme, ha a programoz valamilyen szinten mr tisztban van egy szmtgpes program mkdsvel, rti az utastsok egymsutnisgnak, az rtkadsnak, az elgazsoknak, a
ciklusoknak a fogalmt. rti azt, hogy mit jelent egy eljrs hvsa s mit jelent egy fggvny hvsa. Mint ltjuk
majd, az algoritmus-ler nyelv egyfajta magyar nyelv programozsi nyelv. Ennek a nyelvnek egy oktatsi cl
megvalstsa a Budapesti Mszaki Egyetemen kifejlesztett ELAN nyelv.
A mondatszer lers a kvetkez szintaktikai szablyokat tartalmazza:
rtkads:
:=

A kt oldalon azonos tpus rtkek vannak

Feltteles elgazs:
Ha felttel igaz akkor Utasts
vagy
Ha felttel igaz akkor
Utastsok
Elgazs vge
vagy
Ha felttel igaz akkor
Utastsok
Klnben
Utastsok
Elgazs vge
Ciklusok:
Ciklus cv :=kezdrtktl vgrtkig lpskzzel

Ciklus vge
vagy
Ciklus amg felttel igaz

Ciklus vge
vagy

Ciklus

amg felttel
Ciklus vge
Kezdrtk ads, inicializls
Ki:
Kir utasts
Be:
Adatbeviteli utasts
Tmb:
Tmb definilsa
Inicializls(kezdrtk) Bizonyos adatok kezdrtknek megadsa
Program struktrk
Program Nv

Program vge
Eljrs Nv(paramterlista)

Eljrs vge
Fggvny Nv(paramterlista)

Nev := visszatrsi rtk


Fggvny vge
Az eljrsokat s fggvnyeket az albbi mdon hvhatjuk meg a programokbl:
Nv( paramterlista )
vagy
rtk := Nv( paramterlista )

2.2

Az algoritmusok dokumentlsa

Az algoritmusok hasznlatakor szksges megadni a programok, az eljrsok specifikcijt, azaz milyen bemen adatokat vr a program, azokra milyen felttelek rvnyesek, tovbb az elvrt kimeneti adatokat is meg
kell adni, azokra milyen feltteleket vrunk, mikor tekintjk helyesnek s mikor hibsnak az eredmnyt.
Minden esetben szksges a programban meghvott, nem trivilis eljrsok esetn lerni, hogy mit vrunk
a meghvott eljrstl. Az eljrs kifejtsekor pedig clszer lerni az eljrs fejlceknt, hogy az eljrs mit vgez el, milyen tpus bemen adatokat produkl s milyen kimen adatokat vrunk tle.
A folyamatbrk s struktogrammok hasznlata sorn az algoritmusokat clszer b magyarzattal elltni
tekintve, hogy az elbbi kt lers meglehetsen absztrakt. Az algoritmusler nyelv hasznlata sorn a dokumentls hozzvetlegesen ugyanolyan mrtk kell, hogy legyen, mint a programok rsnl. Az nem teljesen
magtl rtetd zrt programrszek eltt tmren le kell rni a funkcijukat, esetleg annak magyarzatt, hogy
mirt pont gy, azokkal az eszkzkkel valstjuk meg a folyamatot.

Elemi algoritmusok, programozsi ttelek

A tovbbiakban olyan algoritmusokat trgyalunk meg, amelyek a programozs sorn rendszeresen elfordul feladatok megoldsra ksz vlaszt adnak. Ezeket az algoritmusokat programozsi tteleknek hvjk. A
programozsi ttelek azok az ptkvek, amelyek egy program ltrehozsa sorn minduntalan elfordulnak.
Az elemi algoritmusok sorn hasznlt kzs jellsek
Minden programban egy vagy tbb A[N] jel, N elem vagy B[M] jel, M elem tmb tartalmazza a kiindul
tetszleges tpus adatokat. Esetenknt a C[K] jel tmb K elem tartalmazza az eredmny rtkeket. T az elemeknek egy tulajdonsga, amit A[N].T-vel jellnk. (Ezt a jellst a rekordokbl ll tmbktl vettk t.
Egyszerbb esetekben a T tulajdonsg maga az elem rtke.)
Meg kell jegyezni, hogy a tmbket csak a trgyals egyszersge miatt alkalmaztuk, azok lehetnek azonos tpus
rekordokbl ll fjlok vagy listk is. Ennek megfelelen a programozsi ttelek megfogalmazhatk azonos hoszszsg rekordokbl ll file-okra s listkra is.
Ilyen esetekben az albbi mveleteket kell kicserlni az algoritmusokban:
Tmb
Egy tmbelem vizsglata

Iterci egy ciklusban


A tmb vgnek vizsglata
Egy tmb elem rtknek az trsa

tmbindex

3.1

File
Egy rekord beolvassa egy vltozba, majd a megfelel mez
vizsglata
Lps a file kvetkez rekordjra
End Of File vizsglata
Ugrs az adott sorszm rekordra,
majd rs a rekordba, rs, utn a
rekordmutatt eggyel visszalltjuk
rekordsorszm

Lista
A listaelem beolvassa s a megfelel mez vizsglata
Lps a kvetkez listaelemre
A listamutat 0-e vizsglat
A Listaelem kirsa

Egy szmll tpus rtk, a listafej


esetn 0 s minden iterci esetn
nvekedik eggyel.

Sor, rtk ttelek

Olyan ttelekrl van sz, amelynl egy sorhoz egy rtket rendelnk hozz. Azaz a kiindul adatok A[N], N elem tmbben vannak.

3.1.1 sszegzs ttel


Mekkora az A[N] tmb elemeinek sszege. A tmb elemei numerikus tpusak
Osszeg := 0
Ciklus i:=1-tl N-ig
Osszeg := Osszeg+A[i]
Ciklus vge
Ki: Osszeg

3.1.2 tlagszmts
Az tlagszmts visszavezethet az sszegzsi ttelre. Egy dologra kell vigyzni. Mg a tmb elemei lehetnek
egsz tpusak, az tlag kiszmtsnl vagy vals tpust kell alkalmaznunk, vagy egsz szmok osztst kell
hasznlnunk.

Osszeg := 0
Atlag := 0
Ciklus i:=1-tl N-ig
Osszeg := Osszeg + A[i]
Ciklus vge
Atlag : = Osszeg / N
Ki: Atlag

3.1.3 Eldnts
Dntsk el, hogy egy A[N] tetszleges tpus tmbben, hogy van-e benne T tulajdonsg elem. A keresett elemet
a K nev vltoz tartalmazza, teht a keresett tulajdonsg : K A vlaszt a Letezik nev logikai tpus vltoz
fogja tartalmazni.
Be: K
i:=1
Ciklus amg NEM ( (i <= N) s ( A[i].T == K ) )
i := i + 1
Ciklus vge
Letezik := (i <= N)
Itt az utols sort meg kell magyarzni. A legtbb nyelvben az rtkads jobb oldaln ll kifejezst a rendszer
elszr kirtkeli, majd a logikai rtket rtkl adja a bal oldalon ll vltoznak. Ha ezt egy programozsi nyelv
nem tmogatja, akkor a kvetkez kddal lehet helyettesteni a sort:
Ha i <= N akkor
Letezik := Igaz
klnben Ltezik := Hamis

3.1.4 Keress
Egy A[N] tetszleges tpus tmbben keresnk egy T tulajdonsg elemet. Ha ltezik, akkor visszaadjuk a sorszmt, klnben egy olyan sorszmot adunk vissza, amely lehetetlen. A Sorszm nev vltoz adja vissza a
keress rtkt. A vltoz kezdrtkt gy kell megvlasztani, hogy a tmb legkisebb index elemnl is kisebb
legyen.
Lineris keress
Be: Elem
Sorszam := -1
i:=1
Ciklus amg NEM ((i <= N) s ( A[i].T == Elem.T ) )
i := i + 1
Ciklus vge
Letezik := (i <= N)
Ha (i <= N ) akkor Sorszam := i
Klnben sorszam := Lehetetlen rtk
Ha a fenti eljrst fggvnyknt hasznljuk, akkor a fggvny rtknek a lekrdezsnl azt kell vizsglni, hogy
a Sorszmknt visszaadott rtk benne van-e a tmb rtelmezsi tartomnyban.
A lineris keress tlagosan N/2-szr fut le, mivel vletlenszer elemek esetn s nagy szm keress esetn tlagosan az N/2-ik lesz a keresett elem. Ennl sokkal jobb eredmnyt ad a binris keress.
Binris keress.
A binris keress felttele, hogy a kiindulsi tmb T tulajdonsg szerint nvekven vagy cskkenen rendezett
legyen. Mi most a nvekv rendezettsget ttelezzk fel. Ebben az esetben a keress elve az, hogy megnzzk a
tmb kzps elemt. Ha megtalltuk a keresett elemet, akkor befejeztk a keresst. Ha a kzps elem T tulajdonsg szerint kisebb, mint a keresett elem, akkor nyilvn a fels fl tartomnyban kell keresni a keresett elemet,
ha pedig kisebb, akkor az als fl tartomnyban kell keresni. Ily mdon minden egyes sszehasonlts sorn kizrjuk a maradk elemek felt. Ennek megfelelen log2N keress alatt megtalljuk az eredmnyt, illetve eldnthetjk,
hogy az elem benne van-e a keresett elemek kztt. Pldul N =1024 esetn 10 sszehasonlts elegend, mivel
8

log21024 = 10. (log2N jelenti azt a szmot, amire emelve 2-t N-t kapunk eredmnyl, azaz, ha a:= log2N, akkor
a
10
2 =1024. A mi pldnkban 2 = 1024.)
Be: K
Also := 1
Felso := N
Kozepso := ( Also + felso ) / 2
Ciklus amg ( Also <= Felso ) s (A[Kozepso].T <> K )
Ha A[Kozepso].T > K Akkor
Felso := Kozepso - 1
Klnben
Also := Kozepso + 1
Elgazs vge
Kozepso := int(( Also + Felso ) / 2)
Elgazs vge
Ciklus vge
Ha (A[Kozepso].T = K) Akkor
Klnben

Sorszam := Kozepso
Sorszam := -1

A rutinban szerepl osztsok termszetesen az adott programozsi nyelv egsz tpus osztsnak felelnek meg, s
egsz tpus eredmnyt kell visszaadniuk.

3.1.5 Megszmlls
Egy A[N] tetszleges tpus tmbben keressk hogy hny db. T tulajdonsg eleme van. Itt az a krds, hogy az
adott tulajdonsg hnyszor fordul el, teht definilunk egy Szamlalo nev egsz rtkeket felvev vltozt,
amelynek a kezd rtke 0. Az fogja tartalmazni a krdses elemszmot. A korbbi ttelekkel ellenttben itt nyilvnvalan vgig kell nzni a teljes tmbt, ezrt nem ciklus amg, hanem ciklus -tl ig tpus
ciklust kell hasznlni.
Be: K
Szamlalo := 0
Ciklus (i = 1tl N-ig)
Ha A[i].T == K akkor Szamlalo := Szamlalo + 1
Ciklus vge
Ha (i <= N ) akkor Sorszam := i

3.1.6 Maximum kivlaszts (minimum kivlaszts) ttele


Keressk meg egy A[N], N elem tmb elemei kzl egy T tulajdonsg szerinti legnagyobb elemet s a sorszmt
valamint az rtket magt adjuk meg eredmnyl. Az Ertek nev vltoz tartalmazza majd a legnagyobb elem
rtkt, s a Hely mutatja meg a legnagyobb rtk helyt.
Ertek := A[1]
Hely := -1
Ciklus i = 1tl N-ig
Ha A[i].T > Ertek.T akkor
Ertek := A[i]
Hely := i
Elgazs vge
Ciklus vge
Ki: Ertek, Hely
Nyilvn a legkisebb elemet gy tudjuk kivlasztani, hogyha a relcis jelet megfordtjuk.

3.2

Sor, tbb rtk

Az eddigi programozsi ttelekben egy rtket szolgltattak. A tovbbiakban olyan ttelek nznk, amelyek tbb
rtket adnak vissza. Ennek megfelelen az eredmnyeket is egy tmbben kapjuk vissza. A tmb nha ugyanaz,
mint a bemeneti rtkeket tartalmaz tmb, de nha msik tmb vagy tmbk.

3.2.1 Kivlogats ttele


A kivlaszts ttele a bemeneti rtkek A[N], N elem tmbjbl kivlaszt bizonyos T tulajdonsg elemeket, s
azokat kirja a kpernyre.
Be: Elem
Ciklus (i = 1 tl N-ig)
Ha A[i].T == Elem.T akkor Ki: A[i]
Ciklus vge
Nyilvn a fenti algoritmus nem tudja visszaadni az sszes rtket az t meghv eljrsnak, ezrt ennek egy javtst fogjuk megnzni a kvetkezkben.

3.3

Sor, tbb elem

3.3.1 Kivlogats ttele mdostsa


A kivlaszts ttele mdostsa a kivlasztott bizonyos T tulajdonsg elemeket, tmsolja egy C[K], K elem
eredmnytmbbe. Felttel, hogy C[K] tmb elemszma nagyobb vagy egyenl legyen A[N] elemszmval, azaz
K>=N. Az algoritmus vgn C[j] lesz az eredmny tmb utols rtkes eleme.
Be: Elem
j := 0
Ciklus (i = 1 tl N-ig)
Ha A[i].T == Elem.T akkor
j := j+1
C[j] := A[i]
Elgazs vge
Ciklus vge

3.3.2 sszefsls
Az sszefsls sorn A[N], N elem s B[M], M elem T tulajdonsg szerint rendezett tmb elemeibl lltunk
el egy T szerint rendezett C[K], K elem eredmnytmbt.
Az eljrsnak kt vltozata van. Az egyik esetn az elemek tbbszrzst megengedjk, azaz ha mind a kt
tmbben ugyanolyan tulajdonsg elem van, akkor mind a kettt belevesszk az eredmnytmbbe, az egyszerbb
esetben csak az egyiket vesszk bele. Nyilvn az eredmnytmbnek legalbb K := M + N elemnek kell lennie.

10

i := 1
j := 1
l := 0
Vege := Hamis
Ciklus amg Nem Vege
l := l + 1
Ha A[i].T < B[j].T akkor
C[l] := A[i]
i := i + 1
Ha i > N Akkor Vege := Igaz
klnben
C[l] := A[j]
j := j + 1
Ha j > M Akkor Vege := Igaz
Elgazs vge
Ciklus vge
Ha i > N Akkor
Ciklus amg j<= M
C[l] := B[j]
l := l + 1
j := j + 1
ciklus vege
klnben
Ciklus amg i<= N
C[l] := B[i]
l := l + 1
i := i + 1
ciklus vege
elgazs vge
Az algoritmus els rsze akkor r vget, amikor az egyik tmb elemeibl kifogytunk, utna mr csak a msik
tmb elemeit kell tmsolni az eredmnytmbbe.

11

3.4

Rendezsek

A rendezsi algoritmusok a programozs leggyakrabban hasznlt eljrsai. A rendezsek legfbb szempontja,


hogy a rendezs helyben trtnjen, azaz az eredmnytmb megegyezik a bemen adatok tmbjvel. Ebbl az okbl kifolyan br az eredmny tmb, de mgsem sorolhatjuk be a Tmb -> Tmb tpus algoritmusok kz.
A rendezsek hatkonysgnak legfontosabb szempontja az, hogy hny sszehasonlts s hny csere trtnik a
rendezs sorn. Br a modern szmtgpek nhny ezer rtk esetn gyorsan el tudjk vgezni a rendezseket,
azonban nem ritka a tbb szzezer vagy tbb milli bemen adat. Az ilyen adatmennyisgeknl nyilvn a leggyorsabb szmtgp is sok idt tlt el a rendezs sorn. Mindig a megfelel rendezsi eljrst kell alkalmazni.
A rendezsek sorn gyakran alkalmazzuk a Csere eljrst, amely kicserli a kt bemen paramtert egymssal.

3.4.1 Egyszer csere


Az egyszer csere nem a rendezsekhez tartozik, mgis nagyon fontos eljrs. Legyen a s b cm szerint tadott
kt paramtere a Csere nev eljrsnak.
Eljrs Csere( a, b )
C := a
A := b
B := c
Eljrs vge

3.4.2 Ciklikus permutci


Ez az eljrs az egyszer csere tovbbvitele. Egy A[N], N elem tmb elemeit egy hellyel lptetni kell gy, hogy
az els elem az utols helyre kerl s a tbbi elem egy indexxel kisebb helyre kerl.
Eljrs Permutci( A[N] )
C := A[1]
Ciklus i:= 1 tl N-1 ig
A[i] := A[i+1]
Ciklus vge
A[N] := c
Eljrs vge
A fenti eljrsban rdemes megfigyelni, hogy a ciklus N-1 ig megy, mivel ha N-ig menne, akkor az rtkadsban
az i = N esetben az i+1 tlmutatna a tmb hatrn.

3.4.3 Bubork rendezs


A buborkalgoritmus elve az, hogy az egyms utni elemeket sszehasonltom. Ha a nagyobb rtk elem alacsonyabb index helyen van, mint a kisebb rtk, akkor kicserlem ket. Majd tovbb folytatom az
sszehasonltst, amg a tmb vgre nem rek. Ekkor a legnagyobb elem a legnagyobb sorszm helyen lesz. A
msodik menetben csak N-1 ig megyek, .
Ciklus i := N tl 1 lefel 1 -esvel
Ciklus j := 1-tl i-1 -ig
Ha A[j].T > A[j+1].T akkor Csere( A[j], A[j+1] )
Cilus vge
Ciklus vge
Az eljrs hatkonysga elg j, N*(N-1)/2 csere szksges tlagosan.

12

3.4.4 Minimum kivlasztsos (maximum kivlaszts) rendezs


A maximum kivlaszts elve az, hogy ha egy tmb 1..N eleme kzl kivlasztjuk a legkisebbet, majd azt a legels
elem helyre tesszk, akkor a 2..N elem nla mr csak nagyobb lehet. Ekkor a 2..N elembl is kivlasztjuk a legkisebbet, majd a 2. Helyre msoljuk. A vgn az elemek nvekv sorrendben lesznek.
Ciklus i := 1 tl N-1 ig
Ciklus j := i+1-tl N-ig
Ha A[j].T < A[i].T akkor Csere( A[j], A[i] )
Cilus vge
Ciklus vge
A rendezs hatkonysga elg j, N*(N-1)/2 csere szksges tlagosan. Ha a krdses elemek sszetettebb elemek, akkor a rengeteg csere nagyobb adatmozgatst eredmnyezhet. Ennek az adatmozgsnak a lecskkentsre
egy kicsit javthatjuk az algoritmust.
Ciklus i := 1 tl N-1 ig
k := i
Ciklus j := i+1-tl N-ig
Ha A[j].T < A[k].T akkor k:= j
Cilus vge
Csere( A[k], A[i] )
Ciklus vge
A javts azon alapul, hogy a bels ciklusban nem cserlek, csak rtkadst vgzek. Mivel egy csere egy szubrutinhvsbl s hrom rtkadsbl ll, ezrt bizonyos esetekben gyorsthat ez az eljrs.

3.4.5 Beszrsos rendezs


A mdszer azon alapul, hogyha feltesszk, hogy egy tmb els i-1 eleme rendezett, akkor az i-ik elemet kiveszem
a helyrl, majd megkeresem a helyt s beszrom a megfelel pontra. Ehhez termszetesen feljebb kell tolni a
nlnl nagyobb elemeket egy hellyel. Itt fontos, hogy az A tmbnek legyen 0. Eleme is, amely nem tartalmaz rtkes elemet, hanem biztosan minden elemnl kisebb rtket kell tartalmaznia.
Ciklus i := 2 tl N ig
Ha A[i].T < A[i-1].T akkor
Ment :=t[i]
j := i-1
Ciklus amg A[j].T => Ment.T
A[j+1] := A[j]
j := j-1
Ciklus vge
A[j] := Ment
Elagazas vege
Ciklus vge
A fenti algoritmus valamivel gyorsabb a buborkos rendezsnl, de lassabb a maximum- vagy minimum kivlasztsos rendezsnl.

13

3.4.6 Gyorsrendezs
A mig is leggyorsabb rendezsi eljrst Hoare dolgozta ki 1962-ben. A keresztsgben a Quicksort vagy Gyorsrendezs nevet kapta. Hasznlathoz rekurzv programozsi nyelv szksges, de szerencsre a legtbb nyelv
rendelkezik ezzel a kpessggel. A felsorolt algoritmusok kzl messze a leggyorsabb, de mivel mindennek van
ra, nagy tmeg adatok esetn a program vermnek nagynak kell lennie.
Az eljrs elve a kvetkez. Vegyk a tmb szmtanilag kzps elemt. Balrl kezdjk el megkeresni az els olyan elemet, amely nagyobb vagy egyenl a kzps elemmel, majd jobb oldalrl kezdve keressk meg az els
olyan elemet, amely kisebb vagy egyenl a kzps elemmel. Ha talltunk kt ilyen elemet, akkor cserljk ki
ket.
A kvetkezekben folytassuk a fenti tulajdonsg elemek keresst s cserjt, amg a bal s a jobb oldali
elemek tallatai ssze nem rnek. Ha sszertek, az azt jelenti, hogy a kzps elemtl balra csupa kisebb jobbra
pedig csupa nagyobb elem ll.
Rekurzv hvssal futtassuk le az algoritmust a bal oldali, majd a jobb oldali tartomnyra is. Amikor az eljrsbl visszajn a program, akkor a megfelel tartomny mr rendezett.
Az eljrsban az A[N] tmbt adottnak tesszk fel, a Quicksort eljrs kt index paramtert kap, ami az eljrsra nzve loklis vltozkat jelentettek.
Eljaras Quicksort(Bal, Jobb)
I := Bal
J := Jobb
Kozepsokulcs := A[(i+j)/2].T
Ciklus amg i <= j
Ciklus amg A[i].K< Kozepsokulcs
i := i + 1
Ciklus vge
Ciklus amg A[j].K > Kozepsokulcs
j := j - 1
Ciklus vge
Ha i<j akkor
Csere( A[i] , A[j] )
i:=i+1
j:=j-1
Elgazs vge
Ciklus vge
Ha Bal < j
akkor Quicksort(Bal, j-1)
Ha i
< Jobb akkor Quicksort(i+1, Jobb)
Eljrs vge

14

3.5

Programozsi ttelek alkalmazsa

Az albbiakban olyan feladatokat jellnk meg, amelyben a programozsi tteleket lehet alkalmazni.
Feladatok:
Egy repl indul az egyik kontinensrl a msikra s repls kzben rendszeresen mri az alatta lv felszn
tengerszint feletti magassgt. A mrt rtk nulla ekkor tenger felett repl vagy pozitv ekkor szrazfld felett repl. Ksztsnk olyan programot, a Top - Down mdszer felhasznlsval, amelyik a
kvetkezkre kpes:
Szimullja a mrseket vletlenszeren, figyelve arra, hogy az els s az utols mrs szrazfld felett
trtnt. Az eredmnyeket fjlba menti.
Grafikusan kirajzolja a felsznt, s elrept felette egy kis replt (mrs kzben vagy a mrsek lezajlsa utn)
Kirja a kpernyre s a fjlba is:
1. Milyen tvol van egymstl a kt kontinens?
2. Hol vannak a szigetek partjai (eltte tenger, utna szrazfld vagy fordtva)?
3. Hny sziget van a kt kontinens kztt?
4. Hny hegycscsot tallt (A hegycscs az a hely, ami eltt s mgtt kisebb a tengerszint feletti magassg)?
5. t tud-e menni a kt kontinens kztt egy kajakos, ha egyszerre csak egy adott tvolsgot tud evezni,
mert ha tbbet evez, akkor elpusztul?
6. Mekkora a szigetek tlagos tvolsga?
7. Van-e leszllplya valamelyik szigeten (olyan rsz, amely vzszintes legalbb kt mrs tvolsgig)
8. Hny darab apr sziget van (maximum 3 mrshosszsg)?
9. Szeretnk alfldn lni. Van-e olyan rsz, amely sk vidk, elg nagy s alfld? Keressk meg ezt a
helyet!
10. Adjuk meg a leghosszabb sziget kezdpontjt!
A fenti krdsekre vlaszt ad gyis, hogy vletlen-szl gtolja, vagy segti a replgp tjt
Tltsnk fel adatokkal egy kt-dimenzis tmbt! rjunk programot, amely kirja a legnagyobb elemet
tartalmaz sor szmt!
rjunk programot, amely nvsorba rendezi egy osztly vletlenl bert neveit!
rjuk programot, amely a kperny legfels sorban lv kirs karaktereit ciklikusan permutlja. A kirand szveg legyen hosszabb a kperny szlessgnl!

15

Adatszerkezetek, adattpusok, adattrols

A programozsi nyelvek az adatokat bizonyos keretek kztt troljk. Az adatok trolsnak mdja programnyelvenknt, st a programnyelv implementciiknt megvltozhat, ugyanakkor vannak olyan alapvet
adatszerkezetek, amelyek a gpek tulajdonsgai miatt azonosak.
A szmtgpek az adatokat byte, word (2 byte - sz) vagy duplasz (4 byte) hossz egysgekben kezelik.
A hrom lehetsg kzl A processzorok tpustl s a memrik szervezstl fggen a hrom fle adatkezels
sebessge ms s ms. Erre plda, hogy a 8080, 8088, 8086 illetve ltalban a nyolc bites processzorok a byte
hossz adatokat kezelik a leggyorsabban, a 80286-os processzorok a sz hosszsg adatokat, mg a 386-os vagy
jabb Intel processzorok a duplasz hossz adatokat kezelik a leggyorsabban. Ezrt, ha valaki az adatok kezelsnek formit vizsglja s optimlis sebessg programokat akar rni, akkor erre is figyelemmel kell lennie.
Amikor egy programozsi nyelv adatainak trolst vizsgljuk, akkor felttelezzk, hogy van egy kellen
nagy memrink, amely byte nagysg egysgekbl ll. A byte-ok sorfolytonosan helyezkednek el a memriban.
Minden adatnak van tpusa. A tpus meghatrozza az adat lehetsges rtkt, s mrett. Ezen kvl az
adatnak a helyt is ismerni kell adott esetben. Az adat tpusa egyrtelmen meghatrozza azoknak a mveleteknek
a krt is, amelyeket az adott adattpussal lehet vgezni.
A rendszerekben vannak elre definilt tpusok. Ezeket az adattpusokat hvjk ltalban alap adattpusoknak. A rendszerekben ltalban van lehetsg az alap adattpusok s a korbban definilt tpusok
felhasznlsval j tpusok definilsra is.
Az adattpus lehetsges rtkt a tpus rtktartomnynak hvjuk. Egyes adattpusok mrete eleve adott,
ms adattpusok mrete a definci sorn alakul ki a rsz adattpusok mreteibl kvetkezen, mg vannak olyan
adattpusok, amelyeknek mrete a program futsa kzben dl el.
Az adatokat a gpek alapveten a httrtrakon troljk, de azokat feldolgozni csak gy tudjk, ha beolvassk azokat a memriba. A beolvasott adatoknak a memriban trolsa sorn ismerni kell a memriban
elfoglalt helyt. Ezt az adat cmnek hvjk. Az adat cme, teht egy memriacm. A programok az adatok kezelst gy vgzik, hogy ismerik az adat memriacmt, ismerik a tpust ezen keresztl a mrett gy kpesek
az adatokat mdostani.
A programozknak azonban megoldhatatlan feladat, hogy az adat memriacmt kelljen a program rsa
kzben kezelni, hiszen a program futtatsa sorn a konkrt adat a memria ms s ms rszbe kerlhet. Csak
bizonyos, a hardver mkdshez szorosan kapcsold adatok helyezkednek el mindig a memria azonos cmn.
Az adatok kezelsre a programnyelvek bevezettk a konstans s a vltoz fogalmt. A konstans a program egy olyan szimbluma, amely egy konkrt adatot jell. A program fordtsakor a konstans helyre az adat
binris megfelelje kerl, vagyis az rtket bedrtozzuk a programba.
A vltozk olyan szimblumok, amelyek hasznlatval utastjuk a programot, hogy futskor biztostsa az
vltoz tpusnak megfelel mret helyet a memriban. A program fordtsakor az ltalunk hasznlt szimblumok lefordulnak olyan memriacmekk, ahol a megfelel tpus adatokat lehet trolni. A program a memriba
val betltdskor ezeket a cmeket kiegszt az opercis rendszer egy pillanatnyi alap-memriacmmel s gy
tudja kezelni vgl is a programokat.
Az adattpusokat bonyolultsguk szerint szoks osztlyozni. Lteznek az n. egyszer adattpusok.
Ezek kzl vannak alap adattpusok s bvtett adattpusok is. Az alap- vagy a bvtett adattpusok felhasznlsval ltre tudunk hozni sszetett adattpusokat is.
Az adattpusok helyett szoks az adatszerkezet kifejezst is hasznlni.
Az adattpusok kztt ltezik olyan feloszts is, amely a felvehet rtkek megszmllhatsga alapjn osztlyoz.
Ily mdon lteznek megszmllhat adattpusok s nem megszmllhat adattpusok is. Megszmllhatnak tekintnk egy adattpust, ha az elvben felvehet rtkek megszmllsra tudunk mondani egy eljrst. (A
megszmllhatsg matematikai, halmazelmleti fogalom. Megszmllhat pldul az egsz szmok halmaza, az
abc beti, de nem megszmllhat a vals szmok halmaza) A megszmllhat adattpusok a felsorolsi adattpusok.

4.1

Egyszer adatszerkezetek

Az egyszer adatszerkezeteket minden szmtgpes rendszer ismeri. Ezek a numerikus, karakter, logikai tpusok.
Ezeket az adatszerkezeteket a gpek processzor szinten, azaz gpi kd utastsokkal tudjk kezelni, ezrt hasznlatuk a lehet leggyorsabb programokat eredmnyezi.
16

4.1.1 Numerikus tpusok


Tetszleges alap szmok brzolsa
A szmokkal val mveletek sorn hozzszoktunk a 10-es alap szmrendszerhez, de a szmtgpeknek mindegy, hogy mi a hasznlt szmrendszer alapja (elvileg). Technikai persze clszer olyat vlasztani, amely
illeszkedik a szmtgpek bels lelkivilghoz, ezrt a legjobban elterjedt rendszerek a kettes (binris), 16-os
(hexadecimlis) s a 8-as (oktlis) szmrendszer.
Kettes szmrendszerbeli szmok brzolsa
A kettes szmrendszer esetn a szmokat 0 s 1 jelek sorozatval jelljk. Annyi jelet runk le, hogy a jelek szma
kett hatvnyaival legyen egyenl (1, 2, 3, 8, 16, 32, 63 jel), Egy jelet egy bit-nek hvunk (Binary Digit). Ennek
alapjn beszlhetnk 4, 8, 16 stb... bites szmokrl.
Egy szm talaktsa 10-esbl kettesbe.
Elosztjuk a 10-es szmrendszerbeli szmot 2-vel, a maradk lesz a jobbrl szmtott legutols bit bit,
majd a hnyadost osztjuk 2-vel s a legszls lesz az utols eltti bit, stb...)
Az gy kapott bitsorozatot kiegsztjk annyi nullval, hogy megfeleljen a kvnt trolsi mretnek. (8 bit,
16 bit, 32 bit, stb...)
Egy szm talaktsa kettes szmrendszerbl 10-esbe:
A jobbrl szmtott els bit jelenti a kett 0. hatvnyt, a kvetkez kett 1. els hatvnyt, stb... Ha 1 van a
megfelel helyirrtken, akkor az eredmnyhez hozzadom a megfelel 2 hatvnyt.
00010101 = 0*128+0*64+0*32+1*16+0*8+1*4+0*2+1*1 =23
0 s 1 kztti 10-es szmrendszerbeli szmok binris brzolsa.
A szmot elosztom 2-vel. A hnyados lesz a kettedes pont utni els jegy. A maradkot elosztom 2 kvetkez
hatvnyval, s gy folytatom, amg a megfelel trolsi mretet el nem rem.
0,7 / 0,5
=> 1, maradk 0,2
0,2 / 0.25
=> 0, maradk 0,2
0,2 / 0,125
=> 1, maradk 0,075
0,075 / 0,0625 => 1, maradk 0,0125
0,0125 / 0,03125 =>0, maradk 0,0125
0,0125 / 0,015625=> 0, maradk 0,0125
0,0125 / 0,0078125 => 1, maradk 0,0046875
stb ...
Az gy kapott szm: 0,10110001
Lthat, hogy az eredmny nem pontos, mivel az utols oszts utn is van maradk! Az utols bit rtkt kerektjk.
Kettes komplemens szmbrzols
Az tetszleges mret egsz szmok brzolsnak elve. A szmot tetszleges szm bittel rjuk le. A legmagasabb helyirtk bit az gynevezett eljelbit. Az eljelbit 0 volta jelenti a szm pozitv rtkt, vagy ekkor nulla az
rtk, az eljelbit 1-es rtke jelenti, a szm negatv rtkt.
Hogyan llapthatjuk meg egy 10-es szmrendszerbeli szmbl a kettes komplemens alakjt?
Vesszk a szm abszolt rtkt. Ha a szm pozitv, akkor ez nem mdost semmit, ha negatv, akkor elhagyjuk az eljelet.
Ennek a szmnak kiszmtjuk a binris rtkt. (Elosztjuk 2-vel, a maradk lesz a legszls bit, majd a
hnyadost osztjuk 2-vel s a legszls lesz az utols eltti bit, stb...)
Az gy kapott bitsorozatot kiegsztjk annyi nullval, hogy megfeleljen a kvnt trolsi mretnek. (8 bit,
16 bit, 32 bit, stb...)
Ha az eredeti szm pozitv volt, akkor vgeztnk.

17

Ha negatv volt, akkor


A kapott binris szmot kivonjuk nullbl binrisan.
Az eredmny olyan szm lesz, amely jobbrl nzve addig megegyezik a binris pozitv rtkkel, amg a
pozitv rtkekben 0 llt, az els egyes negatv megfelelje 1, a tbbi bit rtke cserldik 1-rl 0-ra s 0rl 1-re.
22 ->
-22 ->

00010100
11101100

Lebegpontos szmok brzolsa


Oktlis szmok brzolsa (8-as szmrendszer)
Az oktlis szmoknl a hasznlhat jelek 0,1,2,3,4,5,6,7 Az oktlis szmokat mindig hrmasval csoportostva
rjuk le. A 10-es szmrendszerbl az albbiak szerint szmoljuk t a szmot 8-asba. Az eredeti szmot elosztjuk
8-cal, s a maradk lesz a legkisebb helyirtk szm. A hnyadost osztjuk megint 8-cal s a maradk lesz a kvetkez jegy, stb...
196 / 8 => 24, maradk 4
24 / 8 => 3, maradk 0
3/ 8
=> 0, maradk 3
Az eredmny: 304
A szoksos jellse az oktlis szmoknak az, hogy balrl kiegsztjk egy 0-val a szmot, azaz 0304
Visszafel hasonlkppen jrhatunk el, mint a binris brzolsnl.
Binris szmokat talaktani oktliss egyszer, mivel 3 bit alkot egy oktlis szmjegyet, azaz:
0304 => 000 011 000 100, ami persze csak 8 bites lesz, azaz 11000100.
Hexadecimlis szmok brzolsa (16 os szmrendszer)
A hexadecimlis szmoknl a hasznlhat jelek 0,1,2,3,4,5,6,7 ,8,9,A,B,C,D,E,F. A hexadecimlis szmokat
mindig ngyesvel csoportostva rjuk le. A 10-es szmrendszerbl az albbiak szerint szmoljuk t a szmot 16osba. Az eredeti szmot elosztjuk 16-tal, s a maradk lesz a legkisebb helyirtk szm. A hnyadost osztjuk
megint 16-tal s a maradk lesz a kvetkez jegy, stb...
196 / 16 => 12, maradk 4
12 / 16 => 0, maradk 12

=> 4
=> C

Az eredmny: C4
A szoksos jellsei a hexadecimlis szmoknak: 0xC4, #C4, $C4
Visszafel hasonlan jrunk el, mint a binris szmoknl.
Binris szmokat hexadecimliss s vissza konvertlni egyszer, mivel 4 bit alkot egy hexadecimlis szmjegyet:
192 => 0xC4 => 0110 100
Tetszleges alap szmrendszerek
Az x alap szmrendszer esetn a hasznlt jelek 0-tl (x-1) ig terjednek.
Ha a szmrendszer alapja x, akkor 10-esbl erre az alapra gy konvertlunk, hogy elosztjuk az eredeti szmrtket az alappal s a maradk lesz a szmrendszerbeli szm utols jegye. A hnyadost osztjuk megint s gy tovbb.
Visszakonvertlni gy kell:
Ha van egy x alap szmom: a1,a2...an, ez a szm az albbi polinom rtkt jelenti:
a1 *Xn-1 + a2 *Xn-2... + an *X0

18

A numerikus tpusok a legalapvetbb adattpusok. Ngy elterjedt tpus ltezik:


Byte
A mrete 1 byte, rtke 0..255 kztti egsz szm lehet (28 rtk)
Ennek egy bvtett adattpusa a rvid egsz vagy shortint, vagy short, amelynek az rtkei
128..,0, ..+127 kztti egsz rtkek lehetnek.
A szm eljelt a legmagasabb helyirtk bit eljele jelli. Ha a bit rtke egy, akkor negatv szmrl vagy a nullrl van sz.
8 bites rendszerekben a leggyorsabb adatkezelst biztostjk
Word - Sz
Mrete 2 byte, rtke 0..65535 kztti egsz szm lehet. (216 rtk)
Integer - Egsz
Mrete kt byte, rtke 32768..,0,..+32767 kztti egsz rtket veheti fel. (216 rtk)
A szm eljelt a legmagasabb helyirtk bit eljele jelli. Ha a bit rtke egy, akkor negatv szmrl vagy a nullrl van sz.
16 bites rendszerekben a lehet leggyorsabb adatkezelst biztostjk az Integer s a Word tpusok.
A fenti adattpusokkal lehetsges mveletek:
sszeads
+
Kivons
Egsz tpus oszts
Div vagy /
Egsz tpusok osztsakor mara- Mod vagy %
dka
Eggyel val nvels, cskkents ++, --

A+B
AB
A div B vagy A / B
A Mod B vagy A % B
A++,

B--

sszehasonltsokban
< kisebb, mint, > nagyobb mint, <= kisebb egyenl mint, >= nagyobb egyenl mint,
== egyenl, <> vagy # nem egyenl relcik lehetnek.
A fenti tpusok bvtsei a longint (Pascal), long int, unsigned long. Ezek 4 byte hossz, adatok, ugyanazokkal a
felttelekkel, amelyek a fentiekben trgyaltunk. (232 rtk)
Real vals float lebegpontos szmok brzolsa
Mrete 4 vagy 5 byte, rendszerenknt vltoz. Trolsa kt rszben trtnik. Az rtkes jegyeket 2 vagy 3 byte-on
troljk gynevezett normlt alakban. Ezt hvjk mantissznak. ltalban 2 byte a kitevt tartalmazza, ezt hvjk
karakterisztiknak.
rtke 3.4*10-383.8*10+38 kztt lehet, termszetesen negatv szmok is brzolhatk, trolhatk.
Mind a szm, mind a kitev eljelt az adott rsz legmagasabb helyirtk bitje hatrozza meg.
A fenti adattpusokkal lehetsges mveletek:
sszeads
+
Kivons
Oszts
/
Matematikai fggvnyek.
sin, cos, tg, atg exp, log,
Kerekts, trtrszkpzs
Round, trunc

A+B
AB
A/B

sszehasonltsokban
< kisebb, mint, > nagyobb mint, <= kisebb egyenl mint, >= nagyobb egyenl mint,
== egyenl, <> vagy # nem egyenl relcik lehetnek.
A real bvtsnek felelnek meg a double 8 byte, extended, long double 10 bytet pusok.

19

ltalban az sszeads, kivons, szorzs, oszts esetn az rtkek lehetnek kevert tpusak is, aza egsz tpus s
lebegpontos is, de az eredmny mindig olyan tpus lesz, mint a legnagyobb helyet elfoglal s lebegpontos. Az
olyan fggvnyek, amelyek lebegpontos rtket vrnak, nem elgednek meg egsz tpus paramterekkel s fordtva.

4.1.2 Karakter tpus


A karakteres adattpus a 8 bites karakterkezelsnl 1 byte helyet foglal, azaz 256 klnbz rtket vehet fel. Valjban a karakterek trolsakor a szmtgp egy byte informcit trol, de hogy az milyen karakternek felel meg
milyen betnek az a kdolsi rendszerektl fgg.
A PC-k vilgban az ASCII (American Code for Information Interchange ) karakterkdolsi rendszer terjedt el. Ez a kdrendszer 7 bites, azaz a kdrendszernek csak az els 127 karaktere definilt.
A 0 31 kd karakterek nem lthat karakterek. A kpernyn mozg kurzort alfanumerikus kpernyn a nyomtat fejt s egyb olyan jeleket definiltak, amelyeknek nincsen lthat formjuk, de azrt
fontosak. Nhny pldt csak: 0 nem lthat, 1- J, 2 - J, 10 soremels, 13 kocsi vissza (Enter), 27 Esc,

A 32 Szkz. 33-47-ig klnbz rsjelek vannak, 48 tl 58-ig a 0,1,2,9 szmjegyek, 58-tl 63-ig
rsjelek, 64 - @ jel (kukac).
65-tl 90-ig az angol ABC nagybeti, A, B, C, D,.Z-ig. 91-tl 96-ig rsjelek, majd 97-tl 122-ig angol ABC kisbeti, a, b, c, d,.z-ig. 123-tl 127-ig megint rsjelek.
Sajnos sok olyan nyelv van, amely ezen kvl g ms rsjeleket is hasznl. Ezeket eredetileg a fels 128
jel kz tettk volna be, de ez nem volt elegend. Ennek a problmnak a megoldsra talltk ki, az un. mdlapokat. A kdlapok az ASCII karakterkszlet egyfajta kiterjesztst eredmnyeztk, ugyanis a klnbz kdlapok
esetn az als 128 karakter megegyezik, de a fels 128 karakter az illet kdlapban definilt jeleket jelenti. Sajnos
a futtat hardvert, az opercis rendszert s a nyomtatkat is fel kell kszteni a klnbz kdlapok hasznlatra, csak gy lehet korrekt megjelentst elrni.
A problma msik megoldsa a 16 bites kdkszlet hasznlata. Ekkor egy karakter kt byte helyet foglal
el a memriban s ennek megfelelen 65535 fle jelet lehet megjelenteni. Ez mr elegend a knai s a japn valamint az egyb nem eurpai nyelvek jeleinek a megjelentsre is. Htrnya az, hogy a karakterek tbb helyet
foglalnak el. A Windows 95, 98, az Windows NT 4.0 s az 5.0 is alapveten alkalmas lesz r, hogy 2 bjtos
karakterekkel mkdjn.
A fenti mese utn trjnk r a karakterre, mint adattpusra. Egy kicsit elreszaladunk, de el kell mondani,
hogy ha a szmtgpek memrijban a karaktereket egyms utn troljuk le, s valamilyen mdon megadjuk,
hogy hol van a karakterek lncolatnak vge, akkor egy j adattpust, a karakterlncot vagy kzkelet nevn
sztringet (string) kapunk. Kt fle karakterlnc kezelsi mdszer terjedt el.
A Pascalban a karakterek maximlisan 254 byte hosszak lehetnek, mivel a 0. Helyen ll karakter kdja
adja meg a sztring hosszt. Ez a karakter egybknt sohasem jelenik meg a kpernyn, de a program ennek alapjn tudja megllaptani a sztring vgt. Ennek az a htrnya, hogy nem lehet tetszlegesen hossz a karakter. A
Pascalban elre meg kell mondani, hogy a karakter milyen hossz lesz.
A C nyelvben s annak minden folyomnyban a 0 vg karakterkezels terjedt el, ami azt jelenti, hogy a
sztring addig tart, amg nem nulla karakterek jnnek egyms utn. Ennek elnye, hogy elvileg tetszleges hosszsg, a gyakorlatban maximum 65535 karakter hossz stringeket lehet kezelni. A htrnya, hogy azokban az
esetekben, amikor szksges tudni a sztring hosszt egy rutinnak vgig kell szaladni a sztring elejtl a 0 kd
karakterig s meg kell szmolnia a karaktereket ez kis lassulst okoz a sztring mveleteknl. Megjegyzend,
hogy a Borland Pascal 7-es verzijtl ltezik a Pstring nev adattpus, amely 0 vg karakterkezelst tesz lehetv a Borland Pascal nyelvekben.
A karakterekkel nem lehet semmifle matematikai mveletet vgezni. Vannak azonban alapvet mveletek, amelyeket minden programozsi nyelvben el lehet vgezni. A mveletek ltalban fggvny alakban lteznek
s a klnbz nyelveken ms s ms a megvalstsuk is. Azt is el kell mondani, hogy ltalban azok a mveletek, amelyek karakterre alkalmazhatk, alkalmazhatk sutringekre is.
A fenti adattpusokkal lehetsges mveletek:
sszefzs
+
Karakter kdja
ASCII(k), ORD(k)
Kd alapjn katakter
CHR(szm)
20

A + B => AB
ASC(A) => 65
CHR(66) => B

Sztring bal oldala


Sztring jobb oldala
Sztring kzps karakterei

Left(sztring, szm)
Right(sztring, szm)
Mid(sztring, szm, dbszm)

LEFT(ABC,1) => A
Right(ABCD,2) => CD
MID(ABCDE,2,3) => BCD

sszehasonltsokban
A karaktereket ugyanazokkal a jelekkel hasonltjuk ssze, mint a karakterlncokat,
< kisebb, mint, > nagyobb mint, <= kisebb egyenl mint, >= nagyobb egyenl mint,
== egyenl, <> vagy # nem egyenl relcik lehetnek.
Mindig balrl jobbra kezdi a rendszer karakterenknt az sszehasonltst s az els klnbsgnl mr el is dnti
az eredmnyt. Ha kt karakterlnc ugyanazt tartalmazza vgig, de az egyik rvidebb, mint a msik, akkor az a
kisebb.
Olyan adatok, esetn, amikor az adatokat tbb klnbz tpus opercis rendszerbl kezelik clszer
az adatokat karakterekknt trolni s lehetleg az ASCII kdrendszert felhasznlni r.

4.1.3 Logikai tpus


A logikai adattpus kt rtket vehet fel, Igaz, vagy Hamis rtkeket. Ez a kt rtk klnbz programnyelveken
lehet a True-False, Yes-No, Igen-Nem, Nem nulla Nulla rtkprosok valamelyike.
Br a logikai adatokat elvileg egy bit is egyrtelmen jelzi, de a gpek binris felptse s a gpi kd utastskszletek mindig egy byte mret adatknt kezelik.
A logikai adatokra lehet alkalmazni a kvetkez mveleteket:
<, >, <=, >=, <> Logikai s, Logikai Vagy, Logikai Kizr Vagy, Tagads.
A szoksos jellsek gyakorlatilag a legtbb programozsi krnyezetben:
<, >, <=, >=,<>, #, AND, OR, XOR, NOT.

4.1.4 Mutatk, pointerek


A memriban trolt adatoknak mindig van cmk. Azokat a vltozkat, amelyek ms adatok memriacmt tartalmazzk, mutatknak vagy pointereknek nevezzk. A pointerek az egyes programozsi nyelvekben s opercis
rendszerekben nem kezelhetk egysgesen, nem egyforma a mretk sem, de egy adott opercis rendszer, memriamodell s fejleszteszkz esetn pontosan meghatrozhatk a pointerek mretei.
Ha az adatok egy 64Kb-os memriaterleten elfrnek, akkor elegend a pointernek csak a terlet elejhez
viszonytott eltolst trolni. Ebben az esetben a pointer mretre elegend csak 2 byte. Ha nagyobb memriaterletet akarunk megcmezni, annak megfelelen kell a pointerek mrett nvelni, ltalban 4 byte vagy 8 byte lesz a
pointer mrete.
Br a mutatk memriacmet tartalmaznak, de a mutatknak lehet tpusuk is. A tpus ebben az esetben
annak az adatnak vagy vltoznak a tpusbl ered, amilyen adatra vagy vltozra a pointer mutat. Ilyenkor a
pointernek ms tpus adatra vagy vltozra nem mutathat.
A Pascal s a C, mint kt alapvet programozsi nyelv kiss ms szintaktikval jelli a mutatkat s a
vgezhet mveletek kre is ms s ms.
A PC-k esetn a pointerek ltalban segmens:offset, mdon, 4 bjton troldnak. Az Intel processzorok
tulajdonsgai miatt a trols als kt bjtja az offszete, a fels kt bjt a szegmens tartalmazza.
Pascal nyelv
v vltoz cmnek letrolsa p pointerbe
Hivatkozs a mutatott p vltozra
rtkads v vltoznak pointer segtsgvel
A sehov sem mutat pointer konstans
sszehasonltsok
p pointer offszetje
p pointer szegmense

P:=@v vagy p:=Addr(v)


p^
p^ := 133
Nil vagy Ptr(0,0)
<>,=
Ofs(p)
Seg(p)

21

A C nyelv lehetsgei a pointerekkel val mveleteket nagyon elsegtik, de a pointerek hasznlata a programokat
kiss ttekinthetetlenn teheti. Ha az ilyen programot jl rjuk meg, akkor a pointerek hasznlata hatkonysgjavulst okoz.
C nyelv
v vltoz cmnek letrolsa p pointerbe
Hivatkozs a mutatott v vltozra
rtkads v vltoznak pointer segtsgvel
A sehov sem mutat pointer konstans
sszehasonltsok
pointer ltal mutatott vltoz mdostsa

p = &v
*p
*p = 133
Null
==, !=
*p = *p + 33

4.1.5 Megszmllhat s nem megszmllhat adattpusok


Az eddig trgyalt sszes egsz tpus adat, a karakter tpus s a logikai tpus megszmllhat tpus is. A megszmllhat tpusokat lehet ltrehozni gy is, hogy felsoroljuk a tpust alkot lehetsges rtkeket. A
megszmllhat adattpusok egyes elemei bitmintaknt trolhatk, ezrt ltalban a megszmllhat adattpusok
trolsi egysgei a byte 2 hatvnyai.
A fenti adattpusokkal lehetsges mveletek:
Els adat
Tpus(0)
Adattpus kvetkez adata
Succ(adat)
Adattpus elz adata
Pred(adat)

0.
Succ(A) => B
Predd(199) => 198

4.1.6 Konverzik
A klnbz nyelveken az egyes adattpusokat ms s ms fggvnyekkel lehet tkonvertlni. Erre azrt van
szksg, mert az egyes programozsi nyelvek a klnbz tpusokat mskppen kezelik. A konverzi all a C
nyelv bizonyos mrtkig mentesthet, mivel a C-ben a rvid egsz tpust lehet karakternek is tekinteni, tovbb
sztringet lehet rvid egszek tmbjnek tekinteni stb Az adatkonverzik leggyakoribb eljrsai:
Karakter kdja
Kd alapjn katakter
Realbl integer
Integerbl Real
Sztringbl szm

ASCII(k), ORD(k)
CHR(szm)
Round(Real)
Int(egsz tpus szm)
VAL(sztring, szm, dbszm)

Szmbl Sztring

STR(szm)

ASC(A) => 65, ORD(B) => 66


CHR(66) => B
Round(1.321) => 1
Int(344) => 344.00
VAL(123.34, vltoz, hibakd) A
Pascalban ez gy mkdik, hogy a
hibakd megmutatja, hogy a konverzi hibtlan volt-e
STR(1876.01) => 1876.00

4.1.7 Globlis- s loklis adatok kezelse, az adatok lthatsga


Amikor egy programban adatokkal dolgozom ltalban nincsen szksgem a programban felhasznlt brmelyik
adat elrsre. A jl strukturlt programokban egy eljrs vagy fggvny jl specifiklhatan csak bizonyos adatokkal dolgozik. A feldolgozand adatokat vagy az t hv eljrstl kapja meg, vagy a fggvnyben eljrsban
keletkezik s esetleg az t hv eljrsnak adja vissza, vagy amikor kilp a programrszletbl, akkor elenyszik,
mert nincsen r szksg.
A BASIC programozsi nyelv eredetileg globlis adatokkal dolgozott csak, azaz minden adatot el lehetett rni a
program minden pontjrl. Ezzel bonyolultabb programok esetn az adatok kvetkezetes kezelse nehzkes, st
csaknem megoldhatatlan. Mindezekre megoldsknt bevezettk a globlis s a loklis vltoz fogalmt.
Egy adat loklis egy programegysgre nzve, ha abban a programegysgben az adat elrhet, esetleg mdosthat, mg a programegysget hv programegysgekbl az adat nem ltszik. ltalban az ilyen adat akkor
jn ltre, amikor elkezdi vgrehajtani a programegysget a program s akkor sznik meg, ha kilp belle.

22

Egy adat globlis egy programegysgre nzve, ha az adat mr ltezik akkor, amikor elkezddik az egysg
vgrehajtsa. Nyilvn ha egy adat globlis egy programegysgre nzve, akkor az egysgbl meghvott programrszekre is globlis az adat.
Az adatok lthatsgnak krdse sszefgg az adatok globalitsval is.
ltalban ha egy adat globlis egy programegysgre nzve, akkor az lthat is, de ez nem minden programozsi
nyelven igaz.
A Pascalban csak azok a globlis adatok lthatk, amelyek a programszvegben elrbb vannak deklarlva, vagy specilis kulcsszval utastjuk a fordtt, hogy tegye lthatv mshonnan is. A C nyelven a header
fjlokban kell megadni azoknak a globlis vltozknak a defincijt, amelyeket ms eljrsokban ltni szeretnnk.
Ha egy eljrsban ugyanolyan nev vltozt definilunk, mint amilyen egy globlis vltoz neve, akkor a
loklisan definilt vltoz vlik lthatv, eltakarja a globlis vltozt. Ez mg akkor gy van, ha a kt vltoz
tpusa nem egyezik meg. Bizonyos nyelvek ebben az esetben fordtskor hibazenetet adnak, de ezzel most nem
foglalkozunk. Ha kilpnk a krdses eljrsbl, akkor termszetesen megint az eredeti globlis vltoz vlik Ha
a loklis adat ltrejttekor meghvunk egy eljrst s egybknt a nyelv szintaktikja engedi, akkor a meghvott
eljrsban is lthat az adat, hiszen arra az eljrsra nzve a krdses adat globlis.
Vannak olyan specilis nyelvek, amelyek kpesek ltrehozni egy begyazott azaz valahonnan meghvott eljrsban is a teljes programra nzve globlis adatokat. Ilyen a Clipper programozsi nyelv.

4.1.8 Paramtertads
Egy begyazott meghvott eljrssal, paramterek tadsval is lehet adatokat kzlni. A C s a Pascal nyelv
is ktfle, rtk szerinti- s cm szerinti paramtertadst tartalmaz:
rtk szerinti paramtertads
A hvott eljrs az tadand adatokrl msolatot kszt, az adatokat behvja a program vermbe, ahonnan a hvott
eljrs kiveszi az adatokat. Az adatok tvtelekor a programban ms nven is lehet hivatkozni az tadott adatokra, mint amely nv az tadskor volt, de az tadott s az tvett adatok tpusnak meg kell egyeznie - nhny
kivteltl eltekintve - formlisan is. Az rtk szerint tadott paramterek rtkt lehet ugyan mdostani, de a mdosts nem marad rvnyes a hvott eljrson kvl. A hvott eljrsbl kilpve az eredeti rtkek maradnak
rvnyben. Vltozt s konstanst is t lehet adni paramterknt.
Cm szerinti paramtertads
A hv eljrs az adat cmt adja t a hvott eljrsnak. A hvott eljrs ms nven is jellheti az tvett paramtert, de az tadott s tvett paramterek tpusnak ugyanazoknak kell lennie. A paramter rtknek megvltozsa
az eredeti adat rtknek mdostst is eredmnyezi. Csak vltozt lehet cm szerint tadni!
A Pascal s a C ms s ms mdon kezeli a paramtertadst. A lnyeg az, hogy a Pascalban a hv s a
hvott eljrsban a vltozk, adatok tpusnak s szmnak meg kell egyeznie, mg a C nyelvben a tpusnak sem
kell mindig megegyezni, s lehetsg van arra, hogy kevesebb adatot vegynk t, mint amennyit tadna a hv
eljrs. Br a rendszer bizonyos esetekben figyelmeztet a turpissgra, de a program lefordul s fut is.
Egy futtathat EXE, COM vagy BAT fjl is tud tvenni az opercis rendszertl adatokat a PC-ken.
Mindig rtk szerinti a paramtertads.
Feladatok
rjunk programot, amely bekr egy numerikus adatot a billentyzetrl, s addig nem fogadja el a vlaszt, a bevitt adat hibtlan nem lesz! A hiba ltrl rtestse az adatbevitelt vgzt!
rjunk programot, amely megvalst egy egyszer 4 alapmveletes szmolgpet az egsz szmok krben! A program figyelmeztessen arra, hogyha egy mvelet eredmnye tlcsordul vagy alulcsordul s ne
hajtsa azt vgre! Az oszts eredmnyt, amennyiben nem egsz rja hnyados s maradk alakban!
rjunk programot, amely megvalst egy egyszer szmolgpet, amely kpes a 4 alapmvelet, a ngyzetre emels, gykvons s nhny egyb matematikai fggvny elvgzsre! Ha nem megfelel
paramtereket adunk a matematikai fggvnynek, akkor figyelmeztessen, de a program lljon le futsi
hibval! A program figyelmeztessen arra, ha egy mvelet eredmnye tlcsordul vagy alulcsordul s ne
hajtsa azt vgre!

23

4.2

rjunk egyszer titkost programot! A program a bevitt vagy parancssorbl paramterknt megadott
stringet titkostsa gy hogy a karakterek ASCII kdjt manipullja. A legegyszerbb mdszer, az ASCII
kd eltolsa, bonyolultabb, ha az ASCII kd mdostshoz valamilyen helytl fgg fggvnyt is
hasznlunk, de a legjobb az un. nylt kd titkosts.
rjunk olyan programot, amely bevitt vagy parancssorbl paramterknt megadott stringben lv kezetes karaktereket a tviratokban szerepl megoldssal helyettesti, azaz = ee, =OEE, =oe, stb
rjunk olyan programot, amely bevitt vagy parancssorbl paramterknt megadott stringben lv egyms utni tbb szkzt egy szkzzel, a tabultor jelet 8 szkzzel helyettesti!
rjunk olyan algoritmust (C, Pascal nyelv programot) amely a stringek tmbdefincis alakja alapjn
megvalstja a LEFT, MID s a RIGHT parancsokat!
Algoritmusler nyelven hozzuk ltre a formzott kirats utastst! A program a paramterknt megadott szmot az adott karakterszlessgben, adott mdon igaztva (jobbra vagy tizedespontra),
megadott jeggyel s tizedesjeggyel rja ki a szmrtket. A feladathoz fel lehet hasznlni a stringek
tmb termszett, az STR(), a LEN() fggvnyt. A STR() fggvny ebben az esetben nem formzza a
szveget, hanem tizedestrt alakban rja ki adja meg az eredmnyt!

sszetett adatszerkezetek

Az eddigiek sorn csak egyszer adatszerkezetekrl volt sz, de ezek ltalban nem elegendek a programok ltal
feldolgozand adatok trolsra. A tovbbiakban olyan adatszerkezeteket trgyalunk, amelyek egyszerbb adatszerkezetek sszeptsvel jnnek ltre.
A ltrejtt adatszerkezetek helyet foglalnak a memriban. Nyilvnvalan az adatszerkezeteknek szksges hely nagysga az adatszerkezetet alkot egyszerbb adatok szmra szksges helyek nagysgaibl addik
ssze. Memriaszervezsi s adminisztratv okokbl nha az sszetett adatszerkezet mrete nagyobb, mint az alkot adatok mreteinek sszege, ez a mretnvekeds ltalban nem tl nagy az adatszerkezet teljes mrethez
kpest, csak nhny bjtot jelent.

4.2.1 Tmbk, sorozatok


Amikor azonos tpus adatokat trolunk a memriban egyms utn, akkor beszlhetnk tmbrl vagy sorozatrl.
A tmbt alkot adatokat a tmb elemeinek hvjuk. Az egyes elemekre a tmb indexvel hivatkozunk. Egy tmb
deklarcijakor meg kell adnunk a tmb elemeinek tpust s a tmb mrett.
Ha a tmbnek csak egy indexe van, akkor egy dimenzis tmbrl beszlnk. Az egy dimenzis tmbket
a szmegyenes egsz helyein lv adatokkal szemlltethetjk.
Ha egy tmbnek kt indexe van, akkor kt-dimenzis tmbrl beszlnk, s gy tovbb A ktdimenzis tmbket egy sk egsz koordintj pontjaiban elhelyezked adatokkal szemlltethetjk.
A tmbket a memriban a programok sorfolytonosan troljk, ami kt dolgot jelent. Egyrszt jelenti,
hogy a tmb elemei egyms utn helyezkednek el a memriban, msrszt tbbdimenzis tmb esetn a mindig az
utols index nvekedik.
Pldul egy T[10][3][2] deklarcij tmb elhelyezkedse a memriban, ahol az indexek 0..9,0..2,0..1 ig
terjednek:
T[0][0][0], T[0][0][1], T[0][1][0], T[0][1][1], T[0][2][0], T[0][2][1], T[1][0][0], T[1][0][1], T[1][1][0],
T[1][1][1],
Valjban a tbbdimenzis tmbt lekpezzk egy egy-dimenzis tmbbe. A lekpezs sorn a tbb dimenzis
indexekhez hozzrendelnk egy egy-dimenzis indexet. Nzzk a fenti deklarcit! Ha a T[i][j][k] elem elhelyezkedst vizsgljuk, akkor az egy dimenzis indexet a
Index := 3*2*i + 2*j +k
kplet segtsgvel lehet kiszmolni. ltalban, ha a tmb dimenzii n1,n2,n3,n4,.nm, nagysgak s az indexek
i1,i2,i3,.im, akkor a tetszleges T[i1][i2][i3][im] elem egy dimenzis indexe:
index := i1*n2 + i2*n 3 + i3*n 4 +..+ im-1*n m + im

24

Ennek segtsgvel a tmb els elemnek memriacme ismeretben, valamint a tmbelem mretbl ki lehet szmolni tetszleges elem memriacmt.
Ha a fenti deklarciban a els elem cme M, akkor az i,j,k index tmbelem memriacme
Cm i,j,k := index * elemmret + M,
azaz
Cm i,j,k := ( 3*2*i + 2*j +k) * elemmret +M
ltalnos esetben,
Cm i1,i2,.,in := (i1*n2*n 3**n m+ i2*n 3**n m +...+ im-2*n m * n m-1 + im-1*n m + im) *elemmret +M
A fenti kpleteket cmfggvnynek hvjk.
Felvetdik a krds, hogy az egy dimenzis elhelyezkeds ismerete esetn a tbb dimenzis elhelyezkeds kiszmolhat-e egyrtelmen.
A fenti 3 dimenzis plda alapjn az Index ismeretben az i,j,k-t a kvetkez algoritmussal lehet kiszmolni:
I:= index div (3*2),
Ma:= index mod (3*2)
J:= ( Ma ) div 2
K:= Ma mod 2
ltalnos esetben a kvetkez algoritmust kell hasznlni:
i1 := Cm div (n2*n 3**n m)
Ma := Cm mod (n2*n 3**n m)
I2 := Ma div (n 3**n m)
Ma := Ma mod (n 3**n m)
..
Im:= Ma mod n m
Az egyes programozsi nyelvek ms s ms szintaktikval rendelkeznek, de alapveten ugyanazt lehet velk elrni.
A Pascalban a tmb kezd s utols indext kell megadnunk, gy jn ki a mrete s meg kell adni az elemek tpust.
T: Array [els..utols] of Tpus
Hivatkozs egy elemre:

T[5]

Tbb dimenzis tmbt az albbi mdon lehet deklarlni:


T1: Array [els..utols, msik_els..msik_utols] of Tpus
Hivatkozs egy elemre:

T1[5,6]

A C-ben a tmb elemeinek darabszmt kell megadnunk s a tmb indexe 0-tl az elemszm-1 ig tart.
Tpus T[elemszm]
Hivatkozs egy elemre: T[5]
Tbb dimenzis tmbt az albbi mdon lehet deklarlni:

25

Tpus T1[elemszm, elemszm1]


Hivatkozs egy elemre:

T1[5,6]

A fentiek alapjn knnyen kiszmolhat egy elemnek a memriban elfoglalt helye s a tmbnek szksges memria mrete is. A tmbk elemeit a klnbz nyelvek ltalban sorfolytonosan troljk a memriban, azaz
tbb dimenzis tmb esetn elszr az els sor elemeit, majd a msodik sor elemeit s gy tovbb...
A tmb adattpus feldolgozsa szorosan sszefgg a ciklusokkal. Nyilvnvalan, ha olyan feladatot kell
megoldani, amely a tmb minden egyes elemnek feldolgozst jelenti, akkor megszmllsos ciklusokat kell alkalmazni, ha pedig a tmb elemein valamilyen tulajdonsg megltt vizsgljuk, akkor ciklus amg a
felttel nem igaz jelleg ciklust kell hasznlnunk.
Tbb dimenzis tmbk feldolgozsakor annyi egymsba gyazott ciklust kell hasznlnunk, ahny dimenzija van a tmbnek.
Feladat:
Egy 25x80-as mtrixba rjunk vletlenszeren lthat karaktereket. rjunk programot, amely minden
oszlopot eggyel balra lptet, az els oszlopot pedig az utols oszlop helyre teszi. (Esetleg kpernyn!)
Tkrzzk egy adatokkal feltlttt kt-dimenzis mtrixot a bal-fels jobb-als tljra!
Egy NxN-es mtrix adatait forgassuk el 90 fokkal!
Tltsnk fel kt NxM-es mtrixot adatokkal. rassuk ki az sszeg mtrix s a klnbsg mtrixot!
Tltsnk fel adatokkal egy NxM-es s egy MxN-es mtrixot. Hozzuk ltre a kt mtrix szorzatt!
Egy tmbben nvekv szmokat trolunk gy, hogy a tmb kzps elembe rjuk a legkisebbet, a bal
oldalra a kvetkezt, a jobb oldalra a kvetkezt, jobb oldalra a kvetkezt s gy folytatjuk, amg
be nem telik a tmb. rjunk programot, amely meghatrozza kt tetszleges sorszm elem klnbsgt!
A fld felsznnek magassgt kt-dimenzis mtrixban troljuk. rjunk programot, amelyik kirja a
kperny megfelel helyre a domborzat magassgnak megfelel sznkdot.
Troljunk egy dimenzis tmbben kt-dimenzis mtrix bal als hromszgnek adatait. Adjuk meg a
cmfggvnyt! Az egy dimenzis tmb adatait rjuk ki hromszg alakban!
rjunk programot, amely kiszmolja a Pascal hromszg adatait elhelyezi az adatokat egy kt dimenzis mtrix bal fels sarkban!
Hajtassuk vgre a Gauss-elimincit!
Egy sakktbln vletlenszeren ugrl egy l sakkfigura. rjunk programot, amely szimullja az ugrlst. lljon meg az ugrls, amikor ugyanarra a mezre ugrik mg egyszer!

4.2.2 Halmaz tpus


Nem minden programozsi nyelvben van meg ez a tpus. A halmaz elemeit ltalban fel kell sorolni. A halmaz
elemei ugyanolyan tpusak. Az elemeknek sorszma van, ltalban 0..255 kztti sorszmuk lehet.
Mvelet
Jel
Plda
Ltrehozs
Set Of alaptpus
Var B : SET of A..Z
rtkads
:=
A := [A..Z]
Metszet
*
A:=A*B
Egyests
+
A:= A + B
Klnbsg
A := A-B
Egyenlsg
=
A=B
Tartalmazs
<=, >=
A <= B
Elem vizsglata
IN
c IN [y,Y,n,N]

26

4.2.3 Rekord tpus


A rekord adattpus elemei klnbz tpusak lehetnek. Egy rekord alkotit mezknek hvjuk. A rekordok trolsa a memriban a definicik sorrendjben trtnik.
A rekordok mrete ltalban nem korltos, br a Pascalnl termszetesen megvan a 64 kb-os korlt. A szoksos
jellsek a kvetkezk.
Pascal
C
Definici
Type nev =
Typedef struct nev {
Record
Tpus 1.meznv;
1.meznv:tpus
Tpus 2.Meznv;
2.Meznv:tpus
;

};
end;
Type tanulo= Record
Typedef struct tanulo {
Nev : string[20];
char nev[26];
Neme: string[4];
char Neme[4];
;
;
end;
};
Var Gyerek: Tanulo;
Tanulo Gyerek
Hivatkozs egy
Tanulo.nev
Tanulo.nev
rekord mezire
A Pascalban s a C-ben is lteznek vltoz rekordszerkezet adattpusok. A C-ben ezeket unionoknak hvjk. Ekkor egy mez rtktl fggen a rekord tbbi mezjben trolt adatok tpusa, mrete is vltozhat. Az union
esetn a lefoglalt mret a legnagyobb sszetev mrete lesz. Amikor az union mezire hivatkozunk, akkor a lefoglalt terletbl csak annyit hasznl a rendszer, amibe az ppen trolt adattpus elfr, de a tbbi memrit nem
szabadtja fel, hanem tovbbra is lefoglalva marad.
Termszetesen rekordokbl is lehet definilni tmbket. Ilyet tipikusan akkor hasznlhatunk fel, ha egy
adatfjl ugyanolyan tpus rekordokbl pl fel, mint amibl a tmbt ptjk fel. A fjl adatait beolvassuk a
tmbbe, majd ott feldolgozzuk.

4.2.4 Sor adattpus, FIFO


Az eddigi adatszerkezetek majdnem minden programozsi nyelvben megtallhatk a nyelv rszeknt. A tovbbiakban olyan adatszerkezeteket tekintnk t, amelyek ltalban a nyelvekben nincsenek explicit mdon
utastsszinten megvalstva, a programoznak sajt magnak kell ltrehoznia azokat.
A kvetkez adattpusok alapja egy legalbb egy dimenzis tmb. Ennek az egy dimenzis tmbnek a
szerkezetre ptjk r a kvetkezkben az adatszerkezeteket. Termszetesen, ha a programoz dinamikus memriakezelssel tmbk nlkl is meg tudja oldani a feladatot, akkor taln gyorsabb feldolgoz programokat kap, de
tmbk felhasznlsval egyszerbben megvalsthatk az adatszerkezetek.
A sor egy olyan adatszerkezet, amelybe az egyms utn bert adatokat a bers sorrendjbl vehetjk ki
(FIFO First In First Out). Az adattpusnak akkor van ltjogosultsga, amikor kt nem egyforma sebessggel
mkd rendszer kztt adattvitelt akarunk megvalstani. Akkor is hasznos kt rendszer kz egy soros adatszerkezetet kelni, ha az adatokat tadsa vagy az adatok tvtele nem folyamatos, hanem lksszer. Pldul
ilyen lehet a szmtgp telefonos kapcsolata vagy egy szmtgp s a hlzat kapcsolata.
A sor adatszerkezetnek kt utastsa van. Az IN utasts egy elemet betesz a sorba, az OUT utasts kiveszi a sor kvetkez elemt. A bettelnl arra kell vigyzni, hogy ha megtelt a sor rszre fenntartott
memriaterlet, akkor nincsen hely a beteend adat rszre hibazenetet kell adni -, ha res a sor, akkor pedig a
kivtelnl kell visszaadni hibazenetet. Az is megolds, hogy res sor esetn olyan adatot adunk vissza, amely
nem fordulhat el rvnyesen az adatok kztt. A sort kt flekppen is meg lehet megvalstani.
Els megvalsts
Az els megvalsts egyszer s lass. A sor adatszerkezetnek van egy sor mutatja. Ez a mutat mutatja meg,
hogy hol van a kvetkez szabad elem a tmbben. Ha betettnk egy elemet, akkor a szabad hely mutat nvekedik eggyel. Ha kivesznk egy elemet, akkor az els elemet vesszk ki a tmbbl, s minden elemet eggyel kisebb
index helyre msolunk.

27

T[N] elem tmb jelenti a sort. A tmb indexe 1-tl indul. Sormutat jelenti az els res helyre mutat vltozt. Kezdetben a sormutat rtke = 1.
Fggvny IN(adat) : Logikai
(Ha Hamis, akkor tele van a sor,
Ha Sormutato = N+1
ha igaz, akkor akkor nincsen tele)
In := Hamis
Klnben
T[sormutato] := adat
sormutato := sormutato + 1
In := Igaz
Elgazs vge
Eljrs vge
Fggvny OUT
Ha sormutato = 1 akkor
Ki:res a sor
OUT := NIL
Klnben
OUT := T[1]
Ciklus i:=2-tl sormutato-ig
T[i-1]:=t[i]
Ciklus vege
sormutato := sormutato 1
Elgazs vge
Eljrs vge
A megvalsts htrnya a kivtelnl a ciklikus msols. Ez lasstja a kivtelt.
Msodik megvalsts
A msodik megvalstsnl is egy N elem, T tmb jelenti a sort, ahol az N elem tmbt 0.tl N-1-ig indexeljk.
Itt kt mutatt hasznlunk. A psorba jelenti azt a helyet, ahov a kvetkez elemet beteheti az IN utasts. A
psorbol jelenti azt a helyet, ahonnan ki lehet venni a kvetkez elemet. Az IN utasts beteszi a psorba ltal
mutatott helyre az j adatot, majd nveli a psorba mutatt, mg az OUT utasts a psorbol ltal mutatott
helyrl veszi ki az adatot s nveli a psorbol mutatt. Ha brmelyik mutat tlmutat a tmb utols elemn,
akkor a mutatt a tmb els elemre irnytjuk.
Itt nagyon fontos annak a megllaptsa, hogy mit jelent az, hogy a sor res s mit jelent az, hogy a sor
tele van. Normlis esetben a kt mutat nem mutathat ugyanarra a helyre. Ekkor tudunk elemet betenni a sorba,
s tudunk elemet is kivenni a sorbl. Mikor res a sor? Ha a psorbol ugyanoda mutat, mint a psorba, ekkor
ugyanis a kiveend adat megegyezik a kvetkez beteend adat helyvel. Mit jelent az, hogy tele van a sor? A
psorba mutat utolri a psorbol mutatt, azaz ugyanaz az rtkk??? Ez gy nem lehetsges, hiszen ugyanaz
jelenti mind a kt esemnyt.
A megolds egyszer s majdnem ugyanez! Legyen tele a sor tele, akkor ha a psorba eggyel kisebb,
mint a psorbol mutat. Legyen res a sor, ha a psorbol mutat eggyel kisebb, mint a psorba mutat.
A fenti okoskods eredmnyekppen a sor mrete eggyel kisebb lesz, mint szeretnnk, hiszen egy elemet
soha nem tudunk kihasznlni. Sebaj, nveljk meg a tmb mrett N+1-re, azaz a tmb 0-tl N-ig indexelt, gy
jra N db elemet tudunk trolni maximlisan a sorban. Termszetesen inicializlni kell a sort, azaz res sorral
kezdnk a program elejn.
Mg egy problmra kell vlaszt tallni. Mi van, ha akrmelyik mutat elrte az utols helyet s nvelnem kell tovbb? Ebben az esetben a mutat N-nel val osztsnak maradkt kell sszehasonltani a msik
mutatval. A kt kd a kvetkezkppen nz ki.

28

Inicializls:
psorba := 2
psorbol := 1

Eljrs IN(adat)
Ha ((psorba+1)
Ki: Tele
Klnben
T[psorba]
psorba :=
Elgazs vge
Eljrs vge

mod N) = psorbol akkor


van a sor, adatveszts
:= adat
(psorba + 1) mod N

Fggvny OUT
Ha ((psorbol+1) mod N ) = psorba akkor
Ki:res a sor
OUT := NIL
Klnben
OUT := T[psorbol]
Psorbol := (psorbol + 1) mod N
Elgazs vge
Eljrs vge
A msodik eljrs gondolatmenete bonyolultabb, de lthatlag gyorsabb kdot eredmnyez.

4.2.5 Verem adattpus


A verem olyan adatszerkezet, amelybe az adatokat betehetjk, illetve kivehetjk. A verembl mindig az utoljra
bevitt adatot vehetjk ki elszr (LIFO Last In First Out, vagy vagy stack-nek is hvjk)
Rengeteg helyen hasznljuk a verem adatszerkezetet. Minden program, amely az opercis rendszerben
fut, st maga az opercis rendszer is rendelkezik veremmel. Amikor egy program meghv egy eljrst, a program
futsnak pillanatnyi cmt a verembe teszi el a gp, majd az eljrsbl visszatrve a verembl kapja vissza a futs megszakadsnak helyt s gy tudja ugyanonnan folytatni a gp a program vgrehajtst.
Ha ltalban a verembl kivett adatok mennyisge vagy sorrendje nem egyezik meg a betett adatok menynyisgvel s sorrendjvel, akkor egy program knnyen olyan helyzetbe kerlhet, hogy a program folytatsnak
cme nem megfelel. Ennek kvetkezmnye ltalban a program lefagysa.
A klnbz programozsi nyelvek eljrsai, fggvnyei szintn vermek felhasznlsval adjk t egymsnak a paramtereket.
A verem adatszerkezetnek van egy veremmutatja (stack pointer). A verem mrete korltos. A veremmutat azt mutatja, hogy hol van az els szabad hely a veremben. Mint emltettk kt mvelet van a veremmel
kapcsolatban.
Az adat bettele a verembe ezt PUSH utastsnak szoks hvni. Egy adatot akkor lehet betenni, ha a verem mg
nem telt meg. Ha tele van a verem s mg egy elemet be akarok tenni a verembe, akkor az utasts hibazenettel
kell, hogy visszatrjen.
Ha a verem nincsen tele, akkor a veremmutat ltal mutatott helyre beteszem az adatot, majd a veremmutatt nvelem eggyel.
A korbbiaknak megfelelen egy T nev, N elem tmb lesz a verem. A tmb indexe 1-tl indul s N-ig tart. T
globlis vltoz hogy az eljrst a program szksges helyrl el lehessen rni.

29

Eljrs PUSH(adat)
Ha Veremmutato = N+1 akkor
Ki: Tele van a verem
Adat := lehetelen adat
Klnben
T[veremmutato] := adat
Veremmutato := veremmutato + 1
Elgazs vge
Eljrs vge
A PUSH mveletben az adat paramtert clszer cm szerinti paramtertadssal hasznlni.
Az adat kivtele a verembl szoksosan a POP nevet viseli. Itt is felmerlhet egy hiba, nevezetesen, hogy van-e
adat a veremben. res a verem, ha a veremmutat a verem els helyre mutat. A POP utasts ilyenkor hibazenettel tr vissza. Ha nem res a verem, akkor kivesszk az adatot, majd cskkentjk a veremmutatt eggyel.
Fggvny POP
Ha Veremmutato = 1 akkor
Ki:res a verem
POP := NIL
Klnben
POP := T[veremmutato]
Veremmutato := veremmutato - 1
Elgazs vge
Eljrs vge
Megjegyzend, hogy a POP mveletet clszer fggvnyknt definilni. Mind a kt mveletnl hiba esetn is
szksges visszatr adatot generlni, de clszeren ennek az adatnak lehetetlen adatnak kell lennie.
A fenti algoritmus megvalsthatjuk Objektum orientlt mdon is, ekkor a kt definilt eljrs vagy fggvny lesz
az objektum kt metdusa.

4.2.6 Lista adatszerkezet


A lista adatszerkezet hasonlan a verem adattpushoz mr meglv alaptpusokra pthet r. A listkat olyan
helyeken clszer hasznlni, a mr trolt adatok kz kell beszrni j adatokat, a meglvk kzl kell kitrlni
gy, hogy a helyt felszabadtjuk. Akkor is hasznos, ha egy bemeneten bejv adatokat folyamatosan a mr meglv adatok kz kell beszrni, stb...
A gyakorlatban a lemezek FAT rendszere, a memriakezels, mind listaszer adatszerkezettel van megvalstva.
A listt alkot elemek minden esetben legalbb kt mezbl ll rekordbl llnak. Az els mez tartalmazza a troland adatot, mg a msodik mez egy mutatt tartalmaz.
Minden listnak van egy listafeje. A listafej megmutatja, hogy hol tallhat a lista els eleme, ugyanis
nem biztos, hogy a lista els eleme egyttal a fizikailag is a listt megvalst alaprendszer els eleme. Ha a listafej lehetetlen, vagy un. NIL rtket tartalmaz, akkor a listt megvalst alaprendszerben nem trolunk a listnak
megfelel adatokat. Ha a listafej meglv helyre mutat, akkor a lista elem egyik egy olyan helyre mutat, ahol a
listban trolunk adatokat. A lista elemnek ekkor az egyik mezje tartalmazza a trolt adatot, mg a msik mez
a lista kvetkez elemnek helyre mutat. Nyilvnvalan gy a listban szerepl elemek lncot alkotnak. A lista
utols elemt gy talljuk meg, hogy a mutat helyn lehetetlen cm, illetve NIL tallhat. Az ilyen listkat egyirny listknak nevezik.
A lista adatit gy lehet elrni, hogy a lista elejtl a vgig vgigjrjuk az elemeket, s minden elem feldolgozsa utn a kvetkez elemre ugrunk, amg el nem rjk az utols elemet.
listafej

1. elem

2. elem
3. elem
4. elem (utols)

30

NIL

A lista egyfajta megvalstsa a kvetkez lehet. Egy N elem, T tmb tartalmazza a listt. A tmb elemeit alkot rekordok az adat s a kovetkezo nev mezkbl ll, ahol az adat nev mez tetszleges adatot
tartalmazhat, mg a kovetkezo egy egsz tpus, megfelel mret mez. Megjegyzend, hogy valsgos esetben a kovekezo legalbb kett vagy ngy byte hossz egsz tpus mez, azaz integer, word vagy longint, ha
Pascal nyelvrl van sz.
Tpusdefinci:
L = rekord
Adat : tetszleges adattpus
Kovetkezo: egsz tpus
Rekord vge
T[N], L tpus elemekbl ll tmb.
A fent definilt adatszerkezetben a lista elejrl el lehet jutni a lista vgig gy, hogy egyesvel vgigmegynk a
lista elemein. Ezt a lista bejrsnak hvjk.
Lista bejrsa:
Eljrs Bejaras
i := Listafej
Ciklus amg i <> NIL
Ki: T[i].adat
i := T[i].kovetkezo
Ciklus vege
Eljrs vege

//***

Hogyan tudjuk a listban szerepl adatok sszegt vagy a listban lv elemek szmt megadni? A programozsi
ttelek megfelel rszeit ttanulmnyozva ezekre a krdsekre vlaszt kaphatunk.
Az egyirny listkat csak az elejrl kezdve lehet bejrni!
Sok krdst feltehetnnk ebben a tmban. Pldul itt van egy feladat, amelyet majd a ksbbiekben felhasznlunk. Az utols elem megkeresse a listban
Fggvny Vegkeres(elso_elem)
i := elso_elem
Ciklus amig T[i].kovetkezo <> NIL
i := T[i].kovetkezo
Ciklus vege
Vegkeres := i
Fuggvny vge
Hogyan kereshetnk meg egy adott elemet a listban? Az albbi pldban fggvnyknt adjuk meg az algoritmust, s paramterknt adjuk t a keresett adatot.

31

Egy elem keresse


Fggvny Kereses(Keresett_adat)
i := Listafej
Ciklus amg (i<>NIL) s (T[i].adat <> keresett_adat)
i := T[i].kovetkezo
Ciklus vege
Ha i <> NIL akkor
Ki: A keresett adat sorszama:, i
Ki: A keresett adat:, T[i].adat
Kereses := i
Kulonben
Ki: Nem ltezik a keresett adat
Kereses := NIL
Elgazs vge
Fggvny vege
Hogyan tudunk egy j elemet betenni a listba, s egy elemet kitrlni a listbl? Elszr egy keresett elemet trljnk ki a listbl. A trlshez felhasznljuk az elbb definilt keress algoritmust egy kicsit mdostva. A
Kereses algoritmus elozo paramtert cm szerint adjuk t!
Eljrs Torls
Be: torlendo_adat
elozo := NIL
elso_elem := Listafej
i := Keress(torlendo_adat, elozo, elso_elem)
Ha i <> NIL akkor
T[elozo].kovetkezo := T[i].kovetkezo
Elgazs vge
Eljrs vge
Fggvny Kereses(keresett_adat, elozo, elso_elem)
i := elso_elem
Ciklus amg (i<>NIL) s (T[i].adat <> keresett_adat)
elozo := i
i := T[i].kovetkezo
Ciklus vege
Ha i <> NIL akkor
Kereses := i
Kulonben
Kereses := NIL
Elgazs vge
Fggvny vge
Ha a 3. elem a kitrlend adat, akkor a 2. Elem kvetkez mutatjt kell tlltani gy, hogy a negyedik elemre
mutasson.
listafej

1. elem

2. elem
3. elem
4. elem (utols)

NIL

Mi trtnik ilyenkor a felszabadult hellyel? Kt lehetsg van.


Az els esetben a felszabadult hely mutatjt NIL-re lltjuk, az adatmezvel nem trdnk, hiszen ettl
kezdve nem hasznljuk az ott trolt adatokat. Ennl a megoldsnl a lista inicializlsakor termszetesen ezekkel
az adatokkal fel kell tlteni a tmbt s ksbb is kvetkezetesen tartani magunkat az elhatrozshoz. Ebben az
esetben a trl eljrs gy vltozik:
32

Eljrs Torls1
Be: torlendo_adat
elozo := NIL
elso_elem := Listafej
i := Keress(torlendo_adat, elozo, elso_elem)
Ha mutato <> NIL akkor
T[elozo].kovetkezo := T[i].kovetkezo
T[i].kovetkezo := NIL
Elgazs vge
Eljrs vge
A msik lehetsg bonyolultabb, de a valsghoz jobban kzelt. Minden listakezel rendszerben ltalban kt
listt tartanak nyilvn. Az egyik lista a foglalt elemeket tartalmazza, mg a msik lista a szabad elemeket tartja
nyilvn. A foglalt elemek listjbl val trls azt jelenti, hogy az elemet ttesszk a szabad listba. A szabad s
a foglalt lista elemei sszessgben kiadjk a listt tartalmaz rendszer sszes elemt.
Legyen a szabadlista feje a SzListafej, a szabadlista els elemre mutat elem az SzListafej.mutato. Ekkor gy mdosul a program, hogy miutn megtalltuk a trlend elemet, az elemet betesszk a szabadlista elejre.
Eljrs Torls1
Be: torlendo_adat
elozo := NIL
elso_elem := Listafej
i := Keress(torlendo_adat, elozo, elso_elem)
Ha i <> NIL akkor
T[elozo].kovetkezo := T[i].kovetkezo
Sz_Elso_elem := Sz_Listafej
T[i].adat := NIL
T[i].kovetkezo := Sz_Elso_elem
Sz_Listafej := i
Elgazs vge
Eljrs vge
Hogyan lehet j adatot betenni a lista vgre? Vgig kell menni a lista elemein, majd az utols elemet megtallva a
szabad lista els elembe kell betenni az adatot, az utols elem mutatjt rirnytani az j elemre s a szabadlista
fej mutatjt rirnytani a szabadlista kvetkez elemre. A beszrt elem mutatjt NIL-re kell lltani, valahogy
gy:
Eljrs Ujadat_a_vgre
Be: Adat
vegso
:= Vegkeres(Listafej)
Regi_Sz_elso
:= Sz_Listafej
Sz_elso
:= T[Regi_Sz_elso].kovetkezo
T[vegso].kovetkezo
:=Regi_Sz_elso
T[Regi_Sz_elso].adat
:= Adat
T[Regi_Sz_elso].kovetkezo := NIL
Sz_Listafej
:= Sz_elso
Eljrs vge
A fentiek alapjn megoldhat az adat beszrsa tetszleges helyre is.

33

Ktirny listk.
Gyakran elfordul, hogy a listkban nem csak az elejtl a vge fel kell mozogni, hanem visszafel is szksges.
Erre a bonyolultabb megolds az, mindig jegyezzk azt, hogy hnyat mozdultunk a listban. A visszafel mozgst
is ellrl kezdjk el, szmoljuk, hogy hnyat lptnk s eggyel elbb megllunk, mint korbban. rezheten bonyolult. Egyszerbb megolds, ha a lista rekordszerkezetbe felvesznk mg egy mezt. Ez a mez az elz
elemre mutat majd. A lista defincija ekkor gy alakul:
Tpusdefinci:
L1 = rekord
Adat
: tetszleges adattpus
Kovetkezo : egsz tpus
Elozo
: egsz tpus
Rekord vge
T[N], L1 tpus elemekbl ll tmb.
Nyilvnvalan ekkor a Listafej tartalmaz mg egy adatot, mgpedig az utols elem indext, hiszen csak gy lehet
visszafel bejrni a vgrl a listt.
Feladatok:
Hatrozzuk meg egy listban trolt szmrtkek sszegt!
Vlasszuk ki a lista legnagyobb elemt!
Egy nvekven rendezett listba szrjunk be egy elemet a nagysgnak megfelel helyre, vagyis a bejrs, nvekv nagysg elemeket rjon ki!
Fordtsuk meg egy egy-irny listban az elemek sorrendjt!
Adott kt rendezett lista, fzzk ssze a kt lista elemeit gy, hogy a tovbbiakban is rendezett lista legyen!
Alaktsunk ki egy listt egy tmbbl. A listt tltsk fel nvekv adatokkal, majd vletlenszeren tegynk t elemeket a szabadlistba. A billentyzetrl bevitt adatokat szrjuk be nagysg szerinti
helykre. Minden beszrt adat utn rassuk ki a tmb llapott, a bert adatot s a listban elfoglalt
helyt.

4.2.7 Fa adattpus
A fkat olyan esetekben hasznljuk, ha az adatok kztt valamilyen al s flrendeltsgi viszony jelenik meg. A
fk legismertebb felhasznlsi terlete a lemezek knyvtrszerkezete. Ekkor az adatokat egy fejrelltott fval lehet vizulisan brzolni.

A fkban nincsenek hurkok. Kt elem kztt a ft csak egyrtelmen lehet bejrni. A fk elemei a nyilak ltal mutatott helyeken vannak. A fa gykere egyttal a hierarchiban legmagasabb helyen ll elem.
Binris fk
Azokat a fkat, amelyekben egy elembl csak kt msik elembe mutat nyl, binris fknak hvjk. A binris fkat
alapveten rendezsi feladatok megoldsra lehet felhasznlni.
Fs rendezs
Sorban vigynk be adatokat egy binris fba. Az els elemet helyezzk el. Ha a kvetkez bevitt elem kisebb,
mint az elz, akkor a gykrelemtl balra helyezzk el, ha nagyobb vagy egyenl, akkor jobbra. Az egyms utn
bevitt elemekkel jrjuk be a fa gait, s ha egy csomponttal sszehasonltva az ppen bevitt elem kisebb, akkor
tle balra menjnk, ha nagyobb vagy egyenl, akkor tle jobbra menjnk.
Az gy kialakult fban minden elemre igaz lesz, hogy a tle balra elhelyezked elemek nla kisebbek lesznek, a jobbra elhelyezked elemek pedig nagyobb vagy egyenlk lesznek vele. Ennek megfelelen, ha balrl
jobbra bejrjuk a ft gy, hogy mindig balra tartva lemegynk a legmlyebb szintre, majd ha mr nem tudunk
tovbb menni, kirjuk az ott tallt elemet. Ez lesz a legkisebb elem.
34

Egy szinttel visszalpve kirjuk a kvetkez elemet, ez lesz a nagysgrendi sorrendben a msodik, majd
ha van jobb oldali g, akkor oda lemegynk. Ha a jobb oldali gat is bejrtuk, akkor egy szinttel visszalpve kirjuk a fenti elemet, majd annak a jobb oldalt jrjuk be. Nagysg szerint rendezett bejrst kapunk. Egy binris fa
egyfajta megvalstsa a kvetkez lehet:
Tpusdefinci:
Fa = Rekord
Bal_mutato : egsz tpus
Adat :valamilyen adattpus
Jobb_mutato : egsz tpus
Rekord vge
Legyen T[N], Fa tpus, N elem tmb.
A T[i].adat tartalmazza az adatot, T[i].Bal_mutato jelenti a fban tle balra elhelyezked elem, mg a
T[i].Jobb_mutato jelenti a fban tle balra elhelyezked elem pozcijt.
A fa feltltse adatokkal.
Eljrs Feltoltes
Be:T[1].adat
T[1].Bal_mutato := NIL
T[1].Jobb_mutato := NIL
Be:Uj_adat
i:=1
Ciklus amg Uj_adat <> NIL s (I <= N )
T[i].adat:=Uj_adat
Uj_elem_Beszrsa(1,i)
i := i + 1
Be:Uj_adat
Ciklus vge
Eljrs vge
Eljrs j_elem_Beszrsa(p,i)
Ha T[i].adat < T[p].adat akkor
Ha T[p].Bal_mutato = NIL akkor
T[i].Bal_mutato :=NIL
T[i].Jobb_mutato :=NIL
T[p].Bal_mutato := i
Kulonben
j_Elem_Beszrsa(T[p].Bal_mutat,i)
Elgazs vge
Klnben
Ha T[p].Jobb_mutato = NIL akkor
T[i].Bal_mutato :=NIL
T[i].Jobb_mutato :=NIL
T[p].Jobb_mutato := i
Kulonben
j_Elem_Beszrsa(T[p].Jobb_mutat,i)
Elgazs vge
Elgazs vge
Eljrs vge
Termszetesen az j_Elem_Beszrsa fggvny rekurzv, nmagt meghv mdon rhat csak meg. Megjegyzend, hogy N elem esetn a rekurzi mlysge jsolhatan csak Log 2 N lesz, amely 1024 elem esetn csak
10.

35

Grf adattpus
A grf adattpus az egyik legelvontabb, legnehezebben kezelhet, de mgis sok esetben szksges adattpus. A
grfok szemlltetshez kpzeljnk el egy orszgot, az orszgban lv teleplseket s a teleplseket sszekt
utakat. Ezek gy egytt grfot alkotnak.
A teleplsek az adott rendszerben a grf csompontjai, a teleplseket sszekt utak a grf lei s az
egyes utak hossza a grf lnek slyozsa.
Tbb krdst lehet feltenni, amelyekre szmtgpes programmal keressk a vlaszt:
El lehet-e jutni az egyik vrosbl a msikba?
Hny km a tvolsga kt tetszlegesen kivlasztott vrosnak?
Ha a teherautnak X km-re elegend zemanyaga van, merre kell mennie, hogy egy adott vrosbl eljusson
egy msikba.
Melyik a legrvidebb t kt vros kztt?
Adott egy tbb vrost rint krt. Melyik az optimlis tvonal
Ezen kvl rengeteg hasonl krdst lehet feltenni, de a megvlaszolsuk tlmegy a jegyzet keretein, ezrt csak
nhny tmpontot adunk itt a tovbbiakhoz.
A fent emltett grfokat gyakran brzoljuk egy kt-dimenzis tmbbel. A tmbnek annyi oszlopa s sora van,
ahny vros van. Ha kt vros kztt t tallhat, akkor a megfelel sor s oszlop ltal meghatrozott helyen a
tvolsgtl fgg pozitv szmot runk, amely vrosok kztt nincsen t, ott nullt runk. Termszetesen a vrosoknak sajt magukhoz nem vezet t, ezrt az tlban csupa nulla szerepel.

1. vros
2. vros
3. vros
4. vros
5. vros
6. vros
7. vros

1. vros 2. vros 3. vros 4. vros 5. vros 6. vros 7. vros


0
1
1
0
1
1
0
1
0
1
0
0
0
1
1
1
0
1
1
0
0
0
0
1
0
1
1
1
1
0
1
1
0
0
0
1
0
0
1
0
0
0
0
1
0
1
0
0
0

Br ez az brzols nagyon gyakori, de nem tl helytakarkos. Nyilvnval, hogy minden adat ktszer
szerepel, hiszen az oszlopok s sorok egymssal felcserlhetk, azaz lehetne a trols kevsb helypocskol. Ha
csak az utakat trolnnk s a nem utakat nem trolnnk, akkor nagysgrendekkel kevesebb adatra lenne szksgnk. Termszetesen, amennyiben csak nhny adattal rendelkeznk, a feldolgoz programok sokkal
egyszerbbek lehetnek, ha a fenti laza brzolst hasznljuk. Nagy mennyisg adat esetn, szmthat a trlhely mrete. Ekkor a dolgok termszetbl fakadan a feldolgoz algoritmusok lesznek bonyolultabbak.
Feladatok:
Egy trkprl leolvashatjuk az albbi adatokat. Teleplsek nevei s a kztk lv utak hossza. Nem minden teleplst kt ssze egymssal kzvetlenl t! rjunk olyan programokat, amelyek vlaszolnak az albbi
krdsekre:
El lehet-e jutni az egyik vrosbl a msikba?
Hny km a tvolsga ton kt tetszlegesen kivlasztott vrosnak?
Ha a teherautnak X km-re elegend zemanyaga van, merre kell mennie, hogy egy adott vrosbl eljusson egy msikba tankols nlkl.
Melyik a legrvidebb t kt vros kztt?
Adott egy tbb vrost rint krt. Melyik az optimlis tvonal

36

4.2.8 Fjl adattpus


Fjloknak hvjuk azokat az adattrolsi egysgeket, amelyekben a szmtgp programok troljk az ltaluk feldolgozand adatokat. Fizikailag teht a httrtron elhelyezked sszefgg adathalmazt tekinthetjk fjloknak.
A lemezeken elhelyezked fjloknak van nevk, fizikai elhelyezkedsk a lemezen, mretk, attribtumaik s ms
s ms rendszereken mg sok egyb jellemzik is. Ha az opercis rendszerben fut program fel akarja dolgozni
egy lemezen elhelyezked fjlban lv adatokat, akkor azt elszr tudatnia kell az opercis rendszerrel egyrtelmen, hogy melyik a krdses fjl, aminek hatsra az opercis rendszer fizikailag megkeresi a fjlt, s az
adatait hozzfrhetv teszi a program szmra. Ezt a folyamatot a fjl megnyitsnak nevezzk. A mr megnyitott fjl esetn a feldolgoz programnak nincsen szksge a fjl nevre, hiszen az opercis rendszer dolga a
nv (s esetleg az elrsi tvonal) alapjn a fjllal kapcsolatos fizikai teendk intzse, ppen ezrt a megnyitskor az opercis rendszer egy sorszmot ad a megnyitott fjlnak. Ezt a sorszmot a fjl handlernek szoks
nevezni.
A tovbbiakban a kezel program minden fjllal kapcsolatos mvelete esetn a handlerre hivatkozik. Lthat,
hogy a feldolgoz program ugyanazokat a tevkenysgeket hajtja vgre a fjl elrsi tvonaltl s nevnek vltoztatstl fggetlenl. Ha egy fjlt megnyitottunk, akkor a feldolgoz programnak mr mindegy, hogy a fjl
fizikailag hol helyezkedik el. Ugyangy, ahogy a memriban elhelyezked adatokat tekinthetjk csak bjtok
egymsutnjnak, vagy bels szerkezettel elltott adatok struktrjnak, a fizikai fjlokat is tekinthetjk tbbflekppen. Termszetesen egy adott fjl esetben a tbb fle megkzelts nem szerencss, hiszen egy binris
programkdot tartalmaz fjl esetben nincs rtelme valamilyen szablyos struktrt keresni a fjlban.
Logikailag a fjlokat gy tekintjk, hogy a feldolgoz program parancsra az opercis rendszer megnyit egy
adattviteli csatornt a program s a klvilg kztt, majd ezen a csatornn keresztl kzlekednek az adatok a
program s a klvilg kztt. A program szmra a fjl egy megnyitott adattviteli csatorna.
A fjl megnyitsa ebben az esetben egyenl az adattviteli csatorna megnyitsval. A fjlokat megnyithatjuk csak
olvassra. Ekkor az adatok ramlsa csak a httrtrrl a program fel lehetsges. A fjlokat megnyithatjuk csak
rsra is. Ebben az esetben az adatok a programbl a httrtr fel kzlekednek. Vannak esetek, amikor rsra s
olvassra nyitjuk meg a fjlt, ekkor ktirny adattvitel trtnik.
Ha a fjlt rsra s olvassra nyitjuk meg, akkor ismerni kell valamilyen mdon azt a helyet, ahov ppen rhatunk, vagy ahonnan olvashatunk a fjlbl. Ezt a helyet a fjl pointere mutatja meg. A fjl megnyitsakor a pointer
a fjl els elemre mutat s minden olvassi s rsi mvelet utn egy egysgnyit mozdul elre automatikusan. A
pointer rtkt ki lehet olvasni, s t lehet lltani.
A megnyitott fjlok kezelsekor figyelnnk kell arra, hogy a fjlnak van-e valamilyen felismerhet bels szerkezete. Alapveten hrom fle fjltpust klnbztethetnk meg,

Szekvencilis fjlok. A fjlok adatait csak sorban, egyms utn dolgozhatjuk fel. Ilyennek tekinthet pldul
a billentyzetrl bevitt karakterek sorozata is. Pascal nyelven ezt Text tpusnak hvjuk.
Beszlhetnk relatv elrs (vagy direkt elrs) fjlokrl is. Ilyenkor ismerjk a fjl adattrolsi egysgnek mrett, s ennek a mretnek az egsz szm tbbszrseivel tudunk elre s htra mozogni a fjlban,
azaz a fjl brmelyik rszt fel tudjuk dolgozni, bvthetjk. Pascal nyelven ezt a fajta fjlt tpusos fjlnak
hvjuk s File of tpus mdon definiljuk. (Adatbzisok esetn hasznlhatk az ilyen fjlok)
A harmadik a tpusnlkli fjl. Ekkor az adatok direkt elrsek, de a fjlnak nincsen ismtld bels szerkezete. Ekkor az adattrolsi egysg ltalban byte. Ha a fjlnak mgis van valamilyen rejtett bels struktrja,
akkor a programoznak kell megrnia azt a kdot, amely feldolgozza fjlban tallhat adatokat. (Pldul a
BMP fjlok bels szerkezete is ilyen tpus nlkli). Pascalban ezt a fjltpus egyszeren File-knt definiljuk.

37

A tovbbiakban sszefoglaljuk, hogy milyen mveletek lehetnek fjlokon.

Minden fjltpus esetn


a
fjl
megnyitsa.
Fjl megnyitsa rsra
A file bezrsa
Olvass a fjlbl
rs fjlba

Pascal
Reset

C, C++
fopen

Rewrite

fopen()

Close()
Read(f,),
Readln(f,.)
Write(f,),
Writeln(f,)

close()
getc(),
fgets(),
fread(), sscanf()
fputc(),
printf(),
fputs(),
fprintf(),
fwrite()
fread()

Nagyobb adatblokk be- BlockRead()


olvassa fjlbl
Nagyobb adatblokk ki- BlockWrite()
rsa fjlba
Fjl pointer mozgat- Seek()
sa

fwrite()
fseek()

Termszetesen nem adtunk kimert lerst minden mveletre.


Feladatok
Szekvencilis fjlok
Ksztsk el bemeneti szvegfjl msolatt, amelyben minden szt csak pontosan egy szkz vlaszt el.
Egy szvegllomnyban bizonyos rszeket % jelek kz tettnk. Ksztsnk kt kimeneti szvegfjlt. Az
egyikben a szveggel megjellt rszek legyenek, a msikban a jelletlenek.
Ksztsnk programot, amely egy bemeneti szvegfjlban kicserli egy adott kifejezs minden elfordulst egy msikra, s a mdostott fjlt rja ki a kimenetre.
Feladatok
Relatv elrs fjlok
Ksztsk el egy adatfjlt, amelyben gpkocsik adatait troljuk. A tovbbi feladatok erre a fjlra vonatkoznak. Az albbi feladatokat kln-kln programban is meg lehet valstani, de clszer egy
menrendszerrel vezrelt program rszv tenni.
Ksztsnk rutint, amely az adatfjlt feltlti adatokkal, mdosthatja a rekordokat, tovbb trli a rekordokat.
Ksztsnk rutint, amely megkeresi egy adott mez, adott rtkkel rendelkez elemt.
Ksztsnk rutint, amely kirja az adatfjl adatait tblzatos formban a kpernyre, s sszegzi az r
jelleg mezk tartalmt.
Ksztsnk rutint, amely az adattbln bngszst engedlyez, a kurzormozgat billentyk segtsgvel.
Ksztsnk rutint, amely egy megadott tetszleges szempont szerint fizikailag rendezi az adatokat. (nehz!)
Ksztsnk rutint, amely egy indexfjlban trolja egy tetszleges rendezsi szempont szerint az adatok
logikai sorrendjt
Tpus nlkli fjlok
rjunk programot, amely megjelenti egy BMP, egy PCX, egy GIF fjl sszes lnyeges paramtert a
kpernyn! A file-ok szerkezetnek lerst krd el tanrodtl vagy keresd meg az Interneten!
A wav fjlok szerkezete is megkereshet. rj programot, amely a legfontosabb adataikat kirja a kpernyre! A fjl szerkezetnek megllaptshoz hasznld fel az iskola Internet kapcsolatt!

38

4.2.9 Objektumok
A programozs mdszereinek fejldsi irnya olyan, hogy a programozst minden mdon igyekszik a htkznapi
gondolkodshoz kzelteni. Ennek a fejldsnek az eredmnye az objektumok megjelense bizonyos programozsi
nyelvekben. Az objektumokat elszr a Smalltalk, majd a Turbo Pascalban, illetve ksbb a C nyelv bvtseknt
megvalsult C++ nyelvben vezettk be.
Az objektumok olyan zrt programozsi egysgek, amelyek az kezelni kvnt adatokon kvl tartalmazzk azokat az eljrsokat s fggvnyeket is, amelyek az objektumok megfelel kezelsre kpesek. Az
albbiakban trgyalt hrom tulajdonsg szksges ahhoz, hogy egy programozsi egysget objektumoknak tekintsnk. A C++ nyelvben az objektumokat osztlyoknak (class) hvjk.
Egysgbe zrs
Az objektumoknak azt a tulajdonsgt, hogy az adatstruktra rsze az adatmezkn kvl az t kezel eljrs
vagy fggvny is, egysgbezrsnak (encapsulation) hvjk. Az objektum tpus adatait manipullni kpes fggvnyeket, eljrsokat metdusoknak hvjk.
Az objektumoknak vannak specilis metdusai is. A konstruktor metdus akkor fut le, amikor egy objektum, futs kzben ltrejn. A konstruktor biztostja a helyet a memriban az adatok s az egyb kdok
rszre. A destruktor metdus akkor fut le, amikor az objektum megsznik. ltalban a destruktornak csak anynyi a feladata, hogy a megfelel memriaterleteket felszabadtja. ltalban az egyes fejlesztrendszerek
automatikusan tartalmazzk az egyszerbb objektumok konstruktorjainak s destruktorjainak kdjt, a programoznak csak hivatkozni kell rjuk.
rklds
Az objektumok ltalban tartalmazhatnak ms objektumokat is. A tartalmazott objektumokat s objektumnak
szoks hvni, mg a tartalmaz objektumot leszrmazott objektumnak, vagy gyereknek hvjuk. A leszrmazott
objektumok rklik seik tulajdonsgait, azaz minden eljrst, metdust s adatmezt, amivel azok rendelkeznek. Ennek megfelelen a leszrmazott objektumban is hasznlhatjuk az s objektum metdusait.
Tbbrtsg (Polimorfizmus)
Ha egy leszrmazott objektum metdust ugyanolyan nven definiljuk, mint egy snek metdust, akkor a
program fordtsi idejben fizikailag ms eljrst kell hasznlnia a rendszernek az ppen hasznlt objektumtl
fggen. Pldul a hatvany() fggvny metdus nem lehet ugyanaz egsz, real vagy longint adattpusok esetn. A
polimorfizmus ppen azt eredmnyezi, hogy a program a megfelel metduspldnyt vlasztja ki futs kzben a
rendelkezsre ll ugyanolyan nev szimblumok kzl.
A program futsa sorn az objektumok definciinak megfelel kd jn ltre. A futs kzben ltrejv
vltozk terletein ltrejnnek az objektumok, s a metdusok kdjra val hivatkozs a vltoz rszv vlik.
Ennek megfelelen az objektumok futs kzben tartalmazzk a nekik megfelel adatokat, s tartalmazzk az objektumok kezelsre alkalmas kdrszletekre val hivatkozst is. Mivel a kapcsolat alapveten dinamikus, ezrt
egy ilyen program futsa kzben a szksges memriaterlet nagyon nagymrtkben vltozhat.
Az objektum orientlt programozs az objektumok hasznlata kiss ms gondolkozst kvn meg a
programozktl, mint a hagyomnyos procedurlis programozs. A program tervezse ttoldik az objektumok
hierarchijnak tgondolt megtervezsre, tovbb az objektumok rszeinek megfelel kd ltrehozsra. A legtbb fejlesztrendszerben mr ltezik az objektumoknak egy olyan hierarchija, amely a kpernykezelsnl, a
felhasznli fellet kialaktsnl elengedhetetlen.
Az objektum orientlt programozs a Windows 3.1 elterjedsvel vltak npszerv, (br maga a Windows nem objektum orientlt lltlag) mivel ekkor olyan nagymrtkben eltoldott hangsly a programok
fejlesztsnl a felhasznli fellet kezelse fel, hogy egyszer mdon csak objektum orientlt programozssal
lehet nagyobb mret alkalmazsokat fejleszteni gyorsan.
Meg kell emlteni azt is, hogy a windowsos programok esemnyvezreltek, ami szintn az objektumok
irnyba vitte el a programozst.
Egy objektum definilshoz kellenek a kvetkezk:

39

Pelda = Objektum
Mez1: Tpus1
Mez2: Tpus2
Metodusok
ElsoELjaras(parameterlista)
Eljrs2(paramlterlista)
Init() konstruktor
Close() destruktor
Objektum vge
Var Vltozo : Pelda
Hivatkozni egy objektum egy vltozjra gy lehet:
Valtozo:mezo1 := Adat
Egy metdusra gy lehet:
Valtozo::ElsoEljaras(paramterek)
Formailag hasonlt a lers a rekordok hasznlathoz, de itt a vltozra val hivatkozs biztostja, hogy mr fordtsi idben csak azokat az eljrsokat metdusokat hajtassuk vgre a vltozn, amivel azt a vltozt lehet
kezelni.
Mivel az egyes fejleszteszkzk nem pontosan ugyangy valstjk meg az objektumokat, ezrt itt tbbet nem mondunk el, a megfelel programozsi nyelvek tanulsnl majd kitrnk a pontos lersra.
Feladatok:
ptsk fel az albbi objektumstruktrt: ktdimenzis pont, egyenes szakasz, trtvonal, krv, kr! Az
objektumokba vegyk bele a pontok, illetve egyb alkotelemek sznt is!

40

Rekurzi

Rekurzinak hvjuk azt a mdszert, amikor egy rtket vagy egy llapotot gy definilunk, hogy definiljuk a
kezdllapott, majd ltalban egy llapott az elz vges szm llapot segtsgvel hatrozzuk meg. Ez a fajta
meghatrozs gyakran rvidebb s jobban hasznlhat, mintha valamilyen zrt alakot hasznlunk. A rekurzv
programozsnl a programok nmagukat hvjk meg s az aktulis llapotuk elmentsre vermet (stack) hasznlnak. A rekurzv programok a feladat megoldst visszavezetik addig, amg a megolds trivilis (kedrtk),
majd ebbl lltjk el az ltalnos rtket. Mivel a verem vges, ezrt mindig biztostani kell egy vgfelttelt,
amely biztostja azt, hogy a rekurzi vgetr. Ha ez nem trtnik meg, akkor a rekurzv program a vgtelensgig
hvn magt, azonban a verem gyorsan megtelik s hibval lell a program.

5.1

A rekurzv eljrsok, fggvnyek

A programozsi nyelvek ltalban biztostjk a programozk szmra azt, hogy egyes eljrsok nmagukat hvhassk meg. Az albbi ltalnos lersban egy fggvny kapcsn mutatjuk be a rekurzit.
Fggvny Rekurziv(Bemen paramter)

Bemen paramter mdostsa

Ha Feltetel(Bemeno parameterre) = igaz akkor


Eredmny := Kezdrtk
Klnben
Eredmny := Rekurziv(Bemeno parameter)
Elgazs vge
Rekurziv := eredmny
Eljrs vge
A fenti eljrsban a rekurzv hvs az eljrsban vgzett mveletek utn helyezkedik el. Az ilyen rekurzit jobb
rekurzinak hvjuk. Ha a rekurzv hvs elszr jn ltre, majd ksbb kvetkeznek a mdost mveletek, bal
rekurzirl beszlnk.
A szmtgpek eljrshvsi mechanizmusa gy mkdik ltalban, hogy az eljrs meghvsakor a program a
pillanatnyi futsi cmet verembe menti, illetve a vermen keresztl tadja a paramtereket is. A meghvott eljrs a
verembl kiveszi a paramtereket s felhasznlja, de az elmentett utastscmet ott hagyja.
Amikor vge szakad egy eljrsnak, akkor a visszatrsi utasts hatsra kiveszi a verembl az elzleg
elmentett futsi cmet, majd ez alapjn, a cmen mutatott utasts utni utastson folytatja a program vgrehajtst.
A fenti eljrsban definilt minden vltoz loklis, ezrt amikor az eljrs meghvja nmagt, ai vltoznak egy j pldnya jn ltre, fggetlenl a tbbitl.
A felttelvizsglat biztostja, hogy egy bizonyos felttel meglte esetn a rekurzi vget rjen. Ha rossz
felttelt lltunk a rekurziban, akkor elfordulhat, hogy vgtelenl sokszor nmagt hvja meg a rekurzi, s a
verem betelik. A program hibazenettel lell.
Nzznk nhny egyszerbb rekurzival megoldhat feladatot:
Fibonacci szmok:
A Fibonacci szmok sorozata olyan szmsorozat, amelyben az i-edik elem az i-1 s az i-2-ik elem sszegbl jn
ki. Az F(0) := 1 s az F(1) :=1. Matematikailag: F(i) := F(i-1) + F(i-2) Ksztsnk olyan rekurzit tartalmaz
programot, amely megadja az F(N)-t.
Fggvny Fibonacci(N)
Ha N=0 vagy N=1 akkor
Fibonacci := 1
Klnben
Fibonacci := Fibonacci( i-1) + Fibonacci (i-2)
Elgazs vge
Fggvny vge

41

N alatt a K kiszmolsa
A feladat egy matematikai defincinak megfelel rtk kiszmolsa. Ha van N db elemnk, s ki akarunk venni
kzle K darabot, akkor N alatt a K flekppen tudjuk kivenni, pldul a 90 db lottszmbl hny fle mdon
tudunk 5 db-ot kivlasztani.
Fggvny N_alatt_a_K(n, k)
Ha k = 0 vagy k = n akkor
N_alatt_a_K := 1
Klnben
N_alatt_a_K := N_alatt_a_K(n-1,k-1)+ N_alatt_a_K(n-1,k)
Elgazs vge
Fggvny vge.
Ennek a feladatnak a megrtshez ismerni kell a matematikban a Pascal hromszgnek nevezett fogalmat. Itt
magyarzatot nem adunk a fogalomra, matematika tantrgyban a kombinatorika rszen lehet ennek az elmleti
alapjaival megismerkedni.
Hanoi torony
Van hrom plciknk, A,B,C jel. Az A jel plcikn nagysg szerint cskken mdon N darab korong van. Milyen sorrendben tudjuk tvinni a C jel plcikra a korongokat, gy hogy szintn nagysg szerint cskken mdon
legyenek, ha csak egyesvel mozgathatjuk ket, mindig egyik plcikrl a msikra tve.
Eljrs Hanoi(N, A, C, B)
Ha N>0 akkor
Hanoi (N-1, A, B, C)
Ki: N, mozgats A-rl C-re
Hanoi( N-1, B, C, A)
Elgazs vge
Eljrs vge
A fenti eljrst gy lehet ellenrizni, ha elszr N=1 re majd, N=2-re ellenrizzk, azaz vgigjtsszuk.
A fenti rekurzv algoritmusok mindegyike a matematikai gondolkods alapjn jl rthet, azonban a rekurziknak
alapvet hibja, hogy futs kzben viszonylag sok helyre van szksg a veremben, tovbb a sok verem mvelet
miatt viszonylag lassak az algoritmusok. A veremkezel mveletek gpi szinten a leglassabb mveletek kz
tartoznak.

5.2

Rekurzi s a ciklusok

Krds az, hogy van-e olyan eset, amikor rdemes rekurzit hasznlni, ciklusok helyett, illetve lehet-e rekurzv
algoritmusokat nem rekurzvv talaktani. Elszr megmutatjuk, hogyan kell trni ciklusokat tartalmaz eljrst
rekurzvv:
Elltesztel ciklus esetn
Eljrs Cikl(x)
Ciklus amg Felt(x) = igaz
Vegreh(x)
Ciklus vge
Eljrs vge
Htultesztel ciklus esetn
Eljrs Cikl(x)
Ciklus
Vegreh(x)
amg Felt(x) = igaz
Ciklus vge
Eljrs vge

42

Eljrs Rek(x)
Ha Felt(x) akkor
Vegreh(x)
Rek(x)
Elgazs vge
Eljrs vge
Eljrs Rek(x)
Vegreh(x)
Ha Felt(x)= igaz akkor
Rek(x)
Elgazs vge
Eljrs vge

Az utols esetben egy megszmllsos ciklust runk t rekurzvv. A ciklus eltt adunk kezdrtket egy vltoznak s a ciklusban is mdostjuk a vltoz tartalmt a korbbi rtke s egy tmb aktulis rtke alapjn. (Pldul
brmilyen sszegzs elvgezhet gy.)
Fggvny R(bemen paramterek)
S:=0
Ciklus i:=1- tl N-ig
S:= fn(S, A[i])
Ciklus vge
R := S
Fggvny vge
A fenti fggvnyben az Fn() tetszleges sszegz tpus fggvnyt jelent. A rekurzv vltozat gy nz ki:
Fggvny R ( bemen paramterek, i)
Ha i>N akkor
R:= kezdrtk
Klnben
R := Fn(A[i], R( paramterek, i+1) )
Elgazs vge
Fggvny vge

5.3

Rekurzv adatszerkezetek

Itt visszatrnk az adatszerkezetek tmra. A korbbi tanulmnyaink alapjn megismert adatszerkezetek kzl a
lista, a binris fa, adatszerkezetek rekurzival is definilhatk.
A lista defincija:
I:=0 esetn a lista res,
I>0 esetn a lista az j elem + az addigi listbl jn ltre.
A binris fa defincija:
I:=0 esetn a binris fa res,
I>0 esetn a binris fa := Bal oldali binris fa + j elem + Jobb oldali binris fa.
Ha mutat tpus vltozval oldjuk meg a kvetkez elem elrst, illetve a listaelem helyt a memriban is mutat adja meg, akkor a Lista^.rtk jelenti a listaelem rtkt, illetve a LISTA^.mutat a kvetkez listaelemre
mutat. Ebben az esetben a lista bejrsa a kvetkez rekurzival oldhat meg:
Eljrs Bejrs (Lista)
Ha Lista<>NIL akkor
Ki: Lista^.rtk
Bejrs(Lista^.mutat)
Elgazs vge
Eljrs vge
Ha a binris ft a listval analg mdon a kvetkezkppen jelljk: Fa^.rtk jelenti az aktulis elem rtkre
mutat pointer, Fa^.Bal s a Fa^.Jobb pedig a bal rszfa illetve a jobb rszfra mutat pointer, akkor a fa bejrs
a kvetkez:

43

Eljrs Balkozepjobb (Fa)


Ha Fa<>NIL akkor
Balkozepjobb(Fa^.Bal)
Ki: Fa^.rtk
Balkozepjobb(Fa^.Jobb)
Elgazs vge
Eljrs vge
Feladatok
Valstsuk meg a LOGO-bl ismert geometriai, ismtld mintkat az PASCAL, C vagy
algoritmusler nyelven!

44

Zrsz

Ajnlott irodalom
Wirth
Knuth

Benk
Benk
Kernighan - Richie
Angster - Kertsz
Hargitai - Kaszanyicki

Adatstruktrk + Algoritmus = Programok


Programozs fellnzetbl
Mdszeres programozs
Szmtstechnika kzpfokon
Programozzunk C nyelven
Programozzunk Pascal nyelven
A C programozsi nyelv
Turbo Pascal 6.0 feladatgyjtemny I - II
Visual Basic 3.0

OMIKK
ComputerBooks , 1997
ComputerBooks , 1997
Mszaki Knyvkiad, 1985
Szmalk, 19

Internet ...
Hi
Fbin Zoltn

45

You might also like