Lekce 5 - Načítání hodnot z konzole a parsování v C# .NET Nové
V minulé lekci C# kurzu, Proměnné, typový systém v C# .NET, jsme si ukázali základní datové
typy, byly to int, string a float.
V dnešním C# .NET tutoriálu se podíváme na parsování hodnot z konzole. Výsledkem bude několik jednoduchých programů včetně kalkulačky.
Program Papoušek
Zkusme do programu zapojit uživatele a nějak reagovat na jeho vstup. Napíšeme program Papoušek, který bude dvakrát opakovat to, co uživatel napsal.
Načtení textu z konzole
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}
Nové projekty v C# takto podtrhávají příkaz
Console.ReadLine():

Příkaz Console.ReadLine() při přiřazení výsledku
příkazu do typu string vyvolá varování, že příkaz může
vrátit null. Ideálně bychom se měli ptát, zda se nevrátil
prázdný výsledek. Jelikož se to ale nikdy nestane, můžeme varování buď
ignorovat nebo za příkaz Console.ReadLine() napsat vykřičník,
tedy Console.ReadLine()!:

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 napsat:
string vstup;
vstup = Console.ReadLine();
Původní zápis lze zkrátit takto:
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}
Výstup:
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ě v příloze, zkoušejte si vytvářet
nějaké podobné, znalosti již k tomu máte 
Shrnutí lekce
Vstup z konzole se v C# načítá pomocí Console.ReadLine().
Když chceme ze zadaného textu získat číslo, musíme ho převést pomocí
parsování, například int.Parse() nebo
float.Parse(). Řetězce lze spojovat pomocí + a C#
umí při výpisu sama převést číslo na text. Na těchto základech vznikly
jednoduché programy jako papoušek, zdvojnásobovač a kalkulačka se
základními početními operacemi.
V následujícím kvízu, Kvíz - C# .NET, konzole a proměnné, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.
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 0x (67.22 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

David se informační technologie naučil na