Programozási tételek újrafelhasználható osztálysablon könyvtára

Hasonló dokumentumok
Objektum elvű alkalmazások fejlesztése Programozási tételek újrafelhasználása 1.

Objektum elvű alkalmazások fejlesztése Programozási tételek újrafelhasználása 1. Készítette: Gregorics Tibor

Programozási tételek újrafelhasználása

Programozási feladatok megoldása visszavezetéssel egy osztály-sablon könyvtárra támaszkodva 1

OAF Gregorics Tibor: Minta dokumentáció a 4. házi feladathoz 1. Feladat. Megoldás

Programozás Minta programterv a 2. házi feladathoz 1.

Tervminták II. (Híd, Bejáró, Gyártófüggvény) Halmaz és bejárása Osztály-sablonok

Programozás(A szakirány) II. beadandó feladat Farkas András HP6S15 1. csoport Veszprémi Anna / Hudoba Péter

EAF II Feladat dokumentáció IV. feladat 4. házi feladathoz

Objektum elvű alkalmazások fejlesztése. Verem típus osztály-sablonja

Szekvenciális inputfájl felsorolása

STL gyakorlat C++ Izsó Tamás május 9. Izsó Tamás STL gyakorlat/ 1

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

Fejlett programozási nyelvek C++ Iterátorok

Programozás Minta programterv a 1. házi feladathoz 1.

Objektum elvű alkalmazások fejlesztése Kifejezés lengyel formára hozása és kiértékelése

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport

Bánsághi Anna 2014 Bánsághi Anna 1 of 68

500.AA Megoldó Kulcsár 500.A

500.AA Megoldo Arisztid 500.A

117. AA Megoldó Alfréd AA 117.

Felhasználó által definiált adattípus

1.AA MEGOLDÓ BERCI AA 1.

Programozás alapjai. 5. előadás

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

1000.AA Megoldo Alfréd 1000.A

OEP Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1. Feladat. Elemzés 1

500. AA Megoldó Alfréd AA 500.

C++ Standard Template Library (STL)

OOP: Java 8.Gy: Abstract osztályok, interfészek

mul : S T N 1 ha t S mul(s, t) := 0 egyébként Keresés Ezt az eljárást a publikus m veletek lenti megvalósításánál használjuk.

503.AA Megoldo Arisztid 503.A

infix kifejezés a+b ab+ +ab postfix kifejezés prefix kifejezés a+b ab+ +ab a+b ab+ +ab Készítette: Szabóné Nacsa Rozália

.AA Megoldó Alfréd AA.

128. AA Megoldó Alfréd AA 128.

500.AJ Megoldó Magyar Magdolna 500.J

Globális operátor overloading

Fejlett programozási nyelvek C++ Sablonok és adatfolyamok

Segédanyag: Java alkalmazások gyakorlat

Szövegek C++ -ban, a string osztály

A feladat lényege egy felhasználói típusnak a zsák típusnak a megvalósítása.

C# Nyelvi Elemei. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei / 18

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

500. CC Megoldó Alfréd CC 500.

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Programozás II gyakorlat. 8. Operátor túlterhelés

Pénzügyi algoritmusok

STL. Algoritmus. Iterátor. Tároló. Elsődleges komponensek: Tárolók Algoritmusok Bejárók

Apple Swift kurzus 3. gyakorlat

228. AA Default Konstruktor AA 228.

Bevezetés a Programozásba II 8. előadás. Polimorfizmus Giachetta Roberto

Algoritmizálás + kódolás C++ nyelven és Pascalban

és az instanceof operátor

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

osztályok kapcsolata Származtatatás C++ Izsó Tamás március 19. Izsó Tamás Származtatatás/ 1

Programozási nyelvek Java

Programozás. C++ osztályok. Fodor Attila. Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék

Maximum kiválasztás tömbben

3. Osztályok II. Programozás II

Programozás alapjai II. (7. ea) C++

Programozási nyelvek II.: JAVA

Pénzügyi algoritmusok

Informatikai Kar. 3. fejezet. alapismeretek. Giachetta Roberto

