Úvod do programování Michal Krátký 1,Jiří Dvorský 1 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programování, 2004/2005 Procesor Procesorem je objekt, který vykonává algoritmem popisovanou činnost (může jím být stroj (počítač) nebo člověk). Formulace algoritmu souvisí s tím, pro jaký typ procesoru se bude vytvářet. Etapy řešení problému specifikace (definice) problému vstupy a požadavky na výstupy, analýza problému volba vhodné metody řešení, sestavení algoritmu posloupnost na sebe navazujících kroků (řídící struktury), kódování zápis algoritmu v jazyce procesoru, testování ověření správnosti navrženého algoritmu. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 1/34 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 2/34 Zápis algoritmu přirozený jazyk (slovní popis), grafické znázornění (např. vývojový diagram), speciální jazyk (pseudojazyk), programovací jazyk. Datový typ Určuje jakých hodnot může nabývat objekt daného datového typu a množinu přípustných operací nad tímto datovým typem. Datovým objektem rozumíme konstantu, proměnnou, výraz a funkci. Identifikátory Identifikátory jsou jména, která dáváme např. konstantám, proměnným, funkcím. Tato jména mohou být tvořena písmeny anglické abecedy, číslicemi a znakem podtržítko. int cislo; float fcislo; Point bod; bod.setcoordinate(0, 0.5); c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 3/34 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 4/34 Výraz Konstanta Nemění hodnotu během řešení problému. Použití: přímé 63, 10 2, ABC, pojmenování označení identifikátorem. final double pi = 3.14; // Java const double pi = 3.14; // C++ pi = 4.8; // error Proměnná Veličina, která může měnit hodnotu během řešení problému. Proměnná se zavádí definicí. int cislo = 2; cislo += 3; c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 5/34 Výraz je tvořen operátory, operandy a speciálními znaky. Operandem může být: konstanta, proměnná, výraz, volání funkce, operátor a příslušné operandy, popřípadě závorky. 12 "abc" a b sin(0.5) 12+9*3 (a+b)/2 a>=c ((a + b) * (c / d)) / 3 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 6/34
Strukturované řídící struktury - sekvence, posloupnost Příkazy (řídící struktury) popisují jednotlivé kroky algoritmu a jejich návaznosti. Rozlišujeme jednoduché a strukturované y. Celý algoritmus lze chápat jako jeden. (Pozn. pro zápis algoritmu v některém programovacím jazyce zpravidla platí, že z výrazu se stane teprve tehdy, až za něj vložíme středník.) Jednoduché y Mezi jednoduché y patří prázdný a volání funkce. Posloupnost je tvořena posloupností jednoho nebo více ů, které se provádějí v pevně daném pořadí. Příkaz se začne provádět až po ukončení předchozího u. int cislo = 1; cislo += 1; System.out.println(cislo); // Java printf("%d\n", cislo); // C/C++ c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 7/34 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 8/34 Strukturované řídící struktury - Větvení Strukturované řídící struktury - Switch Provedení dalšího u závisí na splnění podmínky, tedy podmíněný určí, který z ů bude vykonán v závislosti na splnění či nesplnění podmínky. if (výraz) 1 else 2 bool flag = true; int cislo = 10; if (!flag) cislo = 100; int cislo = 2; if (cislo == 1) 1 else 2 switch (integral-selector) case integral-value1: break; case integral-value2: break;... default: int b = 1; switch (b) case 1: break; default: c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 9/34 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 10/34 Strukturované řídící struktury - Cyklus Cyklus je část algoritmu, která je opakovaně prováděna za splnění řídící podmínky. Opakující se (y) nazýváme tělo cyklu. Rozlišujeme dva typy cyklů: indukční - řídící podmínka cyklu určuje, zda bude provedena posloupnost ů, která tvoří tělo cyklu, nebo dojde k předání řízení za tělo cyklu, iterační -počet opakování těla cyklu závisí na hodnotě řídící proměnné. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 11/34 Strukturované řídící struktury - Cyklus Druhy cyklů cyklus s podmínkou před vykonáním těla cyklu while(výraz) Tělo cyklu se tedy nemusí vykonat ani jednou. cyklus s podmínkou za tělem cyklu do while(výraz) Tělo cyklu se provede minimálně jednou. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 12/34
Strukturované řídící struktury - Cyklus Algebraické struktury 1/2 cyklus s pevným počtem opakování for (výraz1; výraz2; výraz3) for (int i=0,c=3 ; i < 10 ; i++) System.out.println(i+" "+c); for ( ; ; ) Abstrakce datových typů množina a operace. Grupoid (G, ) G= G, G je grupoid, pokud množina H G je uzavřená (vzhledem k operaci G ): a, b H : G b H (1, 2, 3, +) c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 13/34 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 14/34 Algebraické struktury 2/2 Klasifikace: asociativita: a, b, c G : a (b c) =(a b) c pologrupa neutrální prvek: n G tak, že a G : n a = a monoid inverzní prvek: g G g 1 G tak, že g 1 g = n grupa komutativita: a, b G : a b = b a komutativní grupa (Z, +), (Q, +), (R, +) a (C, +) komutativní grupy. (Z, ) není grupa. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 15/34 Datový typ (DT) určuje množinu hodnot, kterých může nabýt konstanta, proměnná, funkce nebo výraz a množinu operací nad těmito hodnotami. Deklarací určujeme typ objektu. Informace o typu je překladačem používána při typové kontrole, typových konverzích, atd. V místě definice definujeme hodnotu proměnné či posloupnost ů funkce. int cislo; cislo = 5; int value = cislo + 10; c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 16/34 Jednoduché datové typy Strukturované datové typy Logický typ (Boolean) hodnoty: true, false. Operace: negace, konjunkce, disjunkce. boolean flag = true; Číselné datové typy celé číslo, reálné číslo (rozsah, přesnost). Operace: +,-,/,... short value = 32; double realv = 0.5; Znak každému znaku je přiřazena celočíselná hodnota, tzv. kód znaku (ASCII, Unicode,...). char ch = A ; System.out.println("cislo: " + value); c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 17/34 Pole posloupnost prvků stejného DT. int []array = new int[100]; Struktura je tvořena několika položkami. typedef struct // C++ double x; double y; Point2D; Uživatelem definované datové typy např. třídy v OO programovacích jazycích. Ukazatel (pointer) adresa v paměti obsahující hodnotu nějakého datového typu. Point point = new Point(); // Java Point point; Point* ppoint = &point; // C++ c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 18/34
Množiny Uspořádané množiny Množina skupina objektů. Množinu budeme považovat za určenou, je-li možno o každém objektu rozhodnout, zda do množiny patří či nikoliv, tj. zda je či není jejím prvkem, x M. Operace s množinami:,,... n-ární Relace Libovolná podmnožina kartézského součinu množin A 1, A 2,...,A n. R A 1 A 2... A n Binární relace: R A A, R A n A = a, b, A A = a, a a, b, b, a, b, b c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 19/34 Množina M se nazývá uspořádaná množina, jestliže je na ní definována binární relace : x : x x x, y : je-li x y a y x potom x = y x, y, z : x y a y z potom x z Jestliže pro každé x, y A platí x y nebo y x potom uspořádání nazýváme lineární uspořádání. A = 1, 2, 3, = 1, 1 1, 2, 1, 3, 2, 2... c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 20/34 Datové struktury Datová struktura - implementace množiny, často dynamická. lineární (pole, zásobník,...), nelineární (stromy). Algoritmy pracují s množinami pomocí různých operací. Aplikace Vyhledávací algoritmy. Relační model SŘBD. Vyhledávání multimediálních dat (texty, obrázky,...). Pole Zásobník Fronta Seznam c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 21/34 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 22/34 Pole Pole vyhledávání v nesetříděném poli 1/3 Pole (array) patří k nejjednodušším datovým strukturám. Přístup k prvkům pole je určen udáním hodnoty indexu a není závislý na přístupu k jinému prvku. Proto říkáme, že pole je strukturou s přímým nebo náhodným přístupem. Pole statické/dynamické. Sekvenční průchod. O(n). public class Array int mdata[]; public Array(int size) mdata = new int[size]; for (int i = 0 ; i < mdata.length ; i++) mdata[i] = (int)(math.random() * size); c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 23/34 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 24/34
Pole vyhledávání v nesetříděném poli 2/3 public int Find(int value) for (int i = 0 ; i < mdata.length ; i++) if (mdata[i] == value) return i; return -1; Pole vyhledávání v nesetříděném poli 3/3 public static void main(string[] args) Array pole = new Array(100); int order = pole.find(25); System.out.println(order); Algoritmus potřebuje v nejhorším případě n porovnání. Průměrný počet porovnání za předpokladu, že pravděpodobnost výskytu libovolného prvku množiny je stejná. C avg =(1 + 2 + + n) 1 n = 1 2 (1 + n)n 1 n = (1 + n) 2 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 25/34 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 26/34 Pole problémy Zásobník (Stack) Dynamické pole. Vyhledávání v setříděném poli - složitost O(log n). Perzistentní pole. U zásobníku je uplatněn princip last-in, first out (LIFO). Tj. prvek, který byl vložen poslední, je jako první ze zásobníku vyzvednut. Ukazatel na aktuální prvek v zásobníku (posledně vložený) se nazývá vrchol zásobníku (stack pointer). Opakem je dno zásobníku. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 27/34 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 28/34 Zásobník operace Zásobník operace Push vložení prvku na vrchol zásobníku. Pop vyjmutí prvku z vrcholu zásobníku. Empty test prázdnosti zásobníku. Top vrátí prvek z vrcholu zásobníku bez jeho vyjmutí. Pokud provedeme operaci Pop na prázdném zásobníku nastává tzv. podtečení (underflow). Pokud není možné přidat další prvek, nastává tzv. přetečení (overflow). Operace mají konstantní časovou složitost. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 29/34 a) Push(15); Push(6); Push(2); Push(9); b) Push(17); Push(3); c) Pop(); c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 30/34
Zásobník implementace pomocí pole 1/3 public class Stack int mdata[]; int mstackpointer; public Stack(int capacity) mdata = new int[capacity]; mstackpointer = -1; c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 31/34 Zásobník implementace pomocí pole 2/3 public boolean Push(int value) boolean ret = false; if (mstackpointer < mdata.length-1) mdata[++mstackpointer] = value; ret = true; return ret; public int Pop() if (mstackpointer >= 0) return mdata[mstackpointer--]; return -1; c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 32/34 Zásobník implementace pomocí pole 3/3 Zásobník Stack stack = new Stack(10); for (int i = 0 ; i < 12 ; i++) System.out.print(stack.Push(i) + ", "); System.out.println(); for (int i = 0 ; i < 12 ; i++) System.out.print(stack.Pop() + ", "); System.out.println(); Výstup: true, true, true, true, true, true, true, true, true, true, false, false, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -1, Problémy Implementace pomocí seznamu a fronty. Dynamický zásobník. Perzistentní zásobník. Aplikace Překladače (závorkované výrazy, zásobníkové automaty). Uložení parametrů volaných funkcí. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 33/34 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 34/34