diff --git a/uczelnia/2_semestr/programowanie/laby/lab10/out/zad10 b/uczelnia/2_semestr/programowanie/laby/lab10/out/zad10 new file mode 100755 index 0000000..3e511f6 Binary files /dev/null and b/uczelnia/2_semestr/programowanie/laby/lab10/out/zad10 differ diff --git a/uczelnia/2_semestr/programowanie/laby/lab10/zad10.cpp b/uczelnia/2_semestr/programowanie/laby/lab10/zad10.cpp index e69de29..6a39b0c 100644 --- a/uczelnia/2_semestr/programowanie/laby/lab10/zad10.cpp +++ b/uczelnia/2_semestr/programowanie/laby/lab10/zad10.cpp @@ -0,0 +1,123 @@ +#include +#include +#include +#include +#include +#include + +class Adres { + std::string ulica; + int nr_mieszkania; + +public: + Adres(std::string ulica, int nr_mieszkania) + : ulica(ulica), nr_mieszkania(nr_mieszkania) {} + + friend std::ostream &operator<<(std::ostream &os, const Adres &adres) { + os << adres.ulica << " mieszkania " << adres.nr_mieszkania; + return os; + } + + friend std::ostream &operator<<(std::ostream &os, Adres &adres) { + os << adres.ulica << " mieszkania " << adres.nr_mieszkania; + return os; + } +}; + +class Pracownik { +protected: + std::string imie; + float pensja; + std::unique_ptr adres; + +public: + virtual float obliczWyplate() = 0; + Pracownik(std::string imie, float pensja, std::unique_ptr adres) + : imie(imie), pensja(pensja), adres(std::move(adres)) {} + virtual ~Pracownik() = default; + friend std::ostream &operator<<(std::ostream &os, Pracownik &p) { + os << p.imie << " zarabia " << p.obliczWyplate() << " i mieszka na " + << *(p.adres); + return os; + } +}; + +class PracownikEtatowy : public Pracownik { + +public: + PracownikEtatowy(std::string imie, float pensja, std::unique_ptr adres) + : Pracownik(imie, pensja, std::move(adres)) {} + + float obliczWyplate() override { return pensja; } +}; + +class Zleceniobiorca : public Pracownik { + float godziny; + +public: + Zleceniobiorca(std::string imie, float pensja, std::unique_ptr adres, + float godziny) + : Pracownik(imie, pensja, std::move(adres)), godziny(godziny) {} + float obliczWyplate() override { return pensja * godziny; } +}; + +class Dzial { + std::vector> pracownicy; + +public: + Dzial() {}; + + void dodajPracownika(std::shared_ptr pracownik) { + pracownicy.push_back(pracownik); + } + + float sumaWyplat() const { + float sum = 0; + for (auto &pracownik : pracownicy) { + sum += pracownik->obliczWyplate(); + } + return sum; + } + + void wypiszPracownikow() const { + std::cout << "=== Wszyscy pracownicy ===\n"; + for (const auto &pracownik : pracownicy) { + std::cout << *pracownik << std::endl; + } + } +}; + +class Kierownik : public PracownikEtatowy { + std::vector> podwladni; + +public: + Kierownik(std::string imie, float pensja, std::unique_ptr adres) + : PracownikEtatowy(imie, pensja, std::move(adres)) {} + + float obliczWyplate() override { return pensja; } + + float sumaWyplatZespolu() { + float sum = 0; + for (auto &pracownik : podwladni) { + sum += pracownik->obliczWyplate(); + } + return sum; + } + + void dodajPracownika(std::shared_ptr p) { podwladni.push_back(p); } +}; + +int main() { + Kierownik kierownik = Kierownik( + "Stasiek", 238943, std::make_unique("Wojska polskiego", 23)); + + kierownik.dodajPracownika(std::make_shared( + "Bożena", 2500, std::make_unique("Żołnierska", 18))); + + kierownik.dodajPracownika(std::make_shared( + "Adam", 6700, std::make_unique("Wiejska", 1), 30)); + + std::cout << "Pracownicy sumarycznie zarabiają: " + << kierownik.sumaWyplatZespolu(); + return 0; +} diff --git a/uczelnia/2_semestr/programowanie/laby/lab10/zad9.cpp b/uczelnia/2_semestr/programowanie/laby/lab10/zad9.cpp index b335108..3d3b305 100644 --- a/uczelnia/2_semestr/programowanie/laby/lab10/zad9.cpp +++ b/uczelnia/2_semestr/programowanie/laby/lab10/zad9.cpp @@ -23,12 +23,12 @@ class Pracownik { protected: std::string imie; float pensja; - Adres *adres; + std::unique_ptr adres; public: virtual float obliczWyplate() = 0; - Pracownik(std::string imie, float pensja, Adres *adres) - : imie(imie), pensja(pensja), adres(adres) {} + Pracownik(std::string imie, float pensja, std::unique_ptr adres) + : imie(imie), pensja(pensja), adres(std::move(adres)) {} virtual ~Pracownik() = default; friend std::ostream &operator<<(std::ostream &os, Pracownik &p) { os << p.imie << " zarabia " << p.obliczWyplate() << " i mieszka na " @@ -40,8 +40,8 @@ public: class PracownikEtatowy : public Pracownik { public: - PracownikEtatowy(std::string imie, float pensja, Adres *adres) - : Pracownik(imie, pensja, adres) {} + PracownikEtatowy(std::string imie, float pensja, std::unique_ptr adres) + : Pracownik(imie, pensja, std::move(adres)) {} float obliczWyplate() override { return pensja; } }; @@ -50,8 +50,9 @@ class Zleceniobiorca : public Pracownik { float godziny; public: - Zleceniobiorca(std::string imie, float pensja, Adres *adres, float godziny) - : Pracownik(imie, pensja, adres), godziny(godziny) {} + Zleceniobiorca(std::string imie, float pensja, std::unique_ptr adres, + float godziny) + : Pracownik(imie, pensja, std::move(adres)), godziny(godziny) {} float obliczWyplate() override { return pensja * godziny; } }; @@ -73,7 +74,7 @@ public: return sum; } - void wypiszPracownikow() { + void wypiszPracownikow() const { std::cout << "=== Wszyscy pracownicy ===\n"; for (const auto &pracownik : pracownicy) { std::cout << *pracownik << std::endl; @@ -84,10 +85,10 @@ public: int main() { Dzial dzial = Dzial(); dzial.dodajPracownika(std::make_unique( - "Bożena", 2500, new Adres("Żołnierska", 18))); + "Bożena", 2500, std::make_unique("Żołnierska", 18))); dzial.dodajPracownika(std::make_unique( - "Adam", 6700, new Adres("Wiejska", 1), 30)); + "Adam", 6700, std::make_unique("Wiejska", 1), 30)); dzial.wypiszPracownikow(); std::cout << "Pracownicy sumarycznie zarabiają: " << dzial.sumaWyplat();