Java Programozás 9. Gy: Java alapok. Adatkezelő 5.rész

C#, OOP. Osztályok tervezése C#-ban

PHP II. WEB technológiák. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) PHP II / 19

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

BME MOGI Gépészeti informatika 8.

A C# programozási nyelv alapjai

Programozás II. 2. Dr. Iványi Péter

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

Objektumok inicializálása

Programozás I. Első ZH segédlet

500. DD Megoldó Alfréd DD 500.

Programozás II. ATM példa Dr. Iványi Péter

Programozási technikák Pál László. Sapientia EMTE, Csíkszereda, 2009/2010

Programozás alapjai II. (4. ea) C++

A képernyőre írást igénylő részfeladatok eredményének megjelenítése előtt írja a képernyőre a feladat sorszámát (például: 3. feladat:)!

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

C++ programozási nyelv Konstruktorok-destruktorok

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós május 6. Széchenyi István Egyetem, Gy r

Bevezetés a programozásba 2

OOP: Java 6.Gy: Java osztályok. Definíció, static, túlterhelés

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

A lista eleme. mutató rész. adat rész. Listaelem létrehozása. Node Deklarálás. Létrehozás. Az elemet nekünk kell bef zni a listába

Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák

Programozási nyelvek I. 5. előadás (Gregorics Tibor anyagának felhasználásával)

Programozás C++ -ban 2007/4

Programozás alapjai II. (7. ea) C++

Programozás C nyelven (3. ELŐADÁS) Sapientia EMTE

Bevezetés a programozásba Előadás: A const

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Generikus Típusok, Kollekciók

Programozás C és C++ -ban

Java programozási nyelv 5. rész Osztályok III.

Objektumorientált Programozás VI.

1. Alapok. Programozás II

A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

Átírás:

Programozási tételek újrafelhasználható osztálysablon könyvtára

Cél Legyen egy programozási tételeket általánosan leíró kódkönyvtár (osztálysablon könyvtár), amely felhasználásával a visszavezetéssel tervezett programjainkat minimális erőfeszítéssel (ciklusok írása nélkül) implementálhatjuk. Egy feladat megoldása egy ún. tevékenység objektum legyen, amelynek 1. osztályát a kódkönyvtár egy osztálysablonjából származtatjuk, 2. megadva annak sablon paramétereit és felülírva a metódusait, 3. majd futási időben egy felsoroló objektumot is csatolunk hozzá. Procedure Enumerator MaxSearch Summation Counting LinSearch Selection Gregorics Tibor: Objektumelvű programozás SeqInFile Enumerator Interval Enumerator StringStream Enumerator Array Enumerator 2

Programozási tételek ősciklusa felsorolt elemek típusa template <typename Item> void run() felsoroló objektumra mutató pointer { if (_enor==nullptr ) throw MISSING_ENUMERATOR ; initialization t.first() t.end() body( t.current() ) t.next() } default:!_enor->end() && whilecond(_enor->current()) init(); for ( first(); loopcond(); _enor->next() ) { default: true body(_enor->current()); } default: _enor->first() Ez a run() függvény bármelyik programozási tétel algoritmusának leírására alkalmas, ha az init(), és a body() függvényeket megfelelő módon definiáljuk. Lehetőség van a first(), a whilecond(), vagy akár a teljes loopcond() függvényt felüldefiniálására is, ha a felsorolást indítását illetve leállását módosítani akarjuk. Gregorics Tibor: Objektumelvű programozás 3

Programozási tételek ősosztálya template <typename Item> class Procedure { protected: Enumerator<Item> *_enor; felsorolt elemek típusa Procedure():_enor(nullptr){} virtual void init()= 0; virtual void body(const Item& current) = 0; virtual void first() {_enor->first();} felsoroló objektumra mutató pointer a run() sablon-metódus felüldefiniálható paraméter-metódusai virtual bool whilecond(const Item& current) const { return true;} virtual bool loopcond() const { return!_enor->end()&& whilecond(_enor->current());} nem írható felül a leszármazott osztályokban public: enum Exceptions { MISSING_ENUMERATOR }; konkrét felsoroló objektum hozzáadása virtual void run() final; virtual void addenumerator(enumerator<item>* en) final { _enor = en;} virtual ~Procedure(){} }; procedure.hpp az ősciklus sablon-metódusa, amelyik paraméter-metódusokat hív meg a sablon-függvény tervminta szerint Gregorics Tibor: Objektumelvű programozás 4

