====== 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~~