Vývoj v C# a .NET

Od úplných základů k robustním aplikacím

Dynamické vs. Statické typování

Python a JS (Dynamické)

Nepíšeme datové typy. Program si je odhadne. Bloky děláme odsazením.

# Nepíšeme datové typy
jmeno = "David"

# Odsazení dělá blok
if jmeno == "David":
    print("Ahoj!")

C# (Statický)

Musíme přesně určit datový typ předem, bloky děláme závorkami {}.

// Typ musíme deklarovat
string jmeno = "David";

// Bloky dělají závorky {}
if (jmeno == "David")
{
    Console.WriteLine("Ahoj!");
} // Nezapomenout středník!

Náš první program

Jak se kód čte?

Kód se vykonává odshora dolů, úplně stejně jako v Pythonu.

Každý příkaz (akce), který má program provést, musí být na konci ukončen středníkem ;.

Ukázka kódu

// Vypíše text do konzole a odřádkuje
Console.WriteLine("Hello, World!");

// Můžeme rovnou psát další logiku
int pocet = 10;
Console.WriteLine(pocet);

💻 ÚKOL 1: První spuštění

  • Otevřete Visual Studio.
  • Vytvořte nový projekt: Konzolová aplikace (Console App).
  • Do souboru Program.cs napište kód, který vypíše vaše jméno.
  • Spusťte program (Zelené tlačítko Play nahoře, nebo klávesa F5).

Proměnné a Interpolace

Základní datové typy

V C# musíme na každý "šuplík" v paměti nalepit štítek s datovým typem:

int pro celá čísla (15, -5)

string pro text (do dvojitých uvozovek: "Ahoj")

char pro jeden jediný znak (do apostrofů: 'A')

