1. diel - Zadávanie vstupu z klávesnice
Vitajte u prvej lekcie kurzu Konzola C# .NET a jej
možnosti. Obsahom tejto lekcie bude vysvetlenie, ako môžeme pre
svoje aplikácie zabezpečiť zadávanie potrebných
dát z klávesnice. V konzolových aplikáciách C# .NET
základnú podporu pre zabezpečenie dátového vstupu z klávesnice poskytuje
trieda Console
, ktorá obsahuje všetky potrebné metódy a
vlastnosti. V kurze Základná konštrukcia jazyka C #.
NET sme sa s niektorými už zoznámili. V tejto lekcii sa o nich dozvieme
ďalšie podrobnosti a zoznámime sa s ďalšími, ktoré naši programátorskú
prácu uľahčia. Tak poďme na to.
Ako načítať dáta z klávesnice
Načítanie dát zadávaných z klávesnice rieši trieda
Console
. Vstup v triede Console
je štandardne
nasmerovaný práve na klávesnici, takže nemusíme nič nastavovať. Existuje
ešte možnosť vstup presmerovať na nejaký súbor, odkiaľ by sme mohli
čítať skôr uložené dáta, ale tým sa teraz zaoberať nebudeme.
Možnosti načítanie dát z klávesnice máme v zásade tri:
- Buď potrebujeme načítať nejakú sadu znakov, typicky
napríklad meno, vek, užívateľské heslo a pod. Pre tieto prípady použijeme
metódu
ReadLine()
. - Alebo potrebujeme načítať jeden znak resp. jednu
klávesu, napríklad ENTER pre potvrdenie voľby, číslicu, zadanie voľby Áno
/ Nie (A / N) a pod. V tom prípade použijeme metódu
ReadKey()
. - Treťou možnosťou je použitie metódy
Read()
, ktorá umožňuje tiež načítanie sady znakov, ale jednotlivo, znak po znaku.
Poďme si tieto metódy podrobne predstaviť.
ReadLine()
Metóda ReadLine()
je tou najjednoduchšou možnosťou, ako
zadávať dáta z klávesnice. Metóda nerobí nič iné, než
že načíta zadávané znaky tak dlho, kým nie je stlačený kláves
ENTER. Načítaný reťazec znakov vracia ako typ
string
. Dĺžka ktoý reťazca je obmedzená 256 znakmi. Prakticky
môžeme ale zadať naraz len 254 znakov, pretože pri načítaní reťazca sa
ešte štandardne načítajú dva ukončovacie znaky - ASCII 13
(Carriage return) pre návrat na začiatok riadku a
ASCII 10
(Line feed) pre odriadkovanie. Tieto
znaky sa však nestávajú súčasťou reťazca, takže vo
svojom reťazci máme iba tie znaky, ktoré sme skutočne zadali.
Preto si v nasledujúcom príklade všimnime, že po zadaní prvého slova sa odřádkuje a kurzor sa nastaví na začiatok riadku. To spôsobí, že požiadavka na zadanie druhého slova sa zobrazí na novom riadku. To isté sa stane po zadaní druhého slova, a preto i výpis výsledku začne na začiatku nového riadku. Výsledná slová sa potom ale vypisujú za sebou na jeden riadok, bez po ich vypísaní došlo k odriadkovanie a návratu kurzora na začiatok riadka:
{CSHARP_CONSOLE}
Console.Write("Zadaj prvé slovo: ");
string slovo1 = Console.ReadLine();
Console.Write("Zadaj druhé slovo: ");
string slovo2 = Console.ReadLine();
Console.Write("Prvé a druhé slovo = "+ slovo1 + "" + slovo2);
Console.ReadKey();
{/CSHARP_CONSOLE}
Najdlhšia reťazec znakov, ktorý môžeme zadať naraz, je 254 znakov.
Konzolová aplikácia
Zadaj prvé slovo: pes
Zadaj druhé slovo: kočka
Prvé a druhé slovo = pes kočka
ReadKey()
Metóda ReadKey()
zaistí zastavenie behu programu, ktorý potom
čaká na stlačenie klávesy. Po stlačení ľubovoľného
klávesu program ihneď pokračuje, teda zadaný znak už nepotvrdzujeme
stlačením klávesy ENTER. Takto zo vstupu načítame jeden
znak.
V mieste použitia metódy ReadKey()
sa beh programu
zastaví. Toto sa využíva umiestnením metódy na konci
programu, alebo na ľubovoľnom mieste vo vnútri programového kódu, kde
nepotrebujeme získať zo vstupu žiadny znak, ale len využijeme zastavenie
behu programu. Napríklad preto, aby sme si mohli prečítať dáta z okna
konzoly. Beh programu následne pokračuje po stlačení ľubovoľného
klávesu.
V zátvorke u metódy ReadKey()
možno použiť
parameter typu bool
. Ak je parameter nastavený na
true
, zaistí, že sa stlačené klávesy nebudú
vypisovať do konzoly. Ak nie je uvedený žiadny parameter, alebo je
nastavený na false
, zadaný znak sa pri stlačení klávesy
vypíše.
Vlastnosť
ReadKey().Key
a výpočet ConsoleKey
Vlastnosť Key
vracia názov klávesy, ktorá
bola stlačená a nie znak, ktorý klávesa reprezentuje. Napríklad názov
klávesy W bude vždy W
, bez ohľadu na to, či pritom
bola stlačená niektorá z klávesov SHIFT, ALT alebo
CTRL alebo ich kombinácie. Toho s výhodou využívame v tých
prípadoch, keď od užívateľa očakávame stlačenie nejaké určitej
klávesy. Takú typickou voľbou môže byť Ano/Ne
, kde sa
požaduje stisk kláves A alebo N, alebo potvrdenie
klávesom ENTER a podobne. Požadovanú kláves si pri písaní kódu
vyberieme z výpočtu ConsoleKey
, čo je zoznam
všetkých dostupných klávesov na klávesnici.
Úplný zoznam klávesov v ConsoleKey
sa nám
ponúkne pri písaní príkazu vo Visual Studiu. Vedľa písmen (len veľké
písmená, ktorá reprezentujú názov klávesy) a čísel tam sú aj klávesy
ENTER, BACKSPACE, DELETE, ESC, alebo
šípky - LeftArrow, rightarrow, upArrow a
downarrow.
Ako príklad si môžeme uviesť požiadavku na stlačenie klávesu
ENTER. Pomocou vlastnosti Key
zistíme názov stlačené
klávesy a porovnáme ho s požadovanou klávesom v zozname
ConsoleKey
. Slučka v príklade bude čakať tak dlho, kým nebude
stlačená klávesa ENTER:
Console.WriteLine("Pre ukončenie stlač ENTER"); while (Console.ReadKey(true).Key != ConsoleKey.Enter){}
Všimnime si použitie parametra true
v
zátvorkách metódy ReadKey(true)
, ktorý zabezpečí, že
stlačené klávesy sa nebudú vypisovať.
Vlastnosť
ReadKey().KeyChar
Vlastnosť KeyChar
vracia načítaný znak z klávesnice ako typ
char
. napríklad:
char znak; Console.Write("Zadaj znak: "); znak = Console.ReadKey(true).KeyChar; Console.Write("\n Znak = " + znak); Console.ReadKey();
výstup:
Konzolová aplikácia
Zadaj znak:
Znak = a
Read()
Túto metódu si tu uvedieme iba pre informáciu, keby sme sa s ňou stretli
v cudzích kódoch. Odporúčam ju skôr nepoužívať. Jej použitie je trochu
ťažkopádne. Všetky potrebné vstupy dokážeme realizovať pomocou skôr
popísaných metód ReadLine()
a ReadKey()
.
Metódu Read()
môžeme použiť v prípade, keď potrebujeme
načítať sadu znakov, ktoré po zadaní potvrdíme klávesom
ENTER. Na rozdiel od metódy ReadLine()
tieto znaky
budeme načítavať jeden po druhom, rovnako ako u metódy
ReadKey()
. Znie to možno nelogicky, vysvetlíme si to.
Metóda Read()
dokáže sama o sebe načítať len jeden
znak z klávesnice. Na rozdiel od metódy ReadKey()
zadaný znak musíme potvrdiť klávesom ENTER. Metóda
Read()
vracia znak ako ASCII hodnotu typu
int
. Ak zadáme metóde Read()
viac znakov, načíta
sa opäť iba ASCII hodnota jedného znaku, a to toho
prvého.
Vyskúšajme si zadať miesto jedného znaku celé slovo:
int znak; Console.Write("Zadaj znak: "); znak = Console.Read(); Console.WriteLine(znak);
výstup:
Konzolová aplikácia
Zadaj znak: test
116
Vo výpise vidíme, že sa vypísala ASCII
hodnota
iba prvého znaku.
Čo sa stalo s ostatnými zadanými znakmi? Tie sa nestratili, ale sú
uložené vo vyrovnávacej pamäti a môžeme sa k nim dostať
pomocou cyklu a znaky z vyrovnávacej pamäte načítať metódou
Read()
. Zadávanie reťazca znakov sme ukončili stlačením
klávesy ENTER a to vygeneruje nám už dobre známe dva znaky
ASCII 13
(Carriage return) pre návrat na začiatok riadku a
ASCII 10
(Line feed) pre odriadkovanie.
Na rozdiel od metódy ReadLine()
sa tieto znaky
stávajú súčasťou reťazca a zapíšu sa na jeho koniec.
Vďaka tomu môžeme jednoducho testovať, či už sme na konci slova a cyklus
ukončiť. Testujeme teda znaky na prítomnosť ASCII 13
, potom
ukončíme cyklus a nakoniec ešte raz použijeme metódu Read()
pre načítanie posledného znaku ASCII 10
, čím vyprázdnime
vyrovnávacia pamäť. Keď už načítame znaky pomocou cyklu, môžete treba
počítať. Z načítané ASCII hodnoty znaku môžeme aj pomocou pretypovania
(char)znak
zistiť, o aký znak ide:
int znak; int pocitadlo = 0; Console.Write("Zadaj slovo: "); znak = Console.Read(); //Zadaní slova z klávesnice, premenná `znak` obsahuje len 1. písmeno while (znak != 13) { Console.Write("\n ASCII hodnota znaku" + (char)znak + "je" + znak); pocitadlo++; znak = Console.Read(); //Načítanie ďalších písmen zadaného slová z vyrovnávacej pamäte jedného po druhom } Console.Read(); // Načítanie posledného znaku ASCII 10 z vyrovnávacej pamäte Console.WriteLine("\n\n Zadal si slovo o" + pocitadlo + "znakoch."); Console.ReadKey();
výstup:
Konzolová aplikácia
Zadaj slovo: Třezalka
ASCII hodnota znaku T je 84
ASCII hodnota znaku ř je 345
ASCII hodnota znaku e je 101
ASCII hodnota znaku z je 122
ASCII hodnota znaku a je 97
ASCII hodnota znaku l je 108
ASCII hodnota znaku k je 107
ASCII hodnota znaku a je 97
Zadal si slovo o 8 znakoch.
V ďalšej lekcii, Zvukový výstup na konzolu , sa zoznámime s možnosťami, ako ovládať zvukový výstup u konzolových aplikácií a ako ľahko spočítať frekvencie tónov.
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é 9x (313.23 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#