3. díl - Proměnné, typový systém a parsování

C# .NET Základní konstrukce Proměnné, typový systém a parsování American English version English version

Unicorn College ONEbit hosting Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

Z miného dílu seriálu o C# již umíme pracovat s Visual Studiem a vytvořit konzolovou aplikaci. Dnes se 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í). Určitě znáte z matematiky proměnnou (např. x), do které jsme si mohli uložit nějakou hodnotu, nejčastěji číslo. Proměnná je v informatice naprosto to samé, 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řesahnout (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. Většinou musíme před prací s proměnnou tuto proměnnou nejdříve tzv. deklarovat, čili říci jazyku jak se 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é samé 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, 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é musíme nejprve deklarovat s jejich datovým typem. Nevýhodou je, že díky 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). Kód samozřejmě píšeme do těla metody Main (jako minule), čili ji zde již nebudu opisovat.

int a;
a = 56;
Console.WriteLine(a);
Console.ReadKey();

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:

float a;
a = 56.6F;
Console.WriteLine(a);
Console.ReadKey();

Je to téměř stejné jako s celočíselným. Jako desetinný oddělovač používáme tečku a na konci desetinného čísla je nutné zadat tzv. suffix 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:

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();

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, jak do vystup přiřadíme, tam 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, ale obecně je 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é zdvojnásobí a vypíše. Asi bychom s dosavadními znalostmi 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 zdvojná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 intu. 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ů má v C# již připraveny metody k parsování, pokud budeme chtít naparsovat např. int ze stringu, 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á bere jako parametr textový řetězec a vrátí číslo. Využijeme této znalosti v našem programu:

Console.WriteLine("Zadejte číslo k zdvojnásobení:");
string s = Console.ReadLine();
int a = int.Parse(s);
a = a * 2;
Console.WriteLine(a);
Console.ReadKey();

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 zdvojnásobíme a vypíšeme do konzole.

Konzolová aplikace
Zadejte číslo k zdvojnásobení: 1024 2048

Pozn. Můžete se setkat s parsováním ze stringu 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 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í.

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();

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ěte 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í znaménka plus. C# překvapivě nezahlásí chybu, ale provede tzv. implicitní konverzi a zavolá na čísle metodu ToString(). Kdyby tomu tak nebylo nebo jsme 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 k parsování - převést cokoli do textové podoby. Příště si řekneme více o typovém systému a představíme si další datové typy.

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 :)


 

Stáhnout

Staženo 1590x (87.57 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

  Aktivity (4)

Článek pro vás napsal David Čápka
Avatar
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.

Jak se ti líbí článek?
Celkem (69 hlasů) :
4.797094.797094.797094.797094.79709


 


Miniatura
Všechny články v sekci
Základní konstrukce jazyka C#
Miniatura
Následující článek
Cvičení k 1.-3. lekci C# .NET

 

 

Komentáře
Zobrazit starší komentáře (102)

Avatar
Martin Kolman:

Oprava
to je tak když člověk čumí jenom do zdrojáku a nečte to povídání okolo :)

Editováno 27. února 13:27
 
Odpovědět 27. února 13:25
Avatar
Adam Rajníček:

Veľmi dobrý článok moc mi pomohol. Ďakujem:)!

 
Odpovědět 2. března 13:07
Avatar
Jan Mareš
Člen
Avatar
Jan Mareš:

Ahoj pěkný článek,vše zatím chápu velice rychle ale mám problém s kalkulačkou:
nedaří se mi napsat výstup jaký by jsem požadoval.Učím se stylem že si zde pročtu jen proměnné co k čemu slouží a dál se zde ukázkové programy snažím sestavovat bez opisování ze stránky,zde uvedené kody využívám pro kontrolu. A když jsem napsal kalkulačku:

Console.Title = "Kalkulačka";
            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 součet = a + b;
            float rozdíl = a - b;
            float součin = a * b;
            float podíl  = a / b;
            Console.WriteLine("součet: " + součet);
            Console.WriteLine("rozdíl: " + rozdíl);
            Console.WriteLine("součin: " + součin);
            Console.WriteLine("podíl: "  + podíl);
            Console.WriteLine("Děkuji že jste využily mou kalkulačku.");
            Console.ReadKey();

Tak výstup vypadá následovně: součet:,rozdíl: atd
Tak bych se chtěl optat.Jak napsat aby výstup vypadal takto: příklad zadám číslo 5 a 6:" součet: 5+6=" atd.
Hledal jsem to na netu ale to co potřebuji jsem našel jen tímto zápisem a to je v dalších lekcích.

Console.Writeline("{0}+{1}={2}",a,b,c);

Tento zápis chápu nemám s ním problém,Ale když vezmu v potaz,že jsem začátečník a s mými znalostmi do této 3tí lekce.Tak by jsem se chtěl optat zda by se tento zápis nedal zapsat ještě jinak.

Editováno 21. března 11:00
 
Odpovědět 21. března 10:58
Avatar
Odpovídá na Jan Mareš
Michal Štěpánek:

Dal

