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

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

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

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

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

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

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

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

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

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

117. AA Megoldó Alfréd AA 117.

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

Szekvenciális inputfájl felsorolása

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

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

128. AA Megoldó Alfréd AA 128.

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

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

500. CC Megoldó Alfréd CC 500.

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

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

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

Globális operátor overloading

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.

.AA Megoldó Alfréd AA.

500.AA Megoldo Arisztid 500.A

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

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

Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

Fejlett programozási nyelvek C++ Iterátorok

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

Programozás II gyakorlat. 4. Öröklődés

500. AA Megoldó Alfréd AA 500.

Bevezetés a programozásba előadás: Öröklődés

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

ISA szimulátor objektum-orientált modell (C++)

1.AA MEGOLDÓ BERCI AA 1.

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

1000.AA Megoldo Alfréd 1000.A

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

500.AJ Megoldó Magyar Magdolna 500.J

Pénzügyi algoritmusok

3. Osztályok II. Programozás II

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

503.AA Megoldo Arisztid 503.A

4. Öröklődés. Programozás II

Programozás II gyakorlat. 6. Polimorfizmus

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

1. Alapok. Programozás II

500.AA Megoldó Kulcsár 500.A

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

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

228. AA Default Konstruktor AA 228.

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

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

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

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

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

Informatika terméktervezőknek

feladat pont min elért

Tartalomjegyzék. Általános Információ! 2. Felhasználói dokumentáció! 3. Feladat! 3. Környezet! 3. Használat! 3. Bemenet! 3. Példa!

C++ Standard Template Library (STL)

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

Objektumok inicializálása

C++ programozási nyelv Konstruktorok-destruktorok

Az alábbi példában a Foo f(5); konstruktor hívása után mennyi lesz f.b értéke? struct Foo { int a, b; Foo(int c):a(c*2),b(c*3) {} };

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

.Net adatstruktúrák. Készítette: Major Péter

Elemi alkalmazások fejlesztése II. 2. Beadandó feladat Juhász Ádám

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

Bevezetés a programozásba 2

Programozás C nyelven 5. ELŐADÁS. Sapientia EMTE

C# osztályok. Krizsán Zoltán

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

Programozás C++ -ban 2007/4

Programozás. C++ típusok, operátorok. Fodor Attila

Mit ír ki? feladatok megoldásokkal

Segédanyag: Java alkalmazások gyakorlat

Programozás II gyakorlat. 7. Példák a polimorfizmus alkalmazásaira

Konkurens TCP Szerver

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:)!

Programozás C és C++ -ban

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

Objektum elvű alkalmazások fejlesztése. Öröklődés. Készítette: Sike Sándor Gregorics Tibor

Objektum elvű alkalmazások fejlesztése 3. beadandó

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

Objektumorientált programozás C# nyelven III.

Programozás alapjai II. (8. ea) C++ bejárók és egy tervezési példa

Szoftvertechnológia alapjai Java előadások

Generikus Típusok, Kollekciók

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

Bevezetés a programozásba I.

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

Informatikai Kar. 3. fejezet. alapismeretek. Giachetta Roberto

Programozás BMEKOKAA146. Dr. Bécsi Tamás 1. Előadás

Programozási nyelvek Java

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

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

Alkalmazott modul: Programozás 11. előadás. Objektumorientált programozás: öröklődés

Átírás:

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

Hozzunk létre a programozási tételeket általánosan leíró kódkönyvtárat (osztály-sablon könyvtárat), amely felhasználásával a visszavezetéssel tervezett programjainkat minimális erőfeszítéssel implementálhatjuk. Egy feladat megoldása egy tevékenység objektum lesz. 1. Az objektum osztályát származtatással hozzuk létre, 2. miután annak ősosztályát a kódkönyvtárból példányosítottuk, 3. az objektumhoz pedig egy felsoroló objektumot rendelünk.

