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(); }