Dziedziczenie wielopoziomowe: Człowiek → Student → StudentFizyki

Zadanie 4 z 7 · rozdział 19Trudność: 2 z 3dziedziczeniekonstruktorysuper

Treść zadania

Zaprojektuj hierarchię klas:

  1. Czlowiek — atrybuty: imię, nazwisko, miejsce urodzenia, zawód.
  2. Student (dziedziczy po Czlowiek) — dodatkowo: numer albumu, kierunek studiów.
  3. StudentFizyki (dziedziczy po Student) — dodatkowo: średnia z laboratoriów, średnia z wykładów.

Każda klasa ma:

  • konstruktor, który atrybuty odziedziczone przekazuje do konstruktora klasy bazowej przez super().__init__(…), a sam zapisuje tylko nowe atrybuty,
  • metodę opis(), która zwraca listę linii z danymi obiektu. Klasa potomna wywołuje super().opis() i dopisuje do wyniku linie ze swoimi nowymi atrybutami,
  • nagłówek: Człowiek, Student albo Student Fizyki.

Metoda wypisz() (zdefiniowana tylko w klasie Czlowiek) wypisuje nagłówek z dwukropkiem, a pod nim kolejne linie z opis().

Program wczytuje dane kilku osób, tworzy odpowiednie obiekty i wypisuje je w kolejności z wejścia.

Dane wejściowe

  • 1. linia: liczba osób $n$
  • następnie dane kolejnych osób; każda wartość w osobnej linii:
    1. rodzaj: czlowiek, student albo student_fizyki
    2. imię
    3. nazwisko
    4. miejsce urodzenia
    5. zawód
    6. numer albumu (liczba całkowita) — tylko dla student i student_fizyki
    7. kierunek studiów — tylko dla student i student_fizyki
    8. średnia z laboratoriów (liczba rzeczywista) — tylko dla student_fizyki
    9. średnia z wykładów (liczba rzeczywista) — tylko dla student_fizyki

Wartości tekstowe mogą zawierać spacje (np. Zielona Góra).

Dane wyjściowe

Dla każdej osoby blok linii, bloki oddzielone pustą linią. Blok ma postać (linie z nawiasu kwadratowego występują tylko w odpowiednich klasach):

<Nagłówek>:
Imię: <imię>
Nazwisko: <nazwisko>
Miejsce urodzenia: <miejsce>
Zawód: <zawód>
[Numer albumu: <numer>]
[Kierunek studiów: <kierunek>]
[Średnia z laboratoriów: <średnia>]
[Średnia z wykładów: <średnia>]

Średnie wypisz z dokładnością do 2 miejsc po przecinku.

Ograniczenia

  • $1 \le n \le 10$

Uwagi

  • Nagłówek wygodnie zapisać jako atrybut klasy, np. naglowek = "Student" — klasa potomna nadpisuje go własną wartością, a wypisz() odczytuje self.naglowek.

Przykład

Wejście
3
czlowiek
Jan
Kowalski
Kraków
Inżynier
student
Anna
Nowak
Warszawa
Student
12345
Informatyka
student_fizyki
Piotr
Wiśniewski
Gdańsk
Student
54321
Fizyka
4.5
4.0
Wyjście
Człowiek:
Imię: Jan
Nazwisko: Kowalski
Miejsce urodzenia: Kraków
Zawód: Inżynier

Student:
Imię: Anna
Nazwisko: Nowak
Miejsce urodzenia: Warszawa
Zawód: Student
Numer albumu: 12345
Kierunek studiów: Informatyka

Student Fizyki:
Imię: Piotr
Nazwisko: Wiśniewski
Miejsce urodzenia: Gdańsk
Zawód: Student
Numer albumu: 54321
Kierunek studiów: Fizyka
Średnia z laboratoriów: 4.50
Średnia z wykładów: 4.00
Zasady obowiązujące w rozdziale 19

Zadania w tym rozdziale uczą dziedziczenia: klasa potomna przejmuje atrybuty i metody klasy bazowej, może je nadpisać (override) albo rozszerzyć, wywołując wersję z klasy bazowej przez super(). Dzięki polimorfizmowi ten sam kod (np. pętla po liście obiektów) wywołuje metodę odpowiednią dla konkretnej klasy obiektu. Dziedziczenie przydaje się też przy wyjątkach: własne wyjątki to klasy dziedziczące po Exception, które można układać w hierarchie.

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 szkieletami klas i gotowym wczytywaniem danych. Twoim zadaniem jest uzupełnienie klas — wynik programu zależy od tego, jak działają Twoje klasy.
  • 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, Czlowiek.
  • „Z dokładnością do 2 miejsc po przecinku” oznacza dokładnie dwie cyfry po kropce, np. f"{x:.2f}" (3.00, 4.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
1
czlowiek
Ala
Zielińska
Łódź
Lekarka
Oczekiwane wyjście
Człowiek:
Imię: Ala
Nazwisko: Zielińska
Miejsce urodzenia: Łódź
Zawód: Lekarka

Test 2

Nie uruchomiono
Wejście
1
student_fizyki
Ewa
Kamińska
Toruń
Studentka
222
Fizyka techniczna
3.25
4.8
Oczekiwane wyjście
Student Fizyki:
Imię: Ewa
Nazwisko: Kamińska
Miejsce urodzenia: Toruń
Zawód: Studentka
Numer albumu: 222
Kierunek studiów: Fizyka techniczna
Średnia z laboratoriów: 3.25
Średnia z wykładów: 4.80

Test 3

Nie uruchomiono
Wejście
2
student
Bartosz
Lis
Poznań
Student
111
Matematyka
czlowiek
Ola
Mróz
Zielona Góra
Nauczycielka
Oczekiwane wyjście
Student:
Imię: Bartosz
Nazwisko: Lis
Miejsce urodzenia: Poznań
Zawód: Student
Numer albumu: 111
Kierunek studiów: Matematyka

Człowiek:
Imię: Ola
Nazwisko: Mróz
Miejsce urodzenia: Zielona Góra
Zawód: Nauczycielka

Test 4

Nie uruchomiono
Wejście
3
student_fizyki
Maria
Skłodowska
Warszawa
Fizyk
1867
Fizyka
5
5
student
Mikołaj
Kopernik
Toruń
Astronom
1473
Astronomia
student_fizyki
Jan
Nowak
Opole
Student
999
Fizyka medyczna
3.5
2.75
Oczekiwane wyjście
Student Fizyki:
Imię: Maria
Nazwisko: Skłodowska
Miejsce urodzenia: Warszawa
Zawód: Fizyk
Numer albumu: 1867
Kierunek studiów: Fizyka
Średnia z laboratoriów: 5.00
Średnia z wykładów: 5.00

Student:
Imię: Mikołaj
Nazwisko: Kopernik
Miejsce urodzenia: Toruń
Zawód: Astronom
Numer albumu: 1473
Kierunek studiów: Astronomia

Student Fizyki:
Imię: Jan
Nazwisko: Nowak
Miejsce urodzenia: Opole
Zawód: Student
Numer albumu: 999
Kierunek studiów: Fizyka medyczna
Średnia z laboratoriów: 3.50
Średnia z wykładów: 2.75
Uruchom z własnymi danymi