Általános maximum keresés Procedure +run() : void {final} +addenumerator() : void {final} # init() : void {virtual} # first() : void {virtual} # body(item) : void {virtual} # loopcond() : bool {virtual} # whilecond(item) : bool {virtual} Item MaxSearch Item, Value # l : bool # opt : Value # optelem : Item # init() : void {override, final} # body(e : Item) : void {override, final} # func(item) : Value {virtual, query} # cond(item) : bool {virtual, query} + found() : bool {query} + opt() : Value {queryl} + optelem() : Item {queryl} #enor Gregorics Tibor: Objektumelvű programozás <<interface>> Enumerator Item az Item típusú elemeknek a Value típusú értékeit hasonlítjuk össze l := false if cond(e) then skip elsif cond(e) l then if func(e) > opt then opt, optelem := func(e), e endif elsif cond(e) l then l, opt, optelem := true, func(e), e endif return true 5

Maximum keresés osztálya template <typename Item, typename Value = Item, typename Compare = Greater<Value> > class MaxSearch : public Procedure<Item> { protected: bool _l; Item _optelem; Value _opt; Compare _better; void init() override final { _l = false; } void body(const Item& e) override final; a maximum vagy minimum kereséshez biztosítja a megfelelő összehasonlítást két Value típusú értékeket összehasonlító adattag ősciklusban bevezetett paramétermetódusok végleges felüldefiniálása további felüldefiniálható paraméter-metódusok }; virtual Value func(const Item& e) const = 0; virtual bool cond(const Item& e) const { return true; } public: bool found() const { return _l; } Value opt() const { return _opt; } Item optelem() const { return _optelem; } eredmény lekérdezése maxsearch.hpp Gregorics Tibor: Objektumelvű programozás 6

Maximum keresés ciklusmagja template <typename Item, typename Value, typename Compare> void MaxSearch<Item,Value,Compare>::body(const Item& e) { } if (!cond(e) ) return; Value val = func(e); if (_l){ if (_better(val, _opt)){ _opt = val; _optelem = e; } } else { _l = true; _opt = val; _optelem = e; } Kell, hogy a Compare helyébe olyan típus kerüljön, amely úgy implementálja az operator(,)-t, hogy a _better objektum kívánt módon hasonlítsa össze a val és az _opt értékeit. maxsearch.hpp Gregorics Tibor: Objektumelvű programozás 7

Összehasonlító osztályok template <typename Value> class Greater{ public: bool operator()(const Value& l, const Value& r) { return l > r; Ha a _better típusa a Greater<int>, } akkor _better(2,5) azonos a 2>5 értékével. }; template <typename Value> Ha a _better típusa a Less<int>, class Less{ akkor _better(2,5) azonos a 2<5 értékével. public: bool operator()(const Value& l, const Value& r) { return l < r; } }; maxsearch.hpp Gregorics Tibor: Objektumelvű programozás 8

Felsorolók Item SeqInFileEnumerator <<interface>> Enumerator Item +first() : void {virtual} +next() : void {virtual} +current() : Item {virtual} +end() : bool {virtual} Item Procedure #enor Item StringStreamEnumerator # f : file of Item # df : Item + first() : void {override} + next() : void {override} + current() : Item {override} + end() : bool {override} ArrayEnumerator Item Item = int IntervalEnumerator # ss : stringstream # ds : Item + first() : void {override} + next() : void {override} + current() : Item {override} + end() : bool {override} # vect : Item[m..n] # ind : int + first() : void {override} + next() : void {override} + current() : Item {override} + end() : bool {override} # m, n : int # ind : int + first() : void {override} + next() : void {override} + current() : Item {override} + end() : bool {override} Gregorics Tibor: Objektumelvű programozás 9

