Warning
This page is located in archive. Go to the latest version of this course pages. Go the latest version of this page.

HW 06 - Maticové počty

Termín odevzdání 23.11.2019 23:59 CET
Povinné zadání 5b
Bonusové zadání 5b
Počet uploadů 10

V této úloze budete mít za úkol implementovat maticové operace sčítání, odčítání a násobení. Všechny prvky všech matic (i v průběhu výpočtu) se vejdou do 32-bitového znaménkového typu integer.

Pokud nebude vstup ve správném formátu nebo nepůjde provést příslušnou maticovou operaci, tak vypište “Error: Chybny vstup!” a konec řádku na standardní chybový výstup a ukončete program s návratovou hodnotou 100.

Pokud budete používat dynamickou alokaci paměti (malloc(), calloc()), tak doporučujeme použít program Valgrind ještě před nahráním do odevzdávacího systému pro kontrolu práce s pamětí.
Velikost vstupních matic (povinného a bonusového zadání) je přesně specifikována vstupním formátem, proto je doporučeno načítat vstup postupně po celých číslech a nikoliv po řádcích např. funkcí getline(). V případě bonusového zadání se může použití funkce getline() zdát výhodné, ale ani tady to není nutné. Opět můžete načítat první řádek postupně po celých číslech a tím identifikovat počet sloupců. Následně můžete již alokovat potřebnou velikost paměti, např. funkcí realloc() a postupovat identicky s povinným/volitelným zadáním.

Povinné zadání - 2 matice

Na standardním vstupu jsou pouze dvě matice s jednou operací (+,-,*). Vaším úkolem je provést zadanou operaci a vypsat na standardní výstup výslednou matici.

Formát vstupu

Na standardním vstupu jsou dvě matice (nebo v bonusovém zadání i více matic) oddělené jedním řádkem se znakem operace (+,-,*). Každá matice má na prvním řádku nejprve svoji velikost ($n$, $m$) a následuje $n$ řádků vždy s $m$ hodnotami matice. Jednotlivé hodnoty jsou oddělené mezerami, ale za poslední hodnotou je pouze znak nového řádku.

Formát výstupu

Formát výstupu je stejný, ale obsahuje pouze jednu matici. Nezapomeňte, že na konci řádku není mezera a i za posledním řádkem je znak nového řádku.

Příklad 1 - pub01-m

$ \left( \begin{array}{cc} 76 & 98 & -31 \\
30 & 30 & 32 \end{array} \right) - \left( \begin{array}{c} 89 & 25 & 38 \\
1 & -32 & -38 \end{array} \right) = \left( \begin{array}{c} -13 & 73 & -69 \\
29 & 62 & 70 \end{array} \right) $

Standardní vstup Očekávaný výstup Očekávaný chybový výstup Návratová hodnota
2 3
76 98 -31
30 30 32
-
2 3
89 25 38
1 -32 -38
2 3
-13 73 -69
29 62 70
žádný 0

Příklad 2 - pub02-m

$ \left( \begin{array}{cc} -59 & 78 & -85\end{array} \right) \times \left( \begin{array}{c} 78 \\
-28 \\
-97\end{array} \right) = \left( \begin{array}{c} 1459\end{array} \right) $

Standardní vstup Očekávaný výstup Očekávaný chybový výstup Návratová hodnota
1 3
-59 78 -85
*
3 1
78
-28
-97
1 1
1459
žádný 0

Příklad 3 - pub03-m

Standardní vstup Očekávaný výstup Očekávaný chybový výstup Návratová hodnota
2 3
16 41 -98
*
3 1
96
-67
49
žádný
Error: Chybny vstup!
100

Příklad 4 - pub04-m

$ \left( \begin{array}{cc} 81 & -96 & -56 & -9 \\
-19 & 66 & 37 & -21 \\
20 & 49 & -71 & -49 \\
45 & -96 & 20 & 8\end{array} \right) \times \left( \begin{array}{c} -89 & -96 \\
76 & 75 \\
65 & 2\end{array} \right) $

