ZPRO cvičení 8 Martin Flusser Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague December 7, 2016
Outline I 1 Outline 2 Dynamické alokování paměti 3 Dynamická alokace cvičení 4 Uživatelské rozhranní 5 UI cvičení 6 Domácí úkol 7 Zdroje
Dynamické alokování paměti Do ted jsme používali jen tzv. statické alokování, kdy bylo již při překladu známo, kolik proměnných a jaké velikosti budeme používat. Dynamické alokování umožnuje alokovat pamět za běhu programu. Můžeme pracovat s daty o kterých nevíme dopředu jak jsou rozsáhlá.
Provedení a syntaxe Základem je vhodný ukazatel a operátory new a delete
Provedení a syntaxe Základem je vhodný ukazatel a operátory new a delete 1 int * a = new int ; 2 double * d = new double ; 3 //... 4 delete a; 5 delete d;
Provedení a syntaxe Základem je vhodný ukazatel a operátory new a delete 1 int * a = new int ; 2 double * d = new double ; 3 //... 4 delete a; 5 delete d; Operátor new vrací nulový ukazatel při neúspěšné alokaci. Proč je nutné používat delete?
Provedení a syntaxe pro pole Základem je vhodný ukazatel a operátory new[] a delete[] 1 int *a = new int [10]; 2 double * d = new double [ 5]; 3 //... 4 delete [] a; 5 delete [] d;
Dynamická alokace cvičení 1 Warm up: Dynamicky alokujte int. Funkcnost overte pomoci cin a cout. 2 Do stejného ukazatele alokujte, naplňte a vypiste pole o třech prvcích. Použijte funkci pro výpis pole z předchozích cičení. Nezapomeňte správně mazat.
Dynamická alokace cvičení cv3 zadání Cílem je napsat funkci pro přidávání prvku do již plného dynamicky alokovaného pole. int* pridej do pole (int pole [], int* velikost, int pridavany prvek)
Dynamická alokace cvičení cv3 zadání Cílem je napsat funkci pro přidávání prvku do již plného dynamicky alokovaného pole. int* pridej do pole (int pole [], int* velikost, int pridavany prvek) 1 Vytvoříme nové o 1 větší pole. (V praxi se vytvoří nové pole o několik prvků větší) 2 Zkopírujeme obsah z původního pole do nového - pomocná fce void prekopiruj pole (const int pole1 [], int pole2 [], int velikost )
Dynamická alokace cvičení cv3 zadání Cílem je napsat funkci pro přidávání prvku do již plného dynamicky alokovaného pole. int* pridej do pole (int pole [], int* velikost, int pridavany prvek) 1 Vytvoříme nové o 1 větší pole. (V praxi se vytvoří nové pole o několik prvků větší) 2 Zkopírujeme obsah z původního pole do nového - pomocná fce void prekopiruj pole (const int pole1 [], int pole2 [], int velikost ) 3 Přidáme nový prvek na poslední místo 4 Smažeme staré pole 5 Ukazatel na nové pole vrátíme (return) Otestujte (párkrát zavolejte)
cv1 a cv2 1 int * ukaz ; 2 3 ukaz = new int ; 4 * ukaz = 3; 5 cout < <* ukaz << endl ; 6 delete ( ukaz ); 7 8 ukaz = new int [3] {1,3,5}; 9 vypis_pole (ukaz,3); 10 delete [] ( ukaz );
Kopírování pole 1 void prekopiruj_pole ( const int pole1 [], 2 int pole2 [], int velikost ) 3 { 4 for ( int i =0; i < velikost ; i ++ ) 5 pole2 [i] = pole1 [i]; 6 }
Funkce přidej do pole 1 int * pridej_do_pole ( int pole [], int * velikost, 2 int pridavany_prvek ) 3 { 4 int * tmp_pole = new int [* velikost + 1]; // vytvorime nove pole o 1 vetsi 5 6 prekopiruj_ pole ( pole, tmp_ pole, * velikost ); // zkopirujeme do nej stare 7 8 tmp_pole [* velikost ] = pridavany_prvek ; // na posledni misto dame novy prvek 9 // pole delky ( velikost +1) ma posl. index = veliko 10 11 delete [] ( pole ); // stare pole smazem 12 (* velikost ) ++; // zvetseni velikosti 13 return tmp_pole ;
Uživatelské rozhranní Umožňuje ovládat program Cílem bude vytvořit malou databázi (pole) čísel, takovou že:
Uživatelské rozhranní Umožňuje ovládat program Cílem bude vytvořit malou databázi (pole) čísel, takovou že: Program bude pořád spuštěný, ale pracovat bude jen, když mu něco zadáme
Uživatelské rozhranní Umožňuje ovládat program Cílem bude vytvořit malou databázi (pole) čísel, takovou že: Program bude pořád spuštěný, ale pracovat bude jen, když mu něco zadáme V libovolnou chvíli můžeme přidat další číslo
Uživatelské rozhranní Umožňuje ovládat program Cílem bude vytvořit malou databázi (pole) čísel, takovou že: Program bude pořád spuštěný, ale pracovat bude jen, když mu něco zadáme V libovolnou chvíli můžeme přidat další číslo V libovolnou chvíli můžeme vypsat všechna čísla
Uživatelské rozhranní Umožňuje ovládat program Cílem bude vytvořit malou databázi (pole) čísel, takovou že: Program bude pořád spuštěný, ale pracovat bude jen, když mu něco zadáme V libovolnou chvíli můžeme přidat další číslo V libovolnou chvíli můžeme vypsat všechna čísla Program se ukončí na náš příkaz Pozn: všechny funkce už máme, zbýva jen vyřešit jak a kdy je volat.
Příklad jednoduchého UI 1 ========================================= 2 Mame 10 zaznamu. Co budeme delat? 3 ----------------------------------------- 4 Vypsat... V 5 Pridat... P 6 Ukoncit... Q 7 ----------------------------------------- Nacteme char jako odpoved Kus kódu je v nekonečné smyčce Pomoci if nebo switch provedeme odpovidajici cinnost
Swicth 1 switch (ch) 2 { 3 case v : 4 case V : 5 cout <<" Vypis vsech prvku " << endl ; 6 vypis_pole ( pole, velikost ); 7 break ; 8 case q : 9 case Q : 10 delete [] pole ; 11 exit (0); 12 break ; 13 default : 14 cout <<" Neplatne zadani : -(... Opakujte " < 15 }
UI cvičení 1 Vytvořte uživatelské rozhraní pro databázi čísel 2 Zkoušejte 3 Testujte 4 Lad te
Domácí úkol 1 Dolad te program ze cvičení 2 Dodělejte možnost, která nechá uživatele zadat číslo a ověří, jestli se dané číslo vyskytuje v databazi. Také se napočítá jeho četnost.
Zdorje 1 http :// kmlinux. fjfi. cvut.cz /~ fabiadav / cecko 2 / poznamky -k-jazyku - c_plus_plus / 3 dynamicka - alokace