Algoritmické myslenie je súčasť všeobecnejšieho informatického myslenia, ktorá sa zameriava na navrhovanie algoritmov.

Čo zahŕňa algoritmické myslenie?

Algoritmus je presne daný postup, ktorým riešime určitý problém. Algoritmické myslenie sa typicky využíva pri programovaní, teda pri zápise algoritmov, ktoré vykonáva počítač. Má však svoje využitie aj v bežnom živote: typickými príkladmi jednoduchých algoritmov sú recepty na varenie alebo popis cesty z jedného miesta na druhé.

Algoritmické myslenie zahŕňa nielen tvorbu algoritmu, ale aj ďalšie súvisiace kroky:

  • Pochopenie problému, jasná formulácia problému.
  • Abstrakcie, rozklad problému na podčasti, odlíšenie podstatných prvkov od tých, ktoré sú menej dôležité.
  • Zváženie rôznych prístupov k riešeniu problému, porovnanie efektivity algoritmov, optimalizácia postupov.
  • Pochopenie algoritmu, ktorý vymyslel niekto iný, a jeho vykonanie.
  • Hľadanie a opravovanie chýb.

Algoritmické myslenie na Vieme to Informatika

V rámci Vieme to Informatika delíme túto tému na niekoľko podtém:

Príklady v tejto časti sú postavené predovšetkým na „mikrosvetoch“, čo sú jednoduché, intuitívne prostredia s obmedzeným množstvom príkazov a súčasne zaujímavou dynamikou. Sú začlenené ako variácie na často používané princípy (korytnačia grafika, robot na mriežke), tak originálne variácie ako kúzla alebo deaktivácia bomby.

Hore

Priebeh programu môžeme riadiť pomocou cyklov a podmienok. Cykly umožňujú vykonávať príkazy opakovane: buď zadaný počet opakovaní (opakuj N×), alebo ak platí nejaká podmienka (opakuj dokým). Podmienené príkazy umožňujú vykonať časť programu, iba ak platí určitá podmienka.

Cykly a podmienky je možné kombinovať – môžeme ich do seba vnárať. Často sa používajú hlavne podmienky vnútri cyklov (opakované rozhodovanie) a cykly vnútri cyklov (vnorené cykly).

Tipy na precvičovanie

  • Pred precvičovaním cyklov a podmienok je vhodné dôkladne precvičiť postupnosti príkazov. Hlavne je treba vedieť, v akom poradí sú príkazy vykonávané.
  • Určovanie, ktoré príkazy patria do tela cyklu a podmienok, je možné precvičiť samostatne v rámci témy vnorené bloky.
  • Pred vytváraním vlastných programov je užitočné si precvičiť čítanie kódu a pochopenie princípov cyklov a podmienok, na to je možné využiť cvičenie Kód kocky, Rozhodovačku, Pexeso, Presúvanie a Krok za krokom.
  • Dôkladné precvičenie podmienok a cyklov potom umožňuje riešenie interaktívnych programovacích úloh formou blokového programovania. V Korytnačej grafike a ProgMaľovaní je možné precvičovať cykly s daným počtom opakovaní (aj vnorené), v Plošinovke podmienky, Staviteľ potom umožňuje precvičenie všetkých cyklov aj podmienených príkazov.
Hore

Každá premenná má svoj dátový typ. Dátový typ určuje, aké hodnoty môže premenná obsahovať a ktoré operácie je s ňou možné vykonávať. Niektoré programovacie jazyky požadujú, aby bol typ premennej uvedený v programe, iné odvodzujú typ automaticky podľa priradenej hodnoty. Programovacie jazyky sa líšia tiež v tom, ktoré dátové typy ponúkajú. Medzi najbežnejšie dátové typy patria:

  • celé číslo (123, −7) – s číslami je možné vykonávať aritmetické operácie (1 + 2) a porovnávať ich (1 < 2)
  • desatinné číslo (1,23, –0,05) – typicky sa používa tzv. „pohyblivá rádová čiarka“, čo umožňuje ukladať aj veľmi veľké alebo malé čísla, ale s obmedzenou presnosťou (napr. s 5 platnými číslicami je možné uložiť 123 450 000 aj 0,000 012 345, nie však 123,456)
  • logická (pravdivostná) hodnota (pravda, nepravda) – reprezentuje informáciu o pravdivosti, dajú sa s nimi vykonávať logické operácie (neplatí x, x alebo y, x a y). (Tento typ sa často označuje ako „bool“ alebo „boolean“ podľa George Boola, ktorý popísal pravidlá pre výpočty s logickými hodnotami.)
  • textový reťazec (“slovo”, “viac slov”) – reprezentuje text ľubovoľnej dĺžky. Na odlíšenie od názvov premenných sa typicky vymedzujú pomocí “úvodzoviek” alebo ‘apostrofov’. Je treba rozlišovať medzi reťazcom obsahujúcim číslo a číslom – “123” nie je 123. (Tento typ sa často označuje ako „string“, z anglického slova pre reťazec.)
  • zoznam (pole) ([1, 2, 3], [‘x’, ‘y’, ‘z’]) – umožňuje uložiť viac súvisiacich hodnôt do jednej premennej. (Často sú k dispozícii aj ďalšie typy na ukladanie rôznych kolekcií dát.)

