Klasa Macierz

Zadanie 5 z 11 · rozdział 18Trudność: 2 z 3classmacierzeoperatory

Treść zadania

Zaprojektuj klasę Macierz:

  1. Konstruktor __init__(self, wiersze) przyjmuje listę wierszy (listę list liczb).
  2. Operatory +, - i * (metody __add__, __sub__, __mul__) zwracają nową macierz — sumę, różnicę i iloczyn macierzy. Jeśli działania nie da się wykonać, metoda zwraca None:
    • dodawanie i odejmowanie wymagają macierzy o tych samych wymiarach,
    • iloczyn $A \cdot B$ wymaga, by liczba kolumn $A$ była równa liczbie wierszy $B$. Element wyniku to $c_{ij} = \sum_k a_{ik} b_{kj}$.
  3. Porównanie == (metoda __eq__) — macierze są równe, gdy mają te same wymiary i te same elementy.
  4. Metoda __str__() zwraca macierz jako napis: kolejne wiersze w osobnych liniach, elementy wiersza oddzielone pojedynczą spacją.

Program wczytuje macierze $A$ i $B$, wypisuje je, a potem wypisuje $A + B$, $A - B$, $A \cdot B$ i informację, czy macierze są równe.

Dane wejściowe

  • 1. linia: liczby $n$ i $m$ — liczba wierszy i kolumn macierzy $A$
  • kolejne $n$ linii: wiersze macierzy $A$ ($m$ liczb całkowitych oddzielonych spacjami)
  • następna linia: liczby $p$ i $q$ — liczba wierszy i kolumn macierzy $B$
  • kolejne $p$ linii: wiersze macierzy $B$ ($q$ liczb całkowitych oddzielonych spacjami)

Dane wyjściowe

Pięć bloków, każdy zakończony pustą linią, a po nich jedna linia z wynikiem porównania:

Macierz A:
<A>

Macierz B:
<B>

Suma macierzy:
<A + B>

Różnica macierzy A - B:
<A - B>

Iloczyn macierzy A * B:
<A * B>

Macierze A i B są równe.
  • Jeśli działania nie da się wykonać, zamiast macierzy wypisz w bloku jedną linię: Niezgodne wymiary.
  • W ostatniej linii wypisz Macierze A i B są równe. albo Macierze A i B są różne.

Ograniczenia

  • $1 \le n, m, p, q \le 5$
  • Elementy macierzy są liczbami całkowitymi z przedziału $[-100, 100]$.

Przykłady

Wejście
2 2
1 3
4 2
2 2
5 0
1 3
Wyjście
Macierz A:
1 3
4 2

Macierz B:
5 0
1 3

Suma macierzy:
6 3
5 5

Różnica macierzy A - B:
-4 3
3 -1

Iloczyn macierzy A * B:
8 9
22 6

Macierze A i B są różne.

Na przykład element w drugim wierszu i drugiej kolumnie iloczynu to $4 \cdot 0 + 2 \cdot 3 = 6$.

Wejście
1 2
1 2
1 2
3 4
Wyjście
Macierz A:
1 2

Macierz B:
3 4

Suma macierzy:
4 6

Różnica macierzy A - B:
-2 -2

Iloczyn macierzy A * B:
Niezgodne wymiary.

Macierze A i B są różne.

Macierz $1 \times 2$ można pomnożyć tylko przez macierz o 2 wierszach.

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
1 1
7
1 1
-3
Oczekiwane wyjście
Macierz A:
7

Macierz B:
-3

Suma macierzy:
4

Różnica macierzy A - B:
10

Iloczyn macierzy A * B:
-21

Macierze A i B są różne.

Test 2

Nie uruchomiono
Wejście
2 3
1 2 3
4 5 6
2 3
1 1 1
0 0 0
Oczekiwane wyjście
Macierz A:
1 2 3
4 5 6

Macierz B:
1 1 1
0 0 0

Suma macierzy:
2 3 4
4 5 6

Różnica macierzy A - B:
0 1 2
4 5 6

Iloczyn macierzy A * B:
Niezgodne wymiary.

Macierze A i B są różne.

Test 3

Nie uruchomiono
Wejście
2 3
1 0 2
-1 3 1
3 2
3 1
2 1
1 0
Oczekiwane wyjście
Macierz A:
1 0 2
-1 3 1

Macierz B:
3 1
2 1
1 0

Suma macierzy:
Niezgodne wymiary.

Różnica macierzy A - B:
Niezgodne wymiary.

Iloczyn macierzy A * B:
5 1
4 2

Macierze A i B są różne.

Test 4

Nie uruchomiono
Wejście
2 2
2 -1
0 4
2 2
2 -1
0 4
Oczekiwane wyjście
Macierz A:
2 -1
0 4

Macierz B:
2 -1
0 4

Suma macierzy:
4 -2
0 8

Różnica macierzy A - B:
0 0
0 0

Iloczyn macierzy A * B:
4 -6
0 16

Macierze A i B są równe.

Test 5

Nie uruchomiono
Wejście
1 3
1 2 3
3 1
4
5
6
Oczekiwane wyjście
Macierz A:
1 2 3

Macierz B:
4
5
6

Suma macierzy:
Niezgodne wymiary.

Różnica macierzy A - B:
Niezgodne wymiary.

Iloczyn macierzy A * B:
32

Macierze A i B są różne.

Test 6

Nie uruchomiono
Wejście
3 3
1 0 0
0 1 0
0 0 1
3 3
1 2 3
4 5 6
7 8 9
Oczekiwane wyjście
Macierz A:
1 0 0
0 1 0
0 0 1

Macierz B:
1 2 3
4 5 6
7 8 9

Suma macierzy:
2 2 3
4 6 6
7 8 10

Różnica macierzy A - B:
0 -2 -3
-4 -4 -6
-7 -8 -8

Iloczyn macierzy A * B:
1 2 3
4 5 6
7 8 9

Macierze A i B są różne.
Uruchom z własnymi danymi