Języki Programowania Laboratorium Ćwiczenia 11

Transkrypt

Języki Programowania Laboratorium Ćwiczenia 11
Języki Programowania
Laboratorium
Ćwiczenia 11-14
Programowanie obiektowe i klasa kontenerowa
Termin oddania zadania: 17 styczeń 2010
Zadanie Nr 1:
Zadanie polega na wcieleniu się w rolę architekta, inżyniera oprogramowania oraz inżyniera
testowania. Twoim zadaniem jest wykonie projektu i realizacja Skarbonki na Monety, według
informacji podanych w poniższej specyfikacji:
•
Moneta jest obiektem, który posiada jeden z nominałów 5, 2, 1, 0.50, 0.20, 0.10
(wskazówka: dobrze jest trzymać wartości monet jako liczby całkowite, tzn 5 PLN = 500
GR)
•
Skarbonka jest pojemnikiem (kontenerem) na obiekty klasy Moneta.
•
Skarbonka jest bardzo pojemna, tzn. że jej rozmiar nie jest z góry ograniczony przez
specyfikację
•
Skarbonka pozwala na dodanie elementu Moneta za pomocą operatora + (S=S+C)
•
Skarbonka pozwala na "wyjęcie" (usunięcie) elementu Moneta za pomocą operatora (S=S-C)
•
Dwie, lub więcej Skarbonki można połączyć ze sobą za pomocą operatora +. Wtedy
zawartość drugiej staje się zawartością pierwszej (S=S_1+S_2+S_3)
•
Możliwe jest przyrównanie dwóch Skarbonek, w celu sprawdzenia czy ich zawartości są
równe (S==S1)
•
Możliwe jest przyrównanie dwóch Skarbonek, w celu sprawdzenia, która z nich trzyma
większą kwotę (S<S1)
•
Możliwe jest sklonowanie skarbonki (w odróżnieniu od rzeczywistości) S=S1
•
Możliwe jest zapytanie, czy Skarbonka jest pusta?
•
Możliwe jest zapytanie, czy Skarbonka posiada Monetę o określonym nominale?
•
Możliwe jest zapytanie ile Monet o określonym nominale jest w Skarbonce?
•
Możliwe jest wydanie ze Skarbonki określonej sumy pieniędzy - operacja (o ile możliwa)
zwraca ze Skarbonki określoną liczbę Monet
•
Zawartość Skarbonki można wypisać na standardowe wyjście (ostream << S )
•
Skarbonkę można uzupełnić ze standardowego wejścia (istream >> S) - zaprojektuj format
wprowadzania Monet
Pracę podziel na etapy:
1. Projektowanie - jako projektant powinieneś przygotować koncepcję programu w oparciu o
specyfikację. Określ jak będą wyglądały klasy i jakie będą posiadać metody, jakie będą ich
przykłady użycia (use case scenario). Wykonaj dokumentację do interfejsu
programistycznego aplikacji (API) w postaci komentarzy opisujących klasy i ich metody.
Projektując pamiętaj o tym, że powierzone Ci zadanie może być tylko częścią większego
projektu, dlatego powinieneś dostarczyć odpowiednie pliki nagłówkowe, pozwalające na
skorzystanie z Twoich klas w innych przypadkach (kieruj się zasadą PPPP - Proper
Preparation Prevents Pathetic Performance).
2. Wykonanie - napisanie właściwego kodu realizującego projekt, pamiętając o dobrych
praktykach takich jak formatowanie kodu, adekwatne nazwy klas, metod i zmiennych,
czytelność (jedna metoda/funkcja ma zajmować nie więcej niż jeden ekran), redukowanie
zagnieżdżeń pętli i wyrażeń warunkowych (dobrze jest pamiętać o zasadzie KISS -Keep It
Stupid Simple). Przygotuj plik Makefile.
3. Testowanie - przygotowanie zestawu funkcji testujących (tzw. unit testing) poprawność
wykonywania operacji (tylko tych podanych w specyfikacji). Funkcja main powinna
zawierać wyłącznie wywołania do funkcji testujących. Jedna funkcja testowa dla każdej z
funkcjonalności, lub scenariusza użycia klasy. Program nie powinien zawierać interfejsu
użytkownika.
Przykładowy kod testujący klasę Adder posiadającą metodę Adder::add(int a, int b) dodającą dwie
liczby całkowite do siebie, może być napisany w następujący sposób:
/**
* Tests Adder::add(int, int)
*/
void testAdd()
{
Adder adder();
assert( adder.add(1, 2) == 3 );
assert( adder.add(1,-1) == 0 );
}
int main()
{
testAdd();
}