{{indexmenu_n>5}} ====== 5 - Dynamická alokace, struktury ====== * Pro vyučující: [[courses:bab36prga:internal:tutorialinstruction:05|]] * [[https://docs.google.com/presentation/d/1TCmHpxDIVDeJ5-TyPDultPZVFEACBEqO_3K0Y3xa2RE/edit?usp=sharing|Prezentace pro cvičení ]] * {{ :courses:bab36prga:labs:lab05.zip | Zdrojové kódy a šablona pro cvičení}} ===== 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:b3b36prg:tutorials: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);