Console.Writeline($"{a}+{b}={c}");

, ale myslím, že si to učení zbytečně komplikuješ tím, že se snažíš naučit se předčasně sám to, co se probírá dál v tutoriálu...

Odpovědět 21. března 11:13
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Jan Mareš
Člen
Avatar
Jan Mareš:

Měl by jsem ještě jeden dotaz:zkoušel jsem si napsat program na obvod kruhu,dle mých znalostí ale nevím co jsem udělal špatně a nebo proč to tak je:

Console.Title = "Obvod kruhu";
           Console.WriteLine("zadej průměr kružnice:");
           float d = float.Parse(Console.ReadLine());
           double obvod = 3.14 * d;
           Console.WriteLine("Obvod kružnice je: " + obvod);
           Console.ReadKey();

když jsem toto chtěl definovat jako float 3.14 * d; tak mi to hlásilo chybu a řeklo mi to že je to double.Kde dělám chybu.děkuji

 
Odpovědět 21. března 11:44
Avatar
Jan Mareš
Člen
Avatar
Odpovídá na Michal Štěpánek
Jan Mareš:

Právě proto se ptám,jen zkouším jiné možnosti aby jsem se naučil ten zápis.proto se ptám jak nadefinovat tento výstup: součet: první číslo + druhé číslo =. Se znalostmi,které do této lekce mám.Zda to tedy s těmito znalostmi je možné.

 
Odpovědět 21. března 11:46
Avatar
pocitac770
Redaktor
Avatar
Odpovídá na Jan Mareš
pocitac770:

To proto, že desetinné číslo je v zákaldu double, pokud chceš zapsat např. 3.14 jako float, musíš k tomu přidat suffix F (viz článek), takto násobíš double a float, double má větší rozsah, proto je výsledek taktéž double.

 
Odpovědět  +1 21. března 11:48
Avatar
pocitac770
Redaktor
Avatar
Odpovídá na Jan Mareš
pocitac770:

Se současnými znalostmi to napíšeš jako spojení stringů, tzn.

Console.WriteLine(a + "+" + b + "=" + c);
 
Odpovědět  +1 21. března 11:51
Avatar
Jan Mareš
Člen
Avatar
Jan Mareš:

Ahoj omlouvám se pokud je to hloupý dotaz ale zkouším napsat program na mocnění a nevím kde je chyba,myslím si že nejspíš ve vzorečku ale co si pamatuji v excelu se ten vzorec takto psal.Problém je že mi to nemocní na druhou ale pouze přičte k na psanému čílu +2.

Console.Title = "Mocnitel";
            Console.WriteLine("zdravím a vítám tě v programu násobitel.Zadej prosím číslo,které chceš mocnit:");
            string číslo = Console.ReadLine();
            int a = int.Parse(číslo);
            int mocnitel = a^2;
            Console.ResetColor();
            Console.WriteLine("výsledek: " + mocnitel);
            Console.ReadKey();

A pokud to takto napíšu tak to funguje:

Console.Title = "Mocnitel";
            Console.WriteLine("zdravím a vítám tě v programu mocnitel.Zadej prosím číslo,které chceš mocnit:");
            string číslo = Console.ReadLine();
            int a = int.Parse(číslo);
            int mocnitel = a * a;
            Console.WriteLine("výsledek: " + mocnitel);
            Console.ReadKey();

Popřípadě se ještě optám jak zapsat i odmocninu,jelikož mi vzorec na který jsem zvyklí z excelu nejde.Vím že toto není excel ale myslel jsem že je to pro pc stejné.Děkuji ještě jednou se omlouvám pokud je to hloupý dotaz.

 
Odpovědět 22. března 12:01
Avatar
pocitac770
Redaktor
Avatar
Odpovídá na Jan Mareš
pocitac770:

Každý jazyk je jiný. Excel, to je "programování" pro největší začátečníky, které ani není porgramováním. To, že něco v nějakém jazyku jde neznamená, že to v jiném jde taky. Ty tu mluvíš o excelu, který se snaží být co nejvíce user-friendly, tak zavádí postupy, které pochopí úplně každý. V programování už musíš trochu přemýšlet, aby jsi něco vytvořil. V základní syntaxi (to, co se zde snažíš napsat) jsou obsaženy pouze ty nejdůležitější věci, na kterých je postaveno všechno ostatní. Tím ostatním jsou knihovny, které práci ulehčují. Představ si to jako cihly, ze kterých můžeš postavit například dům, nebo zeď. Cihly ovšem taktéž nějak vznikly, ale čím hloubš jdeme, tím jsou věci složitější na pochopení, protože se jedná o mnohem elementárnější záležitosti. to, co hledáš, je konrétně knihovna Math, která ti dává přístup k různorodým matematickým funkcím, ta bude popsána na konci základů, stačí jenom počkat, a mezitím se snažit vystačit si s tím, co máš a zatím neexperimentovat. To přijde na řadu, až budeš vědět, co při tom experimentování vůbec děláš...

 
Odpovědět 22. března 13:16
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 112. Zobrazit vše