Konto bankowe

Zadanie 8 z 11 · rozdział 18Trudność: 2 z 3classwyjątkitry-except

Treść zadania

Zaprojektuj klasę KontoBankowe:

  • konstruktor __init__(self, saldo=0) zapamiętuje saldo początkowe w atrybucie saldo,
  • metoda wplac(kwota) zwiększa saldo o kwota. Jeśli $kwota \le 0$, metoda zgłasza wyjątek ValueError("Kwota musi być dodatnia.") i nie zmienia salda,
  • metoda wyplac(kwota) zmniejsza saldo o kwota. Najpierw sprawdza, czy $kwota \le 0$ — wtedy zgłasza ValueError("Kwota musi być dodatnia."), a następnie, czy kwota nie przekracza salda — jeśli przekracza, zgłasza ValueError("Brak środków na koncie."). W obu przypadkach saldo się nie zmienia.

Metody nie wypisują komunikatów o błędach — tylko zgłaszają wyjątki. Wyjątki przechwytuje program główny (try/except) i wypisuje komunikat błędu.

Program tworzy konto z podanym saldem początkowym i wykonuje kolejne polecenia:

  • wplac K — wpłaca kwotę $K$ i wypisuje Wpłacono K. Saldo: S,
  • wyplac K — wypłaca kwotę $K$ i wypisuje Wypłacono K. Saldo: S,
  • saldo — wypisuje Saldo: S,

gdzie $S$ to saldo po wykonaniu polecenia. Jeśli metoda zgłosi wyjątek, program zamiast tego wypisuje Błąd: <komunikat wyjątku>.

Dane wejściowe

  • 1. linia: saldo początkowe — liczba całkowita $\ge 0$
  • 2. linia: liczba poleceń $n$
  • kolejne $n$ linii: polecenie wplac K, wyplac K albo saldo ($K$ — liczba całkowita, może być ujemna lub równa 0)

Dane wyjściowe

$n$ linii — po jednej dla każdego polecenia, w formacie opisanym w treści.

Ograniczenia

  • $1 \le n \le 100$
  • $-10^6 \le K \le 10^6$, saldo początkowe nie przekracza $10^6$

Uwagi

  • Instrukcja raise zgłasza wyjątek i natychmiast przerywa działanie metody. Kod, który wywołał metodę, może wyjątek przechwycić w bloku try/except; zapis except ValueError as e daje dostęp do obiektu wyjątku, a str(e) (lub {e} w f-stringu) to jego komunikat:
    ```python
    def pierwiastek(x):
    if x < 0:
    raise ValueError("Liczba nie może być ujemna.")
    return x ** 0.5
    try:
    print(pierwiastek(-4))
    except ValueError as e:
    print(f"Błąd: {e}") # Błąd: Liczba nie może być ujemna.
    `
  • Dzięki temu klasa tylko sygnalizuje problem, a o tym, co z nim zrobić (wypisać komunikat, zapytać ponownie, przerwać program), decyduje kod, który z niej korzysta.

Przykład

Wejście
100
5
wplac 50
wyplac 30
wyplac 500
wplac -20
saldo
Wyjście
Wpłacono 50. Saldo: 150
Wypłacono 30. Saldo: 120
Błąd: Brak środków na koncie.
Błąd: Kwota musi być dodatnia.
Saldo: 120
Zasady obowiązujące w rozdziale 18

Zadania w tym rozdziale uczą projektowania klas: konstruktora __init__, atrybutów, metod, metod statycznych (@staticmethod) oraz metod specjalnych, dzięki którym obiekty można wypisywać (__str__), porównywać (__eq__) i łączyć operatorami (__add__, __sub__, __mul__, …). Ostatnie zadania wprowadzają też wyjątki (raise, try/except), klasy danych (@dataclass) i generatory (yield).

Konwencje wspólne:

  • Każde zadanie to osobny program: czyta standardowe wejście i wypisuje wynik na standardowe wyjście.
  • W każdym zadaniu dostajesz kod startowy ze szkieletem klasy, a zwykle także z gotowym wczytywaniem danych i wypisywaniem wyników. Twoim zadaniem jest przede wszystkim uzupełnienie metod klasy — wynik programu zależy od tego, jak działa Twoja klasa.
  • Nazwy klas i metod podane w treści są obowiązkowe (kod startowy z nich korzysta). Nazwy w kodzie piszemy bez polskich znaków, np. Kolo, Prostokat.
  • „Z dokładnością do 2 miejsc po przecinku” oznacza dokładnie dwie cyfry po kropce, np. f"{x:.2f}" (3.00, -0.50).
  • Program nie wypisuje komunikatów typu „Podaj liczbę:”.

Zadanie pochodzi z otwartego zbioru Nauka-Programowania (z rozwiązaniami wzorcowymi). Zgłoś błąd w treści lub testach.

Python uruchomi się w przeglądarce przy pierwszym teście.

Kod zapisuje się automatycznie w tej przeglądarce. Tab wstawia wcięcie; aby opuścić edytor klawiaturą, naciśnij Esc, a potem Tab.

Testy

Program dostaje „Wejście” przez input() i musi wypisać „Oczekiwane wyjście”. Liczby porównywane są z tolerancją 0,01, a tekst podany w input("…") nie jest sprawdzany.

Test 1

Nie uruchomiono
Wejście
0
1
saldo
Oczekiwane wyjście
Saldo: 0

Test 2

Nie uruchomiono
Wejście
0
2
wyplac 1
wplac 0
Oczekiwane wyjście
Błąd: Brak środków na koncie.
Błąd: Kwota musi być dodatnia.

Test 3

Nie uruchomiono
Wejście
50
3
wyplac 50
saldo
wyplac 0
Oczekiwane wyjście
Wypłacono 50. Saldo: 0
Saldo: 0
Błąd: Kwota musi być dodatnia.

Test 4

Nie uruchomiono
Wejście
1000
6
wplac 250
wyplac 1250
wyplac 1
wplac 1
wyplac -5
saldo
Oczekiwane wyjście
Wpłacono 250. Saldo: 1250
Wypłacono 1250. Saldo: 0
Błąd: Brak środków na koncie.
Wpłacono 1. Saldo: 1
Błąd: Kwota musi być dodatnia.
Saldo: 1

Test 5

Nie uruchomiono
Wejście
20
4
wyplac 25
wplac 5
wyplac 25
saldo
Oczekiwane wyjście
Błąd: Brak środków na koncie.
Wpłacono 5. Saldo: 25
Wypłacono 25. Saldo: 0
Saldo: 0
Uruchom z własnymi danymi