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; CountFirstA(const std::string& s): db(0) in = new SeqInFile<std::string>(s); ~CountFirstA() delete in; 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; WordsCounter(const std::string& s) : prev_char(0) in = new AbsSeqInFile(s); out = new SeqOutFile<WordCount>("ujinputalpha.txt"); ~WordsCounter() delete out; delete in; 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> SeqInFile<WordCount>* f; WordCount dx; bool eof_x; 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 <class, class Outcome> void Summation<, Outcome>::Do() 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, class Outcome> class Summation // feldolgozandó iterált objektum mutatója: Iterated<> *in; // az eredmény objektum mutatója: Outcome *out; virtual void Add(const & e) = 0; virtual bool Cond(const & e) return true; virtual ~Summation() void Do(); Outcome ScalarResult() return *out; ;
Osztály diagramm: Iterated +Write() +Current() : SeqInFile #ifstream # +Current() : SeqOutFile -ofstream +Write() 1 AbsSeqInFile #SeqInFile<WordCount>* #WordCount +Current() 1 * * CountFirstA WordsCounter +Cond() Summatio +Cond() +Do() +ScalarResult()