{{indexmenu_n>7}} ====== HW 07 - Maticové počty ====== ^ Termín odevzdání | 28.11.2020 05.12.2020 23:59 CET | ^ Bodový zisk | 7b (2+2+3) | ^ Min. bodový zisk | 2b | ^ Počet uploadů | 10 15 | ^ Typ zadání | povinné | 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 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. ====== Zadání A - součet a rozdíl 2 matic ====== 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. ====== Zadání B - součet, rozdíl a násobení 2 matic ====== 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. ====== Zadání C - 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 \times C + D \times E - F$$ ozávorkován následujícím způsobem: $$ A + (B \times C) + (D \times E) - F$$ ===== Formát vstupu ===== * Na standardním vstupu jsou dvě matice (zadání A a B; v zadání C 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. * 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''. * 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 A1 - pub_a01 ==== $$ \begin{bmatrix} 76 & 98 & -31 \\ 30 & 30 & 32 \end{bmatrix} - \begin{bmatrix} 89 & 25 & 38 \\ 1 & -32 & -38 \end{bmatrix} = \begin{bmatrix} -13 & 73 & -69 \\ 29 & 62 & 70 \end{bmatrix} $$ ^ 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 A2 - pub_a02 ==== ^ 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 B1 - pub_b01 ==== $$ \begin{bmatrix} -59 & 78 & -85 \end{bmatrix} \times \begin{bmatrix} 78 \\ -28 \\ -97 \end{bmatrix} = \begin{bmatrix} 1459 \end{bmatrix} $$ ^ 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 B2 - pub_b02 ==== $$ \begin{bmatrix} 81 & -96 & -56 & -9 \\ -19 & 66 & 37 & -21 \\ 20 & 49 & -71 & -49 \\ 45 & -96 & 20 & 8 \end{bmatrix} \times \begin{bmatrix} -89 & -96 \\ 76 & 75 \\ 65 & 2 \end{bmatrix} $$ ^ 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 | ==== Příklad C1 - pub_c01 ==== $$ \begin{bmatrix} 6 & 4 \end{bmatrix} + \begin{bmatrix} -6 & 7 \end{bmatrix} + \begin{bmatrix} -6 & -4 \end{bmatrix} = \begin{bmatrix} -6 & 7 \end{bmatrix} $$ ^ 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 C2 - pub_c02 ==== $$ \begin{bmatrix} 0 & 4 & -9 \\ -9 & 6 & -4 \\ 3 & 5 & -2 \\ -1 & 7 & 5 \end{bmatrix} \times \begin{bmatrix} -10 & -9 & -8 & 9 \\ -4 & 0 & -9 & 1 \\ 4 & 6 & -9 & 5 \end{bmatrix} + \begin{bmatrix} 0 & -9 & 3 & -6 \\\ 10 & -9 & 8 & -7 \\ -1 & 0 & 5 & 1 \\ 3 & 2 & -9 & 9 \end{bmatrix} = \begin{bmatrix} -52 & -63 & 48 & -47 \\ 60 & 48 & 62 & -102 \\ -59 & -39 & -46 & 23 \\ 5 & 41 & -109 & 32 \end{bmatrix} $$ ^ 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 C3 - pub_c03 ==== ^ 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 C4 - pub_c04 ==== $$ \begin{bmatrix} -1 \\\ 4 \end{bmatrix} + \begin{bmatrix} -1 \\ 0 \end{bmatrix} + \begin{bmatrix} 8 & 5 \\ 10 & -8 \end{bmatrix} \times \begin{bmatrix} 5 \\ 5 \end{bmatrix} = \begin{bmatrix} 63 \\ 14 \end{bmatrix} $$ ^ 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 | Více příkladů najdete v níže přiloženém zip archivu ====== Odevzdání ====== Veřejné příklady + Makefile: * Všechny zadání: {{ :courses:b0b99prpa:hw:hw07-matice.zip |}} ^ ^ Zadání ^ ^ Název v BRUTE | HW07 | ^ 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 |