Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
Nowa wersja
Both sides next revision
|
pl:dydaktyka:jimp2:2017:labs:operatory [2017/04/04 10:22] kkutt [Wykorzystanie przeciążania operatorów] istream* -> istream& |
pl:dydaktyka:jimp2:2017:labs:operatory [2017/07/17 10:08] 127.0.0.1 edycja zewnętrzna |
//dostępu do prywatnych pól z wewnątrz definicji | //dostępu do prywatnych pól z wewnątrz definicji |
//funkcji zadeklarowanej poniżej | //funkcji zadeklarowanej poniżej |
// friend std::istream& operator>>(std::istream &, Punkt&); | // friend std::istream& operator>>(std::istream &, Point&); |
... | ... |
| |
| |
using ::std::istream; | using ::std::istream; |
| using ::std::ws; |
| |
//Helper functions: | //Helper functions: |
void CheckNextChar(char c, istream& is) { | void CheckNextChar(char c, istream* is) { |
int next_char = is.peek(); | int next_char = is->peek(); |
if (next_char != c) { | if (next_char != c) { |
throw runtime_error("invalid character"); | throw runtime_error("invalid character"); |
} | } |
is.ignore(); | is->ignore(); |
} | } |
| |
void IgnoreWhitespace(istream& is) { | void IgnoreWhitespace(istream* is) { |
is >> ws; | (*is) >> ws; |
} | } |
| |
double ReadNumber(istream& is) { | double ReadNumber(istream* is) { |
double d; | double d; |
is >> d; | (*is) >> d; |
return d; | return d; |
} | } |
//wewnątrz funkcji (STL nie używa naszej konwencji z przekazywaniem | //wewnątrz funkcji (STL nie używa naszej konwencji z przekazywaniem |
//przez wskaźnik) | //przez wskaźnik) |
istream& operator>>(istream & input, Punkt& p){ | istream& operator>>(istream & input, Point& p){ |
CheckNextChar('(', &input); | CheckNextChar('(', &input); |
p.SetX(ReadNumber(&input)); | p.SetX(ReadNumber(&input)); |
- [1 plus] co należy zrobić z powyższym operatorem, żeby była możliwa operacja <code cpp>repository["201500022324"].ChangeFirstName("Ziemowit");</code> i została zmienione imię studenta już w repozytorium. | - [1 plus] co należy zrobić z powyższym operatorem, żeby była możliwa operacja <code cpp>repository["201500022324"].ChangeFirstName("Ziemowit");</code> i została zmienione imię studenta już w repozytorium. |
- [1 plus] dopisz operator rzutowania dla StudyYear do typu int. | - [1 plus] dopisz operator rzutowania dla StudyYear do typu int. |
- [2 plusy] Zdefiniować strukturę Zipper ze statyczną metodą zip(std::vector<std::string>, std::vector<int>), która pozwoli na uruchomienie następującego kodu: <code cpp>int foo(const vector<string> &v1, const vector<string> &v2) { | - [2 plusy] Zdefiniować strukturę Zipper ze statyczną metodą zip(std::vector<std::string>, std::vector<int>), która pozwoli na uruchomienie następującego kodu: <code cpp>int foo(const vector<string> &v1, const vector<int> &v2) { |
for (const pair<string,int> &p : Zipper::zip(v1,v2)) { | for (const pair<string,int> &p : Zipper::zip(v1,v2)) { |
if (p.first == "elo") { | if (p.first == "elo") { |
}</code> | }</code> |
| |
- **[5 punktów] Napisz klasę WordCounter (podobne ćwiczenie było już tylko jako struktura z języka C, tym razem ma być to pełna klasa z C%%++%%), która będzie zawierać licznik słów. Należy zdefiniować klasę Word, która będzie stanowiła klucz (słowo zliczane) i klasę Counts, która będzie przechowywała liczbę zliczeń. Zarówno klasa Word i Counts powinna zawierać pojedynczy typ prymitywny. Klasa WordCounter powinna mieć konstruktor przyjmujący jako parametr ścieżkę do pliku tekstowego. W konstruktorze powinno nastąpić odczytanie pliku i zbudowanie indeksu wyrazów, tak aby każdy wyraz z pliku miał odpowiadający sobie obiekt std::pair<Word,Counts> w liście. Pole typu //string// wewnątrz obiektów Word powinno odpowiadać danemu słowu, natomiast pole typu //integer// wewnątrz Counts ilości powtórzeń tego słowa we wczytanym pliku. Plik jest __dowolnym plikiem tekstowym!__ Analizując go, ignorujemy znaki interpunkcyjne, spacje tabulatory, etc. i wczytujemy tylko słowa. ** | - **[5 punktów] Napisz klasę WordCounter (podobne ćwiczenie było już tylko jako struktura z języka C, tym razem ma być to pełna klasa z C%%++%%), która będzie zawierać licznik słów. Należy zdefiniować klasę Word, która będzie stanowiła klucz (słowo zliczane) i klasę Counts, która będzie przechowywała liczbę zliczeń. Zarówno klasa Word i Counts powinna zawierać pojedynczy typ prymitywny. Klasa WordCounter powinna mieć konstruktor domyślny inicjalizujący pusty słownik i konstruktor z listą inicjalizacyjną pozwalający zliczyć podane słowa. Dodatkowo należy zdefiniować statyczną funkcję FromInputStream przyjmującą jako parametr istream pokazujący na tekst. W funkcji FromInputStream powinno nastąpić odczytanie tekstu i zbudowanie indeksu wyrazów, tak aby każdy wyraz z pliku miał odpowiadający sobie obiekt std::pair<Word,Counts> w dowolnym kontenerze c%%++%%. Pole typu //string// wewnątrz obiektów Word powinno odpowiadać danemu słowu, natomiast pole typu //integer// wewnątrz Counts ilości powtórzeń tego słowa w wewnętrznym słowniku. Zawartość strumienia jest __dowolnym tekstem!__ Analizując go, ignorujemy znaki interpunkcyjne, spacje tabulatory, etc. i wczytujemy tylko słowa. ** |
* Przeładuj operator klasy WordCounter **[]** tak aby możliwe było poniższe wywołanie:<code cpp>WordCounter wc("myfile,txt"); | * Przeładuj operator klasy WordCounter **[]** tak aby możliwe było poniższe wywołanie:<code cpp>std::ifstream is ("myfile.txt"); |
// w zmiennej ilosc powinna znaleźć się ilość powtórzeń | WordCounter wc = WordCounter.FromInputStream(&is); |
| // w zmiennej ilość powinna znaleźć się ilość powtórzeń |
// słowa "programowanie" w pliku "myfile.txt" | // słowa "programowanie" w pliku "myfile.txt" |
int ilosc = wc["programowanie"];</code> | int ilosc = wc["programowanie"];</code> |
* Przeładuj operator **%%<<%%** dla klasy WordCounter, aby możliwe było wyświetlenie raportu o ilości słów i ich liczebności w danym pliku. Dane wyświetlane powinny być posortowane malejąco. Do tego celu wykorzystaj metodę //[[http://www.cplusplus.com/reference/list/list/sort/|sort]]// klasy //list// - wykorzystaj listę z biblioteki standardowej!. | * Przeładuj operator **%%<<%%** dla klasy WordCounter, aby możliwe było wyświetlenie raportu o ilości słów i ich liczebności w danym pliku. Dane wyświetlane powinny być posortowane malejąco. Do tego celu wykorzystaj metodę //[[http://en.cppreference.com/w/cpp/algorithm/sort|sort]]// z biblioteki //algorithm// - wykorzystaj dowolny kontener z biblioteki standardowej! (w dokumentacji w przykładzie na dole jest przykład jak użyć dowolnego warunku porównującego w konteście sortowania, zerknąć na przykład środkowy z użyciem struktury customLess). |
* Przeładuj operatory porównania (//<,>,==//) dla klasy Counts (porównywanie względem liczebności). | * Przeładuj operatory porównania (//<,>,==//) dla klasy Counts (porównywanie względem liczebności). |
* Przeładuj operator **%%++%%** dla klasy Counts, tak aby można było szybko inkrementować liczebność danego słowa podczas budowania mapy. | * Przeładuj operator **%%++%%** dla klasy Counts, tak aby można było szybko inkrementować liczebność danego słowa podczas budowania licznika. |
| * Zdefiniuj funkcje DistinctWords zwaracającą ilość różnych słów w liczniku |
| * Zdefiniuj funkcje TotalWords zwaracającą ilość słów w liczniku z uwzględnieniem ich liczności (DistinctWords <= TotalWords) |
| * Zdefiniuj funkcje Words zwarającą zbiór wszystkich słów w liczniku |
| |