IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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:

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

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#

 

Všetky články v sekcii
Konzoly C # .NET a jej možnosti
Preskočiť článok
(neodporúčame)
Zvukový výstup na konzolu
Článok pre vás napísal Luděk Novotný
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor je technik, má rád stručné a jasné texty, a tak se také snaží psát články pro vás.
Aktivity