Języki Symboliczne, laboratorium 12 Zadanie 1. Stwórzy klasy
Transkrypt
Języki Symboliczne, laboratorium 12 Zadanie 1. Stwórzy klasy
Języki Symboliczne, laboratorium 12 Zadanie 1. Stwórzy klasy wyjątków ZłyNominałException, NieMożnaWydaćResztyException oraz NieznanaWalutaException. Dodaj obsługę wyjątków: • Do konstruktora klasy Moneta z laboratorium 11. – jeśli nominał monety nie jest jednym z dozwolonych, rzucany powinien być wyjątek ZłyNominałException. • Do funkcji Reszta klasy AutomatBiletowy z laboratorium 11. – jeśli brak monet pozwalających na wydanie reszty, rzucany powinien być wyjątek NieMożnaWydaćResztyException, • Do funkcji pozwalającej na wrzucenie monety w klasie AutomatBiletowy – jeśli użytkownik wrzuca monetę innej waluty niż obsługiwana przez automat, rzucony powinien być wyjątek NieznanaWalutaException. https://docs.python.org/3/tutorial/errors.html#raising-exceptions https://docs.python.org/3/tutorial/errors.html#user-defined-exceptions https://docs.python.org/3/tutorial/classes.html#exceptions-are-classes-too Zadanie 2. Do klasy Moneta dodaj metody: • __str__ zwracającą opis danej monety – informacje dla użytkownika (w tym jej wartość i walutę), • __repr__ zwracającą tekstową reprezentację monety – informacje do debugowania (w tym jej wartość i walutę). Która metoda zostanie wywołana dla str(Moneta(2))? Która metoda zostanie wywołana dla repr(Moneta(5))? Co zostanie wypisane dla str([Moneta(1), Moneta(1), Moneta(2)])? Co zostanie wypisane dla repr([Moneta(1), Moneta(1), Moneta(2)])? Zadanie 3. Napisz funkcję ładującą listę monet z pliku CSV, którego format jest następujący: [nominał],[liczba monet danego nominału] Przykładowy plik zawierający 6+4 monet o nominale 1, 14 monet o nominale 2 i 3 monety o nominale 5: 1,6 2,14 1,4 5,3 Utwórz pustą listę. Otwórz plik, wczytaj każdą linię i podziel ją przy pomocy metody split. Stwórz obiekty klasy Moneta o odczytanym nominale i dodaj je do listy. Jeśli w linii jest inna liczba wartości niż 2, rzuć wyjątek ZłyFormatPlikuException (konieczne jest wcześniejsze napisanie klasy tego wyjątku) i przerwij funkcję zwracając None. Jeśli w pliku jest moneta o nieobsługiwanym nominale, rzuć wyjątek ZłyNominałException i zwróć listę wczytanych monet. Jeśli nie został rzucony żaden wyjątek, wypisz informację o poprawnym wczytaniu, posortuj monety po nominale rosnąco i zwróć listę wczytanych monet (wykorzystaj else dla try). Pamiętaj o zamknięciu pliku (wykorzystaj finally). Upewnij się, że plik istnieje (jaki wyjątek jest wtedy rzucany?). Zmodyfikuj funkcję tak, aby wczytywanie linii z pliku wykorzystało konstrukcję with ... as ...: https://docs.python.org/3/tutorial/errors.html#defining-clean-up-actions https://docs.python.org/3/tutorial/errors.html#predefined-clean-up-actions Zadanie 4. Napisz klasę Log zapisującą informacje o przebiegu programu, zawierającą: • uchwyt na plik do którego logi są wpisywane, • konstruktor przyjmujący jako argument ścieżkę do pliku do którego wpisywane powinny być logi, logi powinny być dopisywane do istniejącego pliku, • metodę success zapisującą informację o sukcesie, przyjmującą jako argument wiadomość do zapisania, wpisującą do pliku tekst: [data] SUKCES: [wiadomość] • metodę info zapisującą wiadomość informacyjną, przyjmującą jako argument wiadomość do zapisania, wpisującą do pliku tekst: [data] INFORMACJA: [wiadomość] • metodę fail zapisującą informację o niepowodzeniu, przyjmującą jako argument wiadomość do zapisania, wpisującą do pliku tekst: [data] NIEPOWODZENIE: [wiadomość] • metodę close zamykającą plik z logami. W miejscu [data] powinna być aktualna data (rok, miesiąc, dzień, godzina, minuta i sekunda). Po otwarciu pliku z logami powinien być do niego wpisywany tekst: ---------------------------------------- START [data] Przed zamknięciem pliku wpisywany powinien być do niego tekst: ---------------------------------------- STOP [data] Jeśli nie udało się otworzyć pliku z logami (złapano wyjątek), informacja o tym powinna zostać wypisana na ekran, a wyjątek przekazany dalej. Do klasy AutomatBiletowy dodaj obsługę logów: • W metodzie Reszta informacja o sukcesie, zawierająca listę zwróconych monet (wypisać tekst zwracany przez funkcję repr dla listy monet), • W metodzie Reszta informacja o niepowodzeniu jeśli nie udało się zwrócić reszty, zawierająca liczbę monet każdego nominału znajdującą się w automacie, oraz kwotę jaką chciano zwrócić, • W metodzie Anuluj informacja o sukcesie, zawierająca kwotę wrzuconą dotychczas przez użytkownika, • W metodzie KupBilet wiadomość informacyjną zawierającą cenę kupowanego biletu i kwotę wrzuconą przez użytkownika, • W metodzie KupBilet informację o sukcesie, jeśli udało się kupić bilet (użytkownik wrzucił wymaganą kwotę i reszta została zwrócona poprawnie), • W metodzie pozwalającej na wrzucenie monety wiadomość informacyjną zawierającą informacje o wrzucanej monecie (wypisać tekst zwracany przez funkcję repr dla monety).