Intervallum és Tömb felsorolója class IntervalEnumerator : public Enumerator<int> { protected: int _m, _n; int _ind; public: IntervalEnumerator(int m, int n):_m(m), _n(n){} void first() override { _ind = m; } void next() override { ++_ind; } bool end() const override { return _ind>_n; } Item current() const override { return _ind; } }; intervalenumerator.hpp template <typename Item> arrayenumerator.hpp class ArrayEnumerator : public Enumerator<Item> { protected: const std::vector<item> *_vect; unsigned int _ind; public: ArrayEnumerator(const std::vector<item> *v):_vect(v){} void first() override { _ind = 0; } void next() override { ++_ind; } bool end() const override { return _ind>=_vect->size(); } Item current() const override { return (*_vect)[_ind]; } }; Gregorics Tibor: Objektumelvű programozás 10

Szekvenciális inputfájl felsorolója template <typename Item> class SeqInFileEnumerator : public Enumerator<Item>{ protected: std::ifstream _f; Item _df; public: enum Exceptions { OPEN_ERROR }; SeqInFileEnumerator(const std::string& str){ _f.open(str); Az Item-re legyen értelmes if(_f.fail()) throw OPEN_ERROR; az istream& operator>> } void first() override { _f >> _df; } void next() override { _f >> _df; } bool end() const override { return _f.fail(); } Item current() const override { return _df; } }; seqinfileenumerator.hpp A könyvtárban ez az osztály ennél összetettebb: egyrészt rendelkezik egy olyan (Item = char) specializációval, amely kikapcsolja az elválasztó jeleket (white-space) figyelmen kívül hagyó mechanizmust, másrészt soronkénti olvasás esetén az üres sorokat figyelmen kívül hagyja. Gregorics Tibor: Objektumelvű programozás 11

StringStreamEnumerator template <typename Item> class StringStreamEnumerator : public Enumerator<Item> { protected: std::stringstream _ss; Az Item-re legyen értelmes az istream& operator>> Item _df; public: StringStreamEnumerator(std::stringstream& ss) {_ss << ss.rdbuf(); } }; void first() override { _ss >> _df; } void next() override { _ss >> _df; } bool end() const override { return!_ss;} Item current() const override { return _df; } stringstreamenumerator.hpp Gregorics Tibor: Objektumelvű programozás 12

1. Feladat Adott egy egész számokat tartalmazó szöveges állomány. Keressük meg ebben a legnagyobb páratlan számot! A : f:infile(z), l:l, max:z Ef : f = f 0 Uf : l, max = MAX e f0 e páratlan e Feltételes maximum keresés t:enor(e) ~ f:infile(z) felsorolása H, > ~ Z, > f(e) ~ e felt(e) ~ e páratlan E / Item ~ Z / int H / Value ~ Z / int f(e) / func(e) ~ e felt(e) / cond(e) ~ e páratlan / e%2!=0 Gregorics Tibor: Objektumelvű programozás 13

Megoldás osztálydiagramja Item, Value, Compare MaxSearch #enor Item SeqInFileEnumerator # func(item) : Value {virtual} # cond(item) : bool {virtual} Item = int Greater Value Item = int, Value = int, Compare = Greater<int> +operator(value,value):bool #better MyMaxSearch # func(e:int) : int {override} # cond(e:int) : bool {override} Value = int return e mod 2!=0 return e Gregorics Tibor: Objektumelvű programozás 14

