{{indexmenu_n>7}} ====== HW 04 - Maticové počty ====== ^ Termín odevzdání | 17.11.2018 23:59 CET | ^ Povinné zadání | 4b | ^ 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 [[http://valgrind.org/|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í: {{ :courses:b0b99prpa:hw:b0b99prpa-hw04.zip |}} ^ ^ Povinné zadání ^ Bonusové zadání ^ ^ Název v BRUTE | HW04 || ^ 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 |