8. előadás Wagner György Általános Informatikai Tanszék
Azonosítók érvényességi köre Kiindulási alap: a blokkszerkezetű programozási nyelvek (C, FORTRAN, PASCAL, ) Egy program szerkezete: Fejléc Deklarációsrész Fejléc Deklarációsrész Fejléc Deklarációsrész Utasításrész Utasításrész Utasításrész
Azonosítók érvényességi köre (2) Minden egyes blokk tehát újabb blokko(ka)t tartalmazhat
Azonosítók érvényességi köre (3) A blokk deklarációs részében azonosítókat lehet deklarálni. Az azonosítók és a blokkok viszonyától függően háromféle érvényességi kört különböztetünk meg. Var i : Integer ; Procedure Csere ;
Azonosítók érvényességi köre (4) Lokális: a, b Globális: Láthatatlan:... c, d a, d b c De!! A globális azonosítókat NEM szeretjük!! Átláthatatlanná teszik a programot. c
Unit-ok A problémák: amennyiben valaki a szubrutinokra építve összeállít egy jó, hasznos szubrutin gyűjteményt, akkor azt egy következő programjában csak úgy tudja felhasználni, ha átmásolja az egészet abba. egy nagy program esetén könnyen előfordulhat, hogy túl nagy programot ír. Akkorát, amekkorát egyben már nem lehet ( > 64 Kb) A megoldás: MODULÁRIS programozás.
Egy futtatható program előállításának menete Forráskód (fv-ek.c) Compiler Tárgykód (fv-ek.obj) Lib Tárgykód könyvtár (fv-ek.lib) Forráskód (valami.c) Compiler Tárgykód (valami.obj) Linker Linker Futtatható program (valami.exe)
Unit-ok (3) Egy forrásnyelvű állományt modulnak nevezünk. Egy modul tartalmazhat: egy szubrutint egy feladatkörre irányuló szubrutinokat minden szubrutinunkat Általában a második a bevált módszer A Free Pascal-ban a modul fordítása után az ún. UNIT keletkezik. Típusa:.TPU A Unit-ban levő szubrutinokat, sőt konstansokat, típusokat, változókat használhatjuk másik programban.
Felépítése: Unit (4) Fejléc: Unit Sajat ; Interfész rész: Interface Implementációs rész: Implementation Inicializációs rész: {konstansok, típusok, változók, valamint eljárások és fv-ek fejlécei} {konstansok, típusok, változók, eljárások, fv-ek} Begin End....
Unit (5) Unit Sajat; Interface Procedure Csere(Var a, b : Real); Implementation Procedure Csere(Var a, b : Real); Var s : Real; Begin s := a; a := b; b := s; End; Begin WriteLn('hip-hip-hurra'); End. Program Pelda; Uses Sajat; Var x, y : Real; Begin x := 5; y := 7; Csere (x, y); WriteLn(x, y); End.
Unit (6) Minden egyes Unit max 64 Kb kódot tartalmazhat A Unit-ok egymás szubrutinjait is hívhatják Vannak előre elkészített Unit-ok: System (szabványos eljárások, fv-ek: WriteLn, ) Crt (billentyűzet, display, hang, ) Graph (nagyfelbontású grafika) Dos (Operációs rendszer megszakítások, ) Overlay (Átlapolásos programozás technika) Turbo3 (TP 3.0-val való kompatibilitás miatt) Graph3 (TP 3.0 grafikájával való kompatibilitás miatt)
Keresések Általános feltétel: N rekordból álló halmazból a rekordok egyikének lokalizálása. További feltétel: Minden rekord tartalmazzon egy kulcsmezőt. Feladat: Megtalálni azt a rekordot, amelynek kulcsa megegyezik a keresett kulccsal. Két eset: A keresés sikeres vagy sikertelen lehet.
Szekvenciális keresések 1. Adott az R 1, R 2,, R n rekordok halmaza, ahol K 1, K 2,, K n jelöli a megfelelő kulcsokat. Feltétel: n 1 Megoldás: az első rekord kulcsának összehasonlítása a keresett kulccsal. Ha megegyezik, a keresésnek sikeresen vége. Ha nem egyezik meg, vizsgálat a file végére. Ha vége, a keresésnek sikertelenül van vége. Ha nincs vége, akkor a következő rekord kulcsának a vizsgálata...
Szekvenciális keresések (2) 2. Gyors szekvenciális keresés: Elv: az előző algoritmusban 2 vizsgálat történik: kulcs egyezés van-e? file vége van-e? Ha az egyik feltétel elvethető, akkor a keresés felgyorsul. Megoldás: egy fiktiv (ál)rekord a file végére R n+1 -ként, amelyre nézve K n+1 = K. Így a file vége vizsgálat kimaradhat.
Szekvenciális keresések (3) 3. Javított gyors szekvenciális keresés: Elv: Megpróbálni egy cikluslépésen belül két rekordot megvizsgálni. Megoldás: továbbra is a fiktív rekordot felvenni R n+1 rekordként, majd a ciklust i = 1-ről indítva, és a ciklusváltozót kétszer növelve (Inc(i); Inc(i);) összehasonlítani az R i, R i+1 rekordok K i, K i+1 kulcsait K-val. Eredmény: az 1. algoritmushoz képest kb. 30 %-kal gyorsabb!
Szekvenciális keresések (4) 4. Rendezett táblában szekvenciálisan keresni: Elv: Az előző algoritmusok csak akkor tudták eldönteni a sikertelen keresést, ha a file végére értek. Egy rendezett táblában ha a K j kulcs nagyobb K-nál, akkor belátható, hogy a keresett rekord nincs a táblában. Eredmény: sikertelen keresés esetén átlagosan kétszer gyorsabb!
Szekvenciális keresések (5) 5. A tábla rendezettségi szempontját megváltoztatni: Elv: feltehető, hogy a kulcsokra nem egyforma gyakorisággal hivatkozunk. Ekkor: K i kulcs p i valószínűséggel fordul elő, ahol: Megoldás: p 1 + p 2 + + p n = 1 (100 %) Azokat a rekordokat előre tenni a táblában, melyeknek a gyakorisága nagyobb.
Alapelvek: Rendezések Beszúró rendezés: egyesével tekinti a rendezendő számokat, és mindegyiket beszúrja a már rendezett elemek közé. (Kártyalapok rendezése). Cserélő rendezés: ha két elem nem a megfelelő sorrendben követi egymást, akkor felcserélésre kerülnek. Ez az eljárás ismétlődik mindaddig, míg további cserére már nincs szükség. Kiválasztó rendezés: először a legkisebb (vagy legnagyobb) elemet határozzuk meg, és a többitől valahogy elkülönítjük. Majd a következő legkisebbet választjuk ki, stb Leszámoló rendezés: minden elemet összehasonlítunk minden elemmel. Az adott elem végső helyét a nála kisebb elemek száma határozza meg.
Rendezések Javasolt irodalom: D. E. Knuth: A számítógép programozás művészete III. kötet
Algoritmusok Leszámoló: (nincs) Beszúró: közvetlen beszúrás bináris beszúrás Shell rendezés lista beszúró rendezése címszámító rendezés Cserélő: buborék rendezés Batcher párhuzamos módszere gyorsrendezés (Quick sort) számjegyes cserélés aszimptotikus módszerek Kiválasztó: közvetlen kiválasztás finomítása elágazva kiválasztó rendezés kupacrendezés legnagyobb be, első ki összefésülő rendezés szétosztó rendezés
Általános cél Adott R 1, R 2,, R n rekordokat K 1, K 2,, K n kulcsaik nem csökkenő sorrendjébe kell rendezni lényegében egy olyan p(1), p(2),, p(n) permutáció megkeresésével, amelyre K p(1) <= K p(2) <= <= K p(n) fennáll. Ideiglenes feltétel: Tekintsünk olyan halmazt, amelynek rendezése a memóriában megvalósítható.
Célszerű adatszerkezetek 1. Ha a rekordok mindegyike több szót foglal el a tárban, akkor célszerű a rekordokra mutató láncolt címek új táblázatának létrehozása és ezeknek a kezelése a rekordok mozgatása helyett. Ez a CÍMTÁBLÁZATOK rendezése. R e k o r d 89 37 41 R S O Kiegészítő D T E információk Rendezés előtt Kisegítő táblázat Rendezés után
Célszerű adatszerkezetek (2) 2. Ha a kulcs rövid, de a rekord kiegészítő információja hosszú, akkor a nagyobb sebesség elérése érdekében a kulcs a láncoló címmel együtt tárolható. Ez a KULCSOK rendezése.
Célszerű adatszerkezetek (3) 3. Ha a láncoláshoz az egyes rekordokhoz csatolt segédmezőt alkalmaznak úgy, hogy a rekordok együtt egy lineáris listát alkotnak, amelyben minden láncoló cím a következő rekordra mutat, akkor az a LISTA rendezése. 89 37 41 R S O D T E Lista feje