Od Scratche k něčemu složitějšímu uNižší programovací jazyk uMalá míra abstrakce oproti tomu, jak funguje procesor počítače uTěsně spjaté s hardwarem uNutná technická znalost fungování hardware uZávislý na platformě uVyšší programovací jazyk uVelká míra abstrakce uPřiblížení zápisu tomu, jak uvažuje člověk uScratch, Python, BASIC, Java, PHP, … uC někde uprostřed – umožňuje nízko úrovňový přístup k paměti aj. Objektové vs sekvenční uObjektové programování uKomunikace jednotlivých prvků – objektů uObjekty jsou uzavřené, navenek poskytují jen metody uNemusíme vědět, jak objekty fungují uTřídy – skupiny objektů sdílející stejné vlastnosti uVhodné pro aplikace s GUI, hry, … uObjekt C, většina jazyků kombinuje obojí přístup uSekvenční programování uKód je vykonáván řádek po řádku uFunkcionální programování – kód obsahuje funkce (přeskakuje) uVětvení a cykly uVhodný pro vědecké aplikace, simulace uC Kompilované/interpretované uInterpretovaný jazyk uNení potřeba překlad do strojového kódu uPotřebují speciální software – interpreter uMéně přenositelné, pomalejší, ale jednodušší pro uživatele, snadný debugging uPřímo interpretovaný/přeložen do mezikódu/částečně interpretovaný uNěkdy se nazývají skriptovací jazyky uPython, Shell, Cmd, Wolfram, … uKompilovaný jazyk uZdrojový kód je nejprve přeložen do strojového kódu a poté proveden celý najednou uPodstatně výkonnější, přenositelné, nutná dobrá znalost jazyka uC, C++ Hello Scratch Hello world v „Assembleru“ [org 100h] [bits 16] jmp START ; Nastavit pozici kurzoru ; IN: dl = x, dh = y curto: xor bh,bh mov ah,2 int 10h ret ; Napsat barevne znaky, ale neposouvat kurzor ; IN: al = char, bl = color, cx = count putchar: xor bh,bh mov ah,9 int 10h ret ; Napsat znak a posunout kurzor ; IN: al = char wrchar: xor bh,bh mov ah,0Eh int 10h ret ; Cist klavesu s cekanim ; OUT: al = ASCII code || 0, ah = scan code inkey: mov ah,0 int 16h Ret ; Napsat textovy retezec ukonceny binarni nulou ; IN: ds:si -> null_terminated_string writez: l_writez1: Lodsb or al,al jz l_writez9 xor bh,bh mov ah,0Eh int 10h jmp l_writez1 l_writez9: Ret msg1: db "Ahoj svete!", 13,10, 0 START: push cs pop ds mov si,msg1 call writez END: mov ax,4C00h int 21h Hello world v C #include int main (){ printf („Hello, world!\n“); return 0; } C PROGRAMOVACÍ JAZYK Klíčová slova uSlova a symboly mající určitý význam v daném programovacím jazyce uVětšinou je jejich použití jinde zakázáno uOznačení datového typu, funkce knihoven, operátory, terminální symboly, direktivy preprocesoru, … uPř. int, include, double, const, main, printf, sin, +, ==, ;, #, … Operátory Unitární +,- unární plus a mínus, & reference (získání adresy objektu) * dereference (získání hodnoty objektu dle adresy) ! logická negace ~ bitová negace ++, -- inkrementace a dekrementace hodnoty (typ) přetypování sizeof() operátor pro získání délky objektu nebo typu! Binární = přiřazení +,-,*,/ plus, mínus, krát, děleno % zbytek po celočíselném dělení (modulo) && logické AND || logické OR . tečka, přímý přístup ke členu struktury -> nepřímý přístup ke členu struktury Relační < menší než > větší než <= menší nebo rovno >= větší nebo rovno == rovnost != nerovnost Funkce uUrychlení běhu programu, usnadnění orientace ve zdrojovém kódu, zkrácení kódu uFunkce – navrací hodnotu uProcedura – nevrací nic uSkladba: datový typ který funkce vrací jméno funkce (datový typ vstupní proměnné vstupní proměnná){ to, co funkce provádí; } Cykly, podmínky uCykly uUsnadnění kódu – počítač dokáže velmi rychle provádět milióny úkolů ufor (i = 0; i < 10; i++){ Tělo cyklu; } uWhile (true){ tělo cyklu; } uPodmínky uVětvení programu uRozhodování pomocí logických operátorů, porovnávání hodnot proměnných uif (true) … uif (true) …. else … uif (true) … else if (true) … else uSwitch - case Proměnné uV některých jazycích není nutné určovat typ (Python) – možnost chyb uDatový typ – jaké místo má být přiřazeno uInt, float, double, char, … uKonstanta – urychlení běhu programu, jiný způsob ukládání do paměti uPřímé zadání hodnoty uKonstantní proměnná uPreprocesorová proměnná Pointery uProměnná je místo v paměti počítače, je jí přidělena adresa uPointer (ukazatel) ukazuje na adresu proměnné uK hodnotě na dané adrese přistupujeme pomocí * uV jazyce C hojně používané, ovšem často vede k chybám uPointerová aritmetika int a; a = 56; printf("Proměnná a s hodnotou %d je v paměti uložená na adrese %p", a, &a); Pointery int i; // definice proměnné i datového typu int int a[3]; // definice proměnné a, pole typu int se třemi prvky int *p; // definice proměnné p, ukazatele na datový typ int p = &i; // hodnota pointeru je nastavena na adresu proměnné i *p = 3; // do paměti na adresu odkazovanou ukazatelem p se uloží hodnota 3 p = &(a[2]); // hodnota pointeru je nastavena na prvek pole a s indexem 2 p = p - 2; // hodnota pointeru je nastavena na prvek pole a s indexem 0 (tj. první prvek pole) *p = 5; // do paměti na adresu odkazovanou p se uloží hodnota 5 (tedy první prvek pole má tuto hodnotu) Pole uVícerozměrná struktura proměnných (libovolná dimeze) uPřístup pomocí ukazatelů uDaná velikost při deklaraci uDatovy_typ nazev [velikost]; uAlokace paměti – pro větší pole, zadávám velikost v bytech (malloc, calloc, free – stdlib.h) uStruktury (c++) – více typů proměnných v 1 „objektu“ uVector – proměnná velikost float vector[3]; double matrix[2][5]; int **pole; pole = (int**) malloc(m*sizeof(int)); for (i = 0; i < n; i++){ pole[i] = malloc(3*sizeof(int)); } free (pole); Zdrojový kód v C uTělo funkce nebo podmínky uzavřeno do složených závorek { } uKaždý příkaz ukončen středníkem; obvykle i konec řádku uParametry funkce v kulatých závorkách uPozice/velikost pole v hranatých závorkách uKomentáře odděleny // na 1 řádku, případně uzavřeny do /* jako blok */ int array[10]; \\ definice pole integerů o velikosti 10 for (i = 0; i < 10; i ++){ array[i] = array [i -1] + array[0]; /* my_func (array[i]); */ } Čitelnost zdrojového kódu uSprávné formátování a volba názvů proměnných a funkcí/procedur usnadňuje orientaci v kódu uIDE pomáhají barevným odlišováním klíčových slov uCase sensitive, klíčová slova psána malými písmeny uTělo funkce/cyklu odsazeno tabulátorem uMezery mezi operátory uVolné řádky oddělují jednotlivé bloky programu uIdentifikátor – název proměnné, funkce uNesmí mít číslo a _ na začátku uBez diakritiky „Always code as if the guy who end up maintaining your code will be a violent psychopath who knows where you live.“ Sestavení programu uKOMPILÁTOR uPřekládá zdrojový kód napsaný programátorem to objektového kódu, kterému rozumí počítač uAlokuje paměť pro proměnné uPREPROCESOR uV C/C++ uDirektivy – instrukce pro kompilátor uPreprocesorové proměnné – např. konstanty uZačínají # uLINKER uDoplňuje do objektového kódu odkazy na knihovny a vytváří tak finální strojový kód Hello, world! #include int main (){ printf („Hello, world!\n“); return 0; } 01111111 01000101 01001100 01000110 00000010 00000001 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000010 00000000 00111110 00000000 00000001 00000000 00000000 00000000 10110000 00000101 01000000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 11010000 00010011 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 00111000 00000000 00001001 00000000 01000000 00000000 00100100 00000000 00100001 00000000 00000110 00000000 00000000 00000000 00000101 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 01000000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 01000000 00000000 00000000 00000000 00000000 00000000 11111000 00000001 00000000 00000000 00000000 00000000 00000000 00000000 11111000 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00001000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000011 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00111000 00000010 00000000 00000000 00000000 00000000 00000000 00000000 00111000 00000010 01000000 00000000 00000000 00000000 00000000 00000000 00111000 00000010 01000000 00000000 00000000 00000000 00000000 00000000 00011100 00000000 00000000 00000000 00000000 00000000 00000000 00000000 …