03. Výpočty

Začnime tým, že podobne ako v minulej lekcii sme vypli komponent Vypisovanie, vypnime aj komponent Premenne. Urobíme si nový skript pre novú lekciu, nech sa nám to nemotá.

Vytvorte nový skript Vypocty, priraďte ho na game object Main Camera a otvorte si skript v editore.

Opäť budeme písať príkazy do metódy Start.

Keď sme skúšali do konzoly vypísať výraz 1+1, počítač do konzoly vypísal 2. Nič prekvapivé. V počítačovom jazyku fungujú výpočty rovnako ako v matematike. Môžeme zapisovať rôzne výrazy s použitím matematických operácií.

Vyskúšajte ako fungujú nasledujúce príkazy:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Vypocty : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Debug.Log(1 + 5 * (7 - 3));
        Debug.Log(30 / 5);
        Debug.Log(2 * 2 * 2 * 2 * 2);
        Debug.Log(1 / 2);           
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

Skontrolujme si, či nám všetkým vyšlo to isté:

Možno vás zaujalo (a ak nie, tak by malo), že výpis 1/2 vypíše číslo 0 a nie 0.5. Toto je neintuitívne a býva to zdroj chýb v programoch. Preto si to vyjasníme. V jazyku C# platí konvencia, že akého typu sú čísla v operácii, takého typu bude aj výsledok. Čísla 1 aj 2 sú celé čísla. Preto aj výsledok bude celé číslo. A preto, hoci matematický výsledok 1/2 je 0.5, počítač odsekne desatinnú časť .5 a ponechá len celočíselnú časť 0.

Vyskúšajte čo sa vypíše, ak zmeníme 1/2 na 1f/2.

Keď sme namiesto 1 (čo je celé číslo, typu int) použili číslo 1f (čo je desatinné číslo, typu float), prinútili sme počítač rátať s jednotkou ako s desatinným číslom. A aj keď nemá desatinnú časť, tak f ho označuje ako desatinné, a preto aj výsledok bude desatinné číslo a výpis v konzole už bude 0.5 namiesto 0.

Výpočty s premennými

Takisto, ako sme v minulej lekcii namiesto slova "Kristína" použili premennú, vieme použiť premenné aj namiesto čísiel vo výpočtoch.

Pozrime sa teraz na v poradí tretí výpis:

    void Start()
    {
        Debug.Log(1 + 5 * (7 - 3));
        Debug.Log(30 / 5);
        Debug.Log(2 * 2 * 2 * 2 * 2);
        Debug.Log(1f / 2);
    }

Zápis 2 * 2 * 2 * 2 * 2 je v skutočnosti 25, ale v C# nemáme jednoduchý operátor na umocnenie, tak to je zatiaľ napísané takto primitívne. Čo keby som po vás chcel, aby ste zápis zmenili tak, aby počítal 35 ? A čo keby som chcel, aby ste zápis zmenili na 45 ? Budete prepisovať čísla ako úradníci. My sme ale programátori a nie úradníci. Takže namiesto dvojek si vytvoríme premennú a budeme meniť už len hodnotu premennej.

  • Vytvorte v metóde Start novú premennú názvom n a priraďte do nej hodnotu 3. Premenná nech je celočíselného typu.
  • Nahraďte každú dvojku vo výraze 2 * 2 * 2 * 2 * 2 premennou n.

Program by mal vypísať 243:

Aké číslo vám vypíše, keď zmeníme n na hodnotu 4 ?

Teraz by ste už mali zvládnuť takéto jednoduché cvičenie:

  • Doplňte do programu premennú polomer a nastavte jej hodnotu na 2.5f
  • Doplňte do programu výpis, ktorý vypíše obvod kruhu s takýmto polomerom. Použite hodnotu 3.14f namiesto čísla Pí.

Všimnite si, že desatinné čísla zapisujeme s desatinnou bodkou, nie čiarkou

Takto by mal vyzerať váš výpis:

