Wprowadzenie do programowania obiektowego

Transkrypt

Wprowadzenie do programowania obiektowego
Ćwiczenie 1
1
Definiowanie prostych klas
Ćwiczenie to poświęcone jest poznaniu podstawowych zagadnień związanych
z definiowaniem prostych klas. Obejmuje m.in. ćwiczenia pozwalające opanować
definiowanie konstruktorów, funkcji składowych spełniających rolę akcesorów
i realizatorów. Ćwiczenie obejmuje również poznanie podstawowych możliwości
obiektowej biblioteki strumieniowej oraz predefiniowanych obiektów cout i cin.
Materiał teoretyczny, niezbędny dla zrozumienia prezentowanych przykładów
zawierają materiały wykładowe dostępne online, w postaci dokumentu pdf, pod
adresem: http://zsi.tech.us.edu.pl/~romek/dyd/pjp/pjp_cxx.pdf. Biblioteka strumieniowa: str. 5-8, informacje dotyczące klas i obiektów: str. 9-20.
1.1 Krok pierwszy
Należy napisać obiektową wersję programu pozwalającego na obliczanie pola
kwadratu. Program pozwala na wprowadzenie liczby rzeczywistej reprezentującej
bok kwadratu, oblicza jego pole i wyprowadza do strumienia wyjściowego
programu.
Obliczenia ma realizować obiekt reprezentujący kwadrat. Niech obiekt nazywa się
s, i należy do klasy Square. Przykładowy kod funkcji main może mieć następującą
postać:
int main()
{
double num;
Square s;
cout << endl << "Obliczam pole kwadratu" << endl;
cout << "Podaj bok: ";
cin >> num;
s.setSide( num );
cout << "Pole kwadratu wynosi: " << s.area();
return 0;
}
Przykłady i ćwiczenia
Definiowanie prostych klas
Funkcja składowa setSide umożliwia ustalenie długości boku obiektu s. Funkcja
area pozwala na obliczenie pola. Program należy oczywiście uzupełnić o włączenie
odpowiednich plików nagłówkowych oraz definicję klasy Square. Warto również
przed zakończeniem programu wstawić sekwencję zatrzymująca jego wykonanie,
tak, aby wyniki jego działania były widoczne. Kompletny program — nie
zawierający jednak konstruktorów — zawiera przedstawiony dalej kod źródłowy.
#include <iostream>
using namespace std;
class Square
{
public :
void setSide( double side );
double getSide();
double area();
private:
double side;
};
void Square::setSide( double side )
{
Square::side = side;
}
double Square::getSide()
{
return side;
}
double Square::area()
{
return side * side;
}
int main()
{
double num;
Square s;
cout << endl << "Obliczam pole kwadratu" << endl;
cout << "Podaj bok: ";
cin >> num;
s.setSide( num );
cout << "Pole kwadratu wynosi: " << s.area();
cin.ignore();
cin.get();
return 0;
}
Wprowadzenie do programowania w języku C++
Przedstawioną powyżej klasę Square należy rozszerzyć o konstruktor domyślny.
Zobacz str. 13 materiałów wykładowych.
1.2 Krok drugi
Rozszerzyć program o możliwość obliczania pól innych figur:
•
prostokąta,
•
trójkąta,
•
okręgu,
•
trapezu.
Dla każdej z figur należy zdefiniować odpowiednią klasę: Rectangle, Triangle,
itp.. Funkcję main należy rozbudować o proste menu pozwalające na wybranie typu
figury. Szablon takiego rozwiązania zawiera przedstawiony dalej kod źródłowy.
int main()
{
char c;
cout << endl << "Wybierz figure:" << endl;
cout << "1.Kwadrat\n2.Prostokat\n3.Trojkat\n>";
cin >> c;
switch( c )
{
case '1' : cout << "Obliczenia dla kwadratu" << endl;
// ...
break;
case '2' : cout << "Obliczenia dla prostokata" << endl;
// ...
break;
case '3' : cout << "Obliczenia dla trojkata" << endl;
// ...
break;
}
cin.ignore();
cin.get();
return 0;
}
Aby umożliwić wielokrotne wykonywanie obliczeń bez konieczności powtórnego
uruchamiania programu, można go rozbudować o iterację, co ilustruje
przedstawiony dalej kod źródłowy. Oczywiście menu programu należy rozbudować
o opcję — np. identyfikowaną przez kolejny numer — pozwalającą na wybranie
zakończenia programu.
Przykłady i ćwiczenia
. . .
do
{
cout << endl << "Wybierz figure:" << endl;
cout << "1.Kwadrat\n2.Prostokat\n3.Trojkat\n4.Koniec\n>";
cin >> c;
switch( c )
{
case '1' : cout << "Obliczenia dla kwadratu" << endl;
// ...
break;
case '2' : cout << "Obliczenia dla prostokata" << endl;
// ...
break;
case '3' : cout << "Obliczenia dla trojkata" << endl;
// ...
break;
}
}
while( c != '4' );
. . .
1.3 Krok trzeci
Program w wersji dla kilku figur się rozrasta, rozrasta się również jego funkcja
main. Można oczywiście podzielić program na funkcje… ale nasz program zacznie
wtedy być hybrydą proceduralno-obiektową! Proponuję wprowadzić obiekt, który
będzie reprezentował nasz program. Niech obiekt nazywa się myProg a jego klasa
Program. Przykład funkcji main wykorzystującej taki obiekt może wyglądać
następująco:
int main()
{
Program myProg;
myProg.run();
return 0;
}
Definicja klasy Program:
class Program
{
public :
Program();
void
void
void
void
};
run();
squareArea();
rectangleArea();
triangleArea();
Implementacja funkcji składowych:
Program::Program()
{
cout << endl << "Program obliczający pola figur" << endl;
}
void Program::run()
{
char c;
do
{
cout << endl << "Wybierz figure:" << endl;
cout << "1.Kwadrat\n2.Prostokat\n3.Trojkat\n4.Koniec\n>";
cin >> c;
switch( c )
{
case '1' : squareArea();
break;
case '2' : rectangleArea();
break;
case '3' : triangleArea();
break;
}
}
while( c != '4' );
}
void Program::squareArea()
{
cout << "Obliczenia dla kwadratu" << endl;
// ...
}
void Program::rectangleArea()
{
cout << "Obliczenia dla prostokata" << endl;
// ...
}
void Program::triangleArea()
{
cout << "Obliczenia dla trojkata" << endl;
// ...
}
1.4 Krok czwarty i ostatni
W oparciu o przedstawione w poprzednich punktach przykłady należy opracować
program, obliczający pola figur (kwadrat, prostokąt, koło, trójkąt, trapez). Program
ma wyświetlać menu umożliwiające wybór figury, po dokonaniu tego wyboru
program wczytuje niezbędne dane, wyświetla wyniki, po czym wraca do menu
umożliwiając dokonanie powtórnych obliczeń. Każda figura posiada klasę
reprezentującą ją w programie, wszelkie obliczenia realizowane są przy
wykorzystaniu funkcji składowej area każdej z klas. Obliczenie nadzoruje klasa
reprezentująca program, przybierając postać podobna do klasy Program.
1.5 Co po tym ćwiczeniu należy umieć?
Zakładam, że po tym ćwiczeniu każdy potrafi odpowiedzieć na pytanie:
1.
Co to jest obiekt a co to jest klasa?
2. Co to jest pole i funkcja składowa?
3. Jakie są reguły dostępu do składowych public a jakie do składowych
private?
4. Co to jest konstruktor i do czego służy?
5.
Co to jest konstruktor domyślny, kiedy jest aktywowany i jak się go
deklaruje?
6. Co to jest konstruktor ogólny, kiedy jest aktywowany i jak się go deklaruje?
7.
Co to są akcesory, realizatory i do czego służą?
Zakładam również, że każdy potrafi napisać od podstaw klasę o stopniu
skomplikowania zbliżonym do przećwiczonych klas reprezentujących figury, oraz że
każdy wie jak wyprowadzać dane z wykorzystaniem strumienia cout i wczytywać
dane z wykorzystaniem strumienia cin.