05. Premenné a funkcie

Než budeme pokračovať v práci na projekte, budeme potrebovať trochu pochopiť programovanie.

Pozn: Našim cieľom je naučiť sa jazyk C#, lebo ten sa používa v Unity. Ale zatiaľ budú ukážky kódu v tejto lekcii len v neexistujúcom zjednodušenom programovacom jazyku, tzv. pseudokóde. Reálny kód v C# by bol zložitejší a obsahoval by veci, ktoré by nás rozptyľovali.

Počítačový program je sekvencia nejakých príkazov – operácií, funkcií – ktoré sa vykonávajú v presnom poradí. A tieto príkazy pracujú s nejakými dátami. To isté robíme aj my, keď varíme podľa receptu. Vykonávame predpísané inštrukcie s nejakými ingredienciami.

Program je ako kuchársky recept – predpisuje, čo sa má robiť. Dáta sú ako ingrediencie do jedla – s čím sa to má robiť.

Premenné

Dáta sa v programe ukladajú do tzv. premenných. Premenná je miesto v pamäti počítača. Je to krabička, do ktorej sa vkladá nejaká dátová hodnota. Má svoje meno, aby sme ju vedeli odlíšiť od iných premenných. Dve premenné nemôžu mať rovnaké meno. A každý premenná je nejakého typu. Ten vymedzuje, aké hodnoty sa do premennej môžu ukladať.

Takto vyzerá príklad príkazu na vytvorenie novej premennej:

int count = 10;
  • int označuje, že táto premenná je typu „celé číslo“. Do takej premennej môžem ukladať len čísla ako -7 alebo 0 alebo 1249. Nemôžem tam uložiť slovo „Ahoj“, lebo typ int akceptuje len čísla. A ani číslo 4.5 by som do nej nemohol uložiť, lebo akceptuje len celé čísla.
  • count je meno našej premennej. Meno premennej nič počítaču nehovorí, vyberáme si ho my. Obvykle volíme taký názov, aby sme intuitívne chápali, čo predstavuje. Tu napríklad predstavuje nejaký počet, tak sme ju nazvali count.
  • = 10 do tejto novovytvorenej premennej rovno aj uloží hodnotu 10.
  • ; bodkočiarka hovorí počítaču, že tu je koniec príkazu. Je to ako bodka za koncom vety.

Niektoré ďalšie bežné typy premenných sú:

  • string : text, napríklad "Hra skoncila"
  • float : číslo s desatinnou čiarkou (bodkou), napríklad 0.9f
  • bool : áno/nie hodnoty, konkrétne len true alebo false
  • Vector3 : pozícia v 3D priestore, napríklad (0, 1, 0.5f). Tento typ pridáva až Unity, nie je štandardnou súčasťou C#.

Tento kúsok kódu:

string pouzivatel;
pouzivatel = "Adam";

vytvorí v prvom riadku novú premennú s názvom pouzivatel a typom string, ale ešte jej nič nepriradí. Až v druhom riadku je ďalší príkaz, ktorý do premennej s názvom pouzivatel priradí hodnotu "Adam".

  • Dáta alebo hodnoty sú ako ingrediencie kuchárskeho receptu, ako soľ, korenie alebo banán.
  • Premenná je konkrétna nádobka na tieto ingrediencie, ako napríklad moja sklenená soľnička.
  • Typ premennej je tvar nádobky, ktorý limituje, čo sa do nej môže dávať. Napríklad moja sklenená soľnička je typu „soľnička“. Do premennej typu „soľnička“ nemôžeme dať banán, ale môžeme do nej dať napríklad soľ alebo aj korenie.

Príkazy

Program vykonáva sekvenciu nejakých príkazov. Sú to inštrukcie v kuchárskom recepte.

zober surovinu;
daj do hrnca surovinu;
daj do hrnca vodu;
povar pol hodinu;

Keď do premennej surovina dáme na začiatku zemiaky, dostaneme na konci programu varené zemiaky. Keď do nej dáme cestoviny, dostaneme rozvarené cestoviny (lebo v programe je príkaz variť pol hodinu). Ten istý program, ale s rôznymi vstupnými dátami dáva rôzny výsledok. A navyše, v oboch prípadoch bude jedlo neosolené, lebo programu chýba inštrukcia na pridanie soli. Počítač robí len to, čo má v programe.

Teraz von z kuchyne a za počítač. Čo robí tento krátky program?

