Vstupy a výstupy v C# C-like jazyky se liší řešením vstupů a výstupů, proto jsou zvlášť probrány vstupy a výstupy v C a v C#. Kapitola popisuje vstup a výstup hodnot do proměnných v C#, formátové specifikace a práce s konzolou (nastavení barev a pozice kurzoru). Na závěr je uvedených několik řešených úloh. Klíčové pojmy: Výpis hodnot na konzolu, formátové specifikace, nastavení barev a pozice kurzoru, vstup hodnot z klávesnice do proměnných různých typů.
Metody pro výpis na konzolu (obrazovku) Console.Write výpis bez odřádkování Console.WriteLine výpis s odřádkováním Vypisovaná hodnota se uvádí vkulatých závorkách.
Výpis konstanty Console.WriteLine(123); Console.WriteLine(123.456); Console.WriteLine('a'); Console.WriteLine("Dobrý den");
// // // //
výpis výpis výpis výpis
celočíselné konstanty reálné konstanty znakové konstanty řetězcové konstanty
V uvozovkách lze použít i Escape sekvence.
Výpis hodnoty proměnné Všechny proměnné v C# musí být deklarovány, nebo definovány. Datové typy proměnných jsou uvedeny v tabulce. byte b=12; sbyte sb=-12; short sh=-123; ushort ush=123; int i=-123456; uint ui=123456; long l=-123456789;
2.11.11
Vstupy a výstupy v C#
1/11
ulong ul=123456789; float f=1.5F; double db=1.234567; decimal dec=1234567890; string s="Dobrý den"; char c='a'; bool bo=true; Console.WriteLine(b); Console.WriteLine(sb); Console.WriteLine(sh); Console.WriteLine(ush); Console.WriteLine(i); Console.WriteLine(ui); Console.WriteLine(l); Console.WriteLine(ul); Console.WriteLine(f); Console.WriteLine(db); Console.WriteLine(dec); Console.WriteLine(s); Console.WriteLine(c); Console.WriteLine(bo);
Současný výpis více hodnot proměnných a konstant Pro současný výpis více hodnot proměnných a konstant lze použít operátor + . Proměnné jsou inicializované v předchozí podkapitole 3. Console.WriteLine(b + " " + sb + " " + sh + " " + ush + " " + i + " " + ui + " " + f + " " + s + " " + c + " " + bo);
Operátor + nemůže být použitý na long a ulong, double a decimal. Metodě WriteLine je možné předat tzv. formátovací řetězec, který trochu připomíná formátovací řetězec v C. Kromě textu, který chceme vypsat, obsahuje i specifikace proměnných ve složených závorkách. Specifikace obsahuje číslo vypisované proměnné – proměnné jsou očíslované v pořadí, jak budou vypisovány, číslování začíná od nuly. S využitím formátovacího řetězce j možné výše uvedený výpis pomocí následovného příkazu: Console.WriteLine("{0} {1} {2} {3} {4} {5} {6} {7} {8} {9}", b, sb ,sh , ush , i , ui , f , s , c , bo);
2.11.11
Vstupy a výstupy v C#
2/11
S využitím formátovacího řetězce lze vypsat i hodnotu výrazu. Proměnné ve výraze musí být stejného typu – jinak je třeba je přetypovat. V následujícím výpise je proměnná dec přetypovaná na double. Console.WriteLine("Součet {0} a {1} se rovná {2}", db, dec, db+(double)dec);
Jiná možnost je přetypovat proměnnou db na decimal. Console.WriteLine("Součet {0} a {1} se rovná {2}", db, dec, (decimal)db+dec);
Pro každý datový typ (kromě bool) můžeme určit minimální a maximální hodnotu, kterou může tento datový typ obsahovat: Console.WriteLine("{0} {1}",byte.MinValue,byte.MaxValue); Console.WriteLine("{0} {1}", sbyte.MinValue, sbyte.MaxValue); Console.WriteLine("{0} {1}", short.MinValue, short.MaxValue); Console.WriteLine("{0} {1}", ushort.MinValue, ushort.MaxValue); Console.WriteLine("{0} {1}", int.MinValue, int.MaxValue); Console.WriteLine("{0} {1}", uint.MinValue, uint.MaxValue); Console.WriteLine("{0} {1}", long.MinValue, long.MaxValue); Console.WriteLine("{0} {1}", ulong.MinValue, ulong.MaxValue); Console.WriteLine("{0} {1}", float.MinValue, float.MaxValue); Console.WriteLine("{0} {1}", double.MinValue, double.MaxValue); Console.WriteLine("{0} {1}", decimal.MinValue, decimal.MaxValue); Console.WriteLine("{0} {1}", char.MinValue, char.MaxValue);
Výstup programu: 0 255 -128 127 -32768 32767 0 65535 -2147483648 2147483647 0 4294967295 -9223372036854775808 9223372036854775807 0 18446744073709551615 -3,402823E+38 3,402823E+38 -1,79769313486232E+308 1,79769313486232E+308 -79228162514264337593543950335 79228162514264337593543950335
Formátové specifikace Za pořadovým číslem proměnné ve složených závorkách lze uvést dvojtečku a formátovou specifikaci, která určuje formát, v němž bude proměnná vypsaná.
2.11.11
Vstupy a výstupy v C#
3/11
Měna C, Cn Desítková soustava D, Dn Exponenciální E, En Pevná čárka F, Fn Obecný G,Gn Číslo N,Nn Procento P, Pn Hexadecimální X, Xn n udává počet míst za desetinnou čárkou Příklad Specifikace různých formátů, aplikovaných na celočíselnou hodnotu 12345: int i = 12345; Console.WriteLine("{0:C}\t{1:C1}\t{1:C7}", i, i, i); Console.WriteLine("{0:D}\t\t{1:D1}\t\t{1:D7}", i, i, i); Console.WriteLine("{0:E}\t{1:E1}\t{1:E7}", i, i, i); Console.WriteLine("{0:F}\t{1:F1}\t\t{1:F7}", i, i, i); Console.WriteLine("{0:G}\t\t{1:G1}\t\t{1:G7}", i, i, i); Console.WriteLine("{0:N}\t{1:N1}\t{1:N7}", i, i, i); Console.WriteLine("{0:P}\t{1:P1}\t{1:P7}", i, i, i); Console.WriteLine("{0:X}\t\t{1:X1}\t\t{1:X7}", i, i, i);
Výstup programu: 12 345,00 Kč
12 345,0 Kč
12 345,0000000 Kč
12345
12345
0012345
1,234500E+004
1,2E+004
1,2345000E+004
12345,00
12345,0
12345,0000000
12345
1E+04
12345
12 345,00
12 345,0
12 345,0000000
1 234 500,00%
1 234 500,0%
1 234 500,0000000%
3039
3039
0003039
Nastavení barev při výpisu na konzolu Třída Console má možnosti nastavení: barvy pozadí barvy textu pozice kurzoru. Barvy můžeme nastavit s využitím výčtového typu ConsoleColor , který obsahuje názvy 16-ti barev: 2.11.11
Vstupy a výstupy v C#
4/11
Název
Barva
Číslo barvy
Black
černá
0
DarkBlue
tmavě modrá
1
DarkGreen
tmavě zelená
2
DarkCyan
tmavě modro-zelená
3
DarkRed
tmavě červená
4
DarkMagenta
tmavě fialová
5
DarkYellow
tmavě žlutá
6
Gray
šedá
7
DarkGray
tmavě šedá
8
Blue
modrá
9
Green
zelená
10
Cyan
modro-zelená
11
Red
červená
12
Magenta
fialová
13
Yellow
žlutá
14
White
bílá
15
Místo názvů barev můžeme použít čísla, ale potom je zapotřebí přetypovat čísla na typ ConsoleColor . Příklad Barvu pozadí nastavujeme jako vlastnost konzoly BackgroundColor a barvu písma nastavujeme jako vlastnost ForegroundColor. Metoda Clear() třídy Console smaže obrazovku nastavenou barvou pozadí. int i = 0; /* * Jestliže následující příkazy zkopírujeme 15 krát, * po každém stisknutí klávesy Enter se konzola vybarví * následující barvou z tabulky.
2.11.11
Vstupy a výstupy v C#
5/11
* */ Console.BackgroundColor = (ConsoleColor)i; Console.Clear(); Console.ForegroundColor=(ConsoleColor)(15-i++); Console.Write("{0}",i-1); Console.ReadLine();
Nastavení pozice kurzoru Pozici kurzoru lze nastavit pomocí metody SetCursorPosition(x, y), kde x,y jsou souřadnice bodu v okně konzoly. x se zvětšuje zleva doprava a y shora dolů. Příklad Následující příkazy nastaví kurzor do desátého sloupce a pátého řádku a vypíše se text Dobrý den: Console.SetCursorPosition(10,5); Console.WriteLine("Dobrý den");
Čtení hodnoty do proměnné typu string Pro čtení hodnot do proměnných typu string používáme metodu ReadLine() třídy Console . string s; s = Console.ReadLine(); Console.WriteLine(s);
2.11.11
Vstupy a výstupy v C#
6/11
Čtení hodnoty do proměnných jiných datových typů, než string U proměnných jiných datových typů, než string, je třeba konvertovat načtený vstup potřebnou metodou třídy Convert. Použitá metoda závisí na datovém typu proměnné. Uvedeme-li při psaní programu název třídy a operátor tečka, nabídnou se nám použitelné metody, které stačí z nabídky vybrat. Načtení hodnot do proměnných deklarovaných v podkapitole 3 je dále uvedeno včetně potřebné konverze: b = Convert.ToByte(Console.ReadLine()); sb = Convert.ToSByte(Console.ReadLine()); sh = Convert.ToInt16(Console.ReadLine()); ush = Convert.ToUInt16(Console.ReadLine()); i = Convert.ToInt32(Console.ReadLine()); ui = Convert.ToUInt32(Console.ReadLine()); l = Convert.ToInt64(Console.ReadLine()); ul = Convert.ToUInt64(Console.ReadLine()); f = (float)Convert.ToDouble(Console.ReadLine()); db = Convert.ToDouble(Console.ReadLine()); dec = Convert.ToDecimal(Console.ReadLine()); c = Convert.ToChar(Console.ReadLine()); bo = Convert.ToBoolean(Console.ReadLine());
Jiná možnost konverze je použít metodu Parse pro požadovaný daný datový typ: b = byte.Parse(Console.ReadLine()); sb = sbyte.Parse(Console.ReadLine()); sh = Int16.Parse(Console.ReadLine()); ush = UInt16.Parse(Console.ReadLine()); i = Int32.Parse(Console.ReadLine()); ui = UInt32.Parse(Console.ReadLine()); l = Int64.Parse(Console.ReadLine()); ul = UInt64.Parse(Console.ReadLine()); f = float.Parse(Console.ReadLine()); db = double.Parse(Console.ReadLine()); dec = decimal.Parse(Console.ReadLine()); c = char.Parse(Console.ReadLine()); bo = bool.Parse(Console.ReadLine());
Příklad V dalším programu uživatel může zadat barvu pozadí a textu formou celého čísla. 2.11.11
Vstupy a výstupy v C#
7/11
Console.WriteLine("Zadej barvu pozadí:"); int bp=Int32.Parse(Console.ReadLine()); Console.WriteLine("Zadej barvu textu:"); int bt = Int32.Parse(Console.ReadLine()); Console.BackgroundColor = (ConsoleColor)bp; Console.Clear(); Console.ForegroundColor = (ConsoleColor)bt;
Metoda ReadKey Jmenný prostor Systém obsahuje strukturu ConsoleKeyInfo , která má vlastnost Key, která určuje kód klávesy, načtené metodou ReadKey a KeyChar , která určuje konkrétní znak na klávesnici. Hodnota stisknuté klávesy se získá bezprostředně po stisku, není zapotřebí ukončit vstup klávesou Enter, jako u metody ReadLine(). Příklad Do proměnné cki načteme kód stisknuté klávesy a vypíše se její kód a název. //Čtení a výpis kódů kláves ConsoleKeyInfo cki; cki = Console.ReadKey(true); Console.WriteLine("{0} {1} {2}", Convert.ToInt16(cki.Key),cki.Key, cki.KeyChar);
Výčtový typ ConsoleKey obsahuje výčet všech kláves. Uvedeme-li název výčtového typu ConsoleKey a operátor tečka, můžeme si požadovanou klávesu nalistovat kurzorovými šipkami, jak je vidět na obrázku:
Název klávesy můžeme vypsat příkazem: Console.WriteLine(ConsoleKey.Escape);
Vypíše se:
2.11.11
Vstupy a výstupy v C#
8/11
Escape
Řešené úlohy: 1. Podíl a zbytek po celočíselném dělení Vytvořte program, který načte dvě celá čísla a vypíše jejich podíl a zbytek po celočíselném dělení. int a, b; Console.WriteLine("Zadej dve cisla: "); a = Convert.ToInt32(Console.ReadLine()); b = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Celociselny podil prvniho cisla druhym je: {0}",a / b); Console.WriteLine("Zbytek po celociselnem deleni je: {0}", a % b);
2. Převod z desítkové do dvojkové soustavy Pomocí operátoru % můžeme dělat převod do dvojkové soustavy tak, že zadané číslo dělíme dvěma a vypisujeme zbytky. Převáděné číslo načteme do proměnné a a jednotlivé bity dvojkového čísla ukládáme do proměnných: b, c, d, e, f, g, h, i. int a, b, c, d, e, f, g, h, i; Console.WriteLine("Zadej cislo do 255: "); a = Convert.ToInt32(Console.ReadLine()); b = a % 2; a = a / 2; c = a % 2; a = a / 2; d = a % 2; a = a / 2; e = a % 2; a = a / 2; f = a % 2; a = a / 2; g = a % 2; a = a / 2; h = a % 2; a = a / 2; i = a % 2; Console.WriteLine("{0}{1}{2}{3}{4}{5}{6}{7}", i, h, g, f, e, d, c, b);
2.11.11
Vstupy a výstupy v C#
9/11
3. Převod s využitím třídy Convert V C# je možné dělat převody jednodušším způsobem s využitím třídy Convert: Převod z desítkové soustavy: Do proměnné originál načteme převáděné desítkové číslo. Toto číslo můžeme převést na řetězec v libovolné soustavě: PrevedeneCislo = Convert.ToString(Original, CilovaSoustava);
Převod do desítkové soustavy: Číslo, které je v soustavě: Soustava_z_niz_prevadime převedeme do desítkové soustavy příkazem: Cislo_v_DesitkoveSoustave = Convert.ToInt32(PrevadeneCislo, Soustava_z_niz_prevadime);
Dále je uvedený program pro převod Original = 255 do dvojkové, osmičkové a šestnáctkové soustavy a zpětný převod do desítkové soustavy. int Original = 255; string B = Convert.ToString(Original, 2); string O = Convert.ToString(Original, 8); string D = Convert.ToString(Original, 10); string H = Convert.ToString(Original, 16); Console.WriteLine(B); Console.WriteLine(O); Console.WriteLine(D); Console.WriteLine(H); Console.WriteLine("Zpetny prevod:"); int i; i = Convert.ToInt32(B, 2); Console.WriteLine(i); i = Convert.ToInt32(O, 8); Console.WriteLine(i); i = Convert.ToInt32(D, 10); Console.WriteLine(i); i = Convert.ToInt32(H, 16); Console.WriteLine(i);
4. Obecný převod mezi soustavami Následující program umožňuje obecný převod ze zadané soustavy s1 (2,8,16) do zadané soustavy s2(2,8,16) Převod se provádí přes desítkovou soustavu. 2.11.11
Vstupy a výstupy v C#
10/11
int s1, s2; // soustavy Console.WriteLine("Zadej vychozi soustavu: "); s1 = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Zadej cilovou soustavu: "); s2 = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Zadej prevadene cislo: "); string c1 = Console.ReadLine();// převáděné číslo // převod do desítkové soustavy long c2 = Convert.ToInt64(c1, s1); // převod z desítkové soustavy do cílové soustavy string c = Convert.ToString(c2, s2); Console.WriteLine(c);
Komunikace s programem: Zadej vychozi soustavu: 16 Zadej cilovou soustavu: 2 Zadej prevadene cislo: aabbcc 101010101011101111001100
5. Převod časového údaje Napište program, ve kterém uživatel zadá čas v sekundách a program vypíše hlášení ve formátu:... s = …den... h ... min ... s int zadanoSekund, hodin, minut, sekund, dny; Console.WriteLine("Zadejte pocet sekund: "); zadanoSekund = Convert.ToInt32(Console.ReadLine()); dny = zadanoSekund / (3600 * 24); sekund = zadanoSekund % (3600 * 24); // Zjistíme počet hodin - použijeme celočíselné dělení: hodin = sekund / 3600; // Zjistíme počet minut ve zbytku: minut = (sekund % 3600) / 60; // Zjistíme počet zbývajících sekund // (zbytek po dělení 60): sekund = sekund % 60; Console.WriteLine("{0} s = {1} den {2} h {3} min {4} s\n", zadanoSekund, dny, hodin, minut, sekund);
Shrnutí: Uvedená kapitola popsala možnosti vstupu a výstupu hodnot do proměnných v konzolových aplikacích C#, formátové specifikace a možnosti nastavení barev a pozice kurzoru.
2.11.11
Vstupy a výstupy v C#
11/11