A megvalósításhoz készített kód class MyMaxSearch : public MaxSearch<int>{ protected: int func(const int& e) const override { return e;} bool cond(const int& e) const override { return e%2!=0;} }; } 12-5 23 44 130 56 3-120 int main(){ try { tevékenység objektum MyMaxSearch pr; SeqInFileEnumerator<int> enor("input.txt"); pr.addenumerator(&enor); pr.run(); felsoroló objektum működés if (pr.found()) cout << "The greatest odd integer:" << pr.optelem(); else cout << "There is no odd integer!"; } catch(seqinfileenumerator<int>::exceptions ex){ if (SeqInFileEnumerator<int>::OPEN_ERROR == ex ) cout << "Wrong file name!"; } return 0; input.txt Gregorics Tibor: Objektumelvű programozás 15

2. Feladat Egy forgalomszámlálás során egy hónapon keresztül számolták, hogy óránként hány utas lép be egy adott metróállomás területére. (A méréseket hétfőn kezdték, de nem minden nap és nem minden órában végeztek megfigyelést.) Az időt négyjegyű számmal kódolták, amelynek első két jegye a mérés napját mutatja (pontosabban azt, hogy hányadik napja ez a megfigyelésnek), utolsó két jegye a nap azon óráját mutatja, amikor a mérés született. A méréseket egy szöveges állományban rögzítették időkód-létszám párok formájában. A hétvégi napok közül (melyik nap melyik órájában) mikor léptek be az állomás területére legkevesebben? input.txt 0108 23 0112 44 0116 130 0207 120 Gregorics Tibor: Objektumelvű programozás 16

Megoldás specifikációja A : f:infile(mérés), l:l, min:n, elem: Mérés Mérés = rec( időpont : N, létszám : N ) Ef : f = f 0 Uf : l, min, elem = MIN e f0 e.időpont hétvége e.létszám Feltételes maximum keresés t:enor(item) ~ f:infile(mérés) felsorolása Item ~ Mérés Value, > ~ N, < func(e) ~ e.létszám cond(e) ~ e.időpont hétvége e.időpont/100%7 == 6 e.időpont/100%7==0 Gregorics Tibor: Objektumelvű programozás 17

Megoldás osztálydiagramja Item, Value, Compare MaxSearch #enor Item SeqInFileEnumerator # func(item) : Value {virtual} # cond(item) : bool {virtual} Item = Mérés Less Value Mérés időpont : int létszám : int Item = Mérés, Value = int, Compare = Less<int> +operator(value,value):bool #better MyMinSearch # func(e : Mérés) : int {override} # cond(e : Mérés) : bool {override} Value = int return e.időpont hétvége return e.létszám Gregorics Tibor: Objektumelvű programozás 18

Elemi típus (Mérés) struct Measurement{ int timestamp; int number; 0108 23 0112 44 0116 130 0207 120 input.txt }; int day() const { return timestamp/100; } int hour() const { return timestamp%100; } a szekvenciális inputfájl Pair típusú elemeinek felsorolásához kell istream& operator>>(istream& f, Measurement& df) { f >> df.timestamp >> df.number; return f; } Gregorics Tibor: Objektumelvű programozás 19

Főprogram class MyMinSearch: public MaxSearch< Measurement, int, Less<int> > { protected: int func(const Measurement &e) const override { return e.number; } bool cond(const Measurement &e) const override { return e.day()%7==6 e.day()%7==0; } }; int main() { try { MyMinSearch pr; SeqInFileEnumerator< Measurement > enor("input.txt"); pr.addenumerator(&enor); pr.run(); } if (pr.found()){ Pair p = pr.optelem(); cout << "The least busy hour was the " << p.hour() << ". hour of the " << p.day() << ". day when " << pr.opt() << " people stepped into the station.\n"; } else cout << "There is no weekend data.\n"; } catch(exceptions ex){ if (OPEN_ERROR == ex ) cout << "File open error!"; } return 0; Gregorics Tibor: Objektumelvű programozás 20

3. Feladat Egy szöveges állomány sorai recepteket tartalmaznak, ahol egy recept az étel nevéből (sztring) és a hozzávalók felsorolásából áll. Egy hozzávalót anyagnévvel (sztring), mennyiséggel (szám), és mértékegységgel (sztring) adunk meg. Példa egy sorra: tejbegríz tej 1 liter búzadara 13 evőkanál vaj 6 dkg cukor 5 evőkanál Hány receptnek hozzávalója a cukor? A : f:infile(recept), db:n Recept = rec(név : String, hozzávalók : Hozzávaló * ) Hozzávaló = rec(anyag : String, mennyiség : N, mérték : String) Ef : f = f 0 részfeladat: van-e a hozzávalók között cukor? Uf : db = e f0 1 van_cukor(e) = SEARCH e.hozzávalók[i].anyag=cukor van_cukor(e) i=1.. e.hozzávalók Számlálás t:enor(item) ~ f:infile(recept) felsorolása Item ~ Recept cond(e) ~ van_cukor(e) egy sor elemei alapján Lineáris keresés t:enor(item) ~ e.hozzávalók : Hozzávaló * felsorolása Item ~ Hozzávaló cond(e) ~ e.hozzávalók[i].anyag=cukor Gregorics Tibor: Objektumelvű programozás 21

Összegzés és Számlálás Procedure Item Item, Value Summation # result : Value # init() : void {override, final} # body(e : Item) : void {override, final} # func(item) : Value {virtual, query} # neutral() : Value {virtual, query} # add(value,value) : Value {virtual, query} # cond(item) : bool {virtual, query} + result() : Value {query} feltételes összegzés result := neutral() if cond(e) then result := add(result, func(e)) endif return true Counting Value = int Item # func(e:item) : int {override, final, query} # neutral() : int {override, final, query} # add(int, int) : int {override, final, query} return 1 return 0 return a+b Gregorics Tibor: Objektumelvű programozás 22

1. megoldás kezdete main pr : MyCounting enor : SeqInFileEnumerator<Recipe> ( input.txt ) pr.addenumerator(&enor) pr.run() return pr.result() MyCounting : Counting Item = Recipe # cond(e:recipe) : bool {override} Recipe name : string vect : Ingredient[*] Ingredient substance : string quantity : int unit : string pr : MyLinSearch enor : ArrayEnumerator< Ingredient> (e.vect) pr.addenumerator(&enor) pr.run() return pr.found() Gregorics Tibor: Objektumelvű programozás 24

Lineáris keresés és kiválasztás Procedure Item pesszimista vagy optimista a pesszimista a default Item, optimist : bool LinSearch # l : bool # elem : Item l := optimist # init() : void {final} # body(item) : void {final} l := cond(e) # cond(item) : bool {virtual} elem := e # whilecond(item) : bool {final} + found() : bool {query} if optimist + elem() : Item {query} then return l else return not l endif Selection Item # init() : void {final} # body(item) : void {final} # cond(item) : bool {virtual} # loopcond(item) : bool {final} + elem() : Item {query} return not cond(enor.current()) skip skip Gregorics Tibor: Objektumelvű programozás 25

1. megoldás folytatása main pr : MyCounting enor : SeqInFileEnumerator<Recipe> ( input.txt ) pr.addenumerator(&enor) pr.run() return pr.result() MyCounting : Counting Item = Recipe # cond(e:recipe) : bool {override} pr : MyLinSearch enor : ArrayEnumerator< Ingredient> (e.vect) pr.addenumerator(&enor) pr.run() return pr.found() Item = Ingredient MyLinSearch : LinSearch # cond(e: Ingredient):bool {override} Ingredient substance : string quantity : int unit : string Recipe name : string vect : Ingredient[*] operator>>(is:istream, e:recipe) line : string getline(is, line) ss : stringstream(line) ss >> e.name át kellene másolni a hozzávalókat az ss-ből az e.vect tömbbe return e.substance= sugar Gregorics Tibor: Objektumelvű programozás 28

Sorozatok (vector, ostream) előállítása összegzéssel A másolások, listázások, kiválogatások összegzésként történő előállításához specializáltuk a Summation sablont: Value = vector<value> esetén az eredmény egy (konstruktor segítségével átvett vagy helyben definiált) sorozat, Value = ostream esetén az eredmény egy output adatfolyam. A func() metódust állítja elő azt az elemet, amelyet az eredménysorozathoz kell hozzáfűzni. Value = vector<value> esetén Value func(item) const Value = ostream esetén string func(item) const A cond() metódus felüldefiniálásával lehet elérni, hogy a felsorolt elemeknek csak egy részét vegye figyelembe. Nem kell a neutral() és add() műveleteket megadni. Gregorics Tibor: Objektumelvű programozás 29

Szöveges állományból beolvasott egész számokat hozzáfűzünk egy tömbhöz, majd a tömb páros elemeit kiírjuk class Concat : public Summation<int, vector<int> >{ public: Concat(const vector<int> &v) : Summation<int, vector<int> >(v) {} protected: int func(const int &e) const override { return e; } }; class Write : public Summation<int, ostream > { public: Write(ostream* o) : Summation<int, ostream>(o) {} protected: string func(const int &e) const override { }; ostringstream os; os << e << " " ; return os.str(); vector<int> v = { -17, 42 }; Concat pr1(v); SeqInFileEnumerator<int> enor1("input.txt"); } pr.addenumerator(&enor1); bool cond(const int &e) const override { pr1.run(); return e%2==0; } Write pr2(&cout); ArrayEnumerator<int> enor2(&pr1.result()); pr2.addenumerator(&enor2); pr2.run(); Gregorics Tibor: Objektumelvű programozás 31

1. megoldás vége main pr : MyCounting enor : SeqInFileEnumerator<Recipe> ( input.txt ) pr.addenumerator(&enor) pr.run() return pr.result() MyCounting : Counting Item = Recipe # cond(e:recipe) : bool {override} pr : MyLinSearch enor : ArrayEnumerator< Ingredient> (e.vect) pr.addenumerator(&enor) pr.run() return pr.found() Item = Ingredient MyLinSearch : LinSearch # cond(e: Ingredient):bool {override} Recipe name : string vect : Ingredient[*] operator>>(is:istream, e:recipe) line : string getline(is, line) ss : stringstream(line) ss >> e.name pr : Copy enor : StringStreamEnumerator<Ingredient>(ss) pr.addenumerator(&enor) pr.run() e.vect := pr.result() operator>>(is:istream, Ingredient substance : string quantity : int unit : string Value = Ingredient[*] Copy : Summation # func(e:ingredient) : Ingredient {override} return e.substance= sugar Item = Ingredient e:ingredient) is >> e.substance >> e.quantity >> e.unit return e Gregorics Tibor: Objektumelvű programozás 32

2. megoldás main pr : MyCounting enor : SeqInFileEnumerator<Recipe>( input.txt ) pr.addenumerator(&enor) pr.run() return pr.result() MyCounting : Counting Item = Recipe # cond(e:recipe) : bool {override} Recipe name : string has_sugar : bool return e.has_sugar Ingredient substance : string quantity : int unit : string operator>>(is:istream, e:recipe) line : string getline(is, line) ss : stringstream(line) ss >> e.name pr : MyLinSearch enor : StringStreamEnumerator<Ingredient>(ss) pr.addenumerator(&enor) pr.run() e.has_sugar := pr.found() operator>>(is:istream, is >> e.substance >> e.quantity >> e.unit Item = Ingredient MyLinSearch : LinSearch # cond(e: Ingredient):bool {override} return e. substance = sugar e:ingredient) Gregorics Tibor: Objektumelvű programozás 33

4. Feladat Egy szöveges állományban aszteroidákról vett megfigyeléseket tárolnak (egy aszteroidáról akár többet is). Minden sor egy megfigyelést tartalmaz: az aszteroida kódját (sztring), egy dátumot (sztring), az aszteroida tömegét (ezer tonnában), az aszteroida távolságát a Földtől (százezer kilométerben). AXS0076 2015.06.13. 2000 5230 Az állomány aszteroidák kódja szerint növekedően rendezett. Listázzuk ki azokat az aszteroidákat a legnagyobb mért tömegükkel, amelyek minden megfigyeléskor 1 milliárd kilométernél közelebb voltak a Földhöz! A : f:infile(megfigyelés), cout:outfile(string N) Megfigyelés = rec( azon : String, dátum : String, tömeg : N, távolság : N) A : t:enor(aszteroida), cout:outfile(string N) Aszteroida = rec(azon : String, tömeg : N, közel : L) Ef : t = t 0 Uf : cout = e t0 e.közel <(e.azon, e.tömeg)> Összegzés (kiválogatás) t:enor(item) ~ t:enor(aszteroida) Item ~ Aszteroida Value, +, 0 ~ (String N)*,, <> func(e) ~ (e.azon, e.tomeg) cond(e) ~ e.közel Gregorics Tibor: Objektumelvű programozás 34

Megoldás terve main pr : Assortment(&cout) enor : AsteroidEnumerator("input.txt") pr.addenumerator(&enor) pr.run() Item = Asteroid Value = ostream Assortment : Summation # cond(e:asteroid) : bool {override} # func(e:asteroid) : string {override} return e.near f := new SeqInFileEnumerator<Observation>(str) Item = Asteroid AsteroidEnumerator : Enumerator - f : SeqInFileEnumerator<Observation> - current : Asteroid - end : bool + AsteroideaEnumerator(string) # first() : void {override} # next() : void {override} # current() : Asteroid {override} # end() : bool {override} f.first() next() return current return end return string(e) Asteroid id : string mass : int near : bool Observation id : string date : string mass : int distance : int operator>>(is:istream, e:observation) is >> e.id >> e.date >> e.mass >> e.distance Gregorics Tibor: Objektumelvű programozás 35

Egy aszteroida adatainak olvasása A next() metódus kiszámolja egy aszteroida legnagyobb tömegét, valamint azt, hogy mindig közelebb volt-e a Földhöz, mint 1 milliárd kilométer. A : f:infile(megfigyelés), e:megfigyelés, st:status, akt:aszteroida, vége:l Megfigyelés = rec( azon:string, dátum:string, tömeg:n, távolság:n) Aszteroida = rec(azon:string, tömeg:n, közel:l) Ef : f = f e = e st = st Uf : vége = (st =abnorm) ( vége akt.azon = e.azon a két feldolgozás eltérő állapotokban állhat le e.azon = akt.azon akt.tömeg, st, e, f = MAX e (e, f ) e.tömeg e.azon = akt.azon ezt a két felsorolást nem szabad szekvenciába tenni, össze kell vonni egy ciklusba akt.közel, st, e, f = SEARCH e (e, f ) e.távolság<10000 ) ) Gregorics Tibor: Objektumelvű programozás 36

