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
pl:dydaktyka:jimp2:2017:labs:operatory [2017/04/04 09:28]
kkutt [Ćwiczenia]
pl:dydaktyka:jimp2:2017:labs:operatory [2019/06/27 15:50] (aktualna)
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, 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;
 } }
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ć ​klasę 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 239: Linia 240:
 } }
 return 0; return 0;
 +}</​code> ​ Podpowiedź:​ udostępniona też [[http://​coliru.stacked-crooked.com/​a/​ff24fd32a47a6e18|TU]] <code cpp>#​include <​iostream>​
 +#include <​string>​
 +#include <​vector>​
 +#include <​utility>​
 +
 +using std::cout;
 +using std::endl;
 +using std::​vector;​
 +using std::​string;​
 +using std::pair;
 +using std::​literals::​string_literals::​operator""​s;​
 +
 +
 +class ZipperIterator {
 +  public: ​  
 +   ​pair<​string,​int>​ operator*() const; //wmagane w linii 74
 +   ​ZipperIterator &​operator++();​ //wymagane w linii 73 for(_;_;TU)
 +   bool operator!=(const ZipperIterator &other) const; //wymagane w linii 73 for(_;TU;_)
 +  private:
 +   //​TODO
 +};
 +
 +//​umożliwia przeglądanie dwóch wektorów na raz, w jednej pętli range-for
 +class Zipper {
 +  public:
 +   ​static Zipper zip(const vector<​string>​ &vs, const vector<​int>​ &vi);
 +   
 +   ​ZipperIterator begin(); //wymagane w linii 73 for(TU;_;_)
 +   ​ZipperIterator end(); //wymagane w linii 73 for(_;TU;_)
 +  private:
 +   //​TODO
 +};
 +
 +
 +
 +int main()
 +{
 +    vector<​int>​ vi = {1,2,3};
 +    vector<​string>​ vs = {"​one"​s,"​two"​s,"​three"​s};​
 +    ​
 +    //PROSTY przykład
 +    for (const auto i : vi) {
 +      cout << i;   
 +    }
 +    cout << endl;
 +    //to samo bez auto:
 +    for (const int i : vi) {
 +      cout << i;   
 +    }
 +    cout << endl;
 +    //​przetłumaczony powyższa petla mniej wiecej tak jak to kompilator ​
 +    //rozumie:
 +    for (vector<​int>::​iterator it = vi.begin(); it != vi.end(); ++it) {
 +      const int i = *it;
 +      cout << i;
 +    }
 +    cout << endl;
 +    ​
 +    //Przykład z zipperem
 +    for (const auto &p : Zipper::​zip(vs,​vi)) {
 +      cout << p.second << " is " << p.first;
 +    }
 +    cout << endl;
 +    //to samo bez auto:
 +    for (const pair<​string,​int>​ &p : Zipper::​zip(vs,​vi)) {
 +      cout << p.second << " is " << p.first;
 +    }
 +    cout << endl;
 +    ​
 +    //​przetłumaczony powyższa petla mniej wiecej tak jak to kompilator ​
 +    //rozumie:
 +    Zipper tmp =  Zipper::​zip(vs,​vi);​
 +    for (ZipperIterator it = tmp.begin();​ it != tmp.end(); ++it) {
 +      const pair<​string,​int>​ &p = *it;
 +      cout << p.second << " is " << p.first;
 +    }
 +    cout << endl;
 }</​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 ​klasy Para liście. Pole typu //string// wewnątrz obiektów ​Para powinno odpowiadać danemu słowu, natomiast pole typu //integer// 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> ​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>Mapa m("​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 = m["​programowanie"​];</​code>​  +int ilosc = wc["​programowanie"​];</​code>​  
-    * Przeładuj operator **%%<<​%%** dla klasy Mapa, 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 (//<,>,​==//) i przypisania (//=//) dla klasy Para (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 Para, 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.1491290889.txt.gz · ostatnio zmienione: 2019/06/27 15:52 (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