Professional Documents
Culture Documents
04-Cykly Vyvojovediagramy-04 Teoria
04-Cykly Vyvojovediagramy-04 Teoria
Vždy keď je potrebné opakovať niekoľko krát krok algoritmu resp. príkaz je výhodné použiť cyklus. Na
pochopenie cyklu nám poslúži úloha zameraná na hľadanie minima.
Príklad č.1 Vytvorte vývojový diagram algoritmu pre nájdenie minima z ľubovoľného počtu prvkov.
Diagram č.1:
Vyjadruje situáciu v ktorej sa bude hľadať minimum z dvoch čísel A a B. Využije sa na to značka vetvenia
s podmienkou kde sa testuje či A je väčšie ako B. Ak je A väčšie nastaví sa premenná MIN na hodnotu
B a v opačnom prípade sa MIN nastaví na A. MIN predstavuje výslednú minimálnu hodnotu. Pri dvoch
číslach je hľadanie minima celkom jednoduché a vystačíme si s vetvením. Ak by sme však pridali tretie
číslo algoritmus sa bude musieť rozšíriť o ďalšie vetvenie.
Diagram č.2:
Tu sa hľadá minimálna hodnota z troch čísel A, B, C. Algoritmus sa nám rozšíril o ďalší vetviaci blok kde
do premennej MIN uložíme C ak sa zistí že C je menšie ako už nájdené minimum uložené v MIN.
Diagram č3:
1
Peter Kačur, Programovanie, December 2020-Január 2021,
Dokument je voľne šíriteľný za predpokladu zachovania jeho pôvodného obsahu.
Hľadá sa minimum zo 4 čísel uložených v premenných A, B, C, a D. Algoritmus sa opäť rozrástol
o ďalší vetviaci blok a hodnota v MIN sa opäť zmení ak sa zistí že D je menšie ako už skôr nájdené
minimum uložené v MIN.
V troch diagramoch ste si mohli všimnúť, že sa tam niečo ustavične opakuje vždy keď sa pridá ďalšie
číslo pre nájdenie nového minima. Opakuje sa načítanie novej hodnoty, pridá sa vetviaci blok
s rovnakou podmienkou a vykoná sa priradenie nového minima do MIN. Ak by sme uvažovali
s hľadaním minima v rozsiahlej množine prvkov tak by sme strávili veľa času písaním a kreslením toho
čo sa vlastne ustavične iba opakuje. Preto si prácu zefektívnime a pokúsime sa to, čo sa v algoritme
opakuje vyjadriť cyklom.
Diagram 4:
Pred zavadením samotného cyklu je nutné algoritmus vhodne upraviť, a tak ho pripraviť aby cyklus
vôbec bolo možné použiť. Prvá vec je, že premennú určenú pre uloženie výsledného minima
nastavíme na začiatku algoritmu na počiatočnú hodnotu čím vykonáme tzv. inicializáciu. Ako prvé
načítavame premennú A preto je vhodné MIN nastaviť na A, teda MIN=A. Týmto zabezpečíme, že
2
Peter Kačur, Programovanie, December 2020-Január 2021,
Dokument je voľne šíriteľný za predpokladu zachovania jeho pôvodného obsahu.
prvý vetviaci blok bude mať namiesto pôvodných dvoch vetiev, už iba jednu vetvu z príkazovou
značkou, presne tak ako to budú mať aj nasledujúce vetviace bloky.
Diagram 5:
Inicializáciu vykonanú v diagrame 4 je možné vykonať aj iným spôsobom, a to tak že premennú MIN
si nastavíme na nejaké veľmi veľké číslo čo je v diagrame vyjadrené ako + nekonečno alebo +oo. Tým
sa zabezpečí, že každé číslo ktoré budeme porovnávať s MIN bude na začiatku vždy menšie. Tento
spôsob však nie je nutný, ale len pre krajšiu názornosť toho, ako sa neskôr budú opakovať takmer
identické bloky vetvenia ju použijem.
Diagram 6:
Na to aby sme mohli zaviesť cyklus musíme ešte odstrániť ustavične sa opakujúci názov premennej
do ktorej načítavame nové číslo. Namiesto A, B, C, D... potrebujem mať iba jednu premennú napr. A.
Túto prekážku rôznych premenný odstránime jednoducho nahradením premenných B, C, D...
premennou A. Teraz nám už nič nestojí v ceste pre zavedenie cyklu preto že ako sami vidíte diagram
pozostáva s opakujúcich sa identických blokov pre načítanie premennej a vetvenie.
Avšak, máme rôzne typy cyklov, ktoré sa odlišujú na základe spôsobu ich ukončenia. Ktorý z nich bude
pre náš príklad vhodný?
Ak dopredu vieme koľko opakovaní sa má vykonať, tak hovoríme o cykle so známym počtom
opakovaní. Opakovania budeme nazývať aj iterácie. Tento typ cyklus môžeme vyjadriť
v zjednodušenom tvare tak, ako je na obrázku v ľavo a v komplikovanejšom tvare tak, ako je na obrázku
v pravo. Výber tvaru diagramu v rámci tohto učiva bude ľubovoľný hoci správnejsič by bolo použiť
diagram v pravo.
3
Peter Kačur, Programovanie, December 2020-Január 2021,
Dokument je voľne šíriteľný za predpokladu zachovania jeho pôvodného obsahu.
Ak sa cyklus bude opakovať dovtedy pokiaľ bude splnená ukončovacia podmienka, tak budeme hovoriť
o cykle s podmienkou na začiatku. Ak sa vykoná aspoň raz telo cyklu, a jeho opakovanie sa bude
vykonávať dovtedy kým nebude splnená ukončovacia podmienka, tak hovoríme o cykle s podmienkou
na konci.
4
Peter Kačur, Programovanie, December 2020-Január 2021,
Dokument je voľne šíriteľný za predpokladu zachovania jeho pôvodného obsahu.
sa navýši hodnota riadiacej premennej L o jedna. Potom sa opäť zopakuje telo cyklu.
6. Po vykonaní 100 iterácií cyklu sa ten ukončí a vypíše sa výsledok teda minimum uložené
v premennej MIN.
Ako ste si istotne všimli vývojový diagram je podstatne jednoduchší a flexibilnejší, ako ten pôvodný
Diagram č.6.
Príklad č. 2
Úlohou je vytvoriť vývojový diagram algoritmu, ktorý bude overovať správne zadanie prihlasovacích
údajov do informačného systému. Na diagramoch sú zobrazené riešenia úlohy s využitím cyklov
s podmienkou na konci a s podmienkou na začiatku. Všimnite si rozdiel medzi nim.
Všimnite si, že pri cykle s podmienkou na začiatku sa údaje MENO a HESLO načítajú aspoň raz a to aj
keď k vyhodnoteniu ukončovacej podmienky cyklu ešte nedošlo. Vývojový diagram je v porovnaní
s cyklom s podmienkou na začiatku stručnejší a málovravnejší. V cykle s podmienkou na začiatku je
užívateľ informovaný navyše o tom, že zadal nesprávne prihlasovacie údaje, čo je istá výhoda. Okrem
toho aj ukončovacia podmienka cyklov s podmienkou na konci a na začiatku sa vyhodnocuje trochu
odlišne. Cyklus s podmienkou na konci sa ukončí ak je výsledkom podmienkového výrazu kladná
odpoveď (Áno, True, Pravda, +), zatiaľ čo cyklus s podmienkou na začiatku sa ukončí ak je výsledok
podmienkového výrazu záporný (Nie, False, Nepravda, -).
5
Peter Kačur, Programovanie, December 2020-Január 2021,
Dokument je voľne šíriteľný za predpokladu zachovania jeho pôvodného obsahu.
Vnáranie cyklov
Na vývojovom diagrame vľavo sú znázornené 2 cykly umiestnené za sebou. Najprv sa vykoná horný
a potom dolný cyklus. Nejde o nič výnimočné, ale tento prístup nerieši isté algoritmické problémy.
Napríklad, predstavme si tabuľku, ktorej bunky by sme chceli prechádzať. Tabuľka by mala N riadkov
a M stĺpcov Diagramom vľavo by sme tento problém nevyriešili. Výhodným riešením je použiť
vnorený cyklus zobrazený diagramom vpravo. Jednotlivé riadky a stĺpce sa prechádzajú postupným
navyšovaním riadiacich premenných i a j. V rámci i-tého riadku sa prechádzajú j-té stĺpce cyklicky.
Nadradený cyklus navyšuje premennú i až potom čo je ukončený podriadený cyklus a jeho premenná
j dosiahla hodnotu v M. Nadradený cyklus sa ukončí až vtedy ak premenná i dosiahne hodntu v N.
Vnorený cyklus má široké využitie napríklad aj v algoritmoch pre usporadúvanie prvkov či
prechádzanie bodov rastrovej grafiky súradnicami x a y. Cykly sa môžu vnárať do seba do takej
úrovne, ako to vyžaduje daná aplikácia.
6
Peter Kačur, Programovanie, December 2020-Január 2021,
Dokument je voľne šíriteľný za predpokladu zachovania jeho pôvodného obsahu.
Nedovolené kríženie vnorených cyklov
Diagram znázorňuje nepovolené kríženie vnorených cyklov. Ide o situáciu keď podradený cyklus po
ukončení jednej iterácie pokračuje nadradeným cyklom. Takéto kríženie nemá žiadny praktický
zmysel a ide len o chybu spôsobenú nepozornosť pri tvorbe diagramu.
Príklad č.4
Úlohou je vytvoriť
Pre A=7 vývojový diagram
XXXXXXX algoritmu, ktorý
XXXXXXX vykreslí plný štvorec
XXXXXXX pomocou znaku ‘X‘.
XXXXXXX Dĺžku strany zadá
XXXXXXX užívateľ na vstupe.
XXXXXXX Pri hľadaní riešenia
XXXXXXX vás určite napadne
že plný štvorec
vykreslený nejakým
znakom sa podobá tabuľke/mriežke, ktorá
má riadky a stĺpce. Tam kde sa pretína riadok
a stĺpec tam sa vykreslí znak ‘X‘. Teda na
riešenie bude vhodné použiť vnorený cyklus.
V diagrame si všimnite, že dĺžka strany
štvorca vyjadrená premennou A zároveň
určuje počet riadkov a počet stĺpcov
pomyselnej mriežky a teda aj počet
opakovaní/iterácii nadradené, ale aj
podradeného cyklu. Jadrom algoritmu je
opakované vypísanie znaku ‘X’ a prechod na
nový riadok vždy, keď sa dosiahne predpísaný
počet stĺpcov v danom riadku. O prechod na
nový riadok sa stará nadradený cyklus
a o výpis znaku do stĺpca sa stará podradený
7
Peter Kačur, Programovanie, December 2020-Január 2021,
Dokument je voľne šíriteľný za predpokladu zachovania jeho pôvodného obsahu.
cyklus. Znak ‘X’ sa vypíše presne AxA krát. Ak by bola dĺžka strany štvorca A=7 potom počet
vypísaných znakov X by bol 7*7=49.
8
Peter Kačur, Programovanie, December 2020-Január 2021,
Dokument je voľne šíriteľný za predpokladu zachovania jeho pôvodného obsahu.
Použitá literatúra a nástroje
9
Peter Kačur, Programovanie, December 2020-Január 2021,
Dokument je voľne šíriteľný za predpokladu zachovania jeho pôvodného obsahu.