Lekce 1 - Zadávání vstupu z klávesnice v C# Konzoli
Vítejte u první lekce kurzu Konzole C# .NET a její
možnosti. Obsahem této lekce bude vysvětlení, jak můžeme pro své
aplikace zajistit zadávání potřebných dat z
klávesnice. V konzolových aplikacích C# .NET základní podporu pro
zajištění datového vstupu z klávesnice poskytuje třída
Console
, která obsahuje všechny potřebné metody a vlastnosti. V
kurzu Základní konstrukce jazyka C# . NET jsme se
s některými už seznámili. V této lekci se o nich dozvíme další
podrobnosti a seznámíme se s dalšími, které naši programátorskou práci
usnadní. Tak pojďme na to.
Jak načíst data z klávesnice
Načítání dat zadávaných z klávesnice řeší třída
Console
. Vstup ve třídě Console
je standardně
nasměrován právě na klávesnici, takže nemusíme nic nastavovat. Existuje
ještě možnost vstup přesměrovat na nějaký soubor, odkud bychom mohli
číst dříve uložená data, ale tím se nyní zabývat nebudeme.
Možnosti načítání dat z klávesnice máme v zásadě tři:
- Buď potřebujeme načíst nějakou sadu znaků, typicky
například jméno, věk, uživatelské heslo apod. Pro tyto případy
použijeme metodu
ReadLine()
. - Anebo potřebujeme načíst jeden znak resp. jednu
klávesu, například Enter pro potvrzení volby, číslici, zadání
volby Ano/Ne ( A / N ) apod. V tom případě použijeme
metodu
ReadKey()
. - Třetí možností je použití metody
Read()
, která umožňuje také načtení sady znaků, ale jednotlivě, znak po znaku.
Pojďme si tyto metody podrobně představit.
ReadLine()
Metoda ReadLine()
je tou nejjednodušší možností, jak
zadávat data z klávesnice. Metoda nedělá nic jiného, než
že načítá zadávané znaky tak dlouho, dokud není stisknuta klávesa
Enter. Načtený řetězec znaků vrací jako typ
string
. Délka načítaného řetězce je omezena 256 znaky.
Prakticky můžeme ale zadat najednou pouze 254 znaků, protože při načtení
řetězce se ještě standardně načítají dva ukončovací znaky -
ASCII 13
(Carriage return) pro návrat na začátek
řádku a ASCII 10
(Line feed) pro
odřádkování. Tyto znaky se však nestávají
součástí řetězce, takže ve svém řetězci máme pouze ty znaky,
které jsme skutečně zadali.
Proto si v následujícím příkladu všimněme, že po zadání prvního slova se odřádkuje a kurzor se nastaví na začátek řádku. To způsobí, že požadavek na zadání druhého slova se zobrazí na novém řádku. Totéž se stane po zadání druhého slova, a proto i výpis výsledku začne na začátku nového řádku. Výsledná slova se pak ale vypisují za sebou na jeden řádek, aniž by po jejich vypsání došlo k odřádkování a návratu kurzoru na začátek řádku:
{CSHARP_CONSOLE}
Console.Write("Zadej první slovo: ");
string slovo1 = Console.ReadLine();
Console.Write("Zadej druhé slovo: ");
string slovo2 = Console.ReadLine();
Console.Write("První a druhé slovo = "+ slovo1 + " " + slovo2);
Console.ReadKey();
{/CSHARP_CONSOLE}
Nejdelší řetězec znaků, který můžeme zadat najednou, je 254 znaků.
Konzolová aplikace
Zadej první slovo: pes
Zadej druhé slovo: kočka
První a druhé slovo = pes kočka
ReadKey()
Metoda ReadKey()
zajistí zastavení běhu programu, který
poté čeká na stisk klávesy. Po stisku libovolné klávesy
program ihned pokračuje, tedy zadaný znak už nepotvrzujeme stiskem klávesy
Enter. Takto ze vstupu načteme jeden znak.
V místě použití metody ReadKey()
se běh programu
zastaví. Toho se využívá umístěním metody na konci
programu, anebo na libovolném místě uvnitř programového kódu, kde
nepotřebujeme získat ze vstupu žádný znak, ale jen využijeme zastavení
běhu programu. Například proto, abychom si mohli přečíst data z okna
konzole. Běh programu následně pokračuje po stisku libovolné klávesy.
V závorce u metody ReadKey()
lze použít parametr
typu bool
. Je-li parametr nastaven na true
, zajistí,
že se stisknuté klávesy nebudou vypisovat do konzole.
Není-li uveden žádný parametr, anebo je nastaven na false
,
zadaný znak se při stisknutí klávesy vypíše.
Vlastnost
ReadKey().Key
a výčet ConsoleKey
Vlastnost Key
vrací název klávesy, která
byla stisknuta a nikoliv znak, který klávesa reprezentuje. Například název
klávesy W bude vždy W
, bez ohledu na to, zda přitom
byla stisknuta některá z kláves Shift, Alt nebo
Ctrl či jejich kombinace. Toho s výhodou využíváme v těch
případech, kdy od uživatele očekáváme stisk nějaké určité klávesy.
Takovou typickou volbou může být Ano/Ne
, kde se požaduje stisk
kláves A nebo N, anebo potvrzení klávesou
Enter a podobně. Požadovanou klávesu si při psaní kódu vybereme
z výčtu ConsoleKey
, což je seznam všech
dostupných kláves na klávesnici. Úplný seznam
kláves v ConsoleKey
se nám nabídne při psaní
příkazu ve Visual Studiu. Vedle písmen (pouze velká písmena, která
reprezentují název klávesy) a čísel tam jsou i klávesy Enter,
Backspace, Delete, Esc, anebo šipky –
LeftArrow, RightArrow, UpArrow a
DownArrow.
Jako příklad si můžeme uvést požadavek na stisknutí klávesy
Enter. Pomocí vlastnosti Key
zjistíme název
stisknuté klávesy a porovnáme jej s požadovanou klávesou v seznamu
ConsoleKey
. Smyčka v příkladu bude čekat tak dlouho, dokud
nebude stisknuta klávesa Enter:
Console.WriteLine("Pro ukončení stiskni ENTER"); while (Console.ReadKey(true).Key != ConsoleKey.Enter){}
Všimněme si použití parametru true
v
závorkách metody ReadKey(true)
, který zajistí, že stisknuté
klávesy se nebudou vypisovat.
Vlastnost
ReadKey().KeyChar
Vlastnost KeyChar
vrací načtený znak z klávesnice jako typ
char
. Například:
char znak; Console.Write("Zadej znak: "); znak = Console.ReadKey(true).KeyChar; Console.Write("\n Znak = " + znak); Console.ReadKey();
Výstup:
Konzolová aplikace
Zadej znak:
Znak = a
Read()
Tuto metodu si zde uvedeme pouze pro informaci, kdybychom se s ní setkali v
cizích kódech. Doporučuji ji spíše nepoužívat. Její použití je
poněkud těžkopádné. Všechny potřebné vstupy dokážeme realizovat
pomocí dříve popsaných metod ReadLine()
a
ReadKey()
.
Metodu Read()
můžeme použít v případě, kdy potřebujeme
načíst sadu znaků, které po zadání potvrdíme klávesou
Enter. Na rozdíl od metody ReadLine()
tyto znaky budeme
načítat jeden po druhém, stejně jako u metody ReadKey()
. Zní
to možná nelogicky, vysvětlíme si to.
Metoda Read()
dokáže sama o sobě načíst jen jeden
znak z klávesnice. Na rozdíl od metody ReadKey()
zadaný
znak musíme potvrdit klávesou Enter. Metoda Read()
vrací znak jako číselnou hodnotu typu int
. Zadáme-li metodě
Read()
více znaků, načte se opět pouze číselná hodnota
jednoho znaku, a to toho prvního.
Vyzkoušejme si zadat místo jednoho znaku celé slovo:
int znak; Console.Write("Zadej znak: "); znak = Console.Read(); Console.WriteLine(znak);
Výstup:
Konzolová aplikace
Zadej znak: test
116
Ve výpisu vidíme, že se vypsala číselná hodnota pouze prvního znaku.
Co se stalo s ostatními zadanými znaky? Ty se neztratily, ale jsou uloženy
ve vyrovnávací paměti a můžeme se k nim dostat pomocí
cyklu a znaky z vyrovnávací paměti načíst metodou Read()
.
Zadávání řetězce znaků jsme ukončili stiskem klávesy Enter a
to vygeneruje nám již dobře známé dva znaky ASCII 13
(Carriage
return) pro návrat na začátek řádku a ASCII 10
(Line feed) pro
odřádkování.
Na rozdíl od metody ReadLine()
se tyto znaky stávají
součástí řetězce a zapíší se na jeho konec. Díky tomu můžeme
jednoduše testovat, zda už jsme na konci slova a cyklus ukončit. Testujeme
tedy znaky na přítomnost ASCII 13
, poté ukončíme cyklus a
nakonec ještě jednou použijeme metodu Read()
pro načtení
posledního znaku ASCII 10
, čímž vyprázdníme vyrovnávací
paměť. Když už načítáme znaky pomocí cyklu, můžete je třeba
počítat. Z načtené číselné hodnoty znaku můžeme také pomocí
přetypování (char)znak
zjistit, o jaký znak jde:
int znak; int pocitadlo = 0; Console.Write("Zadej slovo: "); znak = Console.Read(); //Zadání slova z klávesnice, proměnná `znak` obsahuje pouze 1. písmeno while (znak != 13) { Console.Write("\n Desítková hodnota znaku " + (char)znak + " je " + znak); pocitadlo++; znak = Console.Read(); //Načtení dalších písmen zadaného slova z vyrovnávací paměti jednoho po druhém } Console.Read(); // Načtení posledního znaku ASCII 10 z vyrovnávací paměti Console.WriteLine("\n\n Zadal jsi slovo o " + pocitadlo + " znacích."); Console.ReadKey();
Výstup:
Konzolová aplikace
Zadej slovo: Třezalka
Desítková hodnota znaku T je 84
Desítková hodnota znaku ř je 345
Desítková hodnota znaku e je 101
Desítková hodnota znaku z je 122
Desítková hodnota znaku a je 97
Desítková hodnota znaku l je 108
Desítková hodnota znaku k je 107
Desítková hodnota znaku a je 97
Zadal jsi slovo o 8 znacích.
V další lekci, Analýza dat ze vstupu z klávesnice v C# Konzoli, se dozvíme, co vše lze zjistit ze zadávaných dat z klávesnice a ukážeme si postupy, jak lze tyto informace získat a nakládat s nimi.
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 9x (313.23 kB)
Aplikace je včetně zdrojových kódů v jazyce C#