Standardní vstup Očekávaný výstup Očekávaný chybový výstup Návratová hodnota
4 4
81 -96 -56 -9
-19 66 37 -21
20 49 -71 -49
45 -96 20 8
*
3 2
-89 -96
76 75
65 2
žádný
Error: Chybny vstup!
100

Bonusové zadání - více matic a priorita operací

Na vstupu je sekvence matic o maximální délce 100 spolu se zadanými operacemi. Operace vyhodnocujte podle jejich priority a vypište až výslednou matici. To odpovídá tomu, jako kdyby byl následující výraz s maticemi A až F:

$$ A + B * C + D * E - F$$

ozávorkován následujícím způsobem:

$$ A + (B * C) + (D * E) - F$$

Příklad 1 - pub01-o

$ \left( \begin{array}{cc} 6 & 4\end{array} \right) + \left( \begin{array}{cc} -6 & 7\end{array} \right) + \left( \begin{array}{cc} -6 & -4\end{array} \right) = \left( \begin{array}{cc} -6 & 7\end{array} \right) $

Standardní vstup Očekávaný výstup Očekávaný chybový výstup Návratová hodnota
1 2
6 4
+
1 2
-6 7
+
1 2
-6 -4
1 2
-6 7
žádný 0

Příklad 2 - pub02-o

$ \left( \begin{array}{cc} 0 & 4 & -9 \\
-9 & 6 & -4 \\
3 & 5 & -2 \\
-1 & 7 & 5\end{array} \right) \times \left( \begin{array}{cc} -10 & -9 & -8 & 9 \\
-4 & 0 & -9 & 1 \\
4 & 6 & -9 & 5\end{array} \right) + \left( \begin{array}{cc} 0 & -9 & 3 & -6 \\
10 & -9 & 8 & -7 \\
-1 & 0 & 5 & 1 \\
3 & 2 & -9 & 9\end{array} \right) = \left( \begin{array}{cc} -52 & -63 & 48 & -47 \\
60 & 48 & 62 & -102 \\
-59 & -39 & -46 & 23 \\
5 & 41 & -109 & 32\end{array} \right) $

Standardní vstup Očekávaný výstup Očekávaný chybový výstup Návratová hodnota
4 3
0 4 -9
-9 6 -4
3 5 -2
-1 7 5
*
3 4
-10 -9 -8 9
-4 0 -9 1
4 6 -9 5
+
4 4
0 -9 3 -6
10 -9 8 -7
-1 0 5 1
3 2 -9 9
4 4
-52 -63 48 -47
60 48 62 -102
-59 -39 -46 23
5 41 -109 32
žádný 0

Příklad 3 - pub03-o

Standardní vstup Očekávaný výstup Očekávaný chybový výstup Návratová hodnota
2 2
3 x10
-9 5
+
2 2
8 -5
1 8
+
2 2
-4 6
-2 8
žádný
Error: Chybny vstup!
100

Příklad 4 - pub04-o

$ \left( \begin{array}{cc} -1 \\
4\end{array} \right) + \left( \begin{array}{cc} -1 \\
0\end{array} \right) + \left( \begin{array}{cc} 8 & 5 \\
10 & -8\end{array} \right) \times \left( \begin{array}{cc} 5 \\
5\end{array} \right) = \left( \begin{array}{cc} 63 \\
14\end{array} \right) $

Standardní vstup Očekávaný výstup Očekávaný chybový výstup Návratová hodnota
2 1
-1
4
+
2 1
-1
0
+
2 2
8 5
10 -8
*
2 1
5
5
2 1
63
14
žádný 0

Odevzdání a hodnocení

Veřejné příklady + Makefile:

  • Povinné i bonusové zadání: hw06.zip
Povinné zadání Bonusové zadání
Název v BRUTE HW06
Odevzdávané soubory main.c
Argumenty při spuštění žádné
Kompilace pomocí clang -pedantic -Wall -Werror -std=c99
Procvičované oblasti pole variabilní délky
indexování v poli
dynamická alokace paměti
courses/b0b99prpa/hw/hw06.txt · Last modified: 2019/11/13 15:10 by viteks