#include #include #include #include /* zadanie: Napisz program w języku C++, który umożliwia zarządzanie listą mieszkań w bloku mieszkalnym. Mieszkania powinny być przechowywane w wektorze . Program powinien pozwalać na dodawanie, edytowanie, usuwanie, wyświetlanie dostępnych mieszkań oraz liczyć cenę za metr kwadratowy. Ponadto, powinien obliczać procent dostępnych mieszkań oraz umożliwiać sortowanie listy mieszkań według ceny. W programie musi występować obsługa błędów (np. brak mieszkania o wskazanym numerze). */ using namespace std; struct Mieszkanie { int numer; bool dostepne; float powierzchnia; float cena_za_metr; // Dodane pole dla ceny za metr (PatoDeveLopoOpszion) }; vector mieszkania; // Sprawdź unikalność numeru mieszkania bool czyNumerUnikalny(int numer) { return none_of(mieszkania.begin(), mieszkania.end(), [numer](const Mieszkanie& m) { return m.numer == numer; }); } // Dodaj mieszkanie z walidacją void dodajMieszkanie(int numer, bool dostepne, float powierzchnia) { if (!czyNumerUnikalny(numer)) { throw invalid_argument("Mieszkanie o tym numerze juz istnieje!"); } if (powierzchnia <= 0) { throw invalid_argument("Powierzchnia musi byc dodatnia!"); } mieszkania.push_back({numer, dostepne, powierzchnia, 0.0f}); } // Usuń mieszkanie z obsługą błędów void usunMieszkanie(int id) { if (id < 0 || id >= mieszkania.size()) { throw out_of_range("Nieprawidlowe ID mieszkania!"); } mieszkania.erase(mieszkania.begin() + id); } // Edytuj mieszkanie void edytujMieszkanie(int id, int nowyNumer, bool nowaDostepnosc, float nowaPowierzchnia) { if (id < 0 || id >= mieszkania.size()) { throw out_of_range("Nieprawidlowe ID mieszkania!"); } if (!czyNumerUnikalny(nowyNumer)) { throw invalid_argument("Numer juz istnieje!"); } mieszkania[id] = {nowyNumer, nowaDostepnosc, nowaPowierzchnia, mieszkania[id].cena_za_metr}; } // Wyświetl wszystkie dostępne mieszkania void wyswietlDostepne() { cout << "\nDostepne mieszkania:\n"; for (const auto& m : mieszkania) { if (m.dostepne) { cout << "Nr: " << m.numer << ", Powierzchnia: " << m.powierzchnia << " m2" << ", Cena za m2: " << m.cena_za_metr << endl; } } } // Oblicz procent dostępnych mieszkań void obliczProcentDostepnych() { int dostepne = count_if(mieszkania.begin(), mieszkania.end(), [](const Mieszkanie& m) { return m.dostepne; }); float procent = (dostepne / static_cast(mieszkania.size())) * 100; cout << "Dostepnych jest " << procent << "% mieszkan\n"; } // Sortuj mieszkania po cenie (malejąco) void sortujPoCenie() { sort(mieszkania.begin(), mieszkania.end(), [](const Mieszkanie& a, const Mieszkanie& b) { return (a.powierzchnia * a.cena_za_metr) > (b.powierzchnia * b.cena_za_metr); }); } // Ustaw cenę za metr z walidacją void ustawCeneZaMetr(int id, float cena) { if (id < 0 || id >= mieszkania.size()) { throw out_of_range("Nieprawidlowe ID mieszkania!"); } if (cena <= 0) { throw invalid_argument("Cena musi byc dodatnia!"); } mieszkania[id].cena_za_metr = cena; } // Menu pomocnicze void wyswietlMenu() { cout << "\n===== MENU =====\n" << "1. Dodaj mieszkanie\n" << "2. Usun mieszkanie\n" << "3. Edytuj mieszkanie\n" << "4. Wyswietl dostepne\n" << "5. Oblicz procent dostepnych\n" << "6. Sortuj po cenie\n" << "7. Ustaw cene za metr\n" << "8. Wyjdz\n" << "Wybor: "; } int main() { int wybor; while (true) { try { wyswietlMenu(); cin >> wybor; if (cin.fail()) { cin.clear(); cin.ignore(numeric_limits::max(), '\n'); throw runtime_error("Nieprawidlowy format danych!"); } switch (wybor) { case 1: { int numer; bool dostepne; float powierzchnia; cout << "Podaj numer, dostepnosc (1/0), powierzchnie: "; cin >> numer >> dostepne >> powierzchnia; dodajMieszkanie(numer, dostepne, powierzchnia); break; } case 2: { int id; cout << "Podaj ID do usuniecia: "; cin >> id; usunMieszkanie(id); break; } case 3: { int id, nowyNumer; bool nowaDostepnosc; float nowaPowierzchnia; cout << "Podaj ID, nowy numer, dostepnosc, powierzchnie: "; cin >> id >> nowyNumer >> nowaDostepnosc >> nowaPowierzchnia; edytujMieszkanie(id, nowyNumer, nowaDostepnosc, nowaPowierzchnia); break; } case 4: wyswietlDostepne(); break; case 5: obliczProcentDostepnych(); break; case 6: sortujPoCenie(); cout << "Posortowano!\n"; break; case 7: { int id; float cena; cout << "Podaj ID i cene za metr: "; cin >> id >> cena; ustawCeneZaMetr(id, cena); break; } case 8: return 0; default: cout << "Nieprawidlowy wybor!\n"; } } catch (const exception& e) { cerr << "Blad: " << e.what() << endl; } } }