Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Vaše první aplikace V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a.

Podobné prezentace


Prezentace na téma: "Vaše první aplikace V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a."— Transkript prezentace:

1 Vaše první aplikace V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL #include #include using namespace std; int main(int countArgs,char *argch[]){ cout << "Hello world"; return 0; } #include udává knihovnu pro vstupy a výstupy Funkce main je základním vstupním bodem do vašeho programu. Zjednodušeně si lze představit, že váš program funkcí main začíná a končí. Instance std::cout přijme řetězec Hello world a postará se o jeho vypsání na obrazovku return 0 říká, že se má funkce ukončit a vrátit hodnotu 0 V případě že bychom chtěli získat vstup z klávesnice použijeme objekt std::cin

2 Proměnné V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL Syntaxe:typ identifikátor = počáteční hodnotaSyntaxe:typ identifikátor = počáteční hodnota Proměnná slouží k uchování hodnot. Je určena rozsahem svých hodnot a přesností – to určuje datový typ v C++ máme několik základníchProměnná slouží k uchování hodnot. Je určena rozsahem svých hodnot a přesností – to určuje datový typ v C++ máme několik základních int – celé číslo( signed – se znaménkem, unsigned )int – celé číslo( signed – se znaménkem, unsigned ) Rozsah hodnot je 2^63Rozsah hodnot je 2^63 long- celé číslo s větším rozsahem(většinou – záleží na kompilátoru)long- celé číslo s větším rozsahem(většinou – záleží na kompilátoru) bool –logická hodnota, může nabývat hodnot true =1, nebo false =0bool –logická hodnota, může nabývat hodnot true =1, nebo false =0 char a wchar_t – jsou znakové typy, tzn.mohou obsahovat znak.char a wchar_t – jsou znakové typy, tzn.mohou obsahovat znak. char může obsahovat jeden z ASCII znaků(256 kombinací).char může obsahovat jeden z ASCII znaků(256 kombinací). wchar_t je UNICODE, tzn. mezinárodní znakywchar_t je UNICODE, tzn. mezinárodní znaky float a double – jsou typy pro ukládání hodnot reálných číselfloat a double – jsou typy pro ukládání hodnot reálných čísel float na 7 platných ciferfloat na 7 platných cifer double na 15 platných ciferdouble na 15 platných cifer

3 Proměnné V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL Proměnné se ukládají na vrchol zásobníku(TOS) a při definici můžeme přiřadit hodnotu dvěma způsoby,přičemž oba dva jsou ekvivalentní.Proměnné se ukládají na vrchol zásobníku(TOS) a při definici můžeme přiřadit hodnotu dvěma způsoby,přičemž oba dva jsou ekvivalentní. int promenna = 10;int promenna = 10; int promenna(10);int promenna(10); Pokud přiřazujeme libovolné proměnné nějakou hodnotu, která je literál(hodnota zadaná v době programování např.10), jedná se automaticky o konstantu.Např. v předchozím příkladě jsme v obou případech inicializovali literálem resp. konstantou.Proměnné můžeme i navzájem přiřazovatPokud přiřazujeme libovolné proměnné nějakou hodnotu, která je literál(hodnota zadaná v době programování např.10), jedná se automaticky o konstantu.Např. v předchozím příkladě jsme v obou případech inicializovali literálem resp. konstantou.Proměnné můžeme i navzájem přiřazovat

4 Ukázka proměnné V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL Chceme vytvořit program,jenž nám získá hodnotu od uživatele a opět jí vypíše. Chceme vytvořit program,jenž nám získá hodnotu od uživatele a opět jí vypíše. #include #include int main(int countArgs,char *argch[]){ int pocet_studentu = 0; std::cout << "Studenti:";//výstup std::cin >> pocet_studentu;//vstup z klávesnice std::cout <<"Pocet studentu ve tride:" << pocet_studentu; return 0; } VÝSTUP:Studenti:25 Pocet studentu ve tride:25

