#include <iostream>
#include <vector>
#include <algorithm>
#include <stdexcept>
/*
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<Mieszkanie> 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<float>(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<streamsize>::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;
}
}
}