Existujú ďalšie typy na špecifické účely (napr. čas, dátum, súbor). Väčšinou je tiež možné definovať si vlastné typy. Vymenovaný typ umožňuje definovať premenné, ktoré môžu nadobúdať iba niekoľko vopred určených hodnôt (napr. svetový smer, deň v týždni). Záznamy umožňujú definovať zložené premenné, ktoré sa skladajú z niekoľkých pomenovaných položiek (napr. záznam o zákazníkovi by mohol obsahovať jeho meno, vek a dátum posledného nákupu).

Hore

Mená premenných neovplyvňujú správanie počítača pri vykonávaní programu, sú však dôležité pre čitateľnosť kódu. Ak pomenujeme premennú celková_cena, neznamená to, že v nej bude automaticky uložený súčet cien položiek (to musíme zaistiť vhodnými príkazmi), je ale jasnejšie, čo má premenná reprezentovať, než keď ju pomenujeme c.

Veľkosť písmen hrá rolu

Väčšina programovacích jazykov rozlišuje veľké a malé písmená v menách, napr. Cena a cena sú dve rôzne premenné.

Povolené názvy

Premenné nie je možné pomenovať ľubovoľne. Konkrétne obmedzenia sa medzi programovacími jazykmi mierne líšia. Typické obmedzenia sú nasledujúce:

  • Názvy môžu obsahovať iba písmená, číslice a podčiarkovníky. Keby sa premenná volala a+b, nešlo by ju odlíšiť od operácie sčítanie. Číslicou sa ale názov nesmie začínať. Keby sa premenná volala 12, nešlo by ju odlíšiť od hodnoty 12.
  • Názvy nemôžu obsahovať medzery. Keby sa premenná volala cena mrkvy, nešlo by ľahko poznať, či nejde o dve premenné (cena a mrkvy). Ak chceme viac slov, môžeme použiť napríklad podčiarkovník (cena_mrkvy).
  • Ako názov nie je možné použiť tzv. „rezervované slová“, ktoré už majú v programovacom jazyku určený význam (napr. opakuj, alebo, pravda).

Povolené názvy v blokových jazykoch

V blokových programovacích jazykoch, ktoré majú samostatný blok pre premennú, tieto obmedzenia byť nemusia (pretože je jasné, že ide o názov premennej a kde sa tento názov začína a končí).

Konvencie

Rôzne programovacie jazyky majú navyše rôzne konvencie, ktoré podporujú jednotnosť kódu. Napríklad v jazyku Python sa názvy premenných píšu malými písmenami, po anglicky a viac slov sa oddeľuje podčiarkovníkom (napr. car_speed). Ide však iba o odporúčanie – program sa spustí, či už konvencie dodržujeme alebo nie.

Konvencie pre viacslovné premenné

Rôzne programovacie jazyky majú napríklad rôzne konvencie ako písať názvy premenných obsahujúce viac slov. Používané možnosti sú nasledujúce:

  • vynechanie medzier (cenamrkvy)
  • nahradenie medzier podčiarkovníkmi (cena_mrkvy) – tzv. „hadia_notácia“
  • nahradenie medzier spojovníkmi (cena-mrkvy) – tzv. „špízová-notácia“ (menej časté, pretože spojovník sa používa na odčítanie)
  • vynechanie medzier a označenie začiatkov slov veľkým písmenom (cenaMrkvy, príp. CenaMrkvy) – tzv. „ťaviaNotácia“ (veľké písmená v názve pripomínajú hrby ťavy)

Popisnosť