5 Aritmetické operátory V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL Stejně jako v matematice máme aritmetické operátory +, -, *, /. Pro tyto operátory platí stejná pravidla jako v matematice.Např. int promenna=9/3;//nyní bude obsah promenna 3 Dále máme operátory inkrementace a dekrementace. Inkrementace znamená zvýšení o 1, dekrementace snížení o 1.Pro obě dvě varianty existuje ještě prefix a postfix.Uvedu příklad: int prom1 = 10;// prom1 obsahuje 10 int prom2 = prom1++; // postfix prom2 obsahuje 10 prom1 // se zvýší o 1 int prom1 = 10;// prom1 obsahuje 10 int prom2 = ++prom1;// prefix prom2 obsahuje 11 stejně // jako prom1 Existuje také zbytek po dělení, tzv.modulo.Operátor modula má syntaxi op1%op2.Bude jednodušší si to předvést na příkladu: 6 % 3 = 0, 6%5 = 1, 13 % 8 = 5,64 % 3 = 1

6 Bitové operátory V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL Potřebujeme-li pracovat s jednotlivými bity požijeme k tomu bitové operátory. Máme li proměnnou, můžeme provést s jejím obsahem bitovou konjunkci,disjunkci a nonekvivalenci. Bitová nonekvivalence( ^ ) Daný bit výsledku je roven 1, jsou-li odpovídající bity různé.Jsou-li shodné, výsledek je 0 1 ^ 1 = 0,1 ^ 0 = 1, 0 ^ 0 = 0 Bitová disjunkce( | ) Daný bit výsledku je roven 1, je-li aspoň jeden z operandů roven 1, jinak je výsledek 0 1 | 1 = 1, 1 | 0 = 1, 0 | 0 = 0 Bitová konjunkce( & ) Daný bit výsledku je roven 1, jsou odpovídající bity obou operandů rovny 1, jinak je roven 0 1 & 1 = 1, 1 & 0 = 0,0 & 0 = 0

7 Bitové operátory V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL Představme si proměnnou unsigned short a, jenž obsahuje hodnotu 200, což je hexadecimálně 0xC8, binárně b a unsigned short b, jenž obsahuje 217 = hexadecimálně 0xD8 = binárně b Bitová nonekvivalence a^b ^ Bitová konjunkce a&b & Bitová disjunkce a|b |

8 Relační operátory V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL Pokud potřebujeme porovnat nějaké dvě hodnoty resp.proměnné, použijeme k tomu relační operátory. Máme rovnost, nerovnost, větší, menší, větší nebo rovno a menší nebo rovno. Rovnost syntaxe: a==b. Pokud má proměnná a stejnou hodnotu jako b, tak je výsledek true, jinak false. Nerovnost syntaxe: a!=b.Pokud má proměnná a různou hodnotu od b, tak je výsledek true, jinak false. Menší syntaxe: ab.Výsledek je true, je-li a větší než b Větší nebo rovno:syntaxe: a>=b.Výsledek je true je li a větší nebo rovno b.

9 Logické operátory V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL Logické operátory pracují s proměnnou jako s celkem. Bitové operátory vezmou hodnotu dané proměnné a každý bit vyhodnotí postupně. Předpokládejme opět nějaké dvě proměnné, int a = 10 a int b = 0.Pokud bychom pracovali, pomocí bit.operátorů, např. bitová konjunkce, tzn. a & b, kompilátor by vzal 1010 & 0000 a výsledek by byl 0. Logický operátor vezme hodnotu a pokud je proměnná jakákoli kromě 0, je true. Logický součin && (AND) Platí pro něj podobná pravidla jako pro bitovou konjunci, tzn., je-li hodnota operandu a jakákoli kromě 0 a b též, je výsledek 1, jinak 0 bool vysledek = a && b ; bude 0, jelikož a je sice jakékoli kromě nuly, ovšem b je 0 bool vysledek = a && 1 ; bude 1, jelikož a je jakékoli od nuly a b je 1.Obsah proměnné výsledek bude 1. Logický součet || (OR) Platí pro něj pravidla podobná jako pro disjunkci, ovšem s tím, že vezmou o proměnnou a a b, pokud je aspoň jedna proměnná jakákoli od nuly je výsledek 1, jinak 0 Negace !(NOT) Pokud je obsah libovolné proměnné 0 je výsledek 1, je-li jakýkoli kromě nuly je výsledek 1. Syntaxe:! proměnná

