Lekce 2 — Proměnné

Minule jste uměli vypsat text (Console.WriteLine) a přečíst, co uživatel napíše (Console.ReadLine). Jenže to, co jste přečetli, jste hned zase vypsali — nikde jste si to neuložili. Dnes to napravíme.


1. Co je proměnná

Proměnná je pojmenovaná krabička v paměti, do které si program něco odloží a později to zase vytáhne.

Každá krabička má tři věci:

příklad k čemu je
typ int co se do ní smí dát (číslo? text?)
jméno vek jak se na ni odkazujete
hodnotu 17 co v ní právě je
int vek = 17;

Čte se: "Vytvoř krabičku na celé číslo, pojmenuj ji vek a dej do ní 17."

Hodnotu můžete kdykoliv přepsat — proto se tomu říká proměnná:

int vek = 17;
vek = 18;          // stará hodnota je pryč, teď je tam 18
vek = vek + 1;     // vezmi co je uvnitř, přičti 1, ulož zpátky → 19

Ten poslední řádek není matematická rovnice. = v C# neznamená "rovná se", ale "ulož do". Nejdřív se spočítá pravá strana, výsledek se strčí do krabičky vlevo.


2. Základní typy

Pro dnešek stačí čtyři:

typ co ukládá příklad hodnoty
int celé číslo 42, -7, 0
double desetinné číslo 3.14, -0.5 (tečka, ne čárka!)
string text "Ahoj", "" (prázdný text)
bool ano/ne true, false
int pocetZaku = 24;
double prumer = 2.35;
string jmeno = "Karel";
bool jePatek = false;

Proč vůbec typy? Aby vás překladač zastavil dřív, než program spadne. Tohle se nepřeloží:

int vek = "sedmnáct";   // chyba: nemůžu dát text do krabičky na číslo

To je dobře. Chyba při překladu vás stojí 10 sekund. Chyba za běhu u zákazníka stojí víc.

Pojmenování


3. Vypsání proměnné

Můžete text lepit pomocí +:

string jmeno = "Karel";
int vek = 17;
Console.WriteLine("Ahoj, " + jmeno + ", je ti " + vek + " let.");

Ale čitelnější je interpolace — před uvozovky dáte $ a proměnné píšete do složených závorek:

Console.WriteLine($"Ahoj, {jmeno}, je ti {vek} let.");

Do závorek můžete dát i výpočet:

Console.WriteLine($"Za rok ti bude {vek + 1}.");

Od teď používejte interpolaci. Lepení plusem uvidíte v cizím kódu, tak ať víte, co to je.


4. Načtení čísla od uživatele

Tady je první past. Console.ReadLine() vždycky vrací string, i když uživatel napíše 17. Pro počítač je to text "17", ne číslo 17 — stejně jako je rozdíl mezi číslem 5 a nápisem "5" na dveřích.

Tohle se nepřeloží:

int vek = Console.ReadLine();   // chyba: string se nevejde do int

Text musíte na číslo převést:

string vstup = Console.ReadLine();
int vek = int.Parse(vstup);

Nebo v jednom kroku:

int vek = int.Parse(Console.ReadLine());
double vaha = double.Parse(Console.ReadLine());

Když uživatel napíše "sedmnáct" a vy zavoláte int.Parse, program spadne. Jak se tomu bránit, se naučíme později. Dnes předpokládáme, že uživatel je hodný.


5. Počítání

operátor co dělá příklad výsledek
+ sčítání 7 + 2 9
- odčítání 7 - 2 5
* násobení 7 * 2 14
/ dělení 7 / 2 3 (!)
% zbytek po dělení 7 % 2 1

Past číslo dvě: dělení celých čísel

7 / 2 v C# je 3, ne 3.5. Když dělíte dva int, výsledek je int — desetinná část se zahodí, nezaokrouhluje se.

Chcete-li desetinný výsledek, aspoň jedno z čísel musí být double:

