Obsah

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 (podmínka) { 
  //když podmínka splněna  
}else { 
  //když podmínka nesplněna  
} 
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ů:

„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 
} 
int i = 0; 
while ( i < 3 ) { // dokud i < 3 
  cout << i;      // vypise hodnotu i 
  i++; 
} 
int i = 0; 
do {            // opakuj  
  cout << i;     // vypise hodnotu i 
  i++; 
}while (i < 3); // dokud je i < 3 
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:

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

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:

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:

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

Příkladem modulu může být například knihovna v C.

Seznam předmětů

PB071: Úvod do jazyka C PB161: Programování v jazyce C++ 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: 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?

Programování - WIKI Datové typy - WIKI Datová stuktura - WIKI Řídící sruktura - WIKI Bloková struktura programu Modulární struktura programu

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