10 Vstupy a výstupy V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL Pro vstup a výstup do našeho programu používáme objekty cin a cout, které jsou součástí normy jazyka C++(STL).Pokud se chceme zprostit psaní std:: před každým voláním cin a cout napíšeme hned za #include příkaz using namespace std;. cout objekt slouží k výstupu na obrazovku.Hodnoty do tohoto objektu posíláme pomocí operátoru << a tento operátor je schopen přijímat všechny standardní typy včetně řetězců(o těch později).Operátor se vyhodnocuje z leva na pravou stranu, a jednotlivé proměnné se oddělují <<. cout << prom1 << prom2 << prom_n;//vypíše prom1 //potom prom2 až do prom_n cin slouží k přijímání vstupu z klávesnice.Hodnoty z výstupu posíláme pomocí operátoru >> a operátor opět vyhodnocuje z leva do prava.Proměnné oddělujeme >> cin >> prom1 >> prom2 >> prom_n;//nahraje vstup do //prom1 potom do prom2 až do prom_n

11 Podmíněný příkaz V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL Podmíněný příkaz: Syntaxe podoba 1: if(výraz1) {příkaz1;} další_příkaz; Syntaxe podoba 2: if(výraz1) {příkaz2;} else{příkaz2;} Podoba 1:Je-li výraz1 vyhodnocen jako pravdivý,provede se příkaz1 a pokračuje příkazem další_příkaz.Není-li pravda, příkaz1 ignoruje Podoba 2:Vyhodnotí-li se výraz jako pravdivý provede se příkaz1,jinak se provede příkaz2.Potom bude program pokračovat dalším příkazem.

12 Podmíněný příkaz - příklad V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL #include int main(int countArgs,char *argch[]){ int nejakaPromenna = 0; std::cout << "Zadejte hodnotu promenne"; std::cin >> nejakaPromenna; if(nejakaPromenna < 10){ std::cout << "Hodnota promenne je mensi nez 10"; } else{ std::cout << "Hodnota je vetsi, vc.10"; } return 0; }

13 Smyčka while V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL Syntaxe: while(podmínka) {příkaz;} Když se podmínka vyhodnotí jako pravdivá, provede se příkaz a pak se znovu otestuje podmínka. Je-li pravdivá, provede se příkaz znovu a opakuje se do té doby,než přestane platit podmínka. continue : Příkaz continue způsobí, že smyčka se vrátí zpět na svůj začátek,tzn.tváří se jako kdyby začal nový cyklus. break :příkaz break způsobí,že smyčka while okamžitě ukončí svůj běh a pokračuje příkazem za složenou závorkou.Např.: while(podmínka) { if(podmínka2) break; příkazy; } Zde žádáme aby se cyklus ukončil break skočí sem a ukončí smyčku

14 Smyčka do…while V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL Syntaxe: do {příkaz;}while(podmínka); Provede se příkaz a pak se vyhodnotí podmínka,je-li pravdivá smyčka se zopakuje.V opačném případě smyčka skončí. Smyčka do…while se používá v okamžiku kdy si chceme být jisti že se tělo smyčky provede aspoň jednou Např: char z = 'a'; do{ cout << z << ' '; z++; }while(z <= 'z');