int a = 7;
int b = 2;

Console.WriteLine(a / b);           // 3
Console.WriteLine((double)a / b);   // 3.5   ← (double) říká "ber a jako desetinné"
Console.WriteLine(7.0 / 2);         // 3.5

Na tohle se ptají u přijímaček na VŠ, u pohovorů a bude to i v testu. Zapamatujte si to.

Zkrácený zápis

body = body + 10;   // dlouhá verze
body += 10;         // to samé, kratší
body++;             // přičti 1
body--;             // odečti 1

6. Celý příklad

Console.WriteLine("Jak se jmenuješ?");
string jmeno = Console.ReadLine();

Console.WriteLine("Kolik je ti let?");
int vek = int.Parse(Console.ReadLine());

int vekZaDesetLet = vek + 10;
int dniZivota = vek * 365;

Console.WriteLine($"{jmeno}, za deset let ti bude {vekZaDesetLet}.");
Console.WriteLine($"Zatím jsi na světě zhruba {dniZivota} dní.");

Projděte si ho řádek po řádku a u každého si řekněte, co je v které krabičce. Pokud to neumíte, ještě nejste hotoví s touhle stránkou.


7. Úkoly

Řešte popořadě. Každý úkol je nový program (nebo přepište ten předchozí, je to jedno).

Úkol 1 — Kalkulačka na obdélník

Program se zeptá na šířku a výšku obdélníku (celá čísla) a vypíše obvod a obsah.

Šířka: 4
Výška: 3
Obvod: 14
Obsah: 12

Úkol 2 — Průměr známek

Zeptej se na tři známky a vypiš průměr. Průměr z 1, 2, 2 je 1.666..., ne 1. Pokud vám vyjde 1, přečtěte si znovu kapitolu 5.

Úkol 3 — Prohození

Máte:

int a = 5;
int b = 9;

Napište kód, po kterém bude v a devítka a v b pětka. Nesmíte napsat a = 9 ani b = 5 — má to fungovat, ať jsou v nich jakákoliv čísla.

Nápověda: když přelíváte vodu mezi dvěma plnými sklenicemi, potřebujete třetí.

Úkol 4 — Rozměňování

Zeptej se na částku v korunách (celé číslo) a vypiš, kolik je to nejméně dvacetikorun, desetikorun, pětikorun a korun.

Částka: 87
20 Kč: 4
10 Kč: 0
5 Kč: 1
1 Kč: 2

Nápověda: / vám řekne kolikrát se to vejde, % vám řekne, co zbylo.

Úkol 5 (bonus) — Čas

Zeptej se na počet sekund a vypiš to jako hodiny, minuty, sekundy. 37251 h 2 min 5 s.


8. Chyby, které dnes potkáte

Hláška překladače Co to znamená Oprava
Cannot implicitly convert type 'string' to 'int' Snažíte se dát text do číselné krabičky int.Parse(...)
The name 'vek' does not exist in the current context Překlep ve jméně, nebo jste proměnnou nevytvořili Zkontrolujte psaní, velká/malá písmena se liší!
Use of unassigned local variable 'x' Krabičku jste vytvořili, ale nic do ní nedali int x = 0; místo int x;
; expected Chybí středník na konci řádku Doplňte ;
Program spadne na FormatException Uživatel napsal text a vy jste chtěli číslo Dnes: napište číslo. Později: naučíme se to ošetřit.

9. Pravidlo k AI platí i dnes

Můžete se ptát ChatGPT, Copilota, čehokoliv. Ale když k vám přijdu a řeknu "změň to tak, aby to počítalo v eurech" nebo "proč je tady (double)?", musíte to umět. Když ne, úkol se nepočítá.

Dobrá otázka pro AI dnes: "Proč mi 7 / 2 v C# dává 3?" Špatná otázka: "Napiš mi úkol 4." — ne proto, že by to neuměla, ale protože pak neumíte úkol 4 vy.