EAF II Feladat dokumentáció IV. feladat 4. házi feladathoz Oldja meg az alábbi feladatokat úgy, hogy a programja csak EGYETLEN HELYEN TARTALMAZHAT CIKLUST – az általános összegzést megvalósító osztály-sablon (lásd alább) Do() metódusában, amelyik az előadáson bemutatott iterated.hpp állományra támaszkodik.
Rávezetı feladat: Egy szöveges állományban szavakat helyeztünk el szóközökkel, sorvége jelekkel elválasztva. Hány ’a’ betővel kezdıdı szó található benne? A feladat: Egy szöveges állományban szavakat helyeztünk el szóközökkel, sorvége jelekkel elválasztva, ábécé szerint rendezve. Írjuk ki a szavakat soronként egy szöveges állományba úgy, hogy minden azonos kezdıbetőjő szócsoport után kiírjuk, hogy hány szó szerepelt az adott csoportban. Kettő osztályt kell megvalósítani a 2 feladathoz (bár abban nem vagyok biztos, hogy az első az feladat, vagy csak segítség..)
Tehát az első részhez az osztály megvalósítása: Az osztály létrehozásakor egy szekvenciális fájlt nyitunk meg, amiből a felolvasás történik. A Summation osztály két metódusát felülbírálva: - Cond-ba beleteszem a feltétel lényegét, hogy csak az ’a’ kezdetű szavakat nézzük. - Add-ba, ha találtunk ilyet, akkor növelem a számot class CountFirstA : public Summation<std::string, int> { private: int db; public: CountFirstA(const std::string& s): db(0) { in = new SeqInFile<std::string>(s); } ~CountFirstA(){ delete in; } protected: bool Cond(const std::string &e) { return e[0] == 'a'; } void Add(const std::string &e) { ++db; out = &db; } };
class WordsCounter : public Summation<WordCount, SeqOutFile<WordCount>> { private: char prev_char; public: WordsCounter(const std::string& s) : prev_char(0) { in = new AbsSeqInFile(s); out = new SeqOutFile<WordCount>("ujinputalpha.txt"); } ~WordsCounter(){ delete out; delete in; } protected: void Add(const WordCount &e) { out->Write(e); } };
A Második osztály: -
Paraméterként kapja a felolvasandó fájlt, amiből majd az Absztraktfelolvasát létrehozzuk. A kiírásra a SeqOutFile-t használjuk, ami WordCount-al van paraméterezve.
WordCount struktúrában meg kell valósítani a felolvasást és a kiíratást. struct WordCount { WordCount() : count(0) {}; std::string word; int count; friend std::ifstream& operator >> (std::ifstream& f, WordCount& df); friend std::ofstream& operator << (std::ofstream& f, const WordCount& df); }; std::ofstream& operator << (std::ofstream& f, const WordCount& df) { f << df.word << ": " << df.count << std::endl; return f; } std::ifstream& operator >> (std::ifstream& f, WordCount& df) { f >> df.word; return f; }
class AbsSeqInFile : public Iterated<WordCount> { protected: SeqInFile<WordCount>* f; WordCount dx; bool eof_x; public: AbsSeqInFile(const std::string& s) { f = new SeqInFile<WordCount>(s); f->First(); } ~AbsSeqInFile() {delete f;} void Next(); bool End() const { return eof_x; } WordCount Current()const { return dx;} }; void AbsSeqInFile::Next() { bool l = true; dx.word = ""; if (!(eof_x = f->End())) while(l && !f->End()) { std::string c = f->Current().word; if( "" == dx.word ) { dx.count = 0; dx.word = f->Current().word[0]; } if(f->Current().word[0] != dx.word[0]) l = false; if( f->Current().word[0] == dx.word[0] ) { ++dx.count; f->Next(); } } }
AbsSeqInFile –ban történik meg a lényegi rész a második feladat feldolgozásához. Lényegiben, elsıként a Summation osztály Do metódusa fogja
kiváltani. Ott egy for ciklusban van.
template
void Summation- ::Do() { Item e; for(in->First(); !in->End(); in->Next()) { if( Cond(e = in->Current()) ) Add(e); } }
AbsSeqInFile::Next-ben feltöltöm a WordCount-er, amit majd a Summation::Doban visszatérve, a Cond(true) ként az Add-ba kerül, az Add-ba a kiírás van megvalósítva. Summation osztály fejléce: template class Summation { protected: // feldolgozandó iterált objektum mutatója: Iterated- *in; // az eredmény objektum mutatója: Outcome *out; virtual void Add(const Item& e) = 0; virtual bool Cond(const Item& e) { return true; } public: virtual ~Summation(){} void Do(); Outcome ScalarResult() { return *out; } };
Osztály diagramm: Item Iterated
+Open() +Close() +Write() +End() : bool +Next() +Current() : Item Item
Item
SeqInFile
SeqOutFile
#ifstream #Item +Open() +Next() +End() : bool +Current() : Item +Close() 1
-ofstream +Open() +Close() +Write()
AbsSeqInFile #SeqInFile<WordCount>* #WordCount +Next() +End() : bool +Current() 1
*
*
CountFirstA
WordsCounter
+Cond() +Add()
+Add()
Summatio +Add() +Cond() +Do() +ScalarResult()