<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="sk">
	<id>http://www.kiwiki.info/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=PiknaR</id>
	<title>Kiwiki - Príspevky používateľa [sk]</title>
	<link rel="self" type="application/atom+xml" href="http://www.kiwiki.info/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=PiknaR"/>
	<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php/%C5%A0peci%C3%A1lne:Pr%C3%ADspevky/PiknaR"/>
	<updated>2026-05-01T21:02:25Z</updated>
	<subtitle>Príspevky používateľa</subtitle>
	<generator>MediaWiki 1.34.0</generator>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Rekurzia_(rie%C5%A1en%C3%A9_pr%C3%ADklady)&amp;diff=13283</id>
		<title>Rekurzia (riešené príklady)</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Rekurzia_(rie%C5%A1en%C3%A9_pr%C3%ADklady)&amp;diff=13283"/>
		<updated>2023-05-16T12:40:56Z</updated>

		<summary type="html">&lt;p&gt;PiknaR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Draft}}&lt;br /&gt;
{{Skripta programovanie (zbierka úloh)}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Najväčší spoločný deliteľ==&lt;br /&gt;
'''Zadanie'''&lt;br /&gt;
Nájdite rekurzívny vzťah v Euklidovom algoritme pre výpočet najväčšieho spoločného deliteľa a využite ho vo funkcii, ktorá bude počítať najväčší spoločný deliteľ dvoch čísel, uvedených ako jej parametre. Funkciu použite v programe, ktorý načíta dve čísla a napíše hodnotu ich najväčšieho spoločného deliteľa.&lt;br /&gt;
&lt;br /&gt;
Poznámka: &lt;br /&gt;
V Euklidovom algoritme môžete namiesto klasického odpočítavania využiť zvyšok po delení, čo zníži počet krokov výpočtu a nebude potrebné sa zaoberať problémom „nesprávneho poradia“ čísel pri odpočítavaní.&lt;br /&gt;
&lt;br /&gt;
'''Vzorové príklady'''&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!vstup&lt;br /&gt;
!&lt;br /&gt;
!výstup&lt;br /&gt;
|-&lt;br /&gt;
|36 48&lt;br /&gt;
| -&amp;gt;&lt;br /&gt;
|12&lt;br /&gt;
|-&lt;br /&gt;
|576 284&lt;br /&gt;
| -&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|-&lt;br /&gt;
|2553 7215&lt;br /&gt;
| -&amp;gt;&lt;br /&gt;
|111&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Analýza riešenia'''&lt;br /&gt;
&lt;br /&gt;
Hľadaný rekurzívny vzťah je vidieť v postupe prevodu čísel postupným „modulovaním“ (operáciou modulo) – delenec a je nahradený deliteľom b, deliteľ b zase výsledkom a%b, ukončenie je pri nulovom b: &lt;br /&gt;
* NSD(a, b) = NSD(b, a%b) pre b&amp;gt;0, &lt;br /&gt;
* NSD(a, 0) = a&lt;br /&gt;
&lt;br /&gt;
'''Možné riešenie:'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int NSD(int a, int b)&lt;br /&gt;
{&lt;br /&gt;
   if (b == 0) return a;&lt;br /&gt;
   return NSD(b, a%b);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   int a, b;&lt;br /&gt;
   cin &amp;gt;&amp;gt; a &amp;gt;&amp;gt; b;&lt;br /&gt;
   cout &amp;lt;&amp;lt; NSD(a, b);&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Fibonacciho postupnosť==&lt;br /&gt;
'''Zadanie'''&lt;br /&gt;
Pre Fibonacciho postupnosť platí, že hodnota ďalšieho jeho prvku je súčtom dvoch predchádzajúcich. Zostavte program, ktorý bude z klávesnice čítať čísla n, kým nenačíta nulu a pre každé číslo n vypíše n-té Fibonacciho číslo v poradí, za predpokladu, že Fib(0) = 0 a  Fib(1) = 1.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vzorové príklady'''&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!vstup&lt;br /&gt;
!&lt;br /&gt;
!výstup&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
| -&amp;gt;&lt;br /&gt;
|3&lt;br /&gt;
|-&lt;br /&gt;
|9&lt;br /&gt;
| -&amp;gt;&lt;br /&gt;
|34&lt;br /&gt;
|-&lt;br /&gt;
|20&lt;br /&gt;
| -&amp;gt;&lt;br /&gt;
|6765 &lt;br /&gt;
|-&lt;br /&gt;
|40&lt;br /&gt;
| -&amp;gt;&lt;br /&gt;
|102334155&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
| -&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Analýza riešenia'''&lt;br /&gt;
&lt;br /&gt;
Fibonacciho postupnosť je rekurzívne definovaná ako:&lt;br /&gt;
* fib(0)=0&lt;br /&gt;
* fib(1)=1&lt;br /&gt;
* fib(i)=fib(i-1)+fib(i-2),  pre i&amp;lt;nowiki&amp;gt;&amp;gt;&amp;lt;/nowiki&amp;gt;1&lt;br /&gt;
&lt;br /&gt;
Na tomto príklade je vhodné demonštrovať, čo sa stane, ak zabudneme v rekurzívnej funkcii uviesť podmienku pre ukončenie rekurzie – program havaruje kvôli pretečeniu zásobníka.&lt;br /&gt;
&lt;br /&gt;
'''Možné riešenie:'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream.h&amp;gt;&lt;br /&gt;
long fib(int n)&lt;br /&gt;
{&lt;br /&gt;
  if (n &amp;lt; 2) return n;&lt;br /&gt;
  else return fib(n-1) + fib(n-2);&lt;br /&gt;
}&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   int n;&lt;br /&gt;
   cin &amp;gt;&amp;gt; n;&lt;br /&gt;
   while (n)&lt;br /&gt;
   {&lt;br /&gt;
      cout &amp;lt;&amp;lt; fib(n) &amp;lt;&amp;lt; endl;&lt;br /&gt;
      cin &amp;gt;&amp;gt; n;&lt;br /&gt;
   }&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Prevod čísel z 10-vej sústavy==&lt;br /&gt;
'''Zadanie'''&lt;br /&gt;
&lt;br /&gt;
Zostavte program, ktorý bude prevádzať prirodzené čísla do ľubovoľných číselných sústav so základom Z&amp;lt;10, využitím rekurzívnej funkcie. Túto funkciu postupne zdokonaľujte:&lt;br /&gt;
#Funkciu vylepšite, aby vedela prevádzať aj do sústav so základom Z&amp;lt;=16.&lt;br /&gt;
#Upravte funkciu tak, aby vedela prevádzať všetky celé čísla (čiže aj záporné a nulu).&lt;br /&gt;
#Pokúste sa funkciu obohatiť o prevod reálnych čísel (čiže aj desatinných).&lt;br /&gt;
V programe načítajte 2 vstupné údaje: číslo N v 10-vej sústave a základ novej sústavy z.&lt;br /&gt;
&lt;br /&gt;
'''Vzorové príklady'''&lt;br /&gt;
{|class=wikitable&lt;br /&gt;
|-&lt;br /&gt;
!vstup&lt;br /&gt;
!výstup&lt;br /&gt;
|-&lt;br /&gt;
|80 2 &lt;br /&gt;
|1010000&lt;br /&gt;
|-&lt;br /&gt;
|93 16&lt;br /&gt;
|5D&lt;br /&gt;
|-&lt;br /&gt;
|0 8&lt;br /&gt;
|0 &lt;br /&gt;
|-&lt;br /&gt;
| -74 4&lt;br /&gt;
| -1022&lt;br /&gt;
|-&lt;br /&gt;
|3.141592654 16&lt;br /&gt;
|3.243F6A8A48AA&lt;br /&gt;
|-&lt;br /&gt;
| -0.1 2&lt;br /&gt;
| -0.0001100110011001100&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Je vhodné začať jednoduchou funkciou na prevod prirodzeného čísla. Ak máme základ cieľovej sústavy z&amp;lt;10, môžeme problém vyjadriť aj rekurentným vzťahom v matematickom tvare: P(n, z) = P(n/z, z) * 10 + n%z (pre n &amp;gt; 0), a teda by bolo možné vytvoriť funkciu, ktorej návratovou hodnotou by bolo celé číslo.&lt;br /&gt;
&lt;br /&gt;
V prípade, že uvažujeme o vyššom základe, vo výsledku sa objavia aj symboly A, B, C, ...  funkcia by už musela výsledok vracať vo forme reťazca. Pre zjednodušenie nám stačí funkcia, ktorá bude výsledok priamo vypisovať. Je treba si uvedomiť, ako sa počíta prevod čísla – číslo vydelíme základom sústavy, tento podiel prevedieme a za ním bude nasledovať zvyšok po pôvodnom delení.&lt;br /&gt;
&lt;br /&gt;
Na vypísanie zvyšku pre vyššie sústavy by sme mohli pre zvyšky väčšie ako 9 použiť aj inkrementáciu znakového typu: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
cout &amp;lt;&amp;lt; char (‘A’ + n%z – 10);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keďže základ sústavy sa počas celého prevodu samozrejme nemení, nemá význam v každom volaní funkcie vytvárať jeho kópiu v podobe vstupnej premennej, ale stačí nám referencia (ušetrí sa pár bajtíkov pri každom vnorení).&lt;br /&gt;
&lt;br /&gt;
Ak chceme, aby funkcia dokázala prevádzať aj nulu a záporné čísla, musíme si pridať akúsi „úvodnú“ funkciu, ktorá ošetrí problematické situácie a až potom zavolá hlavnú rekurzívnu funkciu prevodu.&lt;br /&gt;
&lt;br /&gt;
'''Možné riešenie:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
const char znaky[] = &amp;quot;0123456789ABCDEF&amp;quot;;&lt;br /&gt;
void PrevodCele(int n, int &amp;amp;zaklad)&lt;br /&gt;
{&lt;br /&gt;
   if (n == 0) return;&lt;br /&gt;
   PrevodCele(n/zaklad, zaklad); // prevedie celu cast podielu&lt;br /&gt;
   cout &amp;lt;&amp;lt; znaky[n%zaklad]; // za tym napise zvysok&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void PrevodReal(double r, int &amp;amp;zaklad, int presnost)&lt;br /&gt;
{&lt;br /&gt;
   if (r == 0) return;&lt;br /&gt;
   r *= zaklad; // posunie o jeden rad vlavo&lt;br /&gt;
   cout &amp;lt;&amp;lt; znaky[int(r)]; // celu cast vypise&lt;br /&gt;
   PrevodReal(r - int(r), zaklad, presnost - 1); // zvysok prevedie&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// uvodna funkcia na specialne pripady&lt;br /&gt;
void Prevod(double r, int zaklad, int presnost)&lt;br /&gt;
{&lt;br /&gt;
   // ak je zaporne&lt;br /&gt;
   if (r &amp;lt; 0)&lt;br /&gt;
   {&lt;br /&gt;
      r = -r; cout &amp;lt;&amp;lt; '-';&lt;br /&gt;
   }&lt;br /&gt;
   // cela cast&lt;br /&gt;
   int n = int(r);&lt;br /&gt;
   if (n) &lt;br /&gt;
      PrevodCele(n, zaklad);&lt;br /&gt;
   else &lt;br /&gt;
      cout &amp;lt;&amp;lt; 0; // ak je nula, vypise ju&lt;br /&gt;
&lt;br /&gt;
   // desatinna cast (ak je)&lt;br /&gt;
   if (r -= n)&lt;br /&gt;
   {&lt;br /&gt;
      cout &amp;lt;&amp;lt; '.';&lt;br /&gt;
      PrevodReal(r, zaklad, presnost);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   double r;&lt;br /&gt;
   int sustava;&lt;br /&gt;
   cout &amp;lt;&amp;lt; &amp;quot;cislo v 10-kovej sustave: &amp;quot;; cin &amp;gt;&amp;gt; r;&lt;br /&gt;
   cout &amp;lt;&amp;lt; &amp;quot;cielova sustava: &amp;quot;; cin &amp;gt;&amp;gt; sustava;&lt;br /&gt;
   cout &amp;lt;&amp;lt; &amp;quot;prevedene: &amp;quot;;&lt;br /&gt;
   Prevod(r, sustava, 6);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prvočísla==&lt;br /&gt;
&lt;br /&gt;
'''Zadanie:'''&lt;br /&gt;
&lt;br /&gt;
Pomocou rekurzívneho riešenia vytvorte funkciu, ktorá otestuje, či je dané číslo prvočíslo.&lt;br /&gt;
===Prvé riešenie - neoptimalizované===&lt;br /&gt;
&lt;br /&gt;
'''Analýza riešenia:'''&lt;br /&gt;
&lt;br /&gt;
Testujeme číslo n na prvočíselnosť. Číslo n budeme postupne deliť číslami od 2 až po (n-1) aby sme zistili zvyšok po delení. Pri prvom zvyšku, ktorý je rovný 0 (teda číslo z delí číslo n bezo zvyšku) funkciu ukončíme a vrátime hodnotu 0 (n nie je prvočíslo). Ak je z&amp;lt;(n-1) tak funkciu is_prime1 voláme rekurzívne a v tomto volaní zvýšime parameter z o 1. (riadok č. 8). V prípade, že neplatí rovnosť z&amp;lt;(n-1) a ani jedno číslo z intervalu &amp;lt;2,n-1&amp;gt; nedelí číslo n bezo zvyšku, vrátime hodnotu 1 (n je prvočíslo).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Možné riešenie:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line &amp;gt;&lt;br /&gt;
int is_prime1(int n, int z=2)&lt;br /&gt;
{  &lt;br /&gt;
   if((n%z)==0)&lt;br /&gt;
      return 0;&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
      if(z&amp;lt;(n-1))&lt;br /&gt;
         return is_prime1(n,z+1);&lt;br /&gt;
      else&lt;br /&gt;
         return 1;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Druhé riešenie - čiastočne optimalizované===&lt;br /&gt;
Optimalizácia v tomto prípade znamená eliminovať počet delení modulo. Myšlienka nájdenia hornej hranice hodnoty premennej ''z'' z predchádzajúceho príkladu:&lt;br /&gt;
*Číslo n delíme modulo hodnotou 2. (výsledok je rôzny od 0)&lt;br /&gt;
** nemá zmysel deliť číslom ''z'' väčším ako je n/2, pretože už nám nemôže vyjsť celočíselný podiel. Výsledok takéhoto delenia bude v intervale (0,1)&lt;br /&gt;
*Číslo n delíme modulo hodnotou 3. (výsledok je rôzny od 0)&lt;br /&gt;
** nemá zmysel deliť číslom ''z'' väčším ako je n/3, pretože už nám nemôže vyjsť celočíselný podiel. Výsledok takéhoto delenia bude v intervale &amp;lt;math&amp;gt;(1,2) \cup (2,3)&amp;lt;/math&amp;gt;. Podiel nebude mať hodnotu 2, pretože v tom prípade by bolo číslo n delitelné číslom 3 bezo zvyšku.&lt;br /&gt;
*Delitel n budeme zväčšovať až pokiaľ platí &amp;lt;math&amp;gt;\frac {n}{d}&amp;gt;d&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Horná hranica hodnoty d sa dá určiť nasledovne: &amp;lt;math&amp;gt;d=\sqrt{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Možné riešenie:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line &amp;gt;&lt;br /&gt;
int is_prime2(int n, int z=2)&lt;br /&gt;
{  &lt;br /&gt;
   if((n%z)==0)&lt;br /&gt;
      return 0;&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
      if(z&amp;lt;sqrt(n))&lt;br /&gt;
         return is_prime2(n,z+1);&lt;br /&gt;
      else&lt;br /&gt;
         return 1;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tretie riešenie - viac optimalizované===&lt;br /&gt;
V predchádzajúcom príklade sme delili číslo n hodnotami premennej d. Premenná d mala prvú hodnotu 2 a potom sa k nej vždy pripočítala hodnota 1. Teda, číslo n sme postupne delili hodnotami &lt;br /&gt;
 2, 3, 4, 5, 6, 7, 8, ... &amp;lt;math&amp;gt;d=\sqrt{n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Všimnime si, že niektoré delenia sú opäť zbytočné: &lt;br /&gt;
*ak delíme číslom 2, potom nemá zmysel deliť žiadnym jeho násobkom&lt;br /&gt;
*vo všeobecnosti platí: ak delíme číslom ''j'', potom nemá zmysel deliť žiadnym násobkom čísla ''j''.&lt;br /&gt;
&lt;br /&gt;
Inak povedané, netreba deliť žiadnom zloženým číslom. Stačí deliť prvočíslami. A tu sa dostávame k rekurzívnej definícii prvočísel:&lt;br /&gt;
&lt;br /&gt;
'''Rekurzívna definícia prvočísla''':&lt;br /&gt;
* Číslo 2 je najmenšie prvočíslo.&lt;br /&gt;
* Prvočíslo je každé celé kladné číslo, ktoré nie je deliteľné žiadnym iným menším prvočíslom ako je toto číslo samotné.&lt;br /&gt;
&lt;br /&gt;
Pri takto stanovenej podmienke je komplikovanejšie vytvoriť podmienku, ktoré by toto spĺňala. Preto skúsme napísať program, ktorý by zbytočne nedelil násobkami čísel 2 a 3.&lt;br /&gt;
Ak nechceme deliť násobkami čísla 2, tak potom budeme postupne deliť premennú n hodnotami 3,5,7,9,11,...&lt;br /&gt;
&lt;br /&gt;
Ak nechceme deliť násobkami čísla 3, tak potom budeme postupne deliť premennú n hodnotami 4,5,7,8,10,11,13,14,...&lt;br /&gt;
&lt;br /&gt;
Prienikom týchto dvoch podmienok je, že nám zostava deliť číslami 5,7,11,13,17,19,23, ...&lt;br /&gt;
&lt;br /&gt;
V tejto postupnosti je jednoduché pravidlo: striedavé pripočítavanie hodnoty 2 a 4. Vyjadrené aritmetickou postupnosťou:&lt;br /&gt;
*&amp;lt;math&amp;gt;d_0=2&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;d_1=3&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;d_2=5&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;d_n=d_{n-1} + 3-(-1)^{i+1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Možné riešenie:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line &amp;gt;&lt;br /&gt;
int is_prime3(int n, int z,int krok)&lt;br /&gt;
{ &lt;br /&gt;
   int d=z+3+krok;&lt;br /&gt;
   if((n%d)==0)&lt;br /&gt;
      return 0;&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
      if(d&amp;lt;sqrt(n))&lt;br /&gt;
         return is_prime3(n,d,-krok);&lt;br /&gt;
      else&lt;br /&gt;
         return 1;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int is_prime(int n)&lt;br /&gt;
{&lt;br /&gt;
   if((n%2)==0) return 0;&lt;br /&gt;
   if((n%3)==0) return 0;&lt;br /&gt;
   if((n%5)==0) return 0;&lt;br /&gt;
   return is_prime3(n,5,-1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Rozbor zdrojového kódu:'''&lt;br /&gt;
&lt;br /&gt;
Pre hľadanie prvočísel použijeme funkciu is_prime, ktorá otestuje číslo n na deliteľnosť číslami 2, 3 a 5. Potom zavoláme pomocnú rekurzívnu funkciu is_prime3(int n, int z,int krok) ktorá bude testovať deliteľnosť čísla n prvkami postupnosti &amp;lt;math&amp;gt;\big\{d_n\big\}&amp;lt;/math&amp;gt;. Aby sme sa vyhli zbytočným podmienkam, ktoré môžu celý algoritmus spomaliť, definujeme tretí parameter funkcie is_prime3 ''krok''. Parameter krok je v našej postupnosti výraz &amp;lt;math&amp;gt; 3-(-1)^{i+1}&amp;lt;/math&amp;gt;, avšak tu nepočítame hodnotu mocniny &amp;lt;math&amp;gt;(-1)^{i+1}&amp;lt;/math&amp;gt; ale využívame skutočnosť že tento výraz nadobúda hodnoty -1,1,-1,1, ... .&lt;br /&gt;
&lt;br /&gt;
V premennej d je vypočítaná hodnota aktuálneho deliteľa podľa vzťahu: &amp;lt;math&amp;gt;d_n=d_{n-1} + 3-(-1)^{i+1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Riešenie s globálnym poľom===&lt;br /&gt;
Pre zjednodušenie tvorby programu si vytvorme globálne pole do ktorého uložíme prvých n prvočísel. Potom najväčšie číslo, ktoré môžeme testovať na prvočíselnosť je &amp;lt;math&amp;gt;N=n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Analýza riešenia:'''&lt;br /&gt;
&lt;br /&gt;
Testujeme číslo n na prvočíselnosť. Ako prvé vypočítame zvyšok po delení prvým prvočíslom v poli ''pcisla'' (delíme číslom pcisla[0]=2). V prípade, ak je výsledok 0, tak výpočet ukončíme a vrátime hodnotu (0 - nie je prvočíslo). V opačnom prípade rekurzívne zavoláme funkciu jePrvocislo, kde druhý parameter (má význam indexu v poli ''pcisla'') zvýšime o 1. Teda v ďalšom volaní funkcie jePrvocislo už budeme deliť číslom pcisla[1]=3. Musíme však zabezpečiť, aby hodnota pcisla[i] v riadku č. 5 existovala. To zabezpečíme tak, že rekurzívne volanie dovolíme len ak je hodnota indexu i menšia ako počet hodnôt v pole pcisla.&lt;br /&gt;
&lt;br /&gt;
'''Možné riešenie:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line &amp;gt;&lt;br /&gt;
int prvocisla[]={2,3,5,7,11,13,17,19,23,29,31,37};&lt;br /&gt;
&lt;br /&gt;
int is_prime4(int n, int i=0)&lt;br /&gt;
{ &lt;br /&gt;
  if(n%prvocisla[i]==0)&lt;br /&gt;
     return 0;&lt;br /&gt;
  if(i&amp;lt;223 &amp;amp;&amp;amp; n&amp;gt;pow(prvocisla[i],2))&lt;br /&gt;
     return is_prime4(n,i+1);&lt;br /&gt;
  else &lt;br /&gt;
     return 1;   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Vzorové riešenie'''&lt;br /&gt;
&lt;br /&gt;
Uvádzame postupnosť volaní funkcie '''is_prime4(31)'''&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|+&lt;br /&gt;
!Vnorenie&lt;br /&gt;
!Volaná funkcia&lt;br /&gt;
!prvocisla[i]&lt;br /&gt;
!n%prvocisla[i]&lt;br /&gt;
!rekurzívne volanie&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|is_prime(31,0)&lt;br /&gt;
|2&lt;br /&gt;
|31%2=1&lt;br /&gt;
|is_prime(31,1)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|is_prime(31,1)&lt;br /&gt;
|3&lt;br /&gt;
|31%3=1&lt;br /&gt;
|is_prime(31,2)&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|is_prime(31,2)&lt;br /&gt;
|5&lt;br /&gt;
|31%5=1&lt;br /&gt;
|is_prime(31,3)&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|is_prime(31,3)&lt;br /&gt;
|7&lt;br /&gt;
|31%7=3&lt;br /&gt;
|is_prime(31,4)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| is_prime(31,4)&lt;br /&gt;
| 11&lt;br /&gt;
| n.a.&lt;br /&gt;
| neplatí podmienka n&amp;gt;prvocisla[i]^2&amp;lt;br/&amp;gt;n=31, i=4, prvocisla[i]=11&amp;lt;br/&amp;gt;funkcia vracia hodnotu '''1'''&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| návrat na is_prime(31,3)&lt;br /&gt;
| 7&lt;br /&gt;
| n.a.&lt;br /&gt;
| spätný rekurzívny chod&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| návrat na is_prime(31,2)&lt;br /&gt;
| 5&lt;br /&gt;
| n.a.&lt;br /&gt;
| spätný rekurzívny chod&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| návrat na is_prime(31,1)&lt;br /&gt;
| 3&lt;br /&gt;
| n.a.&lt;br /&gt;
| spätný rekurzívny chod&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| návrat na is_prime(31,0)&lt;br /&gt;
| 2&lt;br /&gt;
| n.a.&lt;br /&gt;
| spätný rekurzívny chod&lt;br /&gt;
|}&lt;br /&gt;
====Porovnanie efektivity navrhovaných algoritmov====&lt;br /&gt;
Skôr ako budeme porovnávať ukázané algoritmy, poznamenajme, že tento spôsob zisťovania prvočíselnosti je pre veľké čísla veľmi neefektívny. Pri 8-cifernom čísle trvá výpočet funkcie is_prime približne 230 s. Pre zisťovanie prvočíselnosti existujú špeciálne algoritmy, napr. [http://en.wikipedia.org/wiki/AKS_primality_test ASK test], [http://en.wikipedia.org/wiki/Solovay%E2%80%93Strassen_primality_test Test Solovay-Strassena], [http://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test Test Millera-Rabina] a iné.&lt;br /&gt;
V nasledujúcej tabuľke a na obrázku sú výsledky porovnania efektívnosti týchto algoritmov pri hľadaní prvočísel na intervale (100,n) kde n sme menili od 50 000 do 2 000 000. V tabuľke ani v grafe nie je zahrnutá funkcia is_prime1, pretože pri n=100 000 pri rekurzívnom volaní funkcia neočakávane skončila.&lt;br /&gt;
Aby sme mohli porovnávať aj funkciu is_prime4, musíme do poľa ''prvocisla'' pridať všetky prvočísla, ktoré sú menšie ako &amp;lt;math&amp;gt;\sqrt{n_{max}}&amp;lt;/math&amp;gt;, kde n_max je v našom prípade 2 000 000. Pole ''prvocisla'' obsahuje prvých 233 prvočísel:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int prvocisla[]={&lt;br /&gt;
2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,&lt;br /&gt;
191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,&lt;br /&gt;
397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,&lt;br /&gt;
617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,&lt;br /&gt;
857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997,1009,1013,1019,1021,1031,1033,1039,1049,1051,1061,1063,&lt;br /&gt;
1069,1087,1091,1093,1097,1103,1109,1117,1123,1129,1151,1153,1163,1171,1181,1187,1193,1201,1213,1217,1223,1229,1231,1237,1249,1259,1277,1279,&lt;br /&gt;
1283,1289,1291,1297,1301,1303,1307,1319,1321,1327,1361,1367,1373,1381,1399,1409,1423};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Naprogramované funkcie sme testovali nasledovne:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream.h&amp;gt;&lt;br /&gt;
#include &amp;lt;time.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   clock_t start, end;&lt;br /&gt;
   double elapsed;&lt;br /&gt;
   int n;&lt;br /&gt;
   n=50000; //100000, 200000, ... 2000000&lt;br /&gt;
   start = clock();&lt;br /&gt;
   for(int i=100;i&amp;lt;n;i++)&lt;br /&gt;
      is_prime(i);   &lt;br /&gt;
   end = clock();&lt;br /&gt;
   elapsed = ((double) (end - start)) / CLOCKS_PER_SEC;&lt;br /&gt;
   cout&amp;lt;&amp;lt;elapsed&amp;lt;&amp;lt;endl;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{| class=datatable&lt;br /&gt;
|+Tabuľka nameraných časov behu funkcií&lt;br /&gt;
|-&lt;br /&gt;
!n [tisíc]	&lt;br /&gt;
!is_prime_2 t[s]	&lt;br /&gt;
!is_prime t[s]&lt;br /&gt;
!is_prime4 t[s]&lt;br /&gt;
|-&lt;br /&gt;
|50	&lt;br /&gt;
|0,16	&lt;br /&gt;
|0,086&lt;br /&gt;
|0,061&lt;br /&gt;
|-&lt;br /&gt;
|100	&lt;br /&gt;
|0,398	&lt;br /&gt;
|0,134&lt;br /&gt;
|0,126&lt;br /&gt;
|-&lt;br /&gt;
|200	&lt;br /&gt;
|1,034	&lt;br /&gt;
|0,345&lt;br /&gt;
|0,304&lt;br /&gt;
|-&lt;br /&gt;
|500	&lt;br /&gt;
|1,245	&lt;br /&gt;
|1,237&lt;br /&gt;
|0,958&lt;br /&gt;
|-&lt;br /&gt;
|1000	&lt;br /&gt;
|3,275	&lt;br /&gt;
|3,264&lt;br /&gt;
|2,349&lt;br /&gt;
|-&lt;br /&gt;
|1500	&lt;br /&gt;
|17,203	&lt;br /&gt;
|5,831&lt;br /&gt;
|3,9&lt;br /&gt;
|-&lt;br /&gt;
|2000	&lt;br /&gt;
|26	&lt;br /&gt;
|8,6&lt;br /&gt;
|5,82&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pLines ymin=0 ymax=27 colors=FF0000,00FF00,0000FF size=600x250 plots legend&amp;gt;&lt;br /&gt;
,is_prime2, is_prime, is_prime4&lt;br /&gt;
50 tis, 0.16, 0.08, 0.061&lt;br /&gt;
100 tis, 0.398, 0.134, 0.126&lt;br /&gt;
200 tis, 1.034, 0.345, 0.304&lt;br /&gt;
500 tis, 1.245, 1.237, 0.958&lt;br /&gt;
1 mil, 3.275, 3.264, 2.349&lt;br /&gt;
1.5 mil, 17.203, 5.831, 3.9&lt;br /&gt;
2 mil, 26, 8.6, 5.82&lt;br /&gt;
&amp;lt;/pLines&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podobné časy pri nižších hodnotách n sú dané tým, že vzdialenosť susedných prvočísel je väčšia pri vyšších prvočíslach. Z grafu taktiež vidieť účinok optimalizácie algoritmu.&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
*http://sk.wikipedia.org/wiki/Zoznam_prvo%C4%8D%C3%ADsiel&lt;br /&gt;
*http://www.prime-numbers.org/&lt;/div&gt;</summary>
		<author><name>PiknaR</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=%C5%A0trukt%C3%BAry_(rie%C5%A1en%C3%A9_pr%C3%ADklady)&amp;diff=13282</id>
		<title>Štruktúry (riešené príklady)</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=%C5%A0trukt%C3%BAry_(rie%C5%A1en%C3%A9_pr%C3%ADklady)&amp;diff=13282"/>
		<updated>2023-05-16T12:38:04Z</updated>

		<summary type="html">&lt;p&gt;PiknaR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Draft}}&lt;br /&gt;
{{Skripta programovanie (zbierka úloh)}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Štruktúra Zlomok==&lt;br /&gt;
'''Úloha:'''&lt;br /&gt;
&lt;br /&gt;
Zostavte program, ktorý pomôže pri práci so zlomkami – bude vedieť zlomok skrátiť a vypísať ho v čo najvhodnejšom tvare. Program načíta dva zlomky, každý hneď po načítaní upravene vypíše, ďalej vypíše ich súčin, súčet a podiel:&lt;br /&gt;
#Zostavte funkciu na načítanie zlomku z klávesnice a funkciu, ktorá vypíše zlomok na obrazovku v tvare „a/b“, napr. „3/4“. Postupne ju zdokonaľujte:&lt;br /&gt;
##V prípade, že zlomok má celú časť, vypíše ho v tvare „a b/c“, napr. namiesto „9/4“ bude písať „2 1/4“.&lt;br /&gt;
##V prípade, že jeho zvyšná časť je nulová, nebude ju vypisovať, napr. namiesto „6/2“ nebude písať „3 0/2“, ale iba „3“ a podobne, namiesto „0/2“ iba „0“.&lt;br /&gt;
#Vytvorte si pomocnú funkciu, ktorá zjednoduší (skráti) zlomok, napr. „36/48“ prevedie na „3/4“ a obohaťte ňou funkciu pre vypísanie zlomku (aby sa zlomok vypisoval už v zjednodušenom tvare). &lt;br /&gt;
#Zostavte funkcie, ktoré vypočítajú súčin, súčet a podiel dvoch zlomkov a použite ich v hlavnom programe.&lt;br /&gt;
&lt;br /&gt;
'''Vzorový vstup:'''&lt;br /&gt;
 5 4&lt;br /&gt;
 1 1/4&lt;br /&gt;
 6 8&lt;br /&gt;
 3/4&lt;br /&gt;
&lt;br /&gt;
'''Vzorový výstup:'''&lt;br /&gt;
 sucin: 15/16&lt;br /&gt;
 sucet: 2&lt;br /&gt;
 podiel: 1 2/3&lt;br /&gt;
&lt;br /&gt;
Cieľom je precvičiť si prácu so štruktúrou – bolo by vhodné ju v programe využiť.&lt;br /&gt;
Funkcia na načítanie zlomku môže využiť referenciu alebo štruktúru ako návratovú hodnotu. Pre krátenie zlomku môžeme využiť referenciu a pre matematické operácie so zlomkami zase návratovú hodnotu.&lt;br /&gt;
&lt;br /&gt;
Pre krátenie zlomku treba funkciu na najväčší spoločný deliteľ – použijeme Euklidov algoritmus postupného odpočítavania menšieho čísla od väčšieho a jeho zdokonalenie cez operáciu modulo.&lt;br /&gt;
Pri matematických funkciách môžeme využiť akýsi „akoby konštruktor“ na vytvorenie zlomku, no nie je to nutné.&lt;br /&gt;
&lt;br /&gt;
'''Možné riešenie:'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
struct TZlomok { int citatel, menovatel; };&lt;br /&gt;
void CitajZlomok(TZlomok &amp;amp;z)&lt;br /&gt;
{&lt;br /&gt;
   cin &amp;gt;&amp;gt; z.citatel;&lt;br /&gt;
   cin &amp;gt;&amp;gt; z.menovatel;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int NSD(int a, int b)&lt;br /&gt;
{&lt;br /&gt;
   while (b)&lt;br /&gt;
   {&lt;br /&gt;
      int c = a % b;&lt;br /&gt;
      a = b;&lt;br /&gt;
      b = c;&lt;br /&gt;
   }&lt;br /&gt;
   return a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SkratZlomok(TZlomok &amp;amp;z)&lt;br /&gt;
{&lt;br /&gt;
   int nsd = NSD(z.citatel, z.menovatel);&lt;br /&gt;
   z.citatel /= nsd;&lt;br /&gt;
   z.menovatel /= nsd;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void VypisZlomok(TZlomok z)&lt;br /&gt;
{&lt;br /&gt;
   SkratZlomok(z);&lt;br /&gt;
   int cela_cast = z.citatel / z.menovatel;&lt;br /&gt;
   if (cela_cast)&lt;br /&gt;
   {&lt;br /&gt;
      cout &amp;lt;&amp;lt; cela_cast;&lt;br /&gt;
      int zvysok = z.citatel % z.menovatel;&lt;br /&gt;
      if (zvysok) cout &amp;lt;&amp;lt; &amp;quot; &amp;quot; &amp;lt;&amp;lt; zvysok &amp;lt;&amp;lt; &amp;quot;/&amp;quot; &amp;lt;&amp;lt; z.menovatel;&lt;br /&gt;
   }&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
      cout &amp;lt;&amp;lt; z.citatel;&lt;br /&gt;
      if (z.citatel) // ak je nula, napise len ju a nie napr. 0/1&lt;br /&gt;
      cout &amp;lt;&amp;lt; &amp;quot;/&amp;quot; &amp;lt;&amp;lt; z.menovatel;&lt;br /&gt;
   }&lt;br /&gt;
   cout &amp;lt;&amp;lt; endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
TZlomok Zlomok(int cit, int men)&lt;br /&gt;
{&lt;br /&gt;
   TZlomok z;&lt;br /&gt;
   z.citatel = cit;&lt;br /&gt;
   z.menovatel = men;&lt;br /&gt;
   SkratZlomok(z);&lt;br /&gt;
   return z;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
TZlomok SucinZlomkov(TZlomok z1, TZlomok z2)&lt;br /&gt;
{&lt;br /&gt;
   return Zlomok(z1.citatel * z2.citatel, z1.menovatel * z2.menovatel);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
TZlomok SucetZlomkov(TZlomok z1, TZlomok z2)&lt;br /&gt;
{&lt;br /&gt;
   return Zlomok(z1.citatel * z2.menovatel + z2.citatel * z1.menovatel,&lt;br /&gt;
   z1.menovatel * z2.menovatel);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
TZlomok PodielZlomkov(TZlomok z1, TZlomok z2)&lt;br /&gt;
{&lt;br /&gt;
   return Zlomok(z1.citatel * z2.menovatel, z1.menovatel * z2.citatel);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   TZlomok z1, z2;&lt;br /&gt;
   CitajZlomok(z1); VypisZlomok(z1);&lt;br /&gt;
   CitajZlomok(z2); VypisZlomok(z2);&lt;br /&gt;
   cout &amp;lt;&amp;lt; &amp;quot;sucin: &amp;quot;; VypisZlomok(SucinZlomkov(z1, z2));&lt;br /&gt;
   cout &amp;lt;&amp;lt; &amp;quot;sucet: &amp;quot;; VypisZlomok(SucetZlomkov(z1, z2));&lt;br /&gt;
   cout &amp;lt;&amp;lt; &amp;quot;podiel: &amp;quot;; VypisZlomok(PodielZlomkov(z1, z2));&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zásobník - pamäť typu LIFO==&lt;br /&gt;
===Intepreter postfixových aritmetických výrazov===&lt;br /&gt;
'''Zadanie:'''&lt;br /&gt;
&lt;br /&gt;
Vytvorte program v jazyku C, ktorý po spustení načíta od používateľa postfixový aritmetický výraz, vyhodnotí ho, vypíše jeho hodnotu do konzoly (na monitor) a skončí. &lt;br /&gt;
&lt;br /&gt;
'''Analýza:'''&lt;br /&gt;
&lt;br /&gt;
V postfixovom aritmetickom výraze sa operátor zapisuje vždy po svojich dvoch operandoch, ako to môžeme vidieť v nasledujúcom takomto výraze&lt;br /&gt;
 5 9 8 + 4 6 * * 7 + *&lt;br /&gt;
ktorý má  hodnotu 2075.&lt;br /&gt;
Každý infixový  aritmetický výraz, môže byť prepísaný na postfixový. Infixová verzia uvedeného postfixového výrazu je nasledovná:&lt;br /&gt;
 5 * ( ( (9 + 8) * (4 * 6) ) + 7)&lt;br /&gt;
a tá má samozrejme po vyhodnotení rovnakú hodnotu 2075.&lt;br /&gt;
&lt;br /&gt;
Pomocou abstraktného dátového typu (ADT) zásobníka sa dajú veľmi dobre vyhodnocovať  práve postfixové aritmetické výrazy. Každý operátor si z vrcholu zásobníka načíta svoje dva operandy a po vykonaní operácie na nich vráti jej výsledok namiesto týchto dvoch operandov na vrchol zásobníka (využitie princípu dátovej štruktúry typu LIFO). Nasledujúci obrázok demonštruje tento jednoduchý princíp na vyhodnocovaní vyššie uvedeného postfixového aritmetického výrazu.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=wikitable&lt;br /&gt;
|+ Spracovanie postfixového výrazu 5 9 8 + 4 6 * * 7 + *&lt;br /&gt;
|-&lt;br /&gt;
!index v pamati zásobníka&amp;lt;hr/&amp;gt;číslo kroku&lt;br /&gt;
! 0&lt;br /&gt;
! 1&lt;br /&gt;
! 2&lt;br /&gt;
! 3&lt;br /&gt;
! 4&lt;br /&gt;
! operácia&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 5&lt;br /&gt;
| 9&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 5&lt;br /&gt;
| 9&lt;br /&gt;
| 8&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 8+9&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 5&lt;br /&gt;
| 17&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 5&lt;br /&gt;
| 17&lt;br /&gt;
| 4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 5&lt;br /&gt;
| 17&lt;br /&gt;
| 4&lt;br /&gt;
| 6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 5&lt;br /&gt;
| 17&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 6 * 4&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| 5&lt;br /&gt;
| 17&lt;br /&gt;
| 24&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| 5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 24*17&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| 5&lt;br /&gt;
| 408&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 5&lt;br /&gt;
| 408&lt;br /&gt;
| 7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 408 + 7&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 5&lt;br /&gt;
| 415&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 415 * 5&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 2075&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
Tabuľka ukazuje použitie zásobníka reprezentovaného celočíselným poľom (zasobnik.pamat[ ]) pre vyhodnotenie postfixového výrazu 5 9 8 + 4 6 * * 7 + * uloženého v znakovom poli (vyraz[ ]). Tento výraz postupne prechádzame zľava doprava. Ak narazíme na znak reprezentujúci číslo, vložíme ho na vrchol zásobníka (zasobnik.pamat[zasobnik.vrchol]), ak narazíme na znak reprezentujúci operátor, potom vyberieme z vrcholu zásobníka 2 operandy, aplikujeme na ne operátor a namiesto týchto dvoch operandov vložíme na vrchol zásobníka výsledok samotnej operácie. &lt;br /&gt;
Na reprezentáciu zásobníka použijeme štruktúru LIFO. Pre základné operácie so zásobníkom, vloženie položky na vrchol zásobníka a vybratie položky z jeho vrcholu, si vytvoríme dve funkcie:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  stav zasobnika push(LIFO &amp;amp;zasobnik, int x);&lt;br /&gt;
  int pop(LIFO &amp;amp;zasobnik); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''Príklad vstupu do programu:'''&lt;br /&gt;
&lt;br /&gt;
5 9 8 + 4 6 * * 7 + *&lt;br /&gt;
&lt;br /&gt;
'''Príklad výstupu z programu:'''&lt;br /&gt;
&lt;br /&gt;
2075 &lt;br /&gt;
&lt;br /&gt;
'''Možné riešenie:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include&amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
#define MAX_PAMAT 40 &lt;br /&gt;
&lt;br /&gt;
enum stav_zasobnika{OK=-1, FULL=INT_MAX, EMPTY=INT_MIN}; &lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
    double pamat[ MAX_PAMAT ];&lt;br /&gt;
    int vrchol;&lt;br /&gt;
} LIFO;&lt;br /&gt;
&lt;br /&gt;
/** pre ucely ladenia */&lt;br /&gt;
void show(LIFO &amp;amp;zasobnik){&lt;br /&gt;
    cout&amp;lt;&amp;lt;&amp;quot;|&amp;quot;;&lt;br /&gt;
    for(int i=0; i&amp;lt;zasobnik.vrchol; i++) {&lt;br /&gt;
        cout&amp;lt;&amp;lt;zasobnik.pamat[i]&amp;lt;&amp;lt;&amp;quot;|&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//VLOZI novu polozku 'x' do pola 'zasobnik.pamat' (do zasobnika) a zvacsi indexovu premennu //'zasobnik.vrchol' o 1&lt;br /&gt;
stav_fronty push(LIFO &amp;amp;zasobnik,double x) {&lt;br /&gt;
&lt;br /&gt;
    if(zasobnik.vrchol&amp;lt;MAX_PAMAT)&lt;br /&gt;
        zasobnik.pamat[zasobnik.vrchol++]=x;&lt;br /&gt;
    else&lt;br /&gt;
        return FULL;&lt;br /&gt;
    return OK;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//zmensi indexovu premennu 'zasobnik.vrchol' o 1 a VYBERIE poslednu vlozenu polozku z pola //'zasobnik.pamat' (zo zasobnika)&lt;br /&gt;
double pop(LIFO &amp;amp;zasobnik) {&lt;br /&gt;
    if(zasobnik.vrchol&amp;gt;0)&lt;br /&gt;
        return zasobnik.pamat[--zasobnik.vrchol];&lt;br /&gt;
    else&lt;br /&gt;
        return EMPTY;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
      LIFO f; //deklaracia strukturovej premennej typu 'LIFO' reprezentujucej zasobnik&lt;br /&gt;
      f.vrchol=0;&lt;br /&gt;
      int i,j,N;&lt;br /&gt;
      char vyraz[40];&lt;br /&gt;
&lt;br /&gt;
      //cout&amp;lt;&amp;lt;&amp;quot;Vlozte postfixovy vyraz na vyhodnotenie:\n&amp;quot;;&lt;br /&gt;
      cin.getline(vyraz,39);&lt;br /&gt;
&lt;br /&gt;
      N=(int)strlen(vyraz); //v 'X' je dlzka nacitaneho retazca zo standardneho vstupu &lt;br /&gt;
&lt;br /&gt;
      // v cykle 'for' prechadzame vstupny vyraz ulozeny v poli 'vyraz' zlava doprava. &lt;br /&gt;
      // Ak narazime na znak reprezentujuci cislo, vlozime ho na vrchol &lt;br /&gt;
      // zasobnika ('f.pamat[f.vrchol]'), ak narazime na znak&lt;br /&gt;
      // reprezentujuci operator, potom vyberieme z vrcholu zasobnika 2 operandy, aplikujeme na ne&lt;br /&gt;
      // operator a namiesto tychto dvoch operandov vlozime na vrchol zasobnika vysledok samotnej&lt;br /&gt;
      // operacie&lt;br /&gt;
&lt;br /&gt;
      for(i=0; i&amp;lt;N; i++)&lt;br /&gt;
      {&lt;br /&gt;
        if (vyraz[i]==' ') {&lt;br /&gt;
          continue;&lt;br /&gt;
        }&lt;br /&gt;
        if (vyraz[i]=='+') {&lt;br /&gt;
            push(f, (pop(f) + pop(f)));&lt;br /&gt;
            continue;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (vyraz[i]=='*') {&lt;br /&gt;
            push(f, (pop(f) * pop(f)));&lt;br /&gt;
            continue;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (vyraz[i]=='/') {&lt;br /&gt;
            push(f, (pop(f) / pop(f)));&lt;br /&gt;
            continue;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (vyraz[i]=='-') {&lt;br /&gt;
            push(f, (pop(f) - pop(f)));&lt;br /&gt;
            continue;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        j=0;&lt;br /&gt;
        while((vyraz[i]&amp;gt;='0' &amp;amp;&amp;amp; vyraz[i]&amp;lt;='9') || vyraz[i]=='.') {&lt;br /&gt;
            buffer[j] = vyraz[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
        buffer[j]=0;&lt;br /&gt;
        x = atof (buffer);&lt;br /&gt;
        if(FULL == push(f,x)){&lt;br /&gt;
            cout&amp;lt;&amp;lt;&amp;quot;LIFO overflow&amp;quot;;&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
     }&lt;br /&gt;
      //na vrchole zasobnika je uz vysledok vyhodnoteneho postfixoveho aritmetickeho vyrazu, takze ho&lt;br /&gt;
      //vypiseme&lt;br /&gt;
      cout&amp;lt;&amp;lt;pop(f); &lt;br /&gt;
      return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>PiknaR</name></author>
		
	</entry>
</feed>