Ing. Daniel Hládek PhD.
[note]
Algoritmus je dobre definovaná postupnosť krokov, ktoré po splnení rovnakých podmienok vedú k dosiahnutie rovnakého výsledku v konečnom čase.
E-mail prednášajúcemu je tiež "algoritmus".
Každý algoritmus alebo jeho časť by mala mať definované:
Snažíme sa problém "rozbiť" na menšie časti.
Výraz môže byť súčasťou definície cyklu alebo podmienky.
Výraz sa skladá z operátorov, aritmetických operácií a volaní funkcií.
Operátor je funkcia, ale zapisuje sa inak.
Aritmetické operátory:
+ - * /
Logické operátory:
&& || !
AND: batoh je prázdny a zároveň je cesta voľná:
beepers_in_bag() && front_is_clear()
OR: vidím žetóny alebo je cesta voľná
beepers_present() || front_is_clear()
NOT: nemám žiadne žetóny v batohu
!beepers_in_bag()
Napr. Aký je výsledok výrazov:
2 + 3 * 2
(2 + 3) * 2
pomocou okrúhlych zátvoriek
(beepers_in_bag() && front_is_clear()| || beepers_present()
je výraz a bodkočiarka.
Výraz je niečo čo po vyhodnotení vracia hodnotu.
beepers_present() // Výsledok je možné použiť napr. v podmienke.
Príkaz niečo okamžite vykoná.
beepers_present(); // Výsledok sa hneď zabudne
break skonči cyklus, pokračuj za cyklom
continue pokračuj v cykle novým opakovaním
Choď k stene. Keď nájdeš žetón, tak stoj
while (front_is_clear()){
step();
if (beepers_preent()){
break; // Spôsobí okmažité ukončenie cyklu
}
}
Choď dopredu a ber všetky žetóny:
while (front_is_clear()){
step();
if (!beepers_present()){
continue; // Preskočí zvyšok cyklu a pokračuje.
}
pick_beeper();
}
0 TURNOFF
CORNER FACING BEEP-BAG BEEP-CORNER
(1, 1) EAST 0 0
ST.+-----------------------------------------------+
6 | . . . . . | . | . | . . . . 1 |
|---- | | +---+ | +---+ | | ----|
5 | . . | . | . | . . . . | . | . | . . |
| +---+ | | +---+---+ | | +---+ |
4 | . | . . | . | . | . | . | . | . | . . | . |
| | ----+---+ | | | +---+---- | |
3 | . | . . . | . . | . . | . . . | . |
| +---+---- +---+ | +---+ ----+---+ |
2 | . . | . . . | . | . | . . . | . . |
| +---+ ----+ | | | +---- +---+ |
1 | > | . . . | . . | . . | . . . | . |
+-----------------------------------------------+
1 2 3 4 5 6 7 8 9 10 11 12 AVE.
Počiatočné podmienky:
Ukončovacia podmienka:
stojím na žetóne
Algoritmus v slovenskom jazyku
Nájdi najbližšiu stenu a potom podľa ľavej ruky nasleduj stenu, pokiaľ nenájdeš žetón.
Identifikujeme opakujúce sa časti
void find_wall(){
while (front_is_clear()){
step();
}
}
Počiatočná podmienka: Stenu mám pri ľavej ruke
Posuniem sa tak aby som mal zase stenu po ľavej ruke
Ak stojím oproti stene, otočím sa doprava => stenu mám na ľavej strane
Pokiaľ nevidím stenu, urobím krok a otočím sa doľava.
https://www.khanacademy.org/computing/computer-science/algorithms/recursive-algorithms/a/recursion
https://www.cs.utah.edu/~germain/PPS/Topics/recursion.html
https://en.wikipedia.org/wiki/Recursion_(computer_science)
opakovanie bez cyklov
reprezentácia nekonečného množstva objektov konečným počtom pravidiel
rekurzia sa dá vždy vyjadriť pomocou iterácie
https://en.wikipedia.org/wiki/Fractal
Fraktál sa vytvára rekurzívne.
Fraktál je štruktúra, ktorá obsahuje menšie kópie samého seba.
https://en.wikipedia.org/wiki/Mandelbrot_set
https://www.youtube.com/watch?v=0jGaio87u3A
Ďaľšie číslo je súčtom dvoch predchádzajúcich.
0 1 1 2 3 5 8 13 21 34 55 ....
Riešenie:
čo treba urobiť, aby sme skopírovali n žetónov
Netreba robiť nič.
To isté ako v predošlej funkcii, ale o dva kroky dopredu.
Preprocessor prikladá súbory a definuje makrá
Príkazy pre preprocesor automatizujú "nájdi a nahraď".
Pomocou príkazov preprocesora definujeme časti kódu, ktoré sa vložia pred prekladom.
// vloží deklarácie zo súboru v aktuálnom adresári
#include "karel.h"
// vloží deklarácie zo súboru v štandardnom adresári (napr. /usr/include)
#include <karel.h>
Zaujímavosť: Používanie preprocesora je metaprogramovanie - jazyk preprocesora je špeciálny programovací jazyk, pomocou ktorého vytvárame programny. (programujeme program).
Pomocou makra môžeme definovať konštantu alebo blok kódu.
#define SPEED 100
Každý výskyt SPEED v kóde sa nahradí za 100.
(konštantky sa píšu veľkými písmenami podľa dohody).
Nikdy nepoužívajte globálne premenné (ak neviete prečo). !!!
Makro nie je globálna premenná.
Pri definícii konštánt môžeme využiť makro
#define
Preprocesor pomocou
#include
pripája deklarácie funkcií z knižnice.
(polohu robota, počet žetónov v batohu) aby navrhnutá funkcia mala minimálne vedľajšie efekty.