OAF Gregorcs Tbor: Mnta dokumentácó a 4. ház feladathoz 1. Feladat Adott egy szöveges fájlbel szöveg, ahol a szavakat szóközök, tabulátor-jelek, sorvége-jelek lletve a fájlvége-jel határolja. Melyk a leghosszabb W betűt tartalmazó szó? Megoldás Programterv A megoldáshoz érdemes elképzeln egy olyan absztrakt felsorolót, amely a karakterenként olvasást elrejt, és a szöveg szavat képes felsoroln úgy, hogy mnden szót megjelöl aszernt, hogy van-e benne W betű. A feladatot egy lyen felsorolóra épített feltételes maxmumkereséssel oldjuk meg. A = (f:nfle(szó), l:l, szó:strng) Szó = rec(str : Strng, vanw : L ) Ef = ( f=f ) Uf = (l, max, szó = t max 1 t.vanw t,. str ) A maxmum kválasztást kód-újrafelhasználással valósítjuk meg. Feltételezve, hogy rendelkezésünkre állnak a Procedure, Enumerator, SeqInFleEnumerator és MaxSearch osztály-sablonok (lásd előadás), ezért nekünk csak a MyMaxSearch és a WordEnumerator osztályokat kell defnáln. +Frst() +Next() +Current() +End() Enumerator SeqInFleEnumerator Word fstream f char df Procedure Enumerator *enor +Run() +AddEnumerator #Do() #Int(), Value, Compare MaxSearch Word current bool end char *ft WordEnumerator Word #Func() #Cond() Word, nt, Greater<nt> MyMaxSearch
OAF Gregorcs Tbor: Mnta dokumentácó a 4. ház feladathoz 2. A WordEnumerator osztály t példányát a szöveg karakterenként ft felsorolója, valamnt a felsorolás során éppen érntett aktuáls szó (akt) és a vége logka érték reprezentálja. A felsorolás műveletenek mplementácóját az alább táblázat mutatja. enor(szó) Frst() Next() End() Current() ft : enor(k) akt : Szó vége : L vége akt Részletesebben: első_szót_keres(ft) vége := f t.end() ha vége akkor előállít(akt, ft) vége := ft.end() ha vége akkor előállít(akt, ft) első_szót_keres(ft) ~ l, ft : search ft elválasztó jel W_keres(ft) ~ akt.str, ft : ft ft 1 akt.vanw := ft = W ft ft W elválasztójel ft ft elválasztójel szóvégét_keres(ft) ~ akt.str, ft : ft következő_szót_keres(ft) ~ l, ft : search ft elválasztó jel A felsoroló típusának mplementálásához tehát szükség van a lneárs keresés és az összegzés programozás tételenek osztály-sablonjara (lásd előadás) s. ft Enumerator Procedure Enumerator *enor +Run() +AddEnumerator Summaton Result *res #Do() #Cond() +Answer(), Result #Do() #Int() +Run() LnSearch char, strng SearchWInWord SearchEndOfWord #Int() #Frst() #Int() #WhleCond() #Frst() #Add() #Add() #WhleCond() #Frst() #Cond() char SerachNextWord
OAF Gregorcs Tbor: Mnta dokumentácó a 4. ház feladathoz 3. Megvalósítás A megvalósításhoz felhasználjuk az előadáson bemutatott osztály-sablon könyvtárat. Azoknak fejállományat bemásoljuk a programunkba. Így csak a fent osztálydagramok kék színnel jelölt osztályat kell csak nekünk elkészíten. 1 MyMAxSearch (man.cpp) Mndenekelőtt defnáljuk a jelölt szavak típusát. Erre k kell terjeszten a kíró operátort s. struct Word strng str; bool hasw; frend ostream& operator<<(ostream&, const Word&); ; ostream& operator<<(ostream& f, const Word& df) f << df.str; return f; A feladatot megoldó feltételes maxmumkeresést (MyMaxSearch) az általános maxmumkeresésből származtatjuk a Word segítségével történt példányosítás után. class MyMaxSearch : publc MaxSearch<Word> nt Func(const Word& e) const return e.str.sze(); bool Cond(const Word& e) const return e.hasw; ; nt man() MyMaxSearch pr; WordEnumerator wt("text.txt"); pr.addenumerator(&wt); pr.run(); f (pr.found()) cout << "A leghosszabb W-t tartalmazó szó " << pr.opt() << endl; else cout << "Nncs W-t tartalmazó szó\n"; return 0; 1 Az tt bemutatott kódnak nem s kellene a dokumentácóban szerepeln, hszen ez a forrásprogramban elolvasható.
OAF Gregorcs Tbor: Mnta dokumentácó a 4. ház feladathoz 4. Az absztrakt felsoroló osztályát s nekünk kell defnáln. class WordEnumerator : publc Enumerator<Word> SeqInFleEnumerator<char> * ft; Word current; bool end; publc: WordEnumerator(const std::strng& str) ft = new SeqInFleEnumerator<char>(str); vod Frst(); vod Next(); bool End() const return end; Word Current() const return current; ; WordEnumerator() delete ft; A Frst() és Next() metódusához szükség van a következő szó elejét megtaláló (SearchNextWord), az adott szóban W -t kereső, de közben a szó betűt összegyűjtő (SearchWInWord) és a szó végét kereső, de közben a szó betűt összegyűjtő (SerachEndOfWord) tevékenységekre. Az első tevékenység osztályát a LnSearch osztálysablonból, a másk kettőt a Summaton osztály-sablonból származtatjuk. A Next() metódus a tervezésnél leírt módon működk. vod WordEnumerator::Next() f(end = ft->end()) return; SearchWInWord pr1; pr1.addenumerator(ft); pr1.run(); current.hasw = ft->current() == W; current.str = pr1.answer(); SearchEndOfWord pr2; pr2.addenumerator(ft); pr2.run(); current.str += pr2.answer(); SearchNextWord pr3; pr3.addenumerator(ft); pr3.run(); A Frst() metódus a legelső szó megkeresése után a Next() metódussal azonos módon működk. A legelső szó elejét s a SearchNextWord tevékenységgel keressük meg,
OAF Gregorcs Tbor: Mnta dokumentácó a 4. ház feladathoz 5. de nem szabad megfeledkezn arról, hogy ez előtt el kell ndítan a karakterenként felsorolót (ft->frst()).ezt mutatja az alább kód. vod WordEnumerator::Frst() ft->frst(); SearchNextWord pr; pr.addenumerator(ft); pr.run(); Next(); Végezetül defnáljuk a SearchNextWord, SearchWInWord és SerachEndOfWord tevékenységeket. Mndhárom osztályban felüldefnáljuk a Frst() metódust, hszen nem szabad a karakterenként felsorolást újrakezden. class SearchNextWord : publc LnSearch<char> bool Cond(const char& e) const return e!= && e!=\t && e!=\n; vod Frst() ; class SearchWInWord : publc Summaton<char, strng> vod Add(const char& e) *res += e; vod Int() *res = ""; bool WhleCond(const char& e) const return e!=w && e!= && e!=\t && e!=\n; vod Frst() ; class SearchEndOfWord : publc Summaton<char, strng> vod Add(const char& e) *res += e; vod Int() *res = ""; bool WhleCond(const char& e) const return e!= && e!=\t && e!=\n; vod Frst() ;
OAF Gregorcs Tbor: Mnta dokumentácó a 4. ház feladathoz 6. Tesztelés Fekete doboz tesztesetek: 1. Üres szöveg 2. Csak elválasztó jeleket tartalmazó szöveg. 3. Csupa W betűt nem tartalmazó szó. 4. Több szó, köztük egy W betűt tartalmazó szó a szöveg elején. 5. Több szó, közük egy W betűt tartalmazó szó a szöveg elején, előtte elválasztó jelek. 6. Több szó, közük egy W betűt tartalmazó szó a szöveg végén. 7. Több szó, közük egy W betűt tartalmazó szó a szöveg végén, utána elválasztó jelek. 8. Több szó, köztük azonos hosszúságú W betűt tartalmazó szavak. 9. Több szó, köztük azonos hosszúságú W betűt tartalmazó szavak, valamnt egy ezeknél hosszabb W betűt tartalmazó szó. 10. Több szó, köztük azonos hosszúságú W betűt tartalmazó szavak, valamnt egy ezeknél hosszabb W betűt tartalmazó szó a szöveg végén. 11. Több szó, köztük azonos hosszúságú W betűt tartalmazó szavak, valamnt egy ezeknél hosszabb W betűt tartalmazó szó a szöveg elején. Fehér doboz tesztesetek: A saját kódrészben egyetlen elágazás található az eredmény kírásánál (ennek mndkét ágát befutották a fekete doboz tesztesetek), ezen kívül csak szekvenca szerkezetet látunk, ezért nncs szükség külön fehér doboz tesztre.