{{indexmenu_n>7}}
====== Lab 07 - Dynamická alokace, struktury ======
* Pro vyučující: [[courses:bab36prga:internal:tutorialinstruction:07|]]
{{ :courses:bab36prga:labs:lab07-sources.zip |Výchozí soubory lab07-sources.zip}}
===== Procvičovaná témata =====
* Funkce ''malloc'', ''calloc'', ''free''
* Ukazatel, 2D pole, a pole polí
* Složené typy - struktury
* Dynamická alokace
* Příprava na násobení matic
==== Teoretická příprava ====
* [[courses:bab36prga:tutorials:coding:c_dyn_mem]]
* [[https://en.wikipedia.org/wiki/Standard_deviation|Smerodatna odchylka]]
===== Úkoly na cvičení =====
- Napište funkci, která formátovaně vypíše obecné pole reálných čísel.
- Napište funkci, která vypočte směrodatnou odchylku z prvků zadaného pole.
- Napište funkci, která zajistí načtení n prvků z klávesnice do pole a toto pole předá do volající funkce. Počet prvků bude zadán jako parametr funkce.
- Společně s cvičícím si předveďte použití Valgrindu pro diagnostiku přístupů do paměti a správné alokace.
- Aplikujte funkce pro výpis a výpočet směrodatné odchylky na pole získané načítací funkcí. Nezapomeňte na dealokaci pole při ukončení programu!
- Upravte předchozí funkci tak, aby byla schopna načíst libovolnou posloupnost reálných čísel do pole ukončenou vhodnou zarážkou nebo lépe pomocí EOF, umí-li to vaše konzole.
- Upravte předchozí kód tak, aby bylo možné načíst od uživatele více datových řad a pro každou zvlášť spočítat směrodatnou odchylku. Jednoduše to zařídíte tak, že vytvoříte dvourozměrné pole, které ale může mít různé délky řádků. Nezapomeňte zajistit i dealoakaci celého pole!
- Vždy kontrolujte program pomocí Valgrindu
===== Další úlohy k procvičení =====
==== Pointerová aritmetika ====
- Odhadněte výsledek a ověřte programem:
int *up, **uup, array[] = {5, -6, 0, 8, -9, 3, 1, -4};
up = array;
uup = &up;
printf("array[1] = %d \n", array[1]);
printf("array[1] + 4 = %d \n", array[1] + 4);
printf("(array + 1)[2] = %d \n", (array + 1)[2]);
printf("*up = %d \n", *up);
printf("*up + 4 = %d \n", *up + 4);
printf("*(up + 1) = %d \n", *(up + 1));
printf("**uup = %2d \n", **uup);
printf("*(*uup + 2) = %2d \n", *(*uup + 2));
printf("**uup + 4 = %2d \n", **uup + 4);