Két programozási tétel összevonása Egy aszteroida legnagyobb tömegét megadó maximum kiválasztást, és a Földhöz való közelségét kiszámoló optimista lineáris keresést közös ciklusba kellene vonni. Maximum kiválasztás t:enor(item) ~ f:infile(megfigyelés) first() nélkül amíg azonosítót nem vált Item ~ Megfigyelés Value, > ~ N, > func(e) ~ e.tömeg Összegzés t:enor(item) ~ f:infile(megfigyelés) first() nélkül amíg azonosítót nem vált Item ~ Megfigyelés Value, +, 0 ~ N, max, 0 func(e) ~ e.tömeg nem vonhatók össze Optimista lineáris keresés t:enor(item) ~ f:infile(megfigyelés) first() nélkül amíg azonosítót nem vált Item ~ Megfigyelés cond(e) ~ e.táv < 10000 összevonhatók Összegzés t:enor(item) ~ f:infile(megfigyelés) first() nélkül amíg azonosítót nem vált Item ~ Megfigyelés Value, +, 0 ~ L,, igaz func(e) ~ e.táv < 10000 Gregorics Tibor: Objektumelvű programozás 37

next() metódus terve next end := f.end()) if end then return endif current.id := f.current().id pr : DoubleSummation (current.id) pr.addenumerator(f) pr.run() current.mass := pr.result().mass current.near := pr.result().near Result mass : int near : bool Result(int, bool) Item = Observation Value = Result DoubleSummation : Summation - id : string + DoubleSummation(str : string) # func(const Observation& e) : Result {override} # neutral() : Result {override} # add(result a, Result b) : Result {override} # first() : void {override} # whilecond(observation e) : bool {override} skip Asteroid id : string mass : int near : bool return e.id = id Observation id : string date : string mass : int distance : int id = str return Result( e.mass, e.distance < 10000 ) return Result( 0, true ) return Result( max(a.mass, b.mass), a.near and b.near) Gregorics Tibor: Objektumelvű programozás 38