//Zaimplementowac klase Samochod pozwalajacy na przechowywanie takich danych jak:
//  marka, model samochodu, pojemnosc silnika, cena, rok produkcji
//1.Zaimplementowac 2 konstruktory:
//  bezargumentowy, ktory przypisuje polom nazw lancuch pusty "" a wartosciom liczbowym wartosc 0
//  przyjmujacy 5 argumentow: marka, model samochodu, pojemnosc silnika, cena, rok produkcji
//2.Zaimplementowac operator przypisania kopjacy wszystkie parametry samochodu
//3.Zaimplementowac metody pozwalające na ustawianie modelu samochodu
//4.Zaimplementowac metody pozwalające na ustawianie roku produkcji samochodu
//5.Zaimplementowac operator == porownujacy marke i model samochodu
//6.Zaimplementowac operator << wypisujacy wszystkie dane o samochodzie na ekran
//7.Zaimplementowac rzucanie wyjątku przy probie wypisania na strumien samochodu o niepelych danych
//  (marka lub model pusty, cena, pojemnosc, pola roku zerowe)
//
//Do reprezentacji nazw nalezy zastosowac klase string. Do reprezentacji danych liczbowych
//nalezy zastosowac wlasciwy typ danych najlepiej opisujacy dana liczbe 
//(stalo/ziennoprzenikowa, ze znakiem, bez znaku)
//
//
// Spodziewany efekt na ekranie dzialania pelnej implementacji:

//Dane samochodu 4:
//Dane samochodu sa niepoprawne lub niepelne               
//samochodu 1 i 2 sa te same (Opel Astra)
//Samochod 1 (Opel Astra) i 2 (Skoda Fabia) sa inne
//Dostepne sa samochodu:
//Samochod:   Opel Astra
// cena:  14000
// poj.:  1.4
// prod.: 2004
//
//Samochod:   Opel Astra
// cena:  12000
// poj.:  1.4
// prod.: 2003
//
//Samochod:   Skoda Fabia
// cena:  6000
// poj.:  1.2
// prod.: 1995
//
//Samochod:   Skoda Favorit
// cena:  6000
// poj.:  1.2
// prod.: 1992
//
//Aby kontynuować, naciśnij dowolny klawisz . . .

#include <cstdlib>
#include <iostream>
#include <string>

using namespace std;

class NiepoprawneDane{};

class Samochod {
      string marka;
      string model;
      float pojemnosc;
      float cena;
      unsigned int rok;
public:
       Samochod(string _marka="", string _model="", float _pojemnosc=0.0, float _cena=0.0, unsigned int _rok=0)
       {
                   marka=_marka;
                   model=_model;
                   pojemnosc=_pojemnosc;
                   cena=_cena;
                   rok=_rok;
       }
       void Ustawmodel(string _model){
                   model=_model;
       }
       void UstawRokProdukcji(unsigned int _rok){
                   rok=_rok;
       }
       Samochod& operator=(Samochod& p){
                   marka=p.marka;
                   model=p.model;
                   pojemnosc=p.pojemnosc;
                   cena=p.cena;
                   rok=p.rok;
       }
       bool operator==(Samochod& p){
            if (marka==p.marka && model==p.model && rok==p.rok)
               return true;
            return false;
       }
       string Nazwa(){
              return marka+" "+model;
       }
       string GetMarka(){
              return marka;
       }
       string Getmodel(){
              return model;
       }
       float GetCena(){
              return cena;
       }
       float GetPojemnosc(){
              return pojemnosc;
       }
       unsigned int GetRok(){
              return rok;
       }
};

ostream& operator<<(ostream& s, Samochod& p){
         if (p.GetMarka()=="" || p.Getmodel()=="" || p.GetCena()==0.0 || p.GetPojemnosc()==0.0 || p.GetRok()==0)
            throw NiepoprawneDane();
         cout<<"Samochod:   "<<p.Nazwa()<<endl;
         cout<<" cena:  "<<p.GetCena()<<endl;
         cout<<" poj.:  "<<p.GetPojemnosc()<<endl;
         cout<<" prod.: "<<p.GetRok()<<endl;
         return s;
}

int main(int argc, char *argv[])
{
    Samochod p1("Opel", "Astra", 14000, 1.4, 2004);                        //1
    Samochod p2("Opel", "Astra", 12000, 1.4, 2003);                        //1
    Samochod p3("Skoda", "Fabia", 6000, 1.2, 1995);                    //1
    Samochod p4;                                                            //2
    
    try {                                                             //3
        cout<<"Dane samochodu 4:"<<endl;                                   //3
        cout<<p4;                                                     //3
    } catch (NiepoprawneDane x){                                         //3
           cerr<<"Dane samochodu sa niepoprawne lub niepelne"<<endl;          //3
    }
    
    
        p4=p3;                                                        //4  
        p3.UstawRokProdukcji(1992);                                   //5
        p3.Ustawmodel("Favorit");                                        //5
        
        if (p1==p2)                                                   //6
           cout<<"samochody 1 i 2 sa te same ("<<p1.Nazwa()<<")"<<endl;
        else
          cout<<"Samochod 1 ("<<p1.Nazwa()<<") i 2 ("<<p2.Nazwa()<<")sa jednakowe"<<endl;
  
        if (p1==p3)                                                   //6
           cout<<"samochody 1 i 2 sa te same ("<<p1.Nazwa()<<")"<<endl;
        else
           cout<<"Samochod 1 ("<<p1.Nazwa()<<") i 2 ("<<p3.Nazwa()<<") sa inne"<<endl;

        cout<<"Dostepne sa samochody:"<<endl;
        cout<<p1<<endl;                                                  //7
        cout<<p2<<endl;                                                  //7
        cout<<p3<<endl;                                                  //7
        cout<<p4<<endl;                                                  //7

    system("PAUSE");
    return EXIT_SUCCESS;
}

