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).