Większość aplikacji wymaga informacji wprowadzonej przez użytkownika, generując, na nią odpowiedz jako rezultat zadania. Aby, wyświetlić wiadomość dla użytkownika w oknie konsoli używamy metody: Console.Write i Console.WriteLine.
Różnica między tymi dwoma metodami jest taka, że Console.WriteLine przesuwa kursor do następnej linii po wydruku tekstu.
Aby nie musieć wcześniej deklarować zmiennej zawierającej tekst, należy użyć ” ” i między nim wpisać pożądany tekst lub frazę np. ” Witaj świecie!”
1 2 3 4 |
static void Main(string[] args) { Console.WriteLine("Witaj świecie!"); } |
Po zadeklarowaniu zmiennych możemy je wyświetlać w oknie konsoli bez konieczności używania znaku ” ” .
1 2 3 4 5 |
static void Main(string[] args) { string z = "Witaj świecie!"; Console.WriteLine(z); } |
Tekst w ” …” możemy łączyć, ze zmiennymi co daje nam możliwość dowolnego przedstawiania danych. Jest to bardzo ważna wiadomość dla użytkownika, który będzie odbierał nasze wiadomości:
1 2 3 4 5 6 7 8 9 |
static void Main(string[] args) { int Procent = 10; Console.Write(Procent); Console.WriteLine(" -taka wiadomość może być myląca dla odbiorcy."); Console.Write(Procent+"%"); Console.WriteLine(" -odiorca rozumie już, że chodzi nam o procenty."); } |
Mimo iż tekst możemy łączyć ze zmiennymi dowolnie, istnieje możliwość formatowania zmiennych tak, aby tworzyć użyteczne reprezentacje łańcuchowe. Określamy numeryczne formaty, formaty daty, a nawet wypełnienie. Ciągi formatowania są potężne. Mogą być jednak skomplikowane i trudne w użyciu. Można je tworzyć w dwojaki sposób:
1 2 3 4 5 6 7 |
static void Main(string[] args) { double Procent = 0.1; string rezultat= String.Format("Procent= {0:0.0%}", Procent); Console.WriteLine(rezultat); Console.WriteLine("Procent= {0:0.0%}", Procent); } |
pierwszy znak w nawiasie {} określa która zmienna jest formatowana:
1 2 3 4 5 6 |
static void Main(string[] args) { double Procent = 0.1; string dz = "działa"; Console.WriteLine("Procent= {0:0.0%} {1} {2} {3}", Procent, "tak","to",dz); } |
jeśli chcielibyśmy zrobić wcięcie w lini konsoli, należy po pierwszej liczbie określającej zmienną dodać przecinek i określić wielkość wcięcia i tak wartość negatywna będzie określała wcięcie z lewej strony, wartość dodatnia z prawej (trzeba wziąć pod uwagę długość teksty wyświetlanego):
1 2 3 4 5 6 7 8 9 10 11 12 |
static void Main(string[] args) { string format = "{0,-10} {1,10}"; string line1 = String.Format(format, 100, 5); string line2 = String.Format(format, "ziemniaki", "pies"); string line3 = String.Format(format, true, false); Console.WriteLine(line1); Console.WriteLine(line2); Console.WriteLine(line3); } |
Wykorzystanie różnych rodzajów formatowania:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
static void Main(string[] args) { double Procent = 0.1; byte z = 255; Console.WriteLine("{1,18} {0,42:0.0%}", Procent, "Procent="); Console.WriteLine("{1,51} {0,10:P2}", Procent, "Procent z określoną liczbą po przecinku: "); Console.WriteLine("{1,50} {0,14:C4}", Procent, "Waluta z określoną liczbą po przecinku: "); Console.WriteLine("\n{0}\n", "Znak specjalny tworzący nową linię przed i po tekście."); Console.WriteLine("{1,-20} {0:d}", DateTime.Now, "Dzisiejsza data: "); Console.WriteLine("{1,-20} {0:dddd MMMM}", DateTime.Now, "Dzisiejsza data: "); Console.WriteLine("{1,-20} {0:t}", DateTime.Now, "Aktualny czas: "); Console.WriteLine("{1,-20} {0:hh}", DateTime.Now, "Aktualna godzina: "); Console.WriteLine("{1,-20} {0:yyyy}", DateTime.Now, "Aktualny rok: "); Console.WriteLine("{1,-20} {0:MM}", DateTime.Now, "Aktualny miesiąc: "); Console.WriteLine("{1,-20} {0:N3}", Procent, "Format numeryczny z określoną liczbą po przecinku: "); Console.WriteLine("{1,-20} {0:X}", z, "Wartość szesnastkowa: "); Console.WriteLine("{1,-20} {0:X8}", z, "Wartość szesnastkowa: "); Console.WriteLine("{1,-20} {0:G}", 0x0FFFFF, "Zamiana każdej wartości na liczbę: "); } |
Wcięcie można również uzyskać za pomocą metody PadLeft i PadRight, przydaje się gdy chcemy zrobić coś w stylu kolumn w konsoli:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Console.WriteLine("wcięcie z lewej 10".PadLeft(28)); Console.WriteLine("wcięcie z lewej 20".PadLeft(38)); Console.WriteLine("wcięcie z lewej 10".PadLeft(28,'.')); Console.WriteLine("wcięcie z lewej 20".PadLeft(38,'_')); //PadRight przydaje się, gdy chcemy zrobić kolumny Console.WriteLine(); Console.Write("Imię".PadRight(8,'-').PadLeft(10,'.')); Console.Write("Nazwisko \n"); Console.WriteLine(); Console.Write("Teresa".PadRight(8).PadLeft(10)); Console.Write("Nowak \n"); Console.Write("Piotr".PadRight(8).PadLeft(10)); Console.Write("Kowalski \n"); Console.Write("Kamil".PadRight(8).PadLeft(10)); Console.Write("Krwaczyk \n"); |
Aby pobrać od użytkownika dane, należy użyć metody Console.ReadLine, która przypisuje ją do typu string. Poniższy przykład przypisze do zmiennej i wyświetli odpowiedź w konsoli.
1 2 3 4 5 6 |
static void Main(string[] args) { Console.WriteLine("Jak masz na imie?"); string twojeImie = Console.ReadLine(); Console.WriteLine("Witaj {0}.", twojeImie); } |
Podczas realizacji kodu, metoda Console.ReadLine zatrzymuje proces i czeka na odpowiedź użytkownika. Metoda ta przyjmuje tylko ciąg znaków. Oznacza to, że jeśli zechcemy przypisać ją do zmiennej innego typu niż „string” musimy ją konwertować do określonego typu. Możemy do tego użyć metody Convert.To….(Console.ReadLine()), która spróbuje zamienić wprowadzony ciąg na określony typ (jeśli jest to możliwe).
Jeśli jednak operacja ta się nie uda, zostanie wyświetlona odpowiednia wiadomość o błędzie.
1 2 3 4 5 6 |
static void Main(string[] args) { Console.WriteLine("Ile masz lat?"); int twojWiek = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Ja mam więcej lat niż {0}.", twojWiek); } |
Dla zmiennej całkowitej występują trzy typy konwersji, są to int16, int32, int64 i różnią się zakresem, jakie mogą przyjmować. Domyślnym typem całkowitym wykorzystywanym w języku C# jest int32.
Drugim sposobem konwersji jest Parse, wyróżniamy tutaj dwa rodzaje tej metody: Parse() i TryParse(). Parse od Convert różni się tym, że ten pierwszy przyjmuje tylko wartości rodzaju String i konwertuje go na wskazany typ, ten drugi konwertuje każdy rodzaj zmiennej. Ponadto podczas wywoływania metody Parse() wartość zmiennej nie może być pusta (string k=null;). Dużo ciekawszą i bardziej przydatna metodą jest TryParse() która próbuje konwersji ciągu znakowego (string) na wybrany typ i jeśli ta konwersja się nie uda, program nie wyświetli komunikatu o błędzie a instrukcja będzie kontynuowana:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
static void Main(string[] args) { string k = "154"; int g; int.TryParse(k, out g); //jeśli konwersja się powiedzie, //wtedy poniższe dodawanie będzie miało sens Console.Write("Wynik dodawania k + 10= "); Console.Write(g + 10); //Przykład użycia //string k = "154" //Wynik dodawania k + 10= 164 //string k = "lsad" //Wynik dodawania k + 10= 10 } |
Jest to wielce przydatna metoda, kiedy chcemy pobrać od użytkownika konkretny rodzaj zmiennej, jeśli użytkownik, wprowadzając swój wiek do programu, wprowadzi go niepoprawnie, wtedy program go zignoruje, a błąd nie zostanie wyświetlony, program będzie kontynuowany.
Komentarze są elementami, które można wstawić do programu, aby przynieść korzyści sobie i współtwórcom kodu. Kompilator ignoruje wszystko, co pojawia się w komentarzu, więc żadna z tych informacji nie wpływa na wynik.
Jeśli chcemy pobrać od użytkownika konkretny rodzaj zmiennej np. pojedynczy znak, należy określić jego rodzaj przed Console.ReadLine() tak jak w przykładzie poniżej:
1 2 3 4 5 6 7 |
static void Main(string[] args) { Console.Write("Wpisz znak: "); //pobrany zostanie pierwszy wpisany znak char ch = (char)Console.Read(); Console.WriteLine(ch); } |
Komentarze zaczynamy od dwóch ukośników. Ukośniki informują kompilator, aby ignorował wszystko po nim aż do końca linii.
1 2 3 4 5 6 |
static void Main(string[] args) { // Moja pierwsza aplikacja string z = "Witaj świecie!"; Console.WriteLine(z); } |
Jeśli chcielibyśmy, aby nasz komentarz nie kończył się na jednej linii, należy zacząć go znakiem /* i zamknąć */, można umieści go na tej samej linii bądź kilku poniżej.
1 2 3 4 5 6 7 8 9 10 11 12 |
static void Main(string[] args) { /* Moja pierwsza aplikacja */ /* dopiero * się * ucze */ string z = "Witaj świecie!"; Console.WriteLine(z); } |
Kolejnym bardzo ciekawym elementem organizacji kodu są regiony. Komentarze tłumaczą działanie metod, zmiennych ich wykorzystanie itp. Regiony pozwalają na dzielenie kodu i jego organizacje, jeśli nasz kod jest bardzo długi, podzielenie go na mniejsze, opisane sektory ułatwi prace.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
static void Main(string[] args) { #region "zmienne" string z = "Witaj świecie!"; string x = "Podaj swoje imię."; string imie; string y = "Ile masz lat {0} ?"; int wiek; #endregion #region "Wyświetlanie komunikatów i pobieranie ciągów" Console.WriteLine(z); Console.WriteLine(x); imie = Console.ReadLine(); Console.WriteLine("witaj {0}", imie); Console.WriteLine(y, imie); wiek = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Dobrze wiedzieć ;)"); #endregion } |
Nasz kod już będzie czytelny.