Doplňte do programu výpis, ktorý vypíše aj obsah takéhoto kruhu:

Výpočty s viacerými premennými

Premenné môžeme vo výrazoch aj kombinovať navzájom. Napríklad vyrobíme výpočet veku z roku narodenia a aktuálneho roku:

  • Vytvorte premennú rok_narodenia a priraďte do nej svoj rok narodenia
  • Vytvorte premennú rok_teraz a priraďte do nej súčasný rok
  • Vytvorte premennú vek a priraďte do nej rozdiel premenných rok_teraz a rok_narodenia.
  • Pridajte do programu výpis hodnoty premennej vek.

Len pre kontrolu, takto nejak vyzerá aktuálne náš kód:

    void Start()
    {
        int n = 4;

        Debug.Log(1 + 5 * (7 - 3));
        Debug.Log(30 / 5);
        Debug.Log(n * n * n * n * n);
        Debug.Log(1f / 2);

        float polomer = 2.5f;

        Debug.Log("Obvod kruhu je " + 2 * 3.14 * polomer);
        Debug.Log("Obsah kruhu je " + 3.14 * polomer * polomer);

        int rok_narodenia = 1980;
        int rok_teraz = 2020;
        int vek = rok_teraz - rok_narodenia;

        Debug.Log("Tvoj vek je " + vek);
    }

Neskúšajte si zjednodušiť prácu takýmto výpisom:

        Debug.Log("Tvoj vek je " + rok_teraz - rok_narodenia);

C# nebude vedieť ako odpočítať rok_narodenia od textu "Tvoj vek je " a zahlási chybu:

Výpočty na jednej premennej

Teraz vyskúšame urobiť finančnú kalkulačku. Začnime s premennou ucet ktorá bude desatinného typu a priradíme jej na začiatok hodnotu 100f.

        float ucet = 100f;
        Debug.Log("Stav na ucte je " + ucet);

Teraz pripočítame na účet 1 euro:

        float ucet = 100f;
        Debug.Log("Stav na ucte je " + ucet);
        ucet = ucet + 1;
        Debug.Log("Stav na ucte je " + ucet);

A takto pridáme na účet 2% úrok:

        float ucet = 100f;
        Debug.Log("Stav na ucte je " + ucet);
        ucet = ucet + 1;
        Debug.Log("Stav na ucte je " + ucet);
        ucet = ucet + 0.02f * ucet;
        Debug.Log("Stav na ucte je " + ucet);

Do konzoly nám pribudli takéto výpisy:

Pre výpočty s jednou premennou sú v jazyku C# aj viaceré zjednodušenia, aby sme si toľko neničili prsty. Napríklad:

  • Namiesto ucet = ucet + 3 môžeme napísať ucet += 3
  • Namiesto ucet = ucet + 1 môžeme napísať ucet += 1, a špeciálne pri čísle 1 môžeme použiť aj ucet++
  • Namiesto ucet = 1.02f * ucet môžeme napísať ucet *= 1.02f
  • Podobne to funguje aj s operáciami / a -

Teraz by ste už mohli vedieť aj sami zrealizovať nasledujúce zadanie:

  • Vytvorte nový skript, ktorý sa bude volať Health a priraďte ho na game objekt Main Camera
  • Vytvorte v metóde Start premennú zdravie, ktorá bude desatinného typu a priraďte do nej na začiatok hodnotu 100.
  • Vytvorte premennú lekarnicka a priraďte do nej hodnotu 10
  • Znížte zdravie o 30.
  • Pridajte k zdraviu hodnotu lekárničky.
  • Zvýšte zdravie na 1.5-násobok.
  • Po každej zmene vypíšte hodnotu zdravia.

Takto by mal vyzerať výpis:

Zhrnutie

Rôzne výpočty budeme pri programovaní používať často. Slúžia nám k tomu matematické výrazy a vieme v nich používať aj premenné, ktorými vo výpočtoch nahrádzame konkrétne hodnoty.