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.
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.
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.
pocetZaku, cenaSDph (říká se tomu camelCase).počet žáků nejde, pocetZaku ano.x je špatně. cenaZaKus je dobře. Za měsíc si to budete číst znovu a nebudete si pamatovat, co bylo x.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.
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áteint.Parse, program spadne. Jak se tomu bránit, se naučíme později. Dnes předpokládáme, že uživatel je hodný.
| 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 |
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.
body = body + 10; // dlouhá verze
body += 10; // to samé, kratší
body++; // přičti 1
body--; // odečti 1
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.
Řešte popořadě. Každý úkol je nový program (nebo přepište ten předchozí, je to jedno).
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
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.
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í.
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.
Zeptej se na počet sekund a vypiš to jako hodiny, minuty, sekundy. 3725 → 1 h 2 min 5 s.
| 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. |
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.