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ů:

  1. Podmíněný skok – provede se jen v případě, že je splněna zvolená podmínka
  2. 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:

  1. 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
  2. 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; 
  3. 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ů

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: 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á sem.

Kam dál?

Jedna k dobru

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

Diskuze

, 2008/05/30 16:44

dal bych sem jeste i priklady, co myslite? Dle meho velka spousta lidi na FI programovani moc nerozumi.

, 2008/06/02 16:22

urcite nebude od veci sem soupnout priklad:
- podminka, cykly
- procedura, funkce a jeji volani
- modularni vs blokova struktura
imho je uplne jedno v jakym programovacim jazyku

, 2008/06/02 20:22

Tak jsem doplnil par prikladu temer ke vsemu a doplnil odkaz na stránky s blokovou a modulární strukturou programu s příklady. To jest vše z mé strany k této otázce:-)

, 2008/06/06 14:47

Zformatovali jsme priklady a pridali par drobnosti jako treba switch

, 2008/06/07 09:55

Jj to je dobre na to jsem pozapomel. Diky

, 2008/06/07 10:41

zislo by sa este doplnit cast „Datove typy“ o genericke dat.typy, heterogenne dat.typy (zaznam) a trochu to okecat…tiez by som trochu okecal kazdu cast, podobne ako je to na ceskej wiki, nech mam o com rozpravat :)

, 2008/06/22 03:24

Hm, zo zápiskov predmetu Principy programovacích jazyků vyplýva, že bloková štruktúra a modulárna štruktúra jazyku sa líšia iba v tom, že v blokovej sa bloky môžu vnárať (v definícii funkcie v Pascale môžem definovať podfunkciu) a v modulárnej sa moduly vnárať nemôžu (v Céčku môžem definovať funkcie iba v najvyššom stupni zanorenia). To či premenné definované v bloku/module môžu využívať aj iné časti programu, to si myslím, nezáleží od modulárnej/blokovej povahy jazyka, alebo sa mýlim? Pascal má napríklad blokovú štruktúru. Potom pascalovská knižnica je modul? Trošku som z týchto pojmov zmätený, vedel by mi to niekto objasniť? Ďakujem…

, 2008/06/22 20:09

Aha, me to nedalo a tak sem na to ted koukal jeste jednou a to co rikas ty je pravda. Ale tak nasel jsem i ty moje definice blokove/modularni struktury programu. Sice nevim presne kde, ale rekl bych ze v tech odkazech co tam jsou na blokovou a modularni strukturu je to napsany. Jsou to odkazy na modul student na CVUT v Praze tak si to tam snad nevymysleli ne? Bohuzel jsou ted tyto odkazy docasne mimo provoz:-(
Ale kazdopadne uznavam ze mas pravdu i ty.

, 2008/06/22 22:33

Tak ako keď to je takto nejednoznačné, tak si nemyslím, že by nám za to u štátnich utrhli hlavu, zvlášť ak je to v materiáloch nejakej inej univerzity definované inak. Ja som len bol zvedavý, či tu náhodou nie je niekto kto si je istý, že v tom má 100% jasno… :P

, 2008/09/17 08:28

Casem doplnim genericke datove typy a abstraktni datovy typ

, 2008/11/19 22:20

Tak hotovo, doplněno. +přidána ještě část heterogenní datové typy

You could leave a comment if you were logged in.
home/prog/ap3.txt · Poslední úprava: 2020/04/12 16:56 (upraveno mimo DokuWiki)
Nahoru
CC Attribution-Noncommercial-Share Alike 4.0 International
chimeric.de = chi`s home Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0