====== AP3, IN3 Programování ====== ===== Zadání ===== (strukturované programování v imperativním jazyce, datové a řídicí struktury programovacích jazyků, datové typy, procedury a funkce, bloková a modulární struktura programu) ===== Vypracování ===== ==== Imperativní jazyky ==== Program je posloupnost příkazů, které jsou postupně prováděny: //příkaz 1;příkaz 2;.......;příkaz n;// Během provádění programu se počáteční stav počítače postupně modifikuje, dokud se nedosáhne cílového stavu. Jsou to většiny "běžných" jazyků (Basic, Pascal, C, C++, Java...). ==== Strukturované programování ==== Označuje programovací techniku, kdy se implementovaný algoritmus rozděluje na dílčí úlohy, které se spojují v jeden celek. Každý celek se může skládat z menších bloků. Na nejnižší úrovni jsou bloky složeny z příkazů programovacího jazyka nebo volání funkcí. K implementaci v programu se používá řídících struktur. ==== Řídící struktury ==== === Posloupnost příkazů === Všechny příkazy se provedou postupně === Větvení === Příkaz se provede v závislosti na splnění/nesplnění podmínky * **if** - jednoduchý případ podmínky if (podmínka) { //když podmínka splněna }else { //když podmínka nesplněna } * **switch** - vhodný pro větší množství podmínek nad stejným výrazem switch (n) { case 1 : case 2 : case 3 : ... break; case 4 : ... break; default: ... ; // tato vetev bude provedena pokud zadna podminka nevyhovuje, uvádí se na konci } Příkaz **break** na konci každé větve není povinný, ale pokud tam není, začne se po skončení větve provádět další větev v pořadí bez ohledu na hodnotu výrazu (tak jako 1,2 v našem příkladě). === Cyklus === V závislosti na splnění podmínky se část programu vykoná vícekrát **Existují tyto druhy cyklů:** * nekonečný cyklus - za normálních okolností není vůbec ukončen „Elegantní“ způsob, jak naprogramovat nekonečný cyklus v jazyku C/C++/C# je použít for cyklus bez inicializace, podmínky i inkrementu: for (;;) { //tělo cyklu } while (true) { //tělo cyklu } * while-do - cyklus s podmínkou na začátku, tělo cyklu se nemusí provést ani jednou: int i = 0; while ( i < 3 ) { // dokud i < 3 cout << i; // vypise hodnotu i i++; } * do-while(repeat-until) - cyklus s podmínkou na konci, tělo cyklu se provede aspoň jednou: int i = 0; do { // opakuj cout << i; // vypise hodnotu i i++; }while (i < 3); // dokud je i < 3 * for cyklus - cyklus s podmínkou na začátku, obvykle užívaný pro výčet prvků z množiny prvků for ( i=0; i < 3; i++ ) { //inicializátor; podmínka; inkrementace //tělo cyklu } Společně s cykly bývají často používány příkazy: * **break** -- přeruší úplně běh cyklu a přejde hned za cyklus * **continue** -- přeruší aktuální běh cyklu a přejde opět na začátek cyklu. **Principiálně existují 2 druhy skoků:** - Podmíněný skok -- provede se jen v případě, že je splněna zvolená podmínka - Nepodmíněný skok -- provede se vždy, bez ohledu na výsledek předchozího výpočtu v dnešní době se však už skoky používají jen výjimečně. ==== Datové struktury ==== Hlavním cílem je zjednodušit a zpřehlednit program, který provádí operace s datovým typem. Jsou-li všechny komponenty dané struktury téhož typu, označujeme strukturu homogenní, v opačném případě heterogenní. Rozdělení: * Statické -- nemůžou v průběhu výpočtu měnit počet svých komponent ani způsob jejich uspořádání (pole, záznam) * Dynamické -- jejich rozsah se může v průběhu vykonávání programu měnit (ukazatel, zásobník, fronta, seznam, strom, atd.) ==== Datové typy ==== Datový typ definuje druh proměnných. Je určen oborem hodnot a zároveň typickými výpočetními operacemi, které lze s daty provádět. Tři základní skupiny: - **//Jednoduché//** * Standardní -- jsou definované jazykem * celočíselné (integer) * reálné (real) * znak (char) * logická hodnota (boolean) * Programátorem definované * dynamické -- deklarace obsahují proměnné * statické -- mohou obsahovat pouze konstanty - **//Strukturované//** -- obsahují jeden nebo více datových prvků. Strukturované datové typy se skládají z jednoduchých typů. Dělí se na homogenní a heterogenní. Podle toho jestli mohou obsahovat více různých datových typů. * Homogenní * pole (array) * textový řetězec (string) * výčtový typ (enum) * Heterogenní -- datový typ je složen z prvků různých datových typů (opak homogenního) a navenek se chová jako kompaktní celek. * Pascal typ record * seznam (list) – obdoba pole, ['a', 'b', 9, "cokoliv"] * C typ struct typedef struct { int vek; char *jmeno; enum { muz, zena } pohlavi; } Osoba; - **//Zvláštní//** * ukazatel (pointer) -- ukazuje na místo v paměti * soubor (file) -- reprezentuje ukazatel na soubor ===Abstraktní datový typ=== Abstraktní datový typ je implementačně nezávislá specifikace struktury dat s operacemi povolenými na této struktuře. Základní ADT jsou například: * Zásobník * Seznam * Fronta * Množina * Textový řetězec **Zabudované ADT** Protože některé abstraktní datové typy jsou velmi užitečné a běžně používané, některé programovací jazyky používají tyto ADT jako primitivní datové typy, které jsou přidány do jejich knihoven. Například v Perlu je možné pole považovat za implementaci seznamu, standardní knihovny C++ a Javy zase nabízejí implementaci seznamu, zásobníku, fronty a řetězců. **Vlastnosti abstraktního datového typu** Nejdůležitější vlastnosti abstraktního typu dat jsou: * //Všeobecnost implementace//: jednou navržený ADT může být zabudován a bez problémů používán v jakémkoliv programu. * //Přesný popis//: propojení mezi implementací a rozhraním musí být jednoznačné a úplné. * //Jednoduchost//: při používání se uživatel nemusí starat o vnitřní realizaci a správu ADT v paměti. * //Zapouzdření//: rozhraní by mělo být pojato jako uzavřená část. Uživatel by měl vědět přesně co ADT dělá, ale ne jak to dělá. * //Integrita//: uživatel nemůže zasahovat do vnitřní struktury dat. Tím se výrazně sníží riziko nechtěného smazání nebo změna již uložených dat. * //Modularita//: „stavebnicový“ princip programování je přehledný a umožňuje snadnou výměnu části kódu. Při hledání chyb mohou být jednotlivé moduly považovány za kompaktní celky. Při zlepšování ADT není nutné zasahovat do celého programu. **Typy operací** Na abstraktním datovém typu rozlišujeme tři druhy operací: //konstruktor, selektor a modifikátor//. Operace, která ze zadaných parametrů vytváří novou hodnotu abstraktního datového typu, se nazývá konstruktor. Úkolem konstruktoru je sestavení platné vnitřní reprezentace hodnoty na základě dodaných parametrů. Operace označovaná jako selektor slouží k získání hodnot, které tvoří složky nebo vlastnosti konkrétní hodnoty abstraktního datového typu, a konečně operace typu modifikátor provádí změnu hodnoty datového typu. ===Generické datové typy=== Datový typ, který je možné parametrizovat jiným typem. V jazyce Pascal to může být např. typ pole s parametrem a jaké prvky budou v poli uloženy (např. array of char). Mnohem větší možnosti, jak parametrizovat typy, poskytuje systém šablon v C++ nebo generické typy uvedené v jazycích Java 5, či C# 2.0. **Genericita** Programovací jazyk podporuje genericitu, pokud umožňuje parametrizovat datové typy. Parametrizované datové typy se nazývají generické datové typy. Typickým příkladem zabudovaného generického typu je typ pole. Deklaraci: //Data = array [0 .. 4] of Real// lze chápat jako parametrizaci typu //array// typem //Real// a intervalem 0 .. 4. ==== Procedury a funkce ==== Tvoří posloupnost instrukcí, které potřebujeme v programu provádět na různých souborech dat, nebo na různých místech v programu. Procedura nebo funkce může být po deklaraci použita kdekoliv v následujícím bloku programu. Rozdíl: * Funkce -- vrací hodnotu (může být použita přímo ve výrazech) Funkce je operace, u které podle daného vstupu požadujeme určitý výstup. Vstupem rozumíme parametry a výstupem návratovou hodnotu. int secti(int a, int b){ // funkce neco vraci return a+b; } Volání funkce secti(1,1) vrátí __hodnotu 2__: cout << secti(1,1) << endl; * Procedura -- nevrací hodnotu(vyvolá se příkazem volaní procedury ke splnění jedné nebo více operací) Procedura má stejnou konstrukci jako funkce, s tím rozdílem, že nevrací žádnou hodnotu (nemá return). Místo návratového typu má "void". void pozdrav(){ // procedura nic nevraci cout << "ahoj" << endl; } Volání této procedury nevrátí hodnotu, pouze na obrazovku vypíše __ahoj__: pozdrav(); ==== Bloková struktura programu ==== Blok je řídící struktura, která kromě příkazů obsahuje též deklarace (ty platí pouze v daném bloku). Deklarace provedené uvnitř bloku ztrácí mimo blok platnost. Blok má 2 části: //deklarační a příkazovou//. Bloky mohou být do sebe vnořovány, přičemž věc deklarovaná v bloku je viditelná ve vnořeném bloku také. ==== Modulární struktura programu ==== Modul je programová jednotka, která na rozdíl od bloku umožňuje, aby v ní deklarované proměnné a metody byly použitelné i v jiných modulech. Skládá se ze dvou částí: * specifikační -- zde jsou veřejné deklarace (obsahuje hlavičky procedur a funkcí) * implementační -- může obsahovat i neveřejné deklarace Příkladem modulu může být například knihovna v C. ===== Seznam předmětů ===== [[https://is.muni.cz/auth/predmety/predmet.pl?fakulta=1433;id=427661;zpet=..%2Fpredmety%2Fkatalog.pl%3Ffakulta%3D1433%3Bhledret%3DC%2520OR%2520Java%3Bhledv%3Dnaz%3Bhledv%3Dkod%3Bfak%3D1433%3Buhledat%3D1;zpet_text=Zp%C4%9Bt%20na%20v%C3%BDb%C4%9Br%20p%C5%99edm%C4%9Bt%C5%AF|PB071: Úvod do jazyka C]] [[https://is.muni.cz/auth/predmety/predmet.pl?fakulta=1433;id=455039;zpet=..%2Fpredmety%2Fkatalog.pl%3Ffakulta%3D1433%3Bhledret%3DC%2520OR%2520Java%3Bhledv%3Dnaz%3Bhledv%3Dkod%3Bfak%3D1433%3Buhledat%3D1;zpet_text=Zp%C4%9Bt%20na%20v%C3%BDb%C4%9Br%20p%C5%99edm%C4%9Bt%C5%AF|PB161: Programování v jazyce C++]] [[https://is.muni.cz/auth/predmety/predmet.pl?fakulta=1433;id=455040;zpet=..%2Fpredmety%2Fkatalog.pl%3Ffakulta%3D1433%3Bhledret%3DC%2520OR%2520Java%3Bhledv%3Dnaz%3Bhledv%3Dkod%3Bfak%3D1433%3Buhledat%3D1;zpet_text=Zp%C4%9Bt%20na%20v%C3%BDb%C4%9Br%20p%C5%99edm%C4%9Bt%C5%AF|PB162: Programování v jazyce Java]] ===== Použitá literatura ===== Tuto otázku už jsem si vypracovával dřív a bohužel si nepamatuju, kde jsem čerpal, ale určitě minimálně ze stránek doktora Pitnera: [[http://www.fi.muni.cz/~tomp|Tomáš Pitner - Homepage]]. Dále jsem našel článek o blokové a modulární struktuře programu s příklady v C, takže kdo chce vědět víc než jen vysvětlení těchto dvou struktur, ať se podívá [[http://www.csc.liv.ac.uk/~grant/Teaching/COMP205/progComp.html|sem]]. ===== Kam dál? ===== [[http://cs.wikipedia.org/wiki/Programov%C3%A1n%C3%AD|Programování - WIKI]] [[http://cs.wikipedia.org/wiki/Datov%C3%BD_typ|Datové typy - WIKI]] [[http://cs.wikipedia.org/wiki/Datov%C3%A1_struktura|Datová stuktura - WIKI]] [[http://cs.wikipedia.org/wiki/%C5%98%C3%ADd%C3%ADc%C3%AD_struktura|Řídící sruktura - WIKI]] [[http://student.cvut.cz/cwut/index.php/Procedury_a_funkce%2C_blokov%C3%A1_struktura%2C_aktiva%C4%8Dn%C3%AD_z%C3%A1znamy|Bloková struktura programu]] [[http://student.cvut.cz/cwut/index.php/Modul%C3%A1rn%C3%AD_struktura_programu|Modulární struktura programu]] ===== Jedna k dobru ===== [[http://www.levenez.com/lang/history.html|Evoluce programovacích jazyků]] - tohle nakreslete a není co řešit **A** jak vyšité :-) ===== Vypracuje ===== Ludvík Vidlák, 98532 <99%> ICQ:235006787 Pokud má někdo nějaké připomínky, ať to hned upraví, nebo napíše do diskuze:-) Díky ~~DISCUSSION~~