bool l = false; for (t.first();!t.end(); t.next()){ if(!cond(t.current())) continue; Value val = func(t.current()); if(l) if( opt < val ){ opt = val; optitem = t.current(); else{ l=true; opt = val; optitem = t.current(); bool l = false; for (t.first();!l &&!t.end(); t.next()){ l = cond(elem = t.current()); int db = 0; for (t.first();!t.end(); t.next()){ if( cond(t.current()) ) ++db; init(); for(t.first();!t.end() && whilecond(t.current()); t.next()){ body(t.current());

template <typename > void Procedure<>::run() { if(_enor==null) throw MISSING_ENUMERATOR; default: _enor->first() init(); for( first(); loopcond(); _enor->next()) { body(_enor->current()); felsorolt elemek típusa felsoroló objektumra mutató pointer!_enor->end() && whilecond(_enor->current()) default: true

template <typename > class Procedure { protected: Enumerator<> *_enor; felsorolt elemek típusa felsoroló objektumra mutató pointer Procedure():_enor(NULL){ felüldefiniálható metódusok virtual void init()= 0; virtual void body(const & current) = 0; virtual void first() {_enor->first(); virtual bool whilecond(const & current) const { return true; virtual bool loopcond() const { return!_enor->end()&& whilecond(_enor->current()); ősciklus public: enum Exceptions { MISSING_ENUMERATOR ; konkrét felsoroló void run(); objektum hozzáadása void addenumerator(enumerator<>* en) { _enor = en; virtual ~Procedure(){ ; procedure.hpp

template <typename > class Enumerator { public: virtual void first() = 0; virtual void next() = 0; virtual bool end() const = 0; virtual current() const = 0; virtual ~Enumerator(){ ; enumerator.hpp

Procedure -*enor Enumerator + run() : void + addenumerator() : void # init() : void # first() : void # body() : void # loopcond() : bool # whilecond() : bool +first() +next() +current() +end() : void : void : : bool ArrayEnumerator SeqInFileEnumerator - vect : array of - ind : int + first() : void + next() : void + current() : + end() : bool - f : file of - df : + first() : void + next() : void + current() : + end() : bool

template <typename > class ArrayEnumerator : public Enumerator<> { protected: std::vector<> *_vect; unsigned int _ind; public: ArrayEnumerator(std::vector<> *v):_vect(v){ ; void first() { _ind = 0; void next() { ++_ind; bool end() const { return _ind>=_vect->size(); current()const { return (*_vect)[_ind]; arrayenumerator.hpp

template <typename > class SeqInFileEnumerator : public Enumerator<>{ protected: std::ifstream _f; _df; public: enum Exceptions { OPEN_ERROR ; SeqInFileEnumerator(const std::string& str) ; _f.open(str.c_str()); if(_f.fail()) throw OPEN_ERROR; if(typeid()==typeid(char)) _f.unsetf(std::ios::skipws); ~SeqInFileEnumerator(){ _f.close(); void first() { next(); void next() { _f >> _df; bool end() const { return _f.fail(); current() const { return _df; #include <typeinfo> Az -re legyen értelmes az operator>> seqinfileenumerator.hpp

Procedure -*enor Enumerator +run() : void +addenumerator() : void # init() : void # first() : void # body() : void # loopcond() : bool # whilecond() : bool +first() +next() +current() +end() : void : void : : bool, MaxSearch, LinSearch, Summation Selection Counting

template <typename, typename Value =, typename Compare = Greater<Value> > class MaxSearch : public Procedure<> { protected: ; bool _l; _optelem; Value _opt; Compare _better; az típusú elemek Value típusú értékeit hasonlítjuk össze ősciklusban használt metódusok felüldefiniálása void init(){ _l = false; újabb felüldefiniálható void body(const & current); metódusok virtual Value func(const & e) const = 0; virtual bool cond(const & e) const { return true; public: bool found() const { return _l; eredmény lekérdezése Value opt() const { return _opt; optelem() const { return _optelem; maxsearch.hpp

template <typename, typename Value, typename Compare> void MaxSearch<,Value,Compare>::body(const & current) { Value val = func(current); if (!cond(current) ) return; if (_l){ if (_better(val,_opt)){ _opt = val; _optelem = current; else { _l = true; _opt = val; _optelem = current; a Compare típusú _better összehasonlító objektum mutatja meg, hogy val jobb-e, mint az _opt maxsearch.hpp

template <typename Value> class Greater{ public: bool operator()(const Value& l, const Value& r) { return l > r; Ha Compare a Greater<int>, akkor _better(2,5) azonos a 2>5 értékével. ; Ha Compare a Less<int>, akkor template <typename Value> _better(2,5) azonos a 2<5 értékével. class Less{ public: bool operator()(const Value& l, const Value& r) { return l < r; ; compare.hpp

Procedure -*enor Enumerator +run() : void +addenumerator() : void # init() : void # body() : void # first() : void # loopcond() : bool # whilecond() : bool +first() +next() +current() +end() : void : void : : bool, Value, Compare MaxSearch # init() : void # body() : void # func() : Value # cond() : bool + found() : bool + opt() : Value + optelem() : Greater +operator(, ) : bool Less +operator(, ) : bool Value Value

Adott egy egész számokat tartalmazó szöveges fájl, amelyben keressük a legnagyobb páratlan számot! Melyik a legnagyobb páratlan szám? A feladat visszavezethető a feltételes maximum keresésre 1. Vizsgált elemek típusa (): egész számok 2. Az Value függvény (func): identitás 3. Összehasonlítandó értékek típusa (Value): egész számok 4. Összehasonlítás (Compare): nagyobb reláció (Greater) 5. Feltétel (cond): a szám páratlan 6. Felsoroló: szöveges állomány egész számainak felsorolója

Procedure -enor* Enumerator +run() +addenumerator() : void : void, Value, Compare MaxSearch # init() : void # body() : void # func() : Value # cond() : bool + found() : bool + opt() : Value + optelem() : int int SeqInFileEnumerator Greater Value int, int, Greater<int> MyMaxSearch # func(int e) : int # cond(int e) : bool -enor* -better +operator(, ) : bool return e%2!=0 return e

class MyMaxSearch : public MaxSearch<int>{ protected: ; int main(){ int func(const int& e) const { return e; bool cond(const int& e) const { return e%2!=0; tevékenység objektum 12-5 23 44 130 56 3-120 felsoroló objektum MyMaxSearch pr; SeqInFileEnumerator<int> file_enum("input.txt"); pr.addenumerator(&file_enum); input.txt pr.run(); if (pr.found()) működés Hiányzik a kivételkezelés! cout << "A legnagyobb páratlan szám:" << pr.optelem(); else cout << "Nincs páratlan szám"; return 0; main.cpp

new addenumerator() run() found() optelem() : MyMaxSearch new first() next() end() current() : SeqInFileEnumerator

: MyMaxSearch : SeqInFileEnumerator new new addenumerator() run() found() optelem() first() next() end() current()

Egy forgalom számlálás során egy hónapon keresztül számolták, hogy az egyes órákban hány utas lép be egy adott metróállomás területére. (A méréseket hétfőn kezdték, de lehet, hogy nem minden nap és ne minden órában végeztek megfigyelést.) Az időt egy négyjegyű számmal kódolták, amelynek első két jegye a nap hónapbeli sorszámát, utolsó két jegye az órát mutatja. Egy szöveges fájlban időkód-létszám párok formájában rögzítették a méréseket. A hétvégi napok közül mikor (nap, óra) léptek be legkevesebben az állomás területére?

Mikor léptek be legkevesebben a hétvégi időpontok közül? A feladat visszavezethető a feltételes minimum keresésre 1. Vizsgált elemek (): mérések, azaz időkód-létszám (egész szám) párok 2. Az Value függvény (func): egy mérésből kiemeli a létszámot 3. Összehasonlítandó értékek (Value): létszám (egész számok) 4. Összehasonlítás (Compare): kisebb (Less) reláció 5. Feltétel (cond): a mérés hétvégére esik 6. Felsoroló: szöveges állomány méréseit sorolja fel

struct Pair{ int time; int number; int day() const { return time/100; int hour() const { return time%100; 0108 23 0112 44 0116 130 0207 120 input.txt ; friend ifstream& operator>>(ifstream&, Pair&); ifstream& operator>>(ifstream& f, Pair& df) { f >> df.time >> df.number; return f; Szekvenciális inputfájl Pair típusú elemeinek felsorolásához kell main.cpp

class MyMinSearch: public MaxSearch<Pair, int, Less<int> > { protected: int func(const Pair &e) const { return e.number; bool cond(const Pair &e) const { return (e.day()%7==6 e.day()%7==0; ; main.cpp

int main() { MyMinSearch pr; SeqInFileEnumerator<Pair> file_enum("input.txt"); pr.addenumerator(&file_enum); pr.run(); if (pr.found()){ Pair p = pr.optelem(); cout << "A " << p.day() << ". napon a " << p.hour() << "-kor lépett a legkevesebb, " << pr.opt() << " fő az állomásra" << endl; else cout << "Nincs hétvégi adat" << endl; return 0; main.cpp