double pro desetinná čísla (výchozí v C#, vysoká přesnost)

float pro desetinná čísla (šetří paměť, nutné 'f': 15.5f)

bool pro pravdu/nepravdu (true)

Interpolace (Spojování)

Znak $ před uvozovkami nám dovolí vložit proměnnou přímo do textu pomocí {}.

int vek = 20;
string jmeno = "David";

Console.WriteLine($"Jmenuje se {jmeno} a je mu {vek} let.");

Paměť v praxi: Proč máme tolik typů?

Celá čísla: int vs byte

int (4 byty) je standard na počítání. Vejde se do něj až 2 miliardy.

byte (1 byte) umí jen čísla od 0 do 255. Nevyplatí se ho běžně používat k počítání, ale celý svět ho používá na barvy (RGB) nebo síťovou komunikaci!

Desetinná čísla: double vs float

double (8 bytů) je ultra-přesný (na 15 míst). Je to výchozí volba v C# pro výpočty.

float (4 byty) je poloviční. Milují ho 3D Hry (Unity) a grafické karty! Milion pozic objektů (X,Y,Z) jako float zabere polovinu paměti a hra běží rychleji.

Vstup a Parsing (Překlad)

Čtení textu

Console.ReadLine() čeká na uživatele. Vždy ale vrací text (string).

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

Překlad na číslo (Parse)

Text "20" se musí přeložit na matematické číslo 20 pomocí int.Parse().

Console.WriteLine("Zadej věk:");
string textVek = Console.ReadLine();

// Překlad textu na číslo!
int cisloVek = int.Parse(textVek);

💻 ÚKOL 2: Registrační formulář

  • Zeptejte se uživatele na jeho Jméno a načtěte ho.
  • Zeptejte se na jeho Věk a text přeložte na číslo (int.Parse).
  • Vytvořte proměnnou rokNarozeni a spočítejte ji (2024 - vek).
  • Vypište do konzole naformátovanou zprávu:
    "Uživatel [Jméno] se narodil přibližně v roce [Rok]."

Podmínky a Logika

Jak naučit program rozhodovat se (If / Else).

Porovnávací a Logické operátory

  • Rovnost a Nerovnost: Zda se dvě věci rovnají zapisujeme dvěma rovnítky ==. Zda se nerovnají zapisujeme !=.
  • Velikost: Větší >, Menší <, Větší nebo rovno >=, Menší nebo rovno <=.
  • A ZÁROVEŇ (AND): Zapisujeme jako &&. Obě podmínky musí platit.
    Např: (vek >= 18 && penize >= 100)
  • NEBO (OR): Zapisujeme jako dvě svislítka ||. Stačí, když platí jedna.
    Např: (jmeno == "Admin" || jmeno == "Root")

Syntaxe If / Else

Jak to funguje?

Podmínka musí být vždy v kulatých závorkách (). Blok kódu k vykonání je ve složených {}.

Na rozdíl od Pythonu (kde je elif), v C# používáme celá slova else if.

Ukázka kódu

int vek = 16;

if (vek >= 18) 
{
    Console.WriteLine("Vstup povolen.");
}
else if (vek == 17) 
{
    Console.WriteLine("Ještě jeden rok!");
}
else 
{
    Console.WriteLine("Vstup odepřen.");
}

💻 ÚKOL 3: Kontrola plnoletosti

  • Rozšiřte svůj předchozí program s formulářem.
  • Pomocí podmínky if / else zkontrolujte věk uživatele.
  • Pokud je věk větší nebo roven 18, vypište: "Účet byl vytvořen."
  • Jinak (else) vypište: "Omlouváme se, systém je pouze pro dospělé."

Pole a Cykly

Hromadné ukládání dat a jejich procházení.

Co je to Pole (Array)?

Seznam hodnot

Když potřebujeme uložit více věcí stejného typu, nepíšeme proměnnou pro každou zvlášť. Vytvoříme pole pomocí hranatých závorek [].

Důležité: Počítáme vždy od nuly! První prvek má index 0.

Práce s polem

// Vytvoření pole s konkrétními daty
string[] batoh = { "Meč", "Lektvar", "Klíč" };

// Přečtení prvního prvku
Console.WriteLine(batoh[0]); // Vypíše Meč

// Změna druhého prvku
batoh[1] = "Zlato";

⚠️ Zrádný výpis pole

Zkusíme vypsat vše najednou?

Pokud do výpisu vložíme přímo naši proměnnou batoh, neuvidíme její obsah.

string[] batoh = { "Meč", "Lektvar" };
Console.WriteLine(batoh);

Výsledek: System.String[]

Počítač nám tím říká: "Vím, že je to pole textů, ale neřekl jsi mi, abych ho otevřel a přečetl položky uvnitř."

Abychom vypsali jednotlivé věci, musíme pole projít cyklem!

Jaký cyklus vybrat? (For vs Foreach)

Foreach (Čtecí cyklus)

Kratší, přehlednější a bezpečný. Slouží k pouhému čtení a výpisu položek z pole. Položky pomocí něj nelze upravovat.

foreach (string vec in batoh) 
{
    Console.WriteLine(vec);
}

For (Pracovní cyklus)

Máme v ruce počítadlo i (pozici v poli). Můžeme tak vypsat pořadová čísla, nebo položky uvnitř pole měnit a přepisovat.

for (int i = 0; i < 2; i++) 
{
    batoh[i] = "Zlato"; // Změna prvku
}

💻 ÚKOL 4: Inventář

  • Vytvořte pole textů (string[] inventar) a vložte do něj 4 libovolné předměty (např. meč, lektvar, štít...).
  • Vypište do konzole nadpis "--- MŮJ INVENTÁŘ ---".
  • Použijte cyklus foreach a vypište postupně všechny předměty pod sebe.

Zbytek po dělení (Modulo)

Operátor %

Kromě dělení (/) máme v programování i operátor % (modulo). Ten vrací zbytek po celočíselném dělení.

Nejčastěji ho používáme ke zjištění, zda je číslo sudé nebo liché.

Ukázka: Sudá a lichá

// 5 děleno 2 je 2, zbytek je 1
int zbytek = 5 % 2; 

if (cislo % 2 == 0) 
{
    Console.WriteLine("Číslo je sudé!");
}
else 
{
    Console.WriteLine("Číslo je liché!");
}

💻 ÚKOL 5: Statistiky čísel

  • Požádejte uživatele, ať průběžně zadává celá čísla. Jakmile zadá číslo -1, program zadávání ukončí.
  • K opakovanému načítání použijte cyklus while.
  • Během zadávání čísel si do proměnných průběžně ukládejte: celkový součet, počet sudých a počet lichých čísel. (Pozor: samotné ukončovací číslo -1 do statistik nepočítejte!)
  • Po skončení cyklu vypište zjištěné výsledky na obrazovku. Přidejte také výpočet a výpis průměru zadaných čísel.

Prázdné pole na míru

Když neznáme data předem

Zatím jsme pole plnili hned při vytvoření. Co když ale chceme, aby si uživatel sám určil, kolik hodnot bude zadávat?

Musíme vytvořit prázdné pole o určité délce. Paměť se připraví, ale šuplíky budou zatím prázdné.

Ukázka v kódu

Console.WriteLine("Kolik chceš čísel?");
int delka = int.Parse(Console.ReadLine());

// Vytvoření prázdného pole o zadané velikosti
int[] cisla = new int[delka];

// První prvek můžeme rovnou naplnit
cisla[0] = 42;

🤔 Rychlý Kvíz

Otázka:

Když vytvořím pole o velikosti 5 pro celá čísla, ale zatím do něj nic nevložím... Co se vypíše, když zkusím přečíst první prvek?

int[] cisla = new int[5];
Console.WriteLine(cisla[0]); // Co se stane? Spadne to? Nebo tam nic není?

💡 Řešení kvízu

Odpověď:

Vypíše se 0!

Datový typ int neumí být prázdný (null). V C# se tedy při inicializaci new int[5] automaticky všechny připravené šuplíky naplní výchozí hodnotou nula.

Náhoda (Random)

Jak generovat náhodná čísla?

Ve hrách i aplikacích často potřebujeme náhodu (hod kostkou, poškození nepřítele, loot).

V C# si vytvoříme "generátor" pomocí new Random() a pak z něj taháme čísla metodou Next(min, max).

Ukázka: Hod kostkou

// Vytvoříme si generátor náhody (stačí jednou)
Random kostka = new Random();

// Chceme číslo od 1 do 6
// POZOR: Horní hranice tam už NEPATŘÍ! 
// Proto musíme napsat 7.
int hod = kostka.Next(1, 7);

Console.WriteLine($"Padlo ti: {hod}");

💻 ÚKOL 6: Generátor a statistiky

  • Zeptejte se uživatele: "Kolik čísel chceš vygenerovat?" a načtěte délku.
  • Vytvořte prázdné pole int[] o této velikosti a připravte si Random generátor.
  • Pomocí cyklu for (pracovní cyklus) projděte celé pole a do každého "šuplíku" uložte náhodné číslo (např. od 1 do 100).
  • Vytvořte druhý cyklus, tentokrát foreach (čtecí cyklus). V něm pole projděte a spočítejte si: součet, počet sudých a lichých čísel.
  • Na konci vypište výsledky, včetně průměru vygenerovaných čísel.

Metody a organizace kódu

Jak naučit program nové logické bloky a zbavit se kopírování.

Konec špagetového kódu

Princip DRY

Don't Repeat Yourself (Neopakuj se). Pokud kopírujete stejný kód na více míst, děláte to špatně.

Když v kopírovaném kódu najdete chybu, musíte ji opravovat na deseti místech. To nikdo nechce.

Lego kostky (Metody)

Kód, který dělá jednu logickou věc (např. Vypíše menu nebo Spočítá daň), zabalíme do vlastního pojmenovaného bloku.

Tento blok (Metodu) pak můžeme "zavolat" kolikrát chceme jediným slovem.

Python (def) vs. C# (void)

Python

V Pythonu se funkce definuje klíčovým slovem def.

# Definice funkce
def pozdrav():
    print("Ahoj z funkce!")

# Zavolání funkce
pozdrav()

C#

V C# musíme říct, co metoda vrací. Pokud nevrací nic (jen něco např. vypíše), používáme slovo void (prázdnota).

// Definice metody
void Pozdrav()
{
    Console.WriteLine("Ahoj z metody!");
}

// Zavolání metody
Pozdrav();

Kde a jak metody zapisovat?

  • Pravidlo Top-level statements: Metody definujeme až na úplném konci souboru (dole).
  • Nahoře píšeme náš hlavní program, který metody volá.
// --- HLAVNÍ PROGRAM (Vykonává se shora dolů) ---
Console.WriteLine("Začínáme!");
ZobrazMenu(); // Voláme naši metodu
Console.WriteLine("Konec programu.");

// --- DEFINICE METOD (Tady dole jen čekají na zavolání) ---
void ZobrazMenu()
{
    Console.WriteLine("1. Nová hra");
    Console.WriteLine("2. Konec");
}

💻 ÚKOL 7: Čisté Menu

  • Vytvořte metodu s názvem VypisMenu(), která nebude nic vracet (použijte void).
  • Uvnitř metody pomocí Console.WriteLine naformátujte textové menu (např. 1. Přidat uživatele, 2. Smazat, 3. Konec).
  • V hlavním programu (úplně nahoře) tuto metodu dvakrát po sobě zavolejte. Sledujte, jak se stejný kód vykoná dvakrát bez nutnosti ho kopírovat!

Parametry a Argumenty

Jak poslat do metody vstupní data.

Krmení metod daty (Parametry)

Jak přijmout data?

Metoda může do kulatých závorek () dostat proměnné, se kterými pak bude uvnitř pracovat.

Zásadní: I v závorkách musíme striktně definovat datový typ (zda jde o string nebo int)!

Ukázka v kódu

// Metoda přijímá dvě hodnoty (text a číslo)
void Uvitani(string jmeno, int vek)
{
    Console.WriteLine($"Ahoj {jmeno}!");
    Console.WriteLine($"Je ti {vek} let.");
}

// Zavolání s konkrétními hodnotami (Argumenty)
Uvitani("Martin", 25);
Uvitani("Jana", 30);

⚠️ Pozor na Scope (Platnost proměnných)

  • Co se stane v metodě, zůstane v metodě.
  • Pokud vytvoříte proměnnou uvnitř složených závorek {} jedné metody, hlavní program o ní vůbec neví!
// HLAVNÍ PROGRAM
TestovaciMetoda();
// Následující řádek vyhodí CHYBU! Program nezná 'tajneCislo'.
Console.WriteLine(tajneCislo); 

void TestovaciMetoda()
{
    int tajneCislo = 42; // Proměnná žije pouze zde!
}

💻 ÚKOL 8: Chytré uvítání

  • V hlavním programu se zeptejte uživatele na Jméno a Věk a načtěte je.
  • Vytvořte dole metodu Uvitani(string jmeno, int vek).
  • V hlavním programu tuto metodu zavolejte a pošlete do ní načtená data z klávesnice.
  • Uvnitř metody data zpracujte a vypište např: "Ahoj Davide, je ti 16 let a narodil ses v roce 2008."
  • TIP: C# má typ DateTime pro čas. Zkuste uvnitř metody použít:
    DateTime dnes = DateTime.Today;
    int letos = dnes.Year;

Návratový typ (Return)

Jak dostat výsledek z metody zpět ven.

Slovo "void" nahrazujeme typem

Vracení hodnot

Pokud chceme, aby metoda něco spočítala a vrátila výsledek (abychom si ho uložili), přestaneme psát void.

Před jméno metody napíšeme, jaký typ vracíme (např. int nebo string) a uvnitř použijeme return.

Kalkulačka

// Metoda vrací int (celé číslo)
int SectiCisla(int a, int b)
{
    int vysledek = a + b;
    return vysledek; // Předá data ven!
}

// Voláme metodu a výsledek si ULOŽÍME do šuplíku
int mojeCislo = SectiCisla(10, 5);
Console.WriteLine(mojeCislo);

💻 ÚKOL 9: Mzda

  • Vytvořte metodu s názvem VypoctiRocniPlat.
  • Metoda přijme jeden parametr (int mesicniPlat).
  • Metoda vrátí (return) hodnotu typu int, která vznikne vynásobením měsíčního platu dvanácti.
  • V hlavním programu se zeptejte uživatele na měsíční plat, načtěte ho, pošlete ho do metody a vrácený výsledek vypište na obrazovku!

Switch a Cyklus While

Tvoříme elegantní menu a stabilní aplikace.

Proč přecházíme na Switch?

Dlouhý a nepřehledný if-else

Když máte v menu 5 a více možností, neustálé opakování else if (volba == X) dělá kód špatně čitelný.

Ztrácíme přehled o tom, co přesně testujeme.

Příklad z kalkulačky

if (volba == 1) {
    vysledek = Secti(a, b);
}
else if (volba == 2) {
    vysledek = Odecti(a, b);
}
else if (volba == 3) {
    // ... a tak dále
}
else {
    Console.WriteLine("Špatná volba.");
}

Konstrukce Switch

Jak Switch funguje?

Dáme mu proměnnou (např. volba) a pak definujeme jednotlivé "případy" (case).

Dvě klíčová pravidla:

  • Každý case musí končit slovem break; (jinak kód spadne).
  • Na konci je default: (funguje jako závěrečné else).

Čistý kód

switch (volba)
{
    case 1:
        vysledek = Secti(a, b);
        break;
    case 2:
        vysledek = Odecti(a, b);
        break;
    default:
        Console.WriteLine("Špatná volba.");
        break;
}

🏆 ÚKOL 10: Projekt Kalkulačka (Část 1)

  • Zeptejte se uživatele na dvě čísla (a, b) a načtěte je.
  • Vypište menu: 1. Sčítání, 2. Odečítání, 3. Násobení, 4. Dělení a načtěte volbu.
  • Vytvořte 4 metody (např. Secti(a,b)). Každá vrátí výsledek.
  • Pomocí konstrukce switch ověřte volbu, zavolejte danou metodu a výsledek vypište.
  • Pozor: V metodě pro dělení pohlídejte (pomocí if), aby číslo b nebylo nula!

Cyklus While

Hlídáme uživatele. Dokud nezadá správnou hodnotu, nepustíme ho dál.

Problém s jednorázovým během

Zavři oči a běž

Náš program zatím funguje tak, že se zeptá, vezme odpověď a hned skončí. Ať už uživatel zadá 1, nebo nesmysl jako 99.

Co když chceme, aby se po dokončení výpočtu vrátil zpět do menu? Nebo aby se ptal znovu, když uživatel zadá neplatnou volbu?

Cyklus While (Zatímco)

Cyklus while se opakuje neustále dokola, dokud platí zadaná podmínka.

Je to vlastně if, který se opakuje, dokud nepřestane platit.

Základní cyklus While

Počítadlo (podobně jako for)

Můžeme ho použít jako jednodušší verzi for cyklu. Vytvoříme si proměnnou, v cyklu ji zvyšujeme a testujeme, jestli už je dost velká.

Ukázka: Odpočet

int pocetPokusu = 3;

while (pocetPokusu > 0)
{
    Console.WriteLine($"Zbývá pokusů: {pocetPokusu}");
    pocetPokusu--; // Zmenšíme o 1
}
Console.WriteLine("Konec!");

Pojistka: Hlídání uživatelského vstupu

Obrana proti zlým uživatelům

Uživatelé zadávají hlouposti. Můžeme cyklus while použít k tomu, abychom je drželi "v pasti", dokud nezadají to, co chceme.

Využijeme zde operátor "nerovná se" != a logické "nebo" ||.

Menu, ze kterého neutečeš

int volba = 0; // Musíme nastavit na něco neplatného

// Dokud je volba jiná než 1 A ZÁROVEŇ jiná než 2
while (volba != 1 && volba != 2)
{
    Console.WriteLine("Zadej 1 (Hraj) nebo 2 (Konec):");
    volba = int.Parse(Console.ReadLine());
}

Console.WriteLine($"Díky, zadal jsi platnou volbu: {volba}");

Bonus: Herní smyčka (Game Loop)

Nikdy nekončící program

Téměř všechny hry a aplikace běží v nekonečném cyklu, dokud je uživatel sám neukončí (např. volbou v menu).

Můžeme využít cyklus, který běží pořád (while (true)), a ukončit ho ručně příkazem break;.

Základ herní smyčky

while (true) // Běží do nekonečna
{
    Console.WriteLine("Ahoj. Napiš 'konec' pro odchod:");
    string vstup = Console.ReadLine();
    
    if (vstup == "konec")
    {
        Console.WriteLine("Ukončuji aplikaci...");
        break; // Vyskočí z cyklu while!
    }
}

🏆 ÚKOL 11: Projekt Kalkulačka (Dokončení)

  • Zabalte načítání volby operace do cyklu while. Cyklus se bude opakovat, dokud uživatel nezadá číslo od 1 do 4.
  • Bonus pro experty: Zabalte úplně celý program (od zadání čísel a a b, až po výsledek) do "Herní smyčky" while(true).
  • Do menu přidejte volbu "5. Konec". Pokud ji uživatel vybere, program se pomocí příkazu break; bezpečně ukončí.

Základy řízení toku programu

Nyní umíte elegantně obsloužit menu a zajistit správnost uživatelského vstupu.

C# a .NET - Zvládnuté základy
```