string meno; 
meno = Console.ReadLine();
string pozdrav = "Ahoj " + meno;
Console.WriteLine(pozdrav);
  1. Vytvorí novú stringovú premennú s názvom meno.
  2. Priradí do premennej meno nejaký text zadaný z klávesnice, napríklad "Eva". (Console.ReadLine je funkcia na čítanie textu z klávesnice)
  3. Vytvorí novú premennú s názvom pozdrav a priradí do nej súčet textu "Ahoj " a obsahu premennej meno. Stringy sa sčítavajú prilepením k sebe, takže to bude "Ahoj Eva".
  4. Vypíše na obrazovku obsah premennej pozdrav. Čiže vypíše "Ahoj Eva".

Podobný príklad si môžete vyskúšať aj online na stránkach W3C kurzu. To už nie je pseudokód ale skutočný kód v jazyku C#, takže obsahuje aj ďalšie veci, ktorým v tomto momente netreba rozumieť.

Parametre funkcie

Všimnime si teraz riadok Console.WriteLine(pozdrav). WriteLine je funkcia na vypísanie textu a my musíme nejak počítaču povedať, ktorý text má vypísať. V programe máme aj stringovú premennú meno aj stringovú premennú pozdrav a počítač sa nevie sám rozhodnúť ktorú z nich vypísať. Preto sa do zátvoriek dáva tzv. parameter funkcie a funkcia tým pádom vie, s čím má operovať. Funkcie môžu mať jeden parameter, viac parametrov alebo aj žiaden parameter.

Ak dostanem v kuchyni príkaz VypniRuru, nepotrebujem žiadny parameter. Ale napríklad na vykonanie funkcie ZapniRuru už potrebujem parameter teplota a možno aj čas.

Naše vlastné funkcie

Programovací jazyk už obsahuje nejaké svoje funkcie: výpis hodnoty na obrazovku, matematické operácie, kresliace funkcie a iné. Z týchto príkazov sa potom zostavuje celý program. Obvykle nám tieto preddefinované funkcie nebudú stačiť a budeme si chcieť vyrábať vlastné.

Predstavme si, že máme robotického barmana a ovláda len pár primitívnych príkazov ako zober, nalej, podaj, cena. Takto by vyzeral program na výrobu jednoduchého miešaného drinku:

zober fľašu Gin;
zober fľašu Tonic;
zober pohár P;
nalej 5cl Gin do P;
nalej 15cl Tonic do P;
podaj P;

So far so good. Ak by sme ale chceli, aby barman urobil gin-tonic aj beton aj cuba libre, tak by program vyzeral takto:

zober fľašu Gin;
zober fľašu Tonic;
zober pohár P;
nalej 5cl Gin do P;
nalej 15cl Tonic do P;
podaj P;

zober fľašu Becherovka;
zober fľašu Tonic;
zober pohár Q;
nalej 5cl Becherovka do Q;
nalej 15cl Tonic do Q;
podaj Q;

zober fľašu Rum;
zober fľašu Cola;
zober pohár R;
nalej 5cl Rum do R;
nalej 15cl Cola do R;
podaj R;

Tento barmanský programovací jazyk pozná len pár príkazov, a tak musíme otrocky vypisovať celý postup stále dokola, len s malými obmenami. Je to zdĺhavé, otravné a pri ďalších drinkoch by nám taký program prerástol cez hlavu.

Naučíme ho teda nový príkaz – funkciu NaMixuj, ktorá zovšeobecní túto opakujúcu sa činnosť:

void NaMixuj(fľaša x, fľaša y)
{
   zober pohár z;
   nalej 5cl x do z;
   nalej 15cl y do Z;
   podaj Z; 
}

Toto sa volá definícia funkcie. Rozoberieme si, čo sa tu deje.

Prvý riadok sa volá hlavička funkcie. Na začiatku je slovo void, ale k tomu sa dostaneme neskôr. Ďalej definujeme, že nová funkcia sa bude volať NaMixuj. Meno funkcie si určujeme sami, počítaču je to jedno. Pre neho je to len zhluk znakov. Ďalej v zátvorkách definujeme akého typu má funkcia vstupné parametre a ako sa budú pre potreby funkcie nazývať. Tu sú to dva parametre X a Y a oba sú typu fľaša.

Ďalej nasleduje blok ohraničený zátvorkami { a }. Všetko čo je medzi takýmto párom zátvoriek patrí k sebe do jedného bloku. V prípade definície funkcie sa tomuto bloku hovorí telo funkcie. V tele sú príkazy, ktoré sa vykonajú s parametrami, ktoré funkcia dostane. V tomto prípade sa udeje to, že sa ingrediencie z X a Y nalejú do pohára Z, zamieša sa Z a podáva sa Z.

Program na namiešanie a podanie želaných troch drinkov už bude vyzerať omnoho jednoduchšie:

NaMixuj(gin, tonic);
NaMixuj(becherovka, tonic);
NaMixuj(cola, rum);