Popisné názvy výrazne uľahčujú čitateľnosť programu a znižujú riziko chýb. Príkaz celková_cena ← cena_mrkiev_1kg * kg_mrkvy je jasnejší než cena ← c * m a je tiež jasnejšie, že sú správne jednotky. Volíme také názvy, ktoré jednoznačne vyjadrujú účel premennej, aj za cenu dlhšieho názvu. Jednopísmenové názvy (napr. x) sú vhodné iba v obmedzených prípadoch (riadiaca premenná cyklu, súradnica bodu, krátke ukážky kódu).

Ďalšie odporúčania

  • Používať názvy, ktorá sa dajú dobre vysloviť.
  • Nepoužívať skratky (s výnimkou všeobecne známych).
  • Nemať v programe dva názvy, ktoré sa líšia iba jedným znakom.
  • Nemať v programe dva názvy, ktoré sa podobne vyslovujú.
  • V rámci jedného kontextu nepoužívať jeden názov pre viac rôznych vecí (ani v prípade, že už na pôvodnú premennú odkazovať nepotrebujeme).
Hore

Abstrakcia je schopnosť odhliadať od detailov, ktoré nie sú dôležité pre riešenie skúmaného problému. Sústredíme sa na spoločné prvky a vlastnosti, pomocou ktorých nachádzame všeobecnejšie riešenie.

Príklad z bežného života: Dunčo, Ben a Rex sú tri konkrétne domáce zvieratá. Môžeme ich označiť abstraktným pojmom „pes“ – tým zanedbávame viacero ich vlastností (napr. vek, farbu srsti alebo rasu) a zameriavame sa iba na to, čo majú spoločné. Keby sme mali doma ešte kocúra Murka, tak by sme mohli na ich spoločné označenie použiť napríklad kategóriu „cicavec“.

Príklad z programovania: Pri vykresľovaní obrázkov môžeme vytvoriť funkciu squareA(), ktorá vykreslí modrý štvorec s veľkosťou 100, a squareB(), ktorá vykreslí žltý štvorec s veľkosťou 200. Lepšie je ale vytvoriť abstraktnejšiu funkciu square(length, color), ktorá vykreslí štvorec ľubovoľnej veľkosti a farby (podľa zadaných parametrov). Prípadne môžeme v abstrakcii pokračovať ďalej a vytvoriť funkciu, ktorá vykreslí ľubovoľný mnohouholník (so zadaným počtom vrcholov).

Hore

Funkcie môžu mať parametre, ktoré ovplyvňujú ich správanie. To je užitočné na písanie všeobecných funkcií, ktoré budú použiteľné vo viacerých prípadoch – rôzne hodnoty parametrov povedú k rôznemu správaniu. Parametre sa väčšinou zapisujú do zátvoriek za meno funkcie. Keď funkciu voláme, musíme dodať hodnoty parametrov (zase typicky v zátvorkách za menom funkcie).

Parametre funkcie môžeme vnímať ako špeciálne premenné. Predaným hodnotám parametrov sa hovorí argumenty. (V ukážke vyššie je parametrom meno dĺžka, kým čísla 3 a 2 argumenty.)

Parametre v Scratchi

Scratch označuje funkcie ako „scenáre“ alebo „moje bloky“ a umožňuje im priradiť parametre rôznych typov – číslo, text, logická hodnota (pravda/nepravda).

Viac parametrov

Funkcia môže mať parametrov viac. Oddeľujú sa väčšinou čiarkou. Prvý parameter sa nastaví na prvý predaný argument, druhý parameter na druhý predaný argument atď. V nasledujúcej ukážke sa nastaví n = 5, x = 3 a vypíše sa päť trojok. Ak by sme volali rad(3, 5) nastavilo by sa n = 3, x = 5 a vypísali by sa tri päťky.

Funkcia s návratovou hodnotou

Funkcie môžu vracať vypočítanú hodnotu pomocou kľúčového slova vráť. Také funkcie je potom možné využiť v rámci výrazov, resp. všade, kde sa očakáva nejaká hodnota. V nasledujúcej ukážke je možné využiť funkciu mocnina pri volaní funkcie smiech, pretože mocnina(3) vracia hodnotu 9. Keby funkcia mocnina výsledok vypisovala, ale nevracala, nebolo by toto možné.

Funkcie vs. procedúry

