Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

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
Linia 21: Linia 21:
     //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&);
     ...     ...
     ​     ​
Linia 43: Linia 43:
  
 using ::​std::​istream;​ using ::​std::​istream;​
 +using ::std::ws;
  
 //Helper functions: //Helper functions:
-void CheckNextChar(char c, istreamis) { +void CheckNextChar(char c, istreamis) { 
-  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(istreamis) { +void IgnoreWhitespace(istreamis) { 
-  is >> ws;+  ​(*is>> ws;
 } }
  
-double ReadNumber(istreamis) {+double ReadNumber(istreamis) {
   double d;   double d;
-  is >> d;+  ​(*is>> d;
   return d;   return d;
 } }
Linia 68: Linia 69:
 //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));​
Linia 232: Linia 233:
     - [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"​) {
Linia 241: Linia 242:
 }</​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 plikuPlik 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łownikuZawartość 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
  
pl/dydaktyka/jimp2/2017/labs/operatory.txt · ostatnio zmienione: 2019/06/27 15:50 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0