Lekce 3 - Proměnné, typový systém a parsování v C# .NET
Z minulé lekce C# kurzu, Visual Studio a první konzolová aplikace v C# .NET, již umíme pracovat s Visual Studiem a vytvořit konzolovou aplikaci.
Dnes se v tutoriálu podíváme na tzv. typový systém, ukážeme si základní datové typy a práci s proměnnými. Výsledkem budou 4 jednoduché programy včetně kalkulačky.
Proměnné
Než začneme řešit datové typy, pojďme se shodnout na tom, co je to
proměnná (programátoři mi teď jistě odpustí zbytečné vysvětlování).
Z matematiky určitě znáte proměnnou (např. x
), do které jsme
si mohli uložit nějakou hodnotu, nejčastěji číslo. Proměnná v
informatice je naprosto totéž, je to místo v paměti počítače, kam si
můžeme uložit nějaká data (jméno uživatele, aktuální čas nebo
databázi článků). Toto místo má podle typu proměnné také vyhrazenou
určitou velikost, kterou proměnná nesmí přesáhnout (např. číslo nesmí
být větší než 2 147 483 647).
Proměnná má vždy nějaký datový typ, může to být číslo, znak, text a podobně, záleží na tom, k čemu ji chceme používat. Před prací s proměnnou ji většinou musíme nejdříve tzv. deklarovat, tedy musíme říci jazyku, jak se proměnná bude jmenovat a jakého datového typu bude (jaký v ní bude obsah). Jazyk ji v paměti založí a teprve potom s ní můžeme pracovat. Podle datového typu proměnné si ji jazyk dokáže z paměti načíst, modifikovat, případně ji v paměti založit. O každém datovém typu jazyk ví, kolik v paměti zabírá místa a jak s tímto kusem paměti pracovat.
Typový systém
Existují dva základní typové systémy: statický a dynamický.
- Dynamický typový systém nás plně odstiňuje od toho, že proměnná má vůbec nějaký datový typ. Ona ho samozřejmě vnitřně má, ale jazyk to nedává najevo. Dynamické typování jde mnohdy tak daleko, že proměnné nemusíme ani deklarovat. Jakmile do nějaké proměnné něco uložíme a jazyk zjistí, že nebyla nikdy deklarována, sám ji založí. Do téže proměnné můžeme ukládat text, potom objekt uživatele a potom desetinné číslo. Jazyk se s tím sám popere a vnitřně automaticky mění datový typ. V těchto jazycích jde vývoj rychleji díky menšímu množství kódu, jejich zástupci jsou např. PHP nebo Ruby.
- Statický typový systém naopak striktně vyžaduje definovat typ proměnné a tento typ je dále neměnný. Jakmile proměnnou jednou deklarujeme, není možné její datový typ změnit. Jakmile se do textového řetězce pokusíme uložit objekt uživatel, dostaneme vynadáno.
C# je staticky typovaný jazyk, všechny proměnné tedy musíme nejprve deklarovat s jejich datovým typem. Nevýhodou je, že kvůli deklaracím je zdrojový kód poněkud objemnější a vývoj pomalejší. Obrovskou výhodou však je, že nám kompiler před spuštěním zkontroluje, zda všechny datové typy sedí. Dynamické typování sice vypadá jako výhodné, ale zdrojový kód není možné automaticky kontrolovat, a když někde očekáváme objekt uživatel a přijde nám tam místo toho desetinné číslo, odhalí se chyba až za běhu a interpret program shodí. Naopak C# nám nedovolí program ani zkompilovat a na chybu nás upozorní (to je další výhoda kompilace).
Pojďme si nyní něco naprogramovat, ať si nabyté znalosti trochu osvojíme, s teorií budeme pokračovat až příště. Řekněme si nyní tři základní datové typy:
- celá čísla:
int
, - desetinná čísla:
float
, - textový řetězec:
string
.
Program vypisující proměnnou
Zkusíme si nadeklarovat celočíselnou proměnnou a
, dosadit do
ní číslo 56
a její obsah vypsat do konzole. Založte si nový
projekt, pojmenujte ho Vypis
(i ke všem dalším příkladům si
vždy založte nový projekt).
{CSHARP_CONSOLE}
int a;
a = 56;
Console.WriteLine(a);
Console.ReadKey();
{/CSHARP_CONSOLE}
Připomeňme, že kód píšeme do těla metody
Main()
v případě projektů starších než .NET 6.0.
První příkaz nám nadeklaruje novou proměnnou a
datového
typu int
. Proměnná tedy bude sloužit pro ukládání celých
čísel. Druhý příkaz provádí přiřazení do proměnné, slouží k tomu
operátor "rovná se" (=
). Poslední příkaz je nám známý,
vypíše do konzole obsah proměnné a
. Konzole je chytrá a umí
vypsat i číselné proměnné. ReadKey()
je nám známý.
Konzolová aplikace
56
Pro desetinnou proměnnou by kód vypadal takto:
{CSHARP_CONSOLE}
float a;
a = 56.6F;
Console.WriteLine(a);
Console.ReadKey();
{/CSHARP_CONSOLE}
Je to téměř stejné jako s celočíselnou proměnnou. Jako desetinný
oddělovač používáme tečku (.
) a na konci desetinného čísla
je nutné zadat tzv. sufix F
, tím říkáme, že se jedná o
float
.
Program Papoušek
Minulý program byl poněkud nudný, zkusme nějak reagovat na vstup od
uživatele. Napíšeme program Papoušek, který bude dvakrát opakovat to, co
uživatel napsal. Ještě jsme nezkoušeli z konzole nic načítat, ale je to
velmi jednoduché. Slouží k tomu metoda ReadLine()
, která nám
vrátí textový řetězec z konzole. Zkusme si napsat následující kód:
{CSHARP_CONSOLE}
Console.WriteLine("Ahoj, jsem virtuální papoušek Lóra, rád opakuji!");
Console.WriteLine("Napiš něco: ");
string vstup;
vstup = Console.ReadLine();
string vystup;
vystup = vstup + ", " + vstup + "!";
Console.WriteLine(vystup);
Console.ReadKey();
{/CSHARP_CONSOLE}
To už je trochu zábavnější První dva řádky jsou jasné, dále deklarujeme textový řetězec
vstup
. Do vstup
se přiřadí hodnota z metody
ReadLine()
na konzoli, tedy to, co uživatel zadal. Pro výstup si
pro názornost zakládáme další proměnnou typu textový řetězec.
Zajímavé je to, jak pro výsledek proměnné vystup
využíváme
tzv. konkatenace (spojování) řetězců. Pomocí operátoru +
totiž můžeme spojit několik textových řetězců do jednoho a je jedno,
jestli je řetězec v proměnné, nebo je explicitně zadán v uvozovkách ve
zdroj. kódu. Do proměnné tedy přiřadíme vstup
, dále čárku,
znovu vstup
a poté vykřičník. Proměnnou vypíšeme, vyčkáme
na stisk klávesy a skončíme.
Konzolová aplikace
Ahoj, jsem virtuální papoušek Lóra, rád opakuji!
Napiš něco:
Nazdar ptáku
Nazdar ptáku, Nazdar ptáku!
Do proměnné můžeme přiřazovat již v její deklaraci, můžeme tedy nahradit:
string vstup;
vstup = Console.ReadLine();
za
string vstup = Console.ReadLine();
Program by šel zkrátit ještě více v mnoha ohledech. Obecně je ale lepší používat více proměnných a dodržovat přehlednost než psát co nejkratší kód a po měsíci zapomenout, jak vůbec funguje.
Program Zdvojnásobovač
Zdvojnásobovač si vyžádá na vstupu číslo a to poté vynásobí
hodnotou 2
a vypíše. S dosavadními znalostmi bychom asi napsali
něco takového:
Console.WriteLine("Zadejte číslo k zdvojnásobení:"); int a = Console.ReadLine(); a = a * 2; Console.WriteLine(a); Console.ReadKey();
Všimněte si vynásobení čísla a
, které jsme provedli
pomocí přiřazení. C# nám nyní vyhubuje a podtrhne řádek, ve kterém se
snažíme hodnotu z konzole dostat do proměnné typu int
.
Narážíme na typovou kontrolu, konkrétně nám ReadLine()
vrací
string
a my se ho snažíme uložit do int
. Cokoli
přijde z textové konzole, je vždy text, a to i když zadáme číslo. Budeme
ho potřebovat tzv. naparsovat.
Parsování
Parsováním se myslí převod z textové podoby na nějaký specifický typ,
např. číslo. Mnoho datových typů v C# má metody k parsování již
připraveny. Pokud budeme chtít naparsovat např. int
ze
string
, budeme postupovat takto:
string s = "56"; int a = int.Parse(s);
Vidíme, že datový typ int
má na sobě přímo metodu
Parse()
, která jako parametr bere textový řetězec a vrátí
číslo. Využijeme této znalosti v našem programu:
{CSHARP_CONSOLE}
Console.WriteLine("Zadejte číslo k zdvojnásobení:");
string s = Console.ReadLine();
int a = int.Parse(s);
a = a * 2;
Console.WriteLine(a);
Console.ReadKey();
{/CSHARP_CONSOLE}
Nejprve si text z konzole uložíme do textového řetězce s
.
Do celočíselné proměnné a
poté uložíme číselnou hodnotu
řetězce s
. Dále hodnotu v a
vynásobíme hodnotou
2
a vypíšeme do konzole.
Konzolová aplikace
Zadejte číslo k zdvojnásobení:
1024
2048
Můžete se setkat s parsováním ze string
pomocí
třídy Convert
, ta však slouží ke konverzi mezi čísly a s
textem si nemusí správně poradit, je to tedy špatné řešení.
Parsování se samozřejmě nemusí povést, když bude v textu místo čísla např. "slovo", ale tento případ zatím nebudeme ošetřovat.
Jednoduchá kalkulačka
Ještě jsme nepracovali s desetinnými čísly, zkusme si tedy napsat slibovanou kalkulačku. Bude velmi jednoduchá, na vstup přijdou dvě čísla, program poté vypíše výsledky pro sčítání, odčítání, násobení a dělení.
{CSHARP_CONSOLE}
Console.WriteLine("Vítejte v kalkulačce");
Console.WriteLine("Zadejte první číslo:");
float a = float.Parse(Console.ReadLine());
Console.WriteLine("Zadejte druhé číslo:");
float b = float.Parse(Console.ReadLine());
float soucet = a + b;
float rozdil = a - b;
float soucin = a * b;
float podil = a / b;
Console.WriteLine("Součet: " + soucet);
Console.WriteLine("Rozdíl: " + rozdil);
Console.WriteLine("Součin: " + soucin);
Console.WriteLine("Podíl: " + podil);
Console.WriteLine("Děkuji za použití kalkulačky, aplikaci ukončíte libovolnou klávesou.");
Console.ReadKey();
{/CSHARP_CONSOLE}
Konzolová aplikace
Vítejte v kalkulačce
Zadejte první číslo:
3,14
Zadejte druhé číslo:
2,72
Součet: 5,86
Rozdíl: 0,42
Součin: 8,5408
Podíl: 1,15441176470588
Děkuji za použití kalkulačky, aplikaci ukončíte libovolnou klávesou.
Všimněme si dvou věcí. Zaprvé jsme zjednodušili parsování z konzole
tak, abychom nepotřebovali stringovou proměnnou, protože bychom ji stejně
již poté nepoužili. Zadruhé na konci programu spojujeme řetězec s číslem
pomocí operátoru +
. C# překvapivě nezahlásí chybu, ale
provede tzv. implicitní konverzi a zavolá na čísle metodu
ToString()
. Kdyby tomu tak nebylo nebo kdybychom
se dostali do situace, kdy potřebujeme převést cokoli na string
,
zavoláme na proměnné metodu ToString()
. C# to v tomto případě
udělal za nás, v podstatě vykoná:
Console.WriteLine("Součet: " + soucet.ToString());
Právě jsme se tedy naučili opak parsování – převést cokoli do textové podoby.
Operátor nameof
Někdy se nám může hodit získat místo hodnoty proměnné její název.
Slouží k tomu operátor nameof
:
int cislo = 5; Console.WriteLine(nameof(cislo));
Výstup:
Konzolová aplikace
cislo
Můžeme si vyzkoušet, že program opravdu nevypíše pětku, ale
cislo
.
Všechny programy máte samozřejmě opět v příloze, zkoušejte si
vytvářet nějaké podobné, znalosti již k tomu máte
V příští lekci, Využití umělé inteligence při studiu programování, se podíváme na využití umělé inteligence při studiu programování.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 2696x (87.57 kB)
Aplikace je včetně zdrojových kódů v jazyce C#