Niekedy sa rozlišuje medzi funkciami, ktoré vracajú hodnotu, a procedúrami, ktoré nič nevracajú. Všeobecný názov pre funkcie a procedúry je potom podprogram. Často sa však medzi týmito prípadmi nerozlišuje a používa sa iba pojem „funkcia“.

Hore

Iba málokedy napíšeme na prvý raz bezchybný kód. Riziko chýb znižuje snaha o kvalitný kód, chybám sa ale úplne nevyhneme, preto je treba chyby aktívne hľadať. Chyby v kóde sa niekedy označujú anglickým termínom bug. Proces overovania správnosti kódu nazývame testovanie, proces zisťovania príčiny chyby a jej odstránenia nazývame ladenie (niekedy tiež „debugovanie“, po anglicky „debugging“).

Typy chýb

Rozlišujeme chyby syntaktické (chybný zápis programu – program sa nedá spustiť) a sémantické (program sa vykoná, ale nespĺňa požadované správanie). Špeciálnym prípadom sémantickej chyby je zacyklenie (program sa nikdy nezastaví, napr. pretože podmienka cyklu nikdy neprestane platiť).

Príklady chýb

Niekoľko príkladov častých sémantických chyb:

  • prehodenie poradia príkazov (napr. poradie zatáčania a posunu vpred)
  • chybný počet opakovaní cyklu
  • chybné vymedzenie tela cyklu (napr. chýba odsadenie príkazu, ktorý sa má opakovať)
  • zámena cyklu a podmieneného príkazu (kým namiesto ak)
  • zámena ostrej a neostrej nerovnosti (x < y namiesto x ≤ y)
  • zámena logickej spojky (P a Q namiesto P alebo Q)
  • prehodenie porovnávaných premenných (x < y namiesto y < x)
  • prehodenie priraďovanej premennej a hodnoty (x ← y namiesto y ← x)
  • zámena premenných (použitie chybnej premennej, hrozí hlavne pri nevhodnom pomenovaní)
  • použitie nesprávneho typu premennej (reťazec “3” namiesto čísla 3)
  • chybná hodnota parametra (napr. nesprávny uhol, o ktorý je treba zatočiť)
  • zámena argumentov pri volaní funkcie (f(a, b) namiesto f(b, a))
  • zámena výpisu a vrátenia z funkcie (vypíš namiesto vráť)

Znalosť bežných chyb umožňuje zamerať pri ladení pozornosť na miesta, kde by sa mohla chyba ukrývať.

Postup pri ladení programu

Ak program nevracia správne výsledky, spustíme si ho krok za krokom a sledujeme, kedy sa odchýli od nášho očakávania. Ak program netvorí grafický výstup, je možné si hodnoty premenných priebežne vypisovať, alebo použiť nástroj, ktorý umožňuje program krokovať a sledovať hodnoty premenných (tzv. debugger). Miesto v programe, kde sa program odchyľuje od nášho očakávania, skúsime upraviť.

Tipy na ladenie programov

  • Po každej úprave je vhodné program znovu spustiť, aby sme si overili efekt úpravy.
  • Ak nie je jasné, ako presne kód upraviť (napr. o aký uhol zatočiť), môže pomôcť nakresliť si obrázok.
  • Ak nie je jasné, prečo sa v nejakom bode program správa určitým spôsobom, je lepšie to najskôr pochopiť, než začneme robiť zmeny.
  • Ak si nie sme istí, čo robí niektorá použitá jazyková konštrukcia (príkaz, operátor), vyhľadáme si jej správanie na internete a overíme naše porozumenie vyskúšaním jednoduchého kódu s danou konštrukciou.
  • Ak je kód zbytočne zložitý alebo používa nevhodné mená premenných, môže byť po odstránení týchto nedostatkov (napr. premenovaní premenných) chyba zjavná.
  • Rozloženie do funkcií uľahčí hľadanie chyby – môžeme totiž testovať jednotlivé funkcie izolovane.
Hore
NAPÍŠTE NÁM

Ďakujeme za vašu správu, bola úspešne odoslaná.

Napíšte nám

Neviete si rady?

Pred položením otázky si, prosím, pozrite návody:

Prosíme, neposielajte otázky na prezradenie riešenia úloh alebo vysvetlenie postupu. Ak hlásite chybu, upresnite, prosím, v čom presne spočíva a pripojte snímku obrazovky.

Čoho sa správa týka?

Odkaz Hlásenie chyby Obsah Ovládanie Prihlásenie Licencia