Tomuto sa hovorí volanie funkcie. Funkcia má jednu jedinú definíciu a potom neskôr ju môžem volať koľko chcem. Jeden raz stačí barmana naučiť miešať 2 fľaše dokopy a potom už na neho môžem volať koľko chcem, nech NaMixuje to a to.

Vytváranie nových funkcií z už známych funkcií je celou podstatou programovania. Je to skladanie zložitejších celkov z jednoduchších stavebných dielov. Je to ako LEGO, ale bez rizika, že na to stúpite.

Výstupná hodnota funkcie

Naša funkcia NaMixuj vykonala všetko, čo potrebujeme, až do konca. Nepotrebujeme, aby sa z nej niekam ďalej pokračovalo. Pohár bol podaný a tým to zhaslo. O takej funkcii sa hovorí, že nemá žiadnu výstupnú hodnotu. To je to slovo void (void = „prázdny“) ktorým začína hlavička funkcie NaMixuj:

void NaMixuj(fľaša x, fľaša y)

Na čo sme ale zabudli, je zaplatiť barmanovi za drink. Takže prerobíme našu funkciu NaMixuj tak, aby počas mixovania aj zrátala cenu a táto cena bude jej výstupná hodnota funkcie:

float NaMixuj(fľaša x, fľaša y)
{
   float c = 0;
   zober pohár z;
   nalej 5cl x do z;
   c = c + cena(5cl x);
   nalej 15cl y do Z;
   c = c + cena(15cl y);
   podaj Z; 
   return c;
}
void NaMixuj(fľaša x, fľaša y)
{
   zober pohár z;
   nalej 5cl x do z;
   nalej 15cl y do Z;
   podaj Z; 
}

Čo sa zmenilo:

  • V hlavičke funkcie už nie je prázdny výstupný typ void ale je to float, lebo chceme, aby funkcia vrátila číselnú cenu drinku.
  • V tele funkcie sme vytvoril novú premennú c typu float a jej počiatočná hodnota je = 0.
  • Do tejto premennej pripočítame pridáme cenu prvej prísady:
    c = c + cena(5cl x)
  • Pripočítame aj cenu druhej prísady:
    c = c + cena(15cl y);
  • A na konci tela funkcie povieme return c, čo znamená, že hodnota premennej c je to, čo je výstupnou hodnotou celej funkcie.

Slovo return je kľúčové. Označuje, čo má funkcia vrátiť ako výstupnú hodnotu. Ak je funkcia ako čierna skrinka, do ktorej zhora nahádžeme parametre, tak return určuje, čo z nej na zdola vypadne. Pozor! Akonáhle počítač pri vykonávaní príkazov v tele funkcie príde na príkaz return, tak ukončí chod funkcie a príkazy, ktoré sú v tele funkcie za ním, sa nevykonajú. Výstup už z čiernej skrinky vypadol, tak načo sa obťažovať s ďalšou prácou.

Ako sa to odrazí na mojom programe na namiešanie troch drinkov?

float ucet = 0;
ucet = ucet + NaMixuj(gin, tonic);
ucet = ucet + NaMixuj(becherovka, tonic);
ucet = ucet + NaMixuj(cola, rum);

Pridal som si do programu float premennú ucet. Do nej si budem ukladať, koľko mám zaplatiť. Na samom začiatku je účet nulový.

Po každom namixovaní mi funkcia NaMixuj vráti číselnú hodnotu, koľko stojí konkrétny drink. A ja si túto číselnú hodnotu pripočítam do premennej ucet, ktorú som si vytvoril za týmto účelom. Po skončení programu tak mám v číselnej premennej ucet uloženú sumu cien za 1 gin-tonic, 1 beton a 1 cuba libre.

Zhrnutie

  • Programy pozostávajú z premenných a z funkcií.
  • Premenné v sebe držia nejaké hodnoty (čísla, texty a podobne)
  • Typ premennej vymedzuje, aké hodnoty sa dajú do premennej uložiť.
  • Funkcie vykonávajú nejakú činnosť (NaMixuj)
  • Vieme si vytvoriť novú funkciu poskladaním už existujúcich funkcií.
  • Funkcia má viaceré vstupné parametre jednu výstupnú hodnotu
    (Pozn. viaceré moderné jazyky už umožňujú aj viacero výstupných hodnôt, ale to sem zatiaľ nepatrí)

Domáca úloha

Pozrite si vo W3C kurze, aké všetky typy premenných obsahuje C#.

Pozrite si vo W3C kurze časť o premenných a vyskúšajte si examples.

Urobte si Cvičenia 1 až 5 na prácu s premennými (Variables)

Pozrite si vo W3C kurze časť o operátoroch v C#.

Urobte si Cvičenia 1 až 4 na prácu s operátormi v C#.