Advertisement
Guest User

Untitled

a guest
Mar 25th, 2019
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.81 KB | None | 0 0
  1. #include "pch.h"
  2. #include <iostream>
  3.  
  4. // zad1
  5. // zapoznaj się z implementacją klasy info (klasa raportuje operacje na niej wykonywane, obiekty są automatycznie numerowane)
  6. // dokończ implementację klasy schowek
  7. // klasa schowek przechowuje (za pomocą wskaźnika) daną typu info, lub nic (np. po konstrukji bezargumentowej)
  8.  
  9. // klasa schowek winna posiadać zwykłe i przenoszące warianty konstruktora (kopiującego) i operatora przypisania oraz konstruktor
  10. // z argumentem &info, konstruktor bezargumentowy i destruktor, metody te powinny na wyjście raportować wykonywane operacje;
  11.  
  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. #include <tuple>
  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. struct Sum
  69. {
  70. Sum() : sum{ 0 } { }
  71. void operator()(int n) { sum += n; ++iter; }
  72. int sum;
  73. int iter;
  74. };
  75.  
  76.  
  77. class schowek
  78. {
  79. info *ptr; // gdy ==nullptr, to schowek jest pusty
  80. public:
  81. schowek() :ptr(nullptr) {
  82. cout << "\nschowek()";
  83. }
  84. schowek(const info &crt) :ptr(new info(crt)) {
  85. cout << "\nschowek(const info &crt)";
  86. }
  87. ~schowek() {
  88. cout << "\n~schowek()";
  89. delete ptr;
  90. }
  91. friend ostream& operator<<(ostream &os, const schowek& crs) {
  92. return crs.ptr ? os << *crs.ptr : os << " nullptr";
  93. }
  94.  
  95. //TODO
  96.  
  97. schowek(const schowek &crs) {
  98. cout << endl << "COPY constructor" << endl;
  99. ptr = crs.ptr;
  100. }
  101.  
  102. schowek(schowek &&rrs) : ptr(rrs.ptr) {
  103. cout << endl << "Move constructor" << endl;
  104. rrs.ptr = nullptr;
  105. }
  106.  
  107. schowek& operator=(const schowek &crs) {
  108. if (&crs == this)
  109. return *this;
  110. delete ptr;
  111.  
  112. ptr = new info;
  113. ptr = crs.ptr;
  114.  
  115. return *this;
  116. }
  117.  
  118. schowek& operator=(schowek &&rrs) {
  119. /*if (this != &rrs)
  120. {
  121. delete ptr;
  122. ptr = rrs.ptr;
  123. rrs.ptr = nullptr;
  124. }
  125. return *this;*/
  126.  
  127. ptr = std::move(rrs.ptr);
  128. //std::cout << "move assigned\n";
  129. return *this;
  130. }
  131.  
  132. //bool schowek::operator!=(const schowek& rhs) const
  133. //{
  134. // return (ptr != rhs.ptr);
  135. //}
  136. };
  137.  
  138.  
  139. void zad1()
  140. {
  141. info i1;
  142. schowek si1(i1),
  143. si2,
  144. si3(i1),
  145. si4(si1),
  146. si5(move(si4));
  147.  
  148. cout << endl << si1 << si2 << si3 << si4 << si5;
  149.  
  150. cout << "\n\n zamiana s1-s2 z move(), przed " << si1 << si2 << si3;
  151.  
  152. si3 = move(si2);
  153. si2 = move(si1);
  154. si1 = move(si3);
  155.  
  156. cout << "\n\n zamiana s1-s2 bez move(), przed " << si1 << si2 << si3;
  157.  
  158. si3 = si2;
  159. si2 = si1;
  160. si1 = si3;
  161.  
  162. cout << "\n\n po zamianie " << si1 << si2 << si3;
  163.  
  164. //TODO
  165.  
  166. }
  167.  
  168. void printVector(vector<osoba> vec) {
  169. for_each(vec.begin(), vec.end(), [](osoba const& o)
  170. {
  171. cout << o.imie << " " << o.wiek << endl;
  172. });
  173. }
  174.  
  175. void zad2()
  176. {
  177. vector<osoba> los;
  178. los.push_back(osoba("Jan", "Kowalski", 25));
  179. los.push_back(osoba("Tomek", "Kowalski", 5));
  180. los.push_back(osoba("Anna", "Kowalska", 20));
  181. los.push_back(osoba("Antoni", "Kowalski", 65));
  182. los.push_back(osoba("Onufry", "Kowalski", 99));
  183. los.push_back(osoba("Zosia", "Kowalska", 3));
  184.  
  185. cout << "\n\n Lista osob:";
  186. for (auto const & p : los) cout << p;
  187.  
  188. // odtąd bez deklarowania zmiennych typu iteratorowego (jawnie ani auto), bez for, z algorytmami i funkcjami lambda
  189. // użyj wartości iteratora zwracanej przez metody kontenera .begin(), .end() jako argumentów algorytmów
  190.  
  191. cout << "\n\n Sortowanie wg wieku...";
  192. sort(begin(los), end(los), [](osoba a, osoba b) {return a.wiek < b.wiek; });
  193.  
  194. cout << "\n\n Lista (imie i wiek):\n";
  195. printVector(los);
  196.  
  197. cout << "\n\n Zwiekszenie wieku:";
  198. for_each(los.begin(), los.end(), [](osoba &o)
  199. {
  200. ++o.wiek;
  201. });
  202.  
  203. cout << "\n\n Lista:\n";
  204. printVector(los);
  205.  
  206. cout << "\n\n Sredni wiek..."<<endl;
  207. int sum = 0;
  208. int size = los.size();
  209. for_each(los.begin(), los.end(), [&sum](osoba &o) {
  210. sum += o.wiek;
  211. });
  212. double average = sum / size;
  213. cout << "Sredni wiek to: " << average<<endl;
  214.  
  215. cout << "\n\n Starsi od sredniej:"<<endl;
  216. for_each(los.begin(), los.end(), [&average](osoba &o) {
  217. if (o.wiek > average) {
  218. cout << o.imie + " " + o.nazwisko + " " << o.wiek<<endl;
  219. }
  220. });
  221. }
  222.  
  223. int main()
  224. {
  225. int checkleak = info::getcntr();
  226. zad1();
  227. if (checkleak != info::getcntr())
  228. cerr << "\n\n\tWYCIEK PAMIECI !!!\n";
  229.  
  230. //zad2();
  231. return 0;
  232. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement