background image

Programowanie obiektowe 2010/2011 

 

Laboratorium 9  
 
Zad 1.  
Który wiersz spowoduje błąd kompilacji i dlaczego? 
 
class A 

  private: 
    int a3; 
  protected: 
    int a2; 
  public: 
    int a1; 
    void fa() { a1 = a2 = a3 = 0; } 
}; 
int main() 

  A x; 
  x.a1 = 1; 
  x.a2 = 1;   
  x.a3 = 1;   
  return 0; 

 
Zad. 2.  
Który wiersz spowoduje błąd kompilacji i dlaczego? 
 
class A 

  private: 
    int a3; 
  protected: 
    int a2; 
  public: 
    int a1; 
    void fa() { a1 = a2 = a3 = 0; } 
}; 
 
class B : public A 

  private: 
    int b3; 
  protected: 
    int b2; 
  public: 
    int b1; 
    void fb(); 
}; 
 
void B::fb() 

    b1 = b2 = b3 = 0; 
    a1 = 1; 
    a2 = 2; 
    a3 = 3;   

 

background image

Programowanie obiektowe 2010/2011 

 

int main() 

  B y; 
  y.a1 = 2; 
  y.fa(); 
  y.a2 = 2;   
 
  y.a3 = 2;   
 
  y.b1 = 2; 
  y.b2 = 2;   
 
  y.b3 = 2;   

 
Zad. 3. Konstruktory, przypisywanie wartości do odpowiedniego konstruktora 
Zapoznaj się z programem z pliku przyklad1.cpp. Zmodyfikuj go tak, aby obiekty były tworzone za pomocą 
konstruktorów. 
 
Zad. 4. Zasłanianie metod 
Uzupełnij program z poprzedniego zadania o metodę baw(). Ma ona przedstawiać ulubione zajęcie zwierzaka. 
W klasie bazowej będzie to po prostu zabawa. 
 
Zad. 5. Przeciążanie funkcji. 
Uzupełnij program z poprzedniego zadania o metodę szczekaj(), w której możemy podać ile razy pies ma 
zaszczekać. 
 
Zad. 6. 
Zapoznaj się z programami z plików przyklad2.cpp i przyklad3.cpp 
 
Opracuj klasę bazową Pracownik (pracownik zatrudniony na stałe) i klasę pochodną Pracownik_godz 
(pracownik zatrudniony na godziny) według przedstawionej specyfikacji klas.  
 

class Pracownik { 
  int id;                      // identyfikator  
  string nazwisko;             // lub char *nazwisko - wtedy destruktor 
  double podatek_stawka;       // % podatku 
protected: 
  double placa_brutto; 
public: 
  Pracownik(int prac_id, string prac_nazw); 
  void wpisz_podatek(double nowa_stawka); 
  void wpisz_place(double nowa_placa); 
  double oblicz_place_netto();     // po odtrąceniu podatku 
  void drukuj_info();              // wyświetla informację o pracowniku 
}; 
class Pracownik_godz : public Pracownik 

  double ile_godzin;   // liczba przepracowanych godzin 
  double stawka_godz;  // stawka godzinowa 
public: 
  Pracownik_godz(int prac_id, string prac_nazw, double stawka); 
  void wpisz_godz(double ile); 
  void wpisz_stawke_godz(double stawka); 
  double oblicz_place(); 
  void drukuj_info(); 
}; 
 

background image

Programowanie obiektowe 2010/2011 

 

Przykładowa informacja uzyskana z programu:  
 
Pracownik: nazwisko = Kowalski  
                 id = 1234  
       placa brutto = 2000  
            podatek = 400  
        placa netto = 1600  
 
Pracownik: nazwisko = Nowak  
                 id = 2345  
       placa brutto = 5000  
            podatek = 1000  
        placa netto = 4000  
      liczba godzin = ...  

                stawka = ...  
 
Zadanie domowe 
 