15 Smyčka for V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL Syntaxe: for(inicializace;test;akce) {příkaz;} Příkaz inicializace se používá většinou k inicializaci stavu čítače, nebo k podobnému úvodnímu nastavení smyčky test je výraz který se při každém průchodu cyklem testuje je-li pravdivý, provede se příkaz (tělo cyklu) a provede se akce v hlavičce(obvykle zde dojde ke zvýšení hodnoty čítače. Smyčka do…while se používá v okamžiku kdy si chceme být jisti že se tělo smyčky provede aspoň jednou Např: for(int i = 0; i < 10; i++){ std::cout << "Ahoj!"; } Vypíše desetkrát Ahoj! na obrazovku.

16 Symčky - příklad V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL #include int main(int countArgs,char *argch[]){ int co,na_kolik; std::cout > co; std::cout > na_kolik; int vysledek = 1; for(int n = na_kolik; n > 0; n--){ vysledek = vysledek * co; } std::cout << "vysledek" << vysledek; return 0; } Napište program jenž spočítá n tou mocninu z čísla x

17 Smyčka for V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL Syntaxe: switch(výraz) { case prvníHodnota:příkaz1;break; case druháHodnota:příkaz2;break;... default:příkaz;break; } Příkaz switch umožňuje větvení podle více hodnot výrazu. Výraz se vyhodnotí a jestliže odpovídá některé hodnotě case, skočí vykonávání na řádek kde se case nachází. Jestliže neodpovídá ani jedna hodnota skočí(pokud je definován) na příkaz default. Příaz(y) se vykonávají dokud nenarazí na break, po němž se přesune chod programu za složenou závorku.

18 Funkce V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL Syntaxe: Návratový_typ název(typ parametr1,typ parametr2,…,typ parametr_n){ tělo funkce; return hodnota; } Funkce nám umožňují rozdělit program na části, které se vykonají, jen v případě, že danou funkci zavoláme. V podstatě rozdělí program na části, které lze vykonávat několikrát, aniž bychom museli opisovat zdrojový kód. Funkce vrátí hodnotu typu jenž je typem Návratový_typ. Všechny proměnné definované v bloku funkce(uvnitř funkce) včetně parametrů jsou lokální proměnné, pro které platí že vzniknou při volání funkce a zanikají když funkce skončí(volání příkazu return ) Volání má syntaxi: název(hodnota1,hodnota2,…,hodnota_n); kde hodnota1 odpovídá parametr1, hodnota2 parametru2 atd.S těmito proměnnými lze manipulovat jako by byli definovány uvnitř funkce.

19 Funkce - příklad V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL Představme si že chceme vypočítat n-tou mocninu x, výpočet mocniny budeme potřebovat ve více bodech naší aplikace, to ovšem obnáší vložit do každého bodu programu cyklus pro výpočet. Proč to tak komplikovat? Můžeme vytvořit funkci, což je posloupnost nějakých příkazů, které jsou vykonány v okamžiku kdy chceme. Pomocí funkcí lze toto implementovat: int mocnina(int x, int n){ for(int vysl = 1; n > 0; n--) { vysl = vysl*x; }; return vysl; // vrátí výsledek } Pokud budeme potřebovat uložit hodnotu výsledku(návratové hodnoty) do nějaké proměnné použijeme jí zkrátka jako operand, tzn. int vysledek = mocnina(10,3);//obsah vysledek bude 1000 cout << mocnina(2,2); // vypíše na obrazovku 4

20 Oblast platnosti a viditelnosti V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL int x = 5; {int x = 10; cout << x; //vypíše 10 {int x = 15; cout << x; //vypíše 15 } cout << x; //vypíše 10 }// Int x; nelze int x jsme již definovali Proměnná jenž je definovaná mimo jakákoli blok(funkci,tělo cyklu atd.) je globální proměnná a existuje při běhu celé aplikace. Oblast viditelnosti je oblast v níž můžeme danou proměnnou používat, začíná od místa její deklarace a končí na konci bloku, nebo souboru Oblast platnosti je blok(zjednodušeně si lze představit to co je ve složených závorkách {} – tělo cyklu,tělo funkce…)kde proměnná existuje, po opuštění bloku automaticky zaniká.Této proměnné se říká lokální proměnná. Proměnná je ve svém bloku nadřazená, tzn.všechny proměnné nadřazených bloků se překryjí. Po opuštění bloku zanikají Tato proměnná přepíše proměnnou v nadřazeném bloku (ta co obsahuje 10)

21 Funkce-přetěžování V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL int funkce(int a); //deklarace funkce int funkce(char a); //deklarace funkce int funkce(float a,char); int main(){ // … } int funkce(int a){return a;}// definice funkce int funkce(char a){return b;}// definice funkce Funkce lze přetěžovat, tzn. je-li k dispozici více funkcí s různými parametry, tak si kompilátor vybírá mezi vhodnými kandidáty. Při volání funkce(10); se zavolá int funkce(int a) Při volání funkce(‘a‘); se zavolá int funkce(char); Při volání funkce(0.5,‘a‘) se zavolná int funkce(float,char); Tato proměnná přepíše proměnnou v nadřazeném bloku (ta co obsahuje 10)

22 Přetypování V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL Předpokládejme následující funkci: float sin(int angle); A my máme proměnnou: float uhel = 60.3; My potřebujeme vypočítat sin(uhel). Kompilátor dokáže udělat z nějakého typu jiný, pokud je to možné, mnohdy ovšem se ztrátou.V našem případě se typ float proměnné uhel konvertuje v parametru funkce na int, ovšem s tím že „odsekne“ desetinnou část. To samé platí při inicializaci, int uhel = 30.5;, se konvertuje na celé číslo, tím odsekne(nezaokrouhlí!) a obsah proměnné uhel bude 30 I char se dokáže konvertovat, pokud budeme např.inicializovat, char i = 97.9; tak se 97.9 nejdříve konvertuje na int, takže to bude 97 a poté na char, což představuje v ASCII tabulce znak ‘a‘. Můžeme si přetypování vynutit explicitně pomocí syntaxe: (typ_který_chceme)promenná Výsledek bude proměnná typu typ_který_chceme. char = (char)98;// bude obsahovat ‘b‘

23 Pole V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL Syntaxe: typ identifikátor[počet]; Pole vytvoří posloupnost proměnných(i v paměti jdou za sebou) určitého počtu. Typ udává typ všech prvků pole, identifkátor je označení daného pole, počet udává počet prvků v poli. Přístup k prvkům je pomocí indexů v hranatých závorkách: Identifikátor[index] Potřebujeme vytvořit 4 proměnné typu celé číslo, zapíšeme: int pole[4]; a k jednotlivým prvkům přistupujeme pomocí indexů 0,1,2 nebo 3. C++ bere 0 také jako číslo, tzn. 1.prvek má index 0,2. má 1 atd.Tuto posloupnost lze zapsat jako n-1 kde n je prvek ke kterému chceme přistupovat. Inicializujeme typ indentifikátor[n] = {prvek1,prvek2,…prvek_n}; přičemž se na index 0 nahraje hodnota prvek1, na 1 hodnota prvek2 atd. –Pokud nedoplníme počet prvků( n ), a doplníme inicializcaci ( {…} ), kompilátor si sám dokáže odvodit počet prvků

24 Ukazatele V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL Syntaxe: typ *identifikátor; typ *identifikátor = &proměnná; Ukazatel je proměnná, která obsahuje adresu jiné proměnné nebo funkce.Operátor & vrací adresu proměnné Kompilátor využívá toho, že každá proměnná má svou adresu v paměti a tím, že ukazatel je proměnná která v sobě uchovává adresu jiné proměnné do sebe nahrává adresu nějakého místa v paměti s kterým může následně manipulovat. Ukazatel nám umožňuje pracovat s proměnnou umístěnou kdekoli v programu někde jinde. Příkladem může být funkce, kdy jako parametr předáme ukazatel na nějakou proměnnou a pracujeme s touto proměnnou. Proměnná kterou jsme předali v parametru funkce bude měněna. Dereferencování ukazatele:Potřebujeme-li pracovat s proměnnou jehož adresa je uložena v ukazateli, musíme ukazatel derefencovat, pomocí operátoru * před názvem ukazatele.

25 Ukazatele V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL Předpokládejme že máme proměnnou float float e = 2.71;// definice proměnné e float *p_e = &e; *p_e = std::cout << e; // vypíše Na tomto příkladu bylo evidentní, že jsme nejdříve vzali adresu proměnné e, nahráli jsme jí do ukazatele p_e a na 3.řádku jsme jeho hodnotu změnili dereferencováním ukazatele.Na obrazovku se odešle hodnota změněné proměnné e Pole úzce souvisí s ukazateli, protože první prvek pole bez indexu je ukazatel na první prvek char pole[10]; char *p_pole = pole; // nyní máme adresu prvního prvku pole char *p_pole2 = &pole[0] // to samé jako v předchozím případě

26 Řetězce,pole a ukazatele V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL Ale lze napsat následující konstrukci.Jelikož řetězec uzavřený v uvozovkách je pole a jak jistě víme, tak oba dva tyto příkazy se nám překonvertují na ukazatel na první prvek pole char * pole = "ahoj"; char *pole; pole = "ahoj"; Pro řetězce existují dva způsoby inicializace –char pole[] = {'A','h','o','j',0}; kde inicializujeme každá prvek zvlášť a nakonec přidáme ukončovací znak, který značí kde řetězec končí –char pole[] = "Ahoj"; je to samé jako předchozí případ, s tím že celý řetězec dáme do uvozovek a poslední ukončovací znak si přidá kompilátor. !!!POZOR!!!Nelze ovšem inicializovat posléze, to platí pro pole jakéhokoli typu char pole[10]; pole = "ahoj";

27 Aritmetika ukazatelů V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL S ukazateli a poli lze provádět některé aritmetické operace.Tato tzv.adresová aritmetika slouží především pro práci s poli pomocí ukazatelů na prvky. Přičteme-li ukazateli nebo poli celé číslo n posune se ukazatel o n prvků pole dále, takže např. int pole[6]; int * uk = pole; *(uk+4) = 3; // je to samé jako pole[4] = 3; *(pole + 4) = 4; To samé lze provést s polem.Můžeme použít i inkrementaci a dekrementaci(pouze na ukazatele!) Překladač ani běžící program nekontrolují zda programátor překročil meze, proto je na to dbát pozor, mnohdy může mít tato chyba dalekosáhlé důsledky.

28 Dynamická alokace a dealokace V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL Syntaxe: typ * ukazatel = new typ; typ * ukazatel = new typ[počet]; C++ nám umožňuje dynamicky alokovat proměnnou nebo pole. Pokud vytváříme proměnné způsobem typ název vytváříme proměnnou na zásobníku, který je značně omezený. Funkce new vrací ukazatel na nějaké místo v paměti, které se uvolnilo pro vaší proměnnou. new[počet] vrací ukazatel na první prvek pole po velikosti počet Pracuje dokud je paměť fyzicky v počítači volná(nebo není jiné omezení). Pokud proměnnou resp.její místo v paměti nepotřebujeme měli bychom její místo uvolnit pro jiné programy, nebo proměnné.To lze pomocí operátoru delete, který uvolní místo v paměti. Syntaxe: delete ukazatel; delete [] ukazatel; Pokud paměť neuvolníme zůstane až do restartu celého systému obsazená

29 Příklad V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL Napište program jenž bude inicializovat globální pole pomocí funkce a nakonec jej zobrazí ve funkci main.Pole bude typu int. #include int pole[] = {0,1,2,3,4};//kompilátor si sám zjistí počet prvků //podle počtu inicializátorů - 5 void napln(int cim){ for(int i = 0; i < 5; i++) { pole[i] = cim; } } int main(){ napln(10); for(int i = 0; i< 5; i++) { std::cout<

30 Příklad V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL Napište program pomocí funkce prohodí dvě proměnné,ovšem bez toho aniž bychom museli nějakou proměnnou sdílet globálně #include void swap(int *a,int *b ){ int pom = *a; *a = *b; *b = pom; } int main(){ int x1, x2; x1 = 14;x2 = 3; swap(&x1, &x2); return 0; }

31 Výčtový typ V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL Syntaxe: enum jmenovka { položka_1 = inicializátor, …, položka_n}; Jmenovka představuje název daného výčtového typu,ve složených závorkách jsou jednotlivé položky, přičemž pokud nepřidělíme první položce nějakou hodnotu přidělí se jí automaticky 0 a každé další o o hodnotu větší,takže položka_n bude zastupovat číslo n - 1 Výčtové typy pomáhají vyjádřit v programu skutečnosti které stačí popsat pouze celými čísly,ale u nichž potřebujeme omezit rozsah přiřaditelných hodnot. Výčtovým typem nám vznikne nový typ, do kterého můžeme přiřazovat celá čísla, nebo výčty(položky) Např.dny v týdnu bychom mohli napsat jako 1-7,nebo lépe pojmenovanými konstantami s uvedenými hodnotami,takže enum tyden {PO = 1,UT,ST,CT,PA,SO,NE};

32 Výčtové typy V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL Budeme k tomu potřebovat výčtový typ, který si můžeme nadefinovat následovně: enum tyden{po = 1,ut,st,ct,pa,so,ne}; Napište program s jednou funkcí, která přijme parametrem výčtový typ který má definované dny v týdnu a vypíše den v týdnu na obrazovku. A ještě funkci která bude mít deklaraci: void vypisDen(tyden data);

33 Modulární programování V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL Pro zjednodušení našich programů, je zvykem, oddělovat definice a deklarace od funkcí. Deklarace se dávají do hlavičkových souborů a přidávají se pomocí příkazu #include "soubor.h“. Deklarace informují překladač a soubor kde jsme vložili soubor pomocí include o tom že někde existuje nějaká funkce.Definici si dokáže kompilátor najít(pokud ovšem existuje). Definice se dávají do souborů s příponou cpp,c nebo cxx a není vhodné je vkládat jako hlavičkové soubory, protože může existovat maximálně jedna definice nějaké funkce nebo proměnné //Soubor druhaMocnina.h #include int druhaMocnina(int x); //deklarace //Soubor druhaMocnina.cpp #include "druhaMocnina.h" int druhaMocnina(int x){ return x*x;}//definice //Soubor main.cpp s hlavní funkcí main #include "druhaMocnina.h" int main(){}

34 Modulární programování V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL y.obj export c x.c #include "y.h" double A() {} y.c #include "y.h" int c; y.h extern int c; extern int c; double A() {} extern int c; int c; x.obj import c export A

35 Formátovaný vstup a výstup V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL Funkce pro formátový vstup a výstup jsou v knihovně stdio.h.Proud může být zdrojem nebo cílem dat a může být spojen s diskem,nebo jiným periferním zařízením. Pro vstup z klávesnice použijeme funkci scanf(char[], argument,...) –V prvním parametru zadáváme opět řídící řetězec, v dalších parametrech předáváme adresy proměnných do kterých se mají nahrát hodnoty přijaté z klávesnice. Pro získání adresy použijeme operátor &, který nám vydá adresu dané proměnné. –Např. scanf("%d%d", &i, &j); // Načte 2 čísla, může být i //odděleně Pro výstup na obrazovku použijeme funkci printf(char [], argument, …) –V prvním parametru zadáváme řídící řetězec,podle čeho kompilátor pozná jaký typ má zobrazit,případně řetězec.Funkce podporuje libovolný počet parametrů. –Např. printf("nejaky_int: %d, nejaky_float:%f, nejaky_char[]:%s",nejaky_int,nejaky_float, nejaky_char); Vypše:nejaky_int: 10, nejaky_float:10.3, nejaky_char:ahoj

36 Formátovaný vstup a výstup V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL #include int a,b,c; int main(int argc, char *[]){ printf("a+b, zadejte a:"); scanf("%d", &a); printf("zadejte b:"); scanf("%d", &b); c = a + b; printf("%d + %d = %d", a,b,c); return 0; } Výstup: a+b, zadejte a:10 zadejte b: = 5

37 Formátovaný vstup a výstup V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL ŘetězecData %cZnak %d signed int %ld signed long %u unsigned int %lu unsigned long %f float %xHexadecimální(1a2c) %sŘetězec

38 Souborový vstup a výstup V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL Pro zápis souborů budeme potřebovat knihovnu stdio.h,tu přidáme příkazem #include.Pro otevření souboru, použijeme strukturu: FILE *soubor = fopen(“název“,“modifikátor“); Nyní nahrajeme do ukazatele soubor tzv.deskriptor souboru.Funkce fopen nám poslouží k získání tohoto potřebného ukazatele. název je jméno souboru s kterým budeme pracovat a modifikátor je řetězec jenž udává zda se bude jednat o čtení,zápis nebo obojí. Pro práci se soubory použijeme funkce –fgetc(FILE *stream); která vrátí znak z místa kde je momentálně kurzor.V případě že se jedná o konec souboru vrátí speciální hodnotu EOF, což charakterizuje konec souboru –fputc(int znak, FILE *stream); vloží znak na místo kde se momentálně nachází kurzor Obě dvě funkce automaticky posouvají kurzor na další pozici.

39 Formátovaný vstup a výstup V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a šíření dokumentu podléhá licenci GNU GPL Modifikátory funkce fopen(“název“, „“modifikátory“); r otevření textového souboru pro čtení w vytvoření textového souboru pro zápis,existuje-li tento soubor je jeho původní obsah zahozen a přepisování – otevře nebo vytvoří(v případě že neexistuje) soubor pro zápis na konec souboru r+ otevře textový soubor pro aktualizaci(čtení nebo zápis) w+ vytvoří textový soubor pro aktualizaci,zahodí předchozí obsah, existuje-li a+ připojení – otevře nebo vytvoří textový soubor pro aktualizaci,zapisuje za konec souboru


Stáhnout ppt "Vaše první aplikace V rámci projektu „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil a Antonín Šulc. Modifikace a."

Podobné prezentace


Reklamy Google