Programozási tételek általánosítása 1.

Slides:



Advertisements
Hasonló előadás
C# nyelvi áttekintő A „Programozás C# nyelven (Illés Zoltán)”
Advertisements

C++ programozási nyelv Gyakorlat hét
Programozás III OOP ALAPOK.
Összetett adattípusok 8/b tétel
Programozás III KOLLEKCIÓK 2..
Algoritmus és programozás
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Programozási alapismeretek 5. előadás. ELTE Szlávi - Zsakó: Programozási alapismeretek 5.2/  Programozási tételek.
Programozási alapismeretek 6. előadás. ELTE Szlávi-Zsakó: Programozási alapismeretek 6.2/  Rekordok/struktúrák.
INFOÉRA Kombinatorikai algoritmusok (Horváth Gyula és Szlávi Péter előadásai felhasználásával) Juhász István-Zsakó László: Informatikai.
Copyright, 2009 © Szlávi Péter A kupac és a prioritási sor típuskonstrukciók Szlávi Péter ELTE IK Média- és Oktatásinformatikai Tanszék
© Kozsik Tamás Beágyazott osztályok A blokkstrukturáltság támogatása –Eddig: egymásba ágyazható blokk utasítások Osztálydefiníciók is egymásba.
Programozási alapismeretek 2. előadás. ELTE Szlávi - Zsakó: Programozási alapismeretek 2.2/  Adatokkal kapcsolatos.
Programozási alapismeretek 7. előadás. ELTE Szlávi-Zsakó: Programozási alapismeretek 7. előadás2/  Sorozatszámítás.
Programozási alapismeretek 3. előadás
Programozási alapismeretek 5. előadás. ELTE 2/  Programozási tételek – a lényeglényeg  Sorozatszámítás Sorozatszámítás.
Programozási alapismeretek 8. előadás. ELTE 2/  További programozási tételek További programozási tételek 
Bevezetés a Java programozásba
4. előadás (2005. március 8.) Pointerek Pointer aritmetika
Osztályok Garbage collection.  általában minden osztálynak vannak adattagjai és/vagy metódusai ◦ adattagok megadása:  [láthatóság] [static] [final]
Programozás II. 3. Gyakorlat C++ alapok.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 6. Gyakorlat const, static, dinamikus 2D.
Gombkötő Attila Lineáris egyenlet.
Készítette: Pető László
Java programozási nyelv 3. rész – Osztályok I.
A C++ programozási nyelvSoós Sándor 1/12 C++ programozási nyelv Gyakorlat - 8. hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
C# tagfüggvények.
C# tagfüggvények.
C++ Alapok, első óra Elemi típusok Vezérlési szerkezetek
6. előadás Parametrikus polimorfizmus. Generikus programozás. Az Ada sablonok.
Copyright, 1999 © Szlávi Péter Verem típuskonstrukció Szlávi Péter ELTE IK Média- és Oktatásinformatikai Tanszék
A számfogalom bővítése
Objektumok. Az objektum információt tárol, és kérésre feladatokat hajt végre. Az objektum adatok (attribútumok) és metódusok (operációk,műveletek) összessége,
Tömbök Csernoch Mária.
ELTE Adatokkal kapcsolatos fogalmak  Konstans: az az adat, amely a műveletvégzés során nem változtat(hat)ja meg értékét, mindvégig ugyanabban az „állapotban”
Alprogramok deklarációja, definíciója és meghívása Páll Boglárka.
Tömbök és programozási tételek
Összetett adattípusok
Operátorok Értékadások
Javascript Microsoft által készített kiegészítése Statikus típusosság Nagy projektek Windows 8 fejlesztésénél WinRT egy részét ebben írták Nyílt forráskódú,
Programozási alapismeretek 11. előadás. ELTE Szlávi-Zsakó: Programozási alapismeretek 11.2/ Tartalom  Rendezési.
Koncepció: Specifikáció: e par exp i = eb imp bod ib Specifikáció elemzése: tulajdonságok felírása a koncepció alapján + tulajdonságok bizonyítása.
Copyright, 1999 © Szlávi Péter Sor típuskonstrukció Szlávi Péter ELTE IK Média- és Oktatásinformatikai Tanszék
Egyenesvonalú (lineáris) adatszerkezetek
1 Objektum orientált programozás Öröklődés: többszörös öröklődés, konstruktorok, destruktorok, overloading Nagy Szilvia.
Programozás III KOLLEKCIÓK.
Feladatok (értékadás)
Programozási alapismeretek * A Zh-írás módszertana.
Programozási alapismeretek 8. előadás. ELTE Szlávi-Zsakó: Programozási alapismeretek 8.2/  További programozási.
1. feladat  Készíts olyan függvényt, mely paraméterül kapja két egész típusú változó címét, s hívása után a két változó értéke helyet cserél.
Algoritmizálás, adatmodellezés
Kiterjesztések szemantikája: Szemantikai tartomány : Adatoknak, vagy értékeknek egy nem üres halmazát szemantikai tartománynak nevezzük. Jelölése: D. Egy.
5. előadás Parametrikus polimorfizmus. Generikus programozás. Az Ada sablonok.
Programozási alapismeretek 2. előadás. ELTE Szlávi - Zsakó: Programozási alapismeretek 2.2/  Adatokkal kapcsolatos.
Geometriai feladatok programozása Geometriai programozás Szlávi Péter ELTE IK Média- és Oktatásinformatika Tanszék 2010.
Félcsoport (semigroup) = ({s},{ *: s s  s [infix]}. semigroup is a type specification = sorts: s oprs: *: s s  s [infix] eqns: m 1, m 2, m 3  s (m 1.
Programtervezés, programozás I. 2.5 tömbök,stringek
Objektum orientált programozás 4. Mutatók, típusok és struktúrák Nagy Szilvia.
Függvények, mutatók Csernoch Mária. Függvények függvény definíciója az értelmezési tartomány tetszőleges eleméhez hozzárendel egy értéket –függvény helyettesítési.
Informatikai gyakorlatok 11. évfolyam
TÁMOP /1-2F Felkészítés szakmai vizsgára, informatika területre modulhoz II/14. évfolyam Az interaktív vizsga jellegzetes feladattípusainak.
TÁMOP /1-2F JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam Osztályok, objektumok definiálása és alkalmazása. Saját.
TÁMOP /1-2F Informatikai gyakorlatok 11. évfolyam Alapvető programozási tételek megvalósítása Czigléczky Gábor 2009.
A szoftver mint komplex rendszer: objektumorientált megközelítés.
Nevezetes algoritmusok
Gráfok 2. Szlávi Péter ELTE IK Média- és Oktatásinformatikai Tanszék
Informatikai gyakorlatok 11. évfolyam
Adatszerkezetek -- Típusok
Algoritmus készítés.
Előadás másolata:

Programozási tételek általánosítása 1. Szlávi Péter szlavip@elte.hu 2015

Tartalom Cél+kiinduló pont Az általánosítás lehetőségei Az algoritmizálás absztrakciójának mélyítése A kódolás „absztrakciójának” mélyítése Algoritmizálás/kódolás absztrakciójának mélyítése Sorozatok – Tömbáltalánosítás To be continued… Programozási tételek általánosítása 1. 2018.12.26.

Cél+kiinduló pont Általánosítás Várható előnyök elvekben – algoritmikusan (részben a specifikációt is érintve) gyakorlatban – programozási nyelvben (most Pascalban) Várható előnyök oktatásban: absztrakciós készség fejlődése szakmában: újrafelhasználhatóság miatt a fejlesztési eredményesség és időhatékonyságának a növekedése „Kiinduló pont” – programozási tételek Állítás: a specifikációt az algoritmus kielégíti Mint függvény: TételNév(bemenet):Kimenet Tipikus paraméter-kellékek: tömbök http://people.inf.elte.hu/szlavi/PrM1felev/Pdf/PrMea2.pdf http://people.inf.elte.hu/szlavi/PrM1felev/Pdf/PrMea3.pdf … Programozási tételek általánosítása 1. 2018.12.26.

Az általánosítás lehetőségei Algoritmizálás során a nyelvi eszköz – a modul-fogalom kettőse: Exportmodul – a „kívülről” látszó fogalmak felsorolása (Reprezentációs/Implementációs) Modul – a típus ábrázolása és a műveleteknek ábrázolás-függő megvalósítása Kérdés: Mi értelme a modul-duplázásnak? ExportModul ModulNév(paraméterek): típus-/konstans-definíciós „fejsorok” eljárás-/függvény-definíciós fejsorok operátor-definíciós fejsorok Modul vége. http://people.inf.elte.hu/szlavi/PrM2felev/Pdf/PrMea2_2.pdf Modul ModulNév(paraméterek): Reprezentáció típus-/konstans-definíciók Implementáció eljárás-/függvény-definíciók operátor-definíciók Inicializálás inicializáló műveletek Modul vége. Programozási tételek általánosítása 1. 2018.12.26.

Az általánosítás lehetőségei Kódolás során a nyelvi eszköz – (Free)Pascal unit fogalma ↓ Következmény: „látszik”, azaz ki lehet használni a definíció részleteit, vissza lehet élni e többlet tudással. Más működésű inicializálás. És mi ezekkel a baj?!? Unit UnitNév(paraméterek); Interface típus-/konstans-definíciók (fejsor) eljárás-/függvény-definíciós fejsorok operátor-definíciós fejsorok Implementation eljárás-/függvény-definíciók operátor-definíciók Begin inicializáló műveletek End. ExportModul ModulNév(paraméterek): típus-/konstans-definíciós „fejsorok” eljárás-/függvény-definíciós fejsorok operátor-definíciós fejsorok Modul vége. http://people.inf.elte.hu/szlavi/PrM2felev/Pdf/PrMea2_2.pdf Modul ModulNév(paraméterek): Reprezentáció típus-/konstans-definíciók Implementáció eljárás-/függvény-definíciók operátor-definíciók Inicializálás inicializáló műveletek Modul vége. Programozási tételek általánosítása 1. 2018.12.26.

Az általánosítás lehetőségei De!!! Kódolás során a nyelvi eszköz – (Free)Pascal unit fogalma Type Generic oNév<típPar>=Class(TObject) típus-, változó- (attribútum-) definíciók eljárás-/függvény-definíciós fejsorok operátor-definíciós fejsorok End; Felhasználása a hívó programban (specializálás): Type konkONév=Specialize oNév<konkTíp> Unit UnitNév(paraméterek); {$mode objfpc}{$H+} Interface osztály-sablon-definíció [eljárás-/függvény-definíciós fejsorok] Implementation eljárás-/függvény-definíciók Begin inicializáló műveletek End. ExportModul ModulNév(paraméterek): típus-/konstans-definíciós „fejsorok” eljárás-/függvény-definíciós fejsorok operátor-definíciós fejsorok Modul vége. absztrakt osztálynév típusparaméter(ek) http://people.inf.elte.hu/szlavi/Magamnak/Pascal/pascal_ref.pdf 8. fejezet, 87. o. Modul ModulNév(paraméterek): Reprezentáció típus-/konstans-definíciók Implementáció eljárás-/függvény-definíciók operátor-definíciók Inicializálás inicializáló műveletek Modul vége. konkrét osztálynév absztrakt osztálynév konkrét típus Programozási tételek általánosítása 1. 2018.12.26.

Az általánosítás lehetőségei De!!! Kódolás során a nyelvi eszköz – (Free)Pascal unit fogalma Objektum létrejövetele és kezdőértéke (inicializálás): A deklarációkor még nem jön létre (csak egy címnyi helyet kap), a konstruktor meghívásával hozható létre. Létrehozáskor a kezdőértéke „nulla” (a reprezentált bájtok 0 értékűek). Ha speciális kezdőértékű, akkor definiálni kell olyan saját konstruktort (is), amely a mezőket megfelelően beállítja. Generic oNév<típPar>=Class(TObject) … Constructor Create(paraméterek); … End; Unit UnitNév(paraméterek); {$mode objfpc}{$H+} Interface osztály-sablon-definíció [eljárás-/függvény-definíciós fejsorok] Implementation eljárás-/függvény-definíciók Begin inicializáló műveletek End. ExportModul ModulNév(paraméterek): típus-/konstans-definíciós „fejsorok” eljárás-/függvény-definíciós fejsorok operátor-definíciós fejsorok Modul vége. http://people.inf.elte.hu/szlavi/Magamnak/Pascal/pascal_ref.pdf 6. fejezet, 66. o. Modul ModulNév(paraméterek): Reprezentáció típus-/konstans-definíciók Implementáció eljárás-/függvény-definíciók operátor-definíciók Inicializálás inicializáló műveletek Modul vége. Programozási tételek általánosítása 1. 2018.12.26.

Algoritmizálás/kódolás absztrakciójának mélyítése Feladatok: Készítsen absztrakt vermet (ti. verem-sablont) Verem_Abs_unit unitba csomagolva, a saját vagy a mellékelt (String-elemű) verem unitból kiindulva! Próbálja ki a unitját legalább kétféle konkrét veremre! Azaz írjon egy egyszerű programot, amely képes felépíteni (fájlos inputból) egy-egy adott típusú vermet, s elemeit kiolvasgatva kilistázni azokat. (Lehet az elemtípus: Integer és String.) Fogalmazza meg tapasztalatait a Free Pascal Generic+Specialize fogalompárról! (Pl. az oNév.Create metódus automatikusan létrejön, csak típus paramétere lehet a sablon-nak, konstans, például méret, nem; egy osztály példányát használat előtt létre kell hozni az osztályához tartozó Create osztály-függvénnyel stb.) Letölt Letölt http://people.inf.elte.hu/szlavi/AlgAdatTanMSc/PrAlt15/Verem/StrVerem_Unit.pas Az 1. feladat megoldása: http://people.inf.elte.hu/szlavi/AlgAdatTanMSc/PrAlt15/Verem/Verem_Abs_Unit.pas A 2. feladat megoldása: http://people.inf.elte.hu/szlavi/AlgAdatTanMSc/PrAlt15/Verem/Verem_Proba.pas Programozási tételek általánosítása 1. 2018.12.26.

Algoritmizálás/kódolás absztrakciójának mélyítése Tömbök helyett sorozatok Sorozat: adattípus – értékhalmaz: azonos típusú elemek együttese (sH*) műveletek: létrehozás/lerombolás elemszám (hossz(s)), elemérték-kiolvasás (pl. első(s), következő(s), dik(s,i)…, vége?(s), utolsó?(s), …), elemérték-módosítás (pl. beilleszt(s,e), módosít(s,e), dik(s,i,e)…) leszármazottai (művelethalmaz leszűkítései): tömb, (szekvenciális)fájl(ok), lista, … Cél: a tételek olyan algoritmikus átírása, hogy ne legyenek érzékenyek a bennük előforduló sorozatok milyenségére. Programozási tételek általánosítása 1. 2018.12.26.

Sorozatok – Tömbáltalánosítás Tömb-típuskonstrukció: indextípus + elemtípus Exportmodulja: Kérdés: Miért kell az operátoroknál a Másnéven bejegyzés? Megjegyzés: Később, ahol nyilvánvaló az operátor szintaxisa (pl. infix), ott eltekintünk ettől a bejegyzéstől.) ExportModul Tömb(Típus TIndex: Típus TElem): Eljárás Létrehoz(Változó t:Tömb) Lerombol(Változó t:Tömb) Függvény ElemSzám(Konstans t:Tömb):Egész Operátor ElemÉrték(Konstans t:Tömb, i:TIndex):TElem Másnéven t(i) ElemMódosít(Változó t:Tömb, Konstans i:Tindex, e:TElem) Másnéven t(i):=e AzonosE(Konstans t,tt:Tömb):Logikai Másnéven t=tt LegyenEgyenlő(Változó t:Tömb, Konstans tt:Tömb) Másnéven t:=tt … Modul vége. Tömbök esetében a Létrehoz és a Lerombol műveletek általában automatikusan hajtódnak végre az érintett alprogram indulásakor. Ezért nem találkozik a programozó ezekkel. Az AzonosE nélkülözhető. Programozási tételek általánosítása 1. 2018.12.26.

Sorozatok – Tömbáltalánosítás Elvárások az indextípusoktól (TI): Célok és következmények: a tömb egyes elemei értékének elérése a tömb egyes elemeinek módosítása (címének elérése) mivel a tömb sorozatféle → a feldolgozása ciklussal történik mivel a tömb indexelt sorozat → a szervezéshez kell az értékadás, értékazonosság operátor, rendezési reláció, következő, előző, minimum, maximum függvények, azaz az indextípus egy ún. diszkrét típus (pl. a THét felsorolás típus) mivel erre építhető a tömb reprezentálása (az ún. címfüggvényen keresztül) → sorszám konverziós függvény (index→természetes szám) praktikus okok miatt célszerű a kiírás műveletet is megengedni; gondoljon egy tömb ízléses („sablonos”) kiírásának szokásos kóddarabjára: Maga a tömb indexelése a tömbhöz tartozó funkció (nem az indextípus exportálja), amely az ún. címfüggvényen keresztül valósul meg. Ez persze az indextípuson, egész pontosan a Sorszám függvényén alapul. … Writeln('Valami a tömb egészére utaló kiírás'); For i:=1 to N do Begin Writeln(i:3,’.:’,X[i]); End; Programozási tételek általánosítása 1. 2018.12.26.

Sorozatok – Tömbáltalánosítás Elvárások az indextípusoktól (TI): Alapeset: eleve definiált diszktét típusból készítünk index- típust Egyszerűbben: ExportModul TI: Konstans Min,Max:TI Számosság:Egész Eljárás Ki(Konstans elő:Szöveg, e:TI, utó:Szöveg) Függvény Sorszám(Konstans x:TI):Egész Köv(Konstans x:TI):TI Elő(Konstans x:TI):TI Operátor AzonosE(Konstans x,y:TI):Logikai Másnéven x=y KisebbE(Konstans x,y:TI):Logikai Másnéven x<y LegyenEgyenlő(Változó x:TI, Konstans y:TI) Másnéven x:=y Modul vége. … Operátor =(Konstans x,y:TI):Logikai <(Konstans x,y:TI):Logikai :=(Változó x:TI, Konstans y:TI) Programozási tételek általánosítása 1. 2018.12.26.

Sorozatok – Tömbáltalánosítás Elvárások az indextípusoktól (TI): Alapeset: eleve definiált diszkrét típusból készítünk index- típust Használati példa: Feladat: válaszoljon az algoritmusban feltett kérdésre („mit írjunk ki TI-ről?”)! ExportModul TI: Konstans [ezek eleve definiált típus-konstansok] Min,Max:TI Számosság:Egész Eljárás Ki(Konstans elő:Szöveg, e:TI, utó:Szöveg) Függvény Sorszám(Konstans x:TI):Egész Köv(Konstans x:TI):TI Elő(Konstans x:TI):TI Operátor =(Konstans x,y:TI):Logikai <(Konstans x,y:TI):Logikai :=(Változó x:TI, Konstans y:TI) Modul vége. Válasz: „TI páros értékszámú típus” Konstans tól:Egész(?), ig:Egész(?) Típus TI=…tól..ig közötti egészek típusa [tól<ig]… Változó i,j:TI j:=Max’TI Ciklus i=Min’TI-tól Elő(Max’TI)-ig Ha j≥i akkor j:=Elő(j) Ciklus vége Ha j=(Számosság’TI+1) Div 2 akkor Ki:mit írjunk ki TI-ről? Programozási tételek általánosítása 1. 2018.12.26.

Sorozatok – Tömbáltalánosítás Elvárások az indextípusoktól (TI): Alapeset: eleve definiált diszkrét típusból készítünk index- típust Megvalósítási ötlet: alapesetben (pl. egészek intervalluma) magához, a típus értékhalmazához minden művelet rendelkezésre áll, vagy könnyen származtatható. Megjegyzés: a < definiálja természetesen a  operátort: xy  (x<y). Feladat: gondolja ezt meg az előbbi példa esetére! Kérdés: TI-re hogyan építené egy TE elemű tömb-típus(konstrukció) címfüggvényét? ExportModul TI: Konstans Min,Max:TI Számosság:Egész Eljárás Ki(Konstans elő:Szöveg, e:TI, utó:Szöveg) Függvény Sorszám(Konstans x:TI):Egész Köv(Konstans x:TI):TI Elő(Konstans x:TI):TI Operátor =(Konstans x,y:TI):Logikai <(Konstans x,y:TI):Logikai :=(Változó x:TI, Konstans y:TI) Modul vége. Maga a tömb indexelése a tömbhöz tartozó funkció (nem az indextípus exportálja), amely az ún. címfüggvényen keresztül valósul meg. Ez persze az indextípuson alapul. +-------+-------+-------+-------+ |--------|--------|--------|--------| CímFv(t,i):=KezdőCim(t)+(i-tól)*Méret(TE) + Konstans tól:Egész(?), ig:Egész(?) Típus TI=…tól..ig közötti egészek típusa [tól<ig]… Változó i,j:TI j:=Max’TI Ciklus i=Min’TI-tól Elő(Max’TI)-ig Ha j≥i akkor j:=Elő(j) Ciklus vége Ha j=(Számosság’TI+1) Div 2 akkor Ki:mit írjunk ki TI-ről? Programozási tételek általánosítása 1. 2018.12.26.

Sorozatok – Tömbáltalánosítás Elvárások az indextípusoktól (TI): Amikor nem nyilvánvaló a rákövetkezés (pl. a Szöveg típus egy részhalmaza vagy pl. a prímek az indextípus alaphalmaza), akkor jól jön a Sorszám függvény, amely kielégíti: 1 Sorszám(Min)=0 2 Sorszám(Köv(x))=Sorszám(x)+1 Használati példa1: Probléma: a Szöveg típus rendezettsége ellenére, egy tetszőleges részhalmazán a rákövetkezés nem nyilvánvaló (‚A’→’B’ vagy ’AA’?). Ugyanez a problémája a fent említett prímek indextípusként alkalmazásának, amely egy jól rendezett típusnak, az Egész-nek része. ExportModul TI: Konstans … Eljárás … Függvény Sorszám(x:TI):Egész … Operátor … Modul vége. Típus TI=…Szöveg-sorozatként felsorolt, eltérő értékű, „rendezett” sorrendű szövegek… Változó i,j:TI j:=Max’TI [Max’TI:a legnagyobb (utolsó); Min’TI:a legkisebb (első)] Ciklus i=Min’TI-tól Elő(Max’TI)-ig Ha j≥i akkor j:=Elő(j) [a TI-beli sorozat előző eleme] Ciklus vége … Programozási tételek általánosítása 1. 2018.12.26.

Sorozatok – Tömbáltalánosítás Elvárások az indextípusoktól (TI): Amikor nem nyilvánvaló a rákövetkezés (pl. a Szöveg típus egy részhalmaza vagy pl. a prímek az indextípus alaphalmaza), akkor jól jön a Sorszám függvény, amely kielégíti: 1 Sorszám(Min)=0 2 Sorszám(Köv(x))=Sorszám(x)+1 Elvárás a megvalósítással szemben (l. a példa- program-részletet): x<Köv(x), Elő(x)<x. Használati példa2: A fenti elvárás a rendezett sorrend esetén teljesül! ExportModul TI: Konstans … Eljárás … Függvény Sorszám(x:TI):Egész … Operátor … Modul vége. Típus TI=…Szöveg-sorozatként felsorolt, eltérő értékű, „rendezett” sorrendű szövegek… Változó i,j:TI j:=Max’TI [Max’TI:a legnagyobb (utolsó); Min’TI:a legkisebb (első)] i:=Min’TI Ciklus i≤Elő(Max’TI) [szöveg-hasonlítás alapján] Ha j≥i akkor j:=Elő(j) [a TI-beli sorozat előző eleme] i:=Köv(i) [a TI-beli sorozat következő eleme] Ciklus vége … Az előbbi működésének magyarázata. Így a példaprogramban az i Köv általi haladása és a > reláció „szinkronban” állnak (nincs ellentmondás köztük). Típus TI=…Szöveg-sorozatként felsorolt, eltérő, rendezett sorrendű szövegek… Változó i,j:TI j:=Max’TI [Max’TI:a legnagyobb (utolsó); Min’TI:a legkisebb (első)] Ciklus i=Min’TI-tól Elő(Max’TI)-ig Ha j≥i akkor j:=Elő(j) [a TI-beli sorozat előző eleme] Ciklus vége … Programozási tételek általánosítása 1. 2018.12.26.

Sorozatok – Tömbáltalánosítás Elvárások az indextípusoktól (TI): Amikor nem nyilvánvaló a rákövetkezés (pl. a Szöveg típus egy részhalmaza vagy pl. a prímek az indextípus alaphalmaza), akkor jól jön a Sorszám függvény, amely kielégíti: 1 Sorszám(Min)=0 2 Sorszám(Köv(x))=Sorszám(x)+1 Elvárás a megvalósítással szemben (l. a példa- program-részletet): x<Köv(x), Elő(x)<x. Megvalósítási ötlet: ilyen esetben magát a típus értékhalmazát is tárolni kell egy konstans tömbben (felsoroljuk a szöveg-konstansokat, prímeket), minden műveletet erre a tárolt sorozatra kell építeni (kihasználandó a szövegok/egészek sorrendje≡rendezettsége). A Sorszám≡…konstans tömbbeli index… Feladat: gondolja meg: az előbbi példa esetén, mely művelet hogyan valósítható meg? Feladat: a példában szereplő TI-re hogyan építené egy TE elemű tömb-típuskonstrukció címfüggvényét? (Legyen a Méret’T a T típus ábrázolásához szükséges bájtok száma.) ExportModul TI: Konstans … Eljárás … Függvény Sorszám(x:TI):Egész … Operátor … Modul vége. CímFv(t,i):=KezdőCim(t)+Sorszám(i)*Méret’TE Típus TI=…Szöveg-sorozatként felsorolt, eltérő értékű, „rendezett” sorrendű szövegek… Változó i,j:TI j:=Max’TI [Max’TI:a legnagyobb (utolsó); Min’TI:a legkisebb (első)] i:=Min’TI Ciklus i≤Elő(Max’TI) [szöveg-hasonlítás alapján] Ha j≥i akkor j:=Elő(j) [a TI-beli sorozat előző eleme] i:=Köv(i) [a TI-beli sorozat következő eleme] Ciklus vége … j>i Programozási tételek általánosítása 1. 2018.12.26.

Sorozatok – Tömbáltalánosítás Elvárások az indextípusoktól (TI): Amikor nem nyilvánvaló a rákövetkezés (pl. a Szöveg típus egy részhalmaza vagy pl. a prímek az indextípus alaphalmaza), akkor jól jön a Sorszám függvény, amely kielégíti: 1 Sorszám(Min)=0 2 Sorszám(Köv(x))=Sorszám(x)+1 Elvárás a megvalósítással szemben (l. a példa- program-részletet): x<Köv(x), Elő(x)<x. Használati példa3: ExportModul TI: Konstans … Eljárás … Függvény Sorszám(x:TI):Egész … Operátor … Modul vége. Típus TI=…Szöveg-sorozatként felsorolt, tetszőleges sorrendű, eltérő szövegek… Változó i,j:TI j:=Max’TI [Max’TI:az utolsó (Sorszám(Max’TI)=Számosság’TI-1); Min’TI:az első (Sorszám(Min’TI)=0] i:=Min’TI Ciklus i≤Elő(Max’TI) [≈ Sorszám(i)≤Sorszám(Elő(Max’TI))] Ha j≥i akkor j:=Elő(j) [≈ j:=Sorszám(j)-1. TI-beli szöveg] i:=Köv(i) [≈ i:=Sorszám(i)+1. TI-beli szöveg] Ciklus vége … Az előbbi magyarázata, Sorszám fv-nyel. Probléma: a Szöveg típus rendezettsége ellenére egy részhalmazán a rákövetkezés nem nyilvánvaló; most a részhalmaz elemeinek felsorolási sorrendje (sorszáma) teszi azzá: a haladás (Köv, Elő) és a rendezés is a Sorszám függvényen alapszik. Programozási tételek általánosítása 1. 2018.12.26.

Sorozatok – Tömbáltalánosítás Példa: 1 és 10 közötti egészek mint indextípus megvalósítási modulja: Modul TI_1_10: Reprezentáció Típus TI_1_10=Egész Konstans [típus-függvények] Min:TI_1_10(1) Max:TI_1_10(10) Számosság:Egész(Max-Min+1) … … Implementáció Eljárás Ki(Konstans elő:Szöveg, x:TI_1_10, utó:Szöveg) Ki:elő,x,utó [visszavezetés az „alap” Ki: műveletre] Eljárás vége. Függvény Sorszám(Konstans x:TI_1_10):Egész Sorszám:=x-Min [Sorszám(x)[0..Számosság-1]] Függvény vége. Függvény Köv(Konstans x:TI_1_10):TI_1_10 Köv:=x+1 [a túlcsordulással most nem foglalkozunk] Függvény vége. Függvény Elő(Konstans x:TI_1_10):TI_1_10 Elő:=x-1 [az alulcsordulással most nem foglalkozunk] Függvény vége. Operátor AzonosE(Konstans x,y:TI_1_10):Logikai Másnéven x=y AzonosE:=x=Egészy [visszavezetés az „ős” típus azonosság műveletére] Operátor vége. … Operátor KisebbE(Konstans x,y:TI_1_10):Logikai Másnéven x<y KisebbE:=x<Egészy [visszavezetés az „ős” típus kisebb műveletére] Operátor vége. Operátor :=(Változó x:TI_1_10, Konstans y:TI_1_10): x:=Egészy [visszavezetés az „ős” típus azonosság műveletére] Operátor vége. Inicializálás :=Min [deklarációkori értéke legyen: Min] Modul vége. ExportModul TI: Konstans Min,Max:TI Számosság:Egész Eljárás Ki(Konstans elő:Szöveg, x:TI, utó:Szöveg) Függvény Sorszám(Konstans x:TI):Egész Köv(Konstans x:TI):TI Elő(Konstans x:TI):TI Operátor =(Konstans x,y:TI):Logikai <(Konstans x,y:TI):Logikai :=(Változó x:TI, Konstans y:TI) Modul vége. ExportModul TI_1_10: Konstans Min,Max:TI_1_10 Számosság:Egész Eljárás Ki(Konstans elő:Szöveg, x:TI_1_10, utó:Szöveg) Függvény Sorszám(Konstans x:TI_1_10):Egész Köv(Konstans x:TI_1_10):TI_1_10 Elő(Konstans x:TI_1_10):TI_1_10 Operátor =(Konstans x,y:TI_1_10):Logikai <(Konstans x,y:TI_1_10):Logikai :=(Változó x:TI_1_10, Konstans y:TI_1_10) Modul vége. Programozási tételek általánosítása 1. 2018.12.26.

Sorozatok – Tömbáltalánosítás Példa: a kurzusra járók neveiből alkotott szövegekből álló érték-halmazú indextípus megvalósítási modulja: Modul TI_Név: Reprezentáció Típus TI_Név=Szöveg Konstans [értékhalmaz] KLétszám:Egész(???) KTagok:Tömb(0..KLétszám-1:TI_Név)('Első Tag',…,'Utolsó Tag') Konstans [típus-függvények] Min:TI_Név(KTagok(0)) Max:TI_Név(KTagok(KLétszám-1)) Számosság:Egész(KLétszám) … … Implementáció Függvény Sorszám(Konstans x:TI_Név):Egész … x kiválasztása a KTagok tömbből: i … Sorszám:=i [nem foglalkoztunk a hibás x-szel] Függvény vége. Eljárás Ki(Konstans elő:Szöveg, x:TI_Név, utó:Szöveg) Ki:elő,x,utó [visszavezetés az „alap” Ki: műveletre] Eljárás vége. Függvény Köv(Konstans x:TI_Név):TI_Név Köv:=KTagok(Sorszám(x)+1) [túlcsordulás lehet!!!] Függvény vége. … Függvény Elő(Konstans x:TI_Név):TI_Név Elő:=KTagok(Sorszám(x)-1) [alulcsordulás lehet!!!] Függvény vége. Operátor AzonosE(Konstans x,y:TI_Név):Logikai Másnéven x=y AzonosE:=x=Szövegy [visszavezetés az „ős” típus azonosság műveletére] Operátor vége. Operátor KisebbE(Konstans x,y:TI_Név):Logikai Másnéven x<y KisebbE:=Sorszám(x)<EgészSorszám(y) [visszavezetés] Operátor vége. Operátor :=(Változó x:TI_Név, Konstans y:TI_Név): x:=Szövegy [visszavezetés az „ős” típus azonosság műveletére] Operátor vége. Inicializálás :=TI_Név(Min) [deklarációkori értéke legyen: Min] Modul vége. Programozási tételek általánosítása 1. 2018.12.26.

Sorozatok – Tömbáltalánosítás Elvárások az elemtípusoktól (TE): Exportmodul: Feladatok: Készítse el az 1-10 egészek elemtípusának megvalósító TE_1_10 modulját! Készítse el a kurzusra járók neveiből alkotott szöveg-típusnak a TE_Név megvalósító modulját, amit elemtípusnak szánunk! ExportModul TE: Függvény Be(Konstans kérdés:Szöveg, Változó e:TE):Logikai Eljárás Ki(Konstans elő:Szöveg, e:TE, utó:Szöveg) Operátor =(Konstans x,y:TE):Logikai :=(Változó x:TE, Konstans y:TE) <(Konstans x,y:TE):Logikai Modul vége. A beolvasás függvény értéke a beolvasás sikeressége. A rendezés nem lényegbe vágó. Segíthet a beolvasás ellenőrzésénél. Programozási tételek általánosítása 1. 2018.12.26.

Sorozatok – Tömbáltalánosítás Az „O” utal arra, hogy osztályként ábrázoljuk az adott típust. Sorozatok – Tömbáltalánosítás Házi feladat-1: Készítse el a gyakorlaton utóbb szóba került modulok unitjait, amelyben a típusokat osztályokként reprezentálja OI_1_10_Unit, OE_1_10_Unit, OI_Nev_Unit, OE_Nev_Unit. Kiindulhat az alábbi sablonokból: OI_Sablon_Unit.pas, OE_Sablon_Unit.pas. Fontos kiegészítés: Algoritmikusan mindenféle konverziós függvény létrejötte automatikus egy új típus definiálá-sakor (ezért nem jelent meg a korábbi exportmodulokban). Például valamely érték szöveggé, illetve belső ábrázolásából az adott típusú értékké konvertálás: Szöveg:Típus→Szöveg, ill. az „inverze”: Típus:Szöveg→Típus sokszor értelmes ez is: Típus:Egész→Típus Praktikus okok miatt (kihasználva a polimorfia lehetőségét) a megírandó indextípusokhoz tartozó unitokban az alábbi néven szerepeljen az alábbi konverziós függvény: Function _2Str:String; {String-gé konvertálja az adott típusú értéket} Function Str2_:T; {T típusú értékké konvertálja a String-es megfelelőt} Function Int2_:T; {T típusúvá konvertálja az belső ábrázolású értéket} A kódolásnál ügyelni kell a polimorfizmusra! http://people.inf.elte.hu/szlavi/AlgAdatTan/PrAlt15/Sablonok/OI_Sablon_Unit.pas http://people.inf.elte.hu/szlavi/AlgAdatTan/PrAlt15/Sablonok/OE_Sablon_Unit.pas Programozási tételek általánosítása 1. 2018.12.26.

Sorozatok – Tömbáltalánosítás Házi feladat-1 (folytatás): Kódolásnál további fontos bővítés a hibázás lehetőségének figyelembe vétele. Például egy indextípus esetén a Köv/Elő műveletek túl-/alulcsordulása, vagy az elemtípus esetén a beolvasás közben az értékhalmaz elvétése. Ennek szokásos kódolási trükkje egy hiba:Boolean mező bevezetése és kezelése: Type Generic OX<…>=Class(TObject) {Private} … lényegi mezők deklarálása … hiba:Boolean; Public Constructor Create; … a lényegi műveletek fejsorai … Function HibasE:Boolean; End; Implemetation Constructor OX.Create; Begin … alap állapotba hozás … hiba:=False; {még hibátlan} End; … a további lényeg műveletek megvalósítása … Function OX.HibasE:Boolean; Begin HibásE:=hiba; hiba:=False; {újból hibátlan} End; A mezőket jó Private-tá tenni, de időnként (pl. teszteléshez) célszerű megengedni a kívülről hozzáférést. Ilyenkor elhagyjuk a kulcs-szót. Programozási tételek általánosítása 1. 2018.12.26.

Sorozatok – Tömbáltalánosítás Házi feladat-1 (folytatás): A Számosság’T / Min’T / Max’T típus-konstansokat osztálymetódusként kell definiálni: Példaként nézze meg és értse meg az OI_1_10_Unit.pas-t és az OE_1_10_Unit.pas-t! Generic OX<…>=Class(TObject) … a mezők deklarálása … Public Class Szamossag:Integer; Class Function Min:OX; Class Function Max:OX; … a lényegi műveletek fejsorai … End; Implemetation Class Function OX.Min:OX; Begin Min:=OX.Create; … a mezők Min-hez illő beállítása … End; Class Function OX.Max:OX; … Class Function OX.Szamossag:Integer; … … a lényegi műveletek magvalósítása … http://people.inf.elte.hu/szlavi/AlgAdatTan/PrAlt15/1_10_tipusok/OI_1_10_Unit.pas http://people.inf.elte.hu/szlavi/AlgAdatTan/PrAlt15/1_10_tipusok/OE_1_10_Unit.pas Programozási tételek általánosítása 1. 2018.12.26.

Sorozatok – Tömbáltalánosítás Házi feladat-2: Építse össze az előbbi 4 unitot egyetlen próba programba. A program célja mindössze annyi, hogy kipróbálja az egyes típus-műveleteket. (Ciklus-szervezés mindkét indextípus felhasználá-sával, ellenőrzötten beolvasni mindkét elemtípusú változóba és kiírni annak tartalmát. Valami ilyesmire gondoltam: Tomb_I_1_10_E_1_10_Proba1.exe. Ez csak az 1-10 közöttiek index, ill. elemtípusát tartalmazza.) A megoldás béta-változata: Tipusok_Proba_Osztaly.pas http://people.inf.elte.hu/szlavi/AlgAdatTan/PrAlt15/I_1_10_E1_10_tomb/Tomb_I_1_10_E_1_10_Proba1.exe Programozási tételek általánosítása 1. 2018.12.26.