Zad. 7.  
Opracuj klasę Wielokat do obsługi  figur na płaszczyźnie. Klasa ta ma zawierać: 
 
class Wielokat { 
  int l_bokow;   // liczba boków 
  int *boki;     // tablica z długościami boków 
public: 
  Wielokat();                    // konstruktor domyślny 
  Wielokat(int l_bokow);         // konstruktor, gdy podana liczba boków 
  Wielokat(const Wielokat &w);   // konstruktor kopiujący 
  ~Wielokat();                   // destruktor  
  // przeciążony operator przypisania 
  Wielokat& operator=(const Wielokat &w);  
  // wstawianie dlugości boku 
  void wpiszBok(int ktory, int dlugosc); 
  // wyświetlanie boków 
  void print(); 
  // obliczanie obwodu 
  int obwod(); 
  // w wersji obecnej: wyświetlanie komunikatu  
  // "Nie potrafie policzyc powierzchni" 
  int area(); 
}; 
 
// przykładowy program testowy 
int main() { 
  Wielokat a(5); 
  Wielokat b = Wielokat(3);     // Wielokat b(3) 
  Wielokat c = a; 
  Wielokat d; 
  Wielokat trojkat(3); 
  int bok; 
  cout << "Wpisz dlugosci bokow trojkata: " 
  for (int i = 0; i<3; i++) 
  { 
    cin >> bok; 
    trojkat.wpiszBok(i, bok); 
  } 
  cout << "Obwod trojkata = " << trojkat.obwod() << endl; 
  trojkat.drukuj();  cout << endl; 
  c.drukuj();  cout << endl; 
  endl; 

background image

Programowanie obiektowe 2010/2011 

 

Zad. 8. 
Na podstawie poprzedniego zdania utwórz hierarchię klas: 

 
class trojkat : public wielokat; 
class prostokat : public wielokat; 
class kwadrat :public prostokat; 
 

Zmodyfikuj  klasę  Wielokat,  jeśli  będzie  to  wymagane.  Klasy  pochodne  mają  posiadać  funkcje  obliczające 
powierzchnię  (o ile klasa  macierzysta  takiej funkcji nie  dostarcza) oraz własne  funkcje  drukuj().  Każda  z 
funkcji drukuj() ma wyświetlić informację o typie obiektu i jego powierzchni. 
 
Zad. 9. 
 
Zdefiniuj klasę bazową Samochod. W klasie mają być informacje o marce (typ string), pojemność silnika (typ 
int)  i  właścicielu  samochodu  (typ  osoba,  utworzony  w  poprzednim  zdanaiu).  Utwórz  dwie  klasy  pochodne 
Osobowy i Ciezarowy. Klasa Osobowy ma dodatkowe składowe takie jak: liczba pasażerów (typ int), pojemność 
bagażnika (typ double), liczba drzwi (typ int). Klasa Ciezarowy powinna mieć dodatkowe składowe: ładowność 
(typ double), liczbę osi (typ int), informację o tym, czy posiada urządzenie samowyładowcze (tak/nie, typ bool). 
Zapewnij  klasom  rozsądną  liczbę  potrzebnych  konstruktorów,  funkcji  dostępu  i  modyfikacji,  przeciążony 
operator przypisania i konstruktor kopiujący.  
 
Napisz  program  testujący  opracowane  klasy  a  następnie  program  demonstracyjny  tworzący  co  najmniej  dwa 
samochody  osobowe,  dwa  samochody  ciężarowe  i  wyświetlający  pełne  informacje  o  utworzonych  obiektach. 
Defincja klasy Osoba jest podana poniżej. Jej implementacja należy do zadania. 
 
class Osoba { 
  string nazwisko; 
public: 
  Osoba(); 
  Osoba(string n); 
  Osoba(const Osoba& os); 
  string czytaj_nazwisko() const; 
  Osoba& operator=(const Osoba& os); 
  friend istream& operator>>(istream& we, Osoba& os); 
  friend osteram& operator<<(ostare& wy, const Osoba& os); 
};