3. diel - Premenné, typový systém a parsovanie v C# .NET
Z minulej lekcie C# kurzu, Visual Studio a prvá konzolová aplikácia v C# .NET, už vieme pracovať s Visual Studiom a vytvoriť konzolovú aplikáciu.
Dnes sa v tutoriáli pozrieme na tzv. typový systém, ukážeme si základné dátové typy a prácu s premennými. Výsledkom budú 4 jednoduché programy vrátane kalkulačky.
Premenné
Než začneme riešiť dátové typy, poďme sa zhodnúť na tom, čo je to
premenná (programátori mi teraz určite odpustia zbytočné vysvetľovanie). Z
matematiky určite poznáte premennú (napr. x
), do ktorej sme si
mohli uložiť nejakú hodnotu, najčastejšie číslo. Premenná v informatike
je úplne to isté, je to miesto v pamäti počítača, kam si môžeme uložiť
nejaké dáta (meno užívateľa, aktuálny čas alebo databázu článkov).
Toto miesto má podľa typu premennej tiež vyhradenú určitú veľkosť,
ktorú premenná nesmie presiahnuť (napr. číslo nesmie byť väčšie ako 2
147 483 647).
Premenná má vždy nejaký dátový typ, môže to byť číslo, znak, text a podobne, záleží na tom, na čo ju chceme používať. Pred prácou s premennou ju väčšinou musíme najskôr tzv. deklarovať, teda musíme povedať jazyku, ako sa premenná bude volať a akého dátového typu bude (aký v nej bude obsah). Jazyk ju v pamäti založí a až potom s ňou môžeme pracovať. Podľa dátového typu premennej si ju jazyk dokáže z pamäte načítať, modifikovať, prípadne ju v pamäti založiť. O každom dátovom type jazyk vie, koľko v pamäti zaberá miesta a ako s týmto kusom pamäte pracovať.
Typový systém
Existujú dva základné typové systémy: statický a dynamický.
- Dynamický typový systém nás plne odtieňuje od toho, že premenná má vôbec nejaký dátový typ. Ona ho samozrejme vnútorne má, ale jazyk to nedáva najavo. Dynamické typovanie ide mnohokrát tak ďaleko, že premenné nemusíme ani deklarovať. Akonáhle do nejakej premennej niečo uložíme a jazyk zistí, že nebola nikdy deklarovaná, sám ju založí. Do tej istej premennej môžeme ukladať text, potom objekt užívateľa a potom desatinné číslo. Jazyk sa s tým sám pobije a vnútorne automaticky mení dátový typ. V týchto jazykoch ide vývoj rýchlejšie vďaka menšiemu množstvu kódu, ich zástupcami sú napr. PHP alebo Ruby.
- Statický typový systém naopak striktne vyžaduje definovať typ premennej a tento typ je ďalej nemenný. Akonáhle premennú raz deklarujeme, nie je možné jej dátový typ zmeniť. Akonáhle sa do textového reťazca pokúsime uložiť objekt používateľ, dostaneme vynadané.
C# je staticky typovaný jazyk, všetky premenné teda musíme najskôr deklarovať s ich dátovým typom. Nevýhodou je, že kvôli deklaráciám je zdrojový kód o niečo objemnejší a vývoj pomalší. Obrovskou výhodou však je, že nám kompiler pred spustením skontroluje, či všetky dátové typy sedia. Dynamické typovanie síce vyzerá ako výhodné, ale zdrojový kód nie je možné automaticky kontrolovať, a keď niekde očakávame objekt používateľ a príde nám tam namiesto toho desatinné číslo, odhalí sa chyba až za behu a interpret program zhodí. Naopak C# nám nedovolí program ani skompilovať a na chybu nás upozorní (to je ďalšia výhoda kompilácie).
Poďme si teraz niečo naprogramovať, nech si nadobudnuté znalosti trochu osvojíme, s teóriou budeme pokračovať až nabudúce. Povedzme si teraz tri základné dátové typy:
- celé čísla:
int
, - desatinné čísla:
float
, - textový reťazec:
string
.
Program vypisujúci premennú
Skúsime si nadeklarovať celočíselnú premennú a
, dosadiť
do nej číslo 56
a jej obsah vypísať do konzoly. Založte si
nový projekt, pomenujte ho Output
(aj ku všetkým ďalším
príkladom si vždy založte nový projekt):
{CSHARP_CONSOLE}
int a;
a = 56;
Console.WriteLine(a);
Console.ReadKey();
{/CSHARP_CONSOLE}
Pripomeňme, že kód píšeme do tela metódy
Main()
v prípade projektov starších ako .NET 6.0.
Prvý príkaz nám nadeklaruje novú premennú a
dátového typu
int
. Premenná teda bude slúžiť na ukladanie celých čísel.
Druhý príkaz vykonáva priradenie do premennej, slúži na to operátor
"rovná sa" (=
). Posledný príkaz je nám známy, vypíše do
konzoly obsah premennej a
. Konzola je múdra a vie vypísať aj
číselné premenné. ReadKey()
je nám známy:
Konzolová aplikácia
56
Pre desatinnú premennú by kód vyzeral takto:
{CSHARP_CONSOLE}
float a;
a = 56.6F;
Console.WriteLine(a);
Console.ReadKey();
{/CSHARP_CONSOLE}
Je to takmer rovnaké ako s celočíselnou premennou. Ako desatinný
oddeľovač používame bodku (.
) a na konci desatinného čísla
je nutné zadať tzv. sufix F
, tým hovoríme, že sa jedná o
float
.
Program Parrot
Minulý program bol trochu nudný, skúsme nejako reagovať na vstup od
používateľa. Napíšeme program Parrot
, ktorý bude dvakrát
opakovať to, čo používateľ napísal. Ešte sme neskúšali z konzoly nič
načítať, ale je to veľmi jednoduché. Slúži na to metóda
ReadLine()
, ktorá nám vráti textový reťazec z konzoly. Skúsme
si napísať nasledujúci kód:
{CSHARP_CONSOLE}
Console.WriteLine("Hi, I am a virtual parrot Lora, I love to repeat!");
Console.WriteLine("Type something in: ");
string input;
input = Console.ReadLine();
string output;
output = input + ", " + input + "!";
Console.WriteLine(output);
Console.ReadKey();
{/CSHARP_CONSOLE}
To už je trochu zábavnejšie Prvé dva riadky sú jasné, ďalej deklarujeme textový reťazec
input
. Do input
sa priradí hodnota z metódy
ReadLine()
na konzole, teda to, čo používateľ zadal. Pre
výstup si pre názornosť zakladáme ďalšiu premennú typu textový reťazec.
Zaujímavé je to, ako pre výsledok premennej output
využívame
tzv. konkatenáciu (spájanie) reťazcov. Pomocou operátora +
totiž môžeme spojiť niekoľko textových reťazcov do jedného a je jedno,
či je reťazec v premennej, alebo je explicitne zadaný v úvodzovkách do
zdrojového kódu. Do premennej teda priradíme input
, ďalej
čiarku, znovu input
a potom výkričník. Premennú vypíšeme,
vyčkáme na stlačenie klávesy a skončíme:
Konzolová aplikácia
Hi, I am a virtual parrot Lora, I love to repeat!
Type something in:
Hello bird
Hello bird, Hello bird!
Do premennej môžeme priraďovať už v jej deklarácii, nasledujúcu časť kódu môžeme skrátiť:
string input;
input = Console.ReadLine();
Jednoducho napíšeme iba:
string input = Console.ReadLine();
Program by šiel skrátiť ešte viac v mnohých ohľadoch. Všeobecne je ale lepšie používať viac premenných a dodržiavať prehľadnosť, ako písať čo najkratší kód a po mesiaci zabudnúť, ako vôbec funguje.
Program Doubler
Doubler
si vyžiada na vstupe číslo a to potom vynásobí
hodnotou 2
a vypíše. S doterajšími znalosťami by sme asi
napísali niečo také:
Console.WriteLine("Enter a number and I will double it: "); int a = Console.ReadLine(); a = a * 2; Console.WriteLine(a); Console.ReadKey();
Všimnite si vynásobenie čísla a
, ktoré sme vykonali pomocou
priradenia. C# nám teraz vyhubuje a podčiarkne riadok, v ktorom sa snažíme
hodnotu z konzoly dostať do premennej typu int
. Narážame na
typovú kontrolu, konkrétne nám ReadLine()
vracia
string
a my sa ho snažíme uložiť do int
.
Čokoľvek príde z textovej konzoly, je vždy text, a to aj keď zadáme
číslo. Budeme ho potrebovať tzv. naparsovať.
Parsovanie
Parsovaním sa myslí prevod z textovej podoby na nejaký špecifický typ,
napr. číslo. Veľa dátových typov v C# má už pripravené metódy na
parsovanie. Pokiaľ budeme chcieť naparsovať napr. int
zo
string
, budeme postupovať takto:
string s = "56"; int a = int.Parse(s);
Vidíme, že dátový typ int
má na sebe priamo metódu
Parse()
, ktorá ako parameter berie textový reťazec a vráti
číslo. Využijeme túto znalosť v našom programe:
{CSHARP_CONSOLE}
Console.WriteLine("Enter a number and I will double it: ");
string s = Console.ReadLine();
int a = int.Parse(s);
a = a * 2;
Console.WriteLine(a);
Console.ReadKey();
{/CSHARP_CONSOLE}
Najprv si text z konzoly uložíme do textového reťazca s
. Do
celočíselnej premennej a
potom uložíme číselnú hodnotu
reťazca s
. Ďalej hodnotu v a
vynásobíme hodnotou
2
a vypíšeme do konzoly:
Konzolová aplikácia
Enter a number and I will double it:
1024
2048
Môžete sa stretnúť s parsovaním zo string
pomocou triedy Convert
, tá však slúži na konverziu medzi
číslami a s textom si nemusí správne poradiť, je to teda zlé
riešenie.
Parsovanie sa samozrejme nemusí podariť, keď bude v texte namiesto čísla napr. "slovo", ale tento prípad zatiaľ nebudeme ošetrovať.
Jednoduchá kalkulačka
Ešte sme nepracovali s desatinnými číslami, skúsme si teda napísať
sľubovanú kalkulačku. Bude veľmi jednoduchá, na vstup prídu dve čísla,
program potom vypíše výsledky pre sčítanie, odčítanie, násobenie a
delenie. Namiesto dátového typu float
použijeme tentoraz pre
desatinné čísla iný datový typ, a to double
:
{CSHARP_CONSOLE}
Console.WriteLine("Welcome to our calculator");
Console.WriteLine("Enter the first number:");
double a = double.Parse(Console.ReadLine());
Console.WriteLine("Enter the second number:");
double b = double.Parse(Console.ReadLine());
double sum = a + b;
double difference = a - b;
double product = a * b;
double quotient = a / b;
Console.WriteLine("Addition: " + sum);
Console.WriteLine("Subtraction: " + difference);
Console.WriteLine("Multiplication: " + product);
Console.WriteLine("Division: " + quotient);
Console.WriteLine("Thank you for using our calculator. Press any key to end the program.");
Console.ReadKey();
{/CSHARP_CONSOLE}
Konzolová aplikácia
Welcome to our calculator
Enter the first number:
3,14
Enter the second number:
2,72
Addition: 5,86
Subtraction: 0,42
Multiplication: 8,5408
Division: 1,15441176470588
Thank you for using our calculator. Press any key to end the program.
Všimnime si dve veci. Po prvé sme zjednodušili parsovanie z konzoly tak,
aby sme nepotrebovali stringovú premennú, pretože by sme ju aj tak už potom
nepoužili. Po druhé, na konci programu spájame reťazec s číslom pomocou
operátora +
. C# prekvapivo nezahlási chybu, ale vykoná tzv.
implicitnú konverziu a zavolá na čísle metódu ToString()
. Keby
tomu tak nebolo alebo keby sme sa dostali do situácie, keď potrebujeme
previesť čokoľvek na string
, zavoláme na premenné metódu
ToString()
. C# to v tomto prípade urobil za nás, v podstate
vykoná:
Console.WriteLine("Addition: " + sum.ToString());
Práve sme sa teda naučili opak parsovania – previesť čokoľvek do textovej podoby.
Operátor nameof
Niekedy sa nám môže hodiť získať namiesto hodnoty premennej jej názov.
Slúži na to operátor nameof
:
int number = 5; Console.WriteLine(nameof(number));
Výstup:
Konzolová aplikácia
number
Môžeme si vyskúšať, že program naozaj nevypíše päťku, ale
number
.
Všetky programy máte samozrejme opäť v prílohe, skúšajte si vytvárať nejaké podobné, znalosti už k tomu máte
V nasledujúcom kvíze, Kvíz - C# .NET, konzola a premenné, si vyskúšame nadobudnuté skúsenosti z predchádzajúcich lekcií.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 13x (89.12 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#