SHARE
TWEET

Untitled

a guest Mar 25th, 2019 58 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Mateusz Tomczyk <dimolek@gmail.com>
  2.    
  3. Załączniki13:17 (2 godziny temu)
  4.    
  5. do ja, Artur
  6. // zad1
  7. // zapoznaj się z implementacją klasy info (klasa raportuje operacje na niej wykonywane, obiekty są automatycznie numerowane)
  8. // dokończ implementację klasy schowek
  9. // klasa schowek przechowuje (za pomocą wskaźnika) daną typu info, lub nic (np. po konstrukji bezargumentowej)
  10. // klasa schowek winna posiadać zwykłe i przenoszące warianty konstruktora (kopiującego) i operatora przypisania oraz konstruktor
  11. // z argumentem &info, konstruktor bezargumentowy i destruktor, metody te powinny na wyjście raportować wykonywane operacje;
  12. // wywołanie metody przenoszącej schowka nie powinno powodować konstrukcji obiektu info, ani błędów przy poźniejszej destrukcji
  13. // przeanalizuj efekty wywołania funkcji zad1 - wykonując ją krokowo oraz śledząc komunikaty wyprowadzanie na konsolę
  14. // rozbuduj funkcję zad1, by ten sposób sprawdzić:
  15. // -w jakich sytuacjach wywoływane są metody zwykłe, a kiedy przenoszące (w razie potrzeby dopisz nowe metody/operatory do schowka)?
  16. // -co jest wywoływane przy konstrukcji/przypisaniu do schowka z wyrażenia zwracającego tymczasowy nienazwany schowek?
  17. // -co jest wywoływane przy konstrukcji/przypisaniu do schowka ze zmiennej zwracanej z funkcji przez wartość?
  18. // -wypróbuj działanie move(), co się stanie gdy użyjemy move(), a w klasie nie ma metod przenoszących(zakomentuj je chwilowo)?
  19. // -czy kompilator poprawnie rozpoznał wszystkie sytuacje kiedy można użyć metody przenoszącej?
  20. // -czy metody przenoszące poprawiają wydajność kodu? Odpowiedź uzasadnij.
  21.  
  22. // zad2
  23. // zapoznaj się za strukturą osoba i funkcją zad2
  24. // dokończ funkcję zad2 posługując się algorytmami stl (sort for_each) i funkcjami lambda tak, aby
  25. // - posortować listę liste osob los wg wieku osób
  26. // - wyświetlić posortowane osoby (tylko imie i wiek każdej osoby)
  27. // - zwiększyć wiek każdej z osób o 1 i ponownie wyświetlić listę
  28. // - wyznaczyć średni wiek osoby, wyświetlić go i wyświetlić osoby starsze niż średnia
  29. // uwaga: w capture list funkcji lambda należy przekazywać wyłącznie faktycznie potrzebne zmienne, nie używać [&] ani tym bardziej [=]
  30.  
  31.  
  32.  
  33.  
  34. #include <iostream>
  35. #include <vector>
  36. #include <string>
  37. #include <algorithm>
  38.  
  39. using namespace std;
  40.  
  41.  
  42. class info
  43. {
  44.     static int serial,    // ++ przy konstrukcji
  45.         cntr;    // ++ przy konstrukcji, -- przy destrukcji, zwracany przez getcntr
  46.     const int  nr;        // =++serial przy konstrukcji
  47. public:
  48.     static int getcntr() { return cntr; };
  49.     info() :nr(++serial) { cntr++; cout << "\ninfo() nr: " << nr; }
  50.     info(const info &cri) :nr(++serial) { cntr++; cout << "\ninfo(const info &cri) nr: " << nr << " cri.nr: " << cri.nr; }
  51.     ~info() { cntr--; cout << "\n~info() nr: " << nr; }
  52.     info & operator=(const info &cri) { cout << "\ninfo & operator=(const info &cri) nr: " << nr << " cri.nr: " << cri.nr; return *this; }
  53.     friend ostream& operator<<(ostream &os, const info& cri) { return os << " info nr: " << cri.nr; }
  54. };
  55. int info::serial = 0,        // static w klasie
  56. info::cntr = 0;        // static w klasie
  57.  
  58.  
  59. struct osoba
  60. {
  61.     string imie, nazwisko;
  62.     int wiek;
  63.     //    osoba():wiek(-1){}
  64.     osoba(const string & imie, const string & nazwisko, const int wiek) :imie(imie), nazwisko(nazwisko), wiek(wiek) {}
  65.     friend ostream& operator<<(ostream &os, const osoba& cro) { return os << endl << cro.imie << ' ' << cro.nazwisko << ' ' << cro.wiek; }
  66. };
  67.  
  68.  
  69. class schowek
  70. {
  71.     info *ptr; // gdy ==nullptr, to schowek jest pusty
  72. public:
  73.     schowek() :ptr(nullptr) { cout << "\nschowek()"; }
  74.     schowek(const info &crt) :ptr(new info(crt)) { cout << "\nschowek(const info &crt)"; }
  75.     ~schowek() { cout << "\n~schowek()"; delete ptr; }
  76.     friend ostream& operator<<(ostream &os, const schowek& crs) { return crs.ptr ? os << *crs.ptr : os << " nullptr"; }
  77.  
  78.     //TODO
  79.  
  80.     schowek(const schowek &crs) {};
  81.     schowek(schowek &&rrs) {};
  82.     schowek& operator=(const schowek &crs) { ptr = crs.ptr; return *this; };
  83.     schowek& operator=(schowek &&rrs) { ptr = move(rrs.ptr); return *this; };
  84. };
  85.  
  86.  
  87. void zad1()
  88. {
  89.     info i1;
  90.     schowek    si1(i1),
  91.         si2,
  92.         si3(i1),
  93.         si4(si1),
  94.         si5(move(si4));
  95.  
  96.     cout << endl << si1 << si2 << si3 << si4 << si5;
  97.  
  98.     cout << "\n\n zamiana s1-s2 z move(), przed " << si1 << si2 << si3;
  99.  
  100.     si3 = move(si2);
  101.     si2 = move(si1);
  102.     si1 = move(si3);
  103.  
  104.     cout << "\n\n zamiana s1-s2 bez move(), przed " << si1 << si2 << si3;
  105.  
  106.     si3 = si2;
  107.     si2 = si1;
  108.     si1 = si3;
  109.  
  110.     cout << "\n\n po zamianie " << si1 << si2 << si3;
  111.  
  112.     //TODO
  113.  
  114. }
  115.  
  116.  
  117. void zad2()
  118. {
  119.     vector<osoba> los;
  120.     los.push_back(osoba("Jan", "Kowalski", 25));
  121.     los.push_back(osoba("Tomek", "Kowalski", 5));
  122.     los.push_back(osoba("Anna", "Kowalska", 20));
  123.     los.push_back(osoba("Antoni", "Kowalski", 65));
  124.     los.push_back(osoba("Onufry", "Kowalski", 99));
  125.     los.push_back(osoba("Zosia", "Kowalska", 3));
  126.  
  127.     cout << "\n\n Lista osob:";
  128.     for (auto const & p : los) cout << p;
  129.  
  130.  
  131.     // odtąd bez deklarowania zmiennych typu iteratorowego (jawnie ani auto), bez for, z algorytmami i funkcjami lambda
  132.     // użyj wartości iteratora zwracanej przez metody kontenera .begin(), .end() jako argumentów algorytmów
  133.  
  134.     cout << "\n\n Sortowanie wg wieku...";
  135.    
  136.     sort(begin(los), end(los), [](osoba a, osoba b) {return a.wiek < b.wiek; });
  137.  
  138.     cout << "\n\n Lista (imie i wiek):";
  139.    
  140.     for_each(begin(los), end(los), [](osoba a) {cout << "\n" << a.imie << " " << a.wiek;});
  141.  
  142.     cout << "\n\n Zwiekszenie wieku:";
  143.    
  144.     for_each(begin(los), end(los), [](osoba &a) {a.wiek = a.wiek + 1;});
  145.  
  146.     cout << "\n\n Lista:";
  147.  
  148.     for_each(begin(los), end(los), [](osoba a) {cout << "\n" << a.imie << " " << a.wiek;});
  149.  
  150.     cout << "\n\n Sredni wiek...";
  151.     int avg = 0;
  152.     int amo = 0;
  153.     for_each(begin(los), end(los), [&avg, &amo](osoba a) {avg += a.wiek; ++amo;});
  154.     avg = avg / amo;
  155.     cout << "\n" << avg;
  156.  
  157.     cout << "\n\n Starsi od sredniej:";
  158.    
  159.     for_each(begin(los), end(los), [avg](osoba a) {if (a.wiek > avg) { cout << "\n" << a.imie << " " << a.wiek; }});
  160.  
  161. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top