Poprzedni wpis z tej serii, zatytułowany Wyrażenia logiczne (gdzie sens? gdzie logika?) poświęcony był zagadnieniom czysto matematycznym. Jednak nie samą stricte matematyką człowiek żyje, zatem dzisiejszy, dedykowany będzie zagadnieniom związanym z prostymi operacjami na tekstach. Zatem; operacje na tekstach.
Let’s do it!
W omawianych dziś przykładach wykorzystywać będziemy podstawowe operacje na danych typu string oraz powiemy sobie kilka słów nt. operatora konkatenacji tekstów, czyli łączenia wyrażeń.
1. Operacje na tekstach – Operator konkatenacji tekstów i niejawna konwersja
Przykład 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
using System; namespace operacje_na_tekstach { class Program { static void Main(string[] args) { Console.WriteLine("Podaj imię"); string tekst = Console.ReadLine(); tekst = "Cześć" + tekst; Console.WriteLine(tekst); Console.WriteLine(tekst.Length); Console.ReadKey(); } } } |
Na powyższym przykładzie widzimy kod prostego programu proszącego użytkownika o wpisanie w konsoli tekstu (swojego imienia), które za pomocą instrukcji Console.ReadLine() wczytuje tekst z klawiatury. Metoda ta wczytuje daną typu string, zadeklarowaną na początku, zatem nie musimy używać innej metody, która dokonywałaby konwersji typu, tak jak miało to miejsce w przykładach, w innych wpisach z tej serii.
W kolejnej linii widzimy wyrażenie w którym zmienna tekst jest zmieniana poprzez przypisanie do niej innej wartości poprzez połączenie wyrazu “Cześć” z wartością wpisaną w konsoli przez użytkownika.
W linii tej widzimy również znak ‘+’, który pełni tu rolę operatora konkatenacji tekstu.
Kolejna linia kodu wyświetla wynik działania programu, zaś kolejna, tj.:
1 |
Console.WriteLine(tekst.Length); |
sprawia, że program podaje nam ilość znaków konkatenacji.
Jeśli zaś zmodyfikujemy nasz powyższy kod do postaci:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
using System; namespace operacje_na_tekstach { class Program { static void Main(string[] args) { Console.WriteLine(10 + 23); Console.ReadKey(); } } } |
nasz dotychczasowy znak ‘+’, służący nam w Przykładzie 1 jako operator konkatenacji przyjmuje znaczenie arytmetyczne w którym jest zwykłym plusem, a program w swoim wyniku daje nam za jego przyczyną sumę, czyli liczbę 33.
Natomiast gdy kod przyjmie postać:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
using System; namespace operacje_na_tekstach { class Program { static void Main(string[] args) { Console.WriteLine("10" + 23); Console.ReadKey(); } } } |
w której liczba 10 ujęta zostaje w cudzysłów, przez co już nie jest daną typu integer a łańcuchem znakowym o typie string, program w swoim wyniku, jak sami zobaczycie po jego uruchomieniu da nam wartość 1023, co zostanie osiągnięte poprzez znak ‘+’, który znów zostaje tu wykorzystany jako operator nie arytmetyczny, a jako operator konkatenacji.
Wynik tego działania jest również daną typu string, ponieważ kompilator dokonał w tym miejscu niejawnej konwersji liczby 23 z typu integer na typ string.
Co się zaś stanie jeśli wykonamy taki kod, kod w którym użyjemy typu całkowitoliczbowego char? Zwróćmy uwagę, że dla tego typu stosujemy tzw. ‘ciapki’.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
using System; namespace operacje_na_tekstach { class Program { static void Main(string[] args) { char znak = 'A'; Console.WriteLine("B" + znak); Console.ReadKey(); } } } |
Otóż jak się okazuje po uruchomieniu tego programu, otrzymujemy w wyniku daną typu string – BA. Zatem znów ‘+’
posłużył nam jako operator konkatenacji, a kompilator dokonał niejawnej konwersji typu wbudowanego char na typ string.
W momencie, gdy kod przyjmie postać:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
using System; namespace operacje_na_tekstach { class Program { static void Main(string[] args) { char znak = 'A'; Console.WriteLine('B' + znak); Console.ReadKey(); } } } |
w którym to daną B objęliśmy również ciapkami, program zwróci nam liczbę 131. Jak to się stało? A mianowicie poprzez użycie znaku ‘+’ jako operatora arytmetycznego i dodanie wartości jakie przyjmują litery A i B w postaci dziesiętnej w ASCII.
- A – 65
- B – 66
2. Operacje na tekstach – Znaki specjalne
Jak już dziś wspomnieliśmy stałe znakowej, czyli literały typu char zapisujemy w tzw. ciapkach (apostrofach), natomiast stałe tekstowe, tj. literały typu string zapisujemy w cudzysłowiu.
Wewnątrz stałych tekstowych mogą jednak występować tzw. znaki specjalne na które również podczas nauki C# powinniśmy zwrócić uwagę i którym poświęcony będzie ten punkt dzisiejszego wpisu.
Znakami specjalnymi są:
- \’ – znak apostrofu (‘)
- \” – znak cudzysłowu
- \\ – baskslash (\)
- \n – nowa linia
- \t – tabulacja pozioma
- \0 – znak pusty
To oczywiście tylko wybrane znaki specjalne – pełną listę znajdziesz w dokumentacji tu i jeszcze tu.
Wynik zastosowania wymienionych przeze mnie, podstawowych znaków specjalnych osiągniemy poprzez uruchomienie poniższego przykładu.
Przykład 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
using System; namespace operacje_na_tekstach { class Program { static void Main(string[] args) { Console.WriteLine("Linia1\nLinia2"); Console.WriteLine("Kolumna1\tKolumna2"); Console.WriteLine(@"Kolumna1\tKolumna2"); Console.WriteLine("C:\\Windows\\temp"); Console.WriteLine("Tytuł filmu: \"Matrix\""); Console.ReadKey(); } } } |
3. Operacje na tekstach – Prezentowanie tekstu
Do tej pory, do prezentowania wyniku naszego programu w konsoli używaliśmy metody Console.WriteLine(). Metoda ta jednak ma również inne wersje niż ta jedyna z której korzystaliśmy dotychczas, np. wersja pozwalająca na formatowanie tekstu. Przejdźmy zatem do przykładu…
Przykład 3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
using System; namespace operacje_na_tekstach { class Program { static void Main(string[] args) { int a = 4, b = 6, suma = a + b; Console.WriteLine("a=" + a + " b=" + b + " Suma=" + suma); Console.WriteLine("a={0} b={1} Suma={2}", a, b, suma); Console.ReadKey(); } } } |
W powyższym przykładzie widzimy dwie wersje prezentacji wyniku za pomocą wspomnianej wcześniej metody Console.WriteLine().
Pierwsza z nich jak widzimy w swoim wywołaniu prezentuje łańcuch znakowy, używa konkatenacji oraz niejawnej konwersji.
Drugie wywołanie owej metody używa tzw. elementów formatujących, które ujęte są w nawiasach klamrowych; o tu:
1 |
Console.WriteLine("a={0} b={1} Suma={2}", a, b, suma); |
numerowane są od 0 w swej kolejności poprzez tzw. indeksy i występują w postaci łańcucha znakowego. Tuż za nimi widzimy zmienne, które zostaną zaprezentowane w wyniku wywołania naszej metody.
Prócz elementów formatujących jakimi są wyżej przedstawione indeksy możemy użyć innych elementów, które również zawrzeć musimy w nawiasach klamrowych i które przedstawia kolejny przykład.
Przykład 4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
using System; namespace operacje_na_tekstach { class Program { static void Main(string[] args) { double x = 12.34567, wskaznik = 0.45; int suma = 10; string imie = "Jan", nazwisko = "Nowak"; Console.WriteLine("--------------------------------------"); Console.WriteLine("1. Imię: {0,8} Nazwisko: {1,10}", imie, nazwisko); Console.WriteLine("2. Imię: {0,-8} Nazwisko: {1,-10}", imie, nazwisko); Console.WriteLine("3. Wartość: {0,10} to suma", suma); Console.WriteLine("4. Wskaźnik: {0,8:P}", wskaznik); Console.WriteLine("5. Waga: {0,8} kg Waga: {0,8:F2} kg", x); Console.ReadKey(); } } } |
Jak widzimy, mamy kilka przykładowych wywołań metody Console.WriteLine(), zawierającej w nawiasach klamrowych prócz indeksu (pierwsza wartość – obowiązkowa) dodatkową pozycję, która może być np. wyrównaniem bądź specyfikatorem formatu.
W linii 13
1 |
Console.WriteLine("1. Imię: {0,8} Nazwisko: {1,10}", imie, nazwisko); |
widzimy w nawiasach klamrowych wartości 0 i 8 dla imienia oraz 1 i 10 dla nazwiska. Jak wspomniałem pierwszy parametr określa indeks pozycji, drugi (8 lub 10) jest to wyrównanie (domyślnie do prawej) i określa liczbę znaków na których zostanie wyświetlony tekst.
Linia kodu powyżej jest swego rodzaju odnośnikiem aby można było policzyć ilości znaków.
Linia 14 prezentuje ten sam wynik, jednak z wyrównaniem do lewej, co można zauważyć po wykonaniu kodu z przykładu 4.
Kolejna linia, również prezentuje wyrównanie do prawej oraz wyświetlenie zmiennej.
Najistotniejsze są jednak linie 16 i 17 w których użyty został specyfikator formatu – cała lista dostępnych specyfikatorów znajduje się na stronie dokumentacji MSDN.
1 |
Console.WriteLine("4. Wskaźnik: {0,8:P}", wskaznik); |
Powyżej użyliśmy specyfikatora dot. procentów (P) pozwalającego na prezentowanie wartości procentowych. Domyślnie, jeśli nie dodamy dodatkowego ustawienia, np.:
1 |
Console.WriteLine("4. Wskaźnik: {0,8:P4}", wskaznik); |
który określa wartość procentową z dokładnością do 4 miejsc po przecinku, wartość prezentowana jest z dokładnością do 2 miejsc.
Ostatnia linia prezentująca specyfikatory formatu, czyli:
1 |
Console.WriteLine("5. Waga: {0,8} kg Waga: {0,8:F2} kg", x); |
przedstawia w rodzaje zapisu zmiennej x. Pierwsza, domyślną, zadeklarowaną wartość, druga zaś zaokrąglającą ja do dwóch znaków po przecinku.
Na koniec, ostatni przykład przedstawiający różnice pomiędzy metodą Console.WriteLine() a metodą Console.Write().
Przykład 5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
using System; namespace operacje_na_tekstach { class Program { static void Main(string[] args) { double x = 12.34567, wskaznik = 0.45; int suma = 10; string imie = "Jan", nazwisko = "Nowak"; Console.WriteLine("--------------------------------------"); Console.WriteLine("1. Imię: {0,8} Nazwisko: {1,10}", imie, nazwisko); Console.WriteLine("2. Imię: {0,-8} Nazwisko: {1,-10}", imie, nazwisko); Console.WriteLine("3. Wartość: {0,10} to suma", suma); Console.Write("4. Wskaźnik: {0,8:P4}", wskaznik); Console.WriteLine("5. Waga: {0,8} kg Waga: {0,8:F2} kg", x); Console.ReadKey(); } } } |
Jak widzimy po uruchomieniu powyższego kodu, różnica pomiędzy tymi dwoma metodami jest prosta, a mianowicie Console.WriteLine() wyświetla wynik w nowej linii, zaś Console.Write() robi to w tej samej.
Podobny efekt (wynik w nowej linii) jesteśmy w stanie osiągnąć poprzez zastosowanie poznanego już wcześniej znaku specjalnego (\n), tj.:
1 |
Console.Write("4. Wskaźnik: {0,8:P4}\n", wskaznik); |
który pozwala nam przywrócić funkcjonalność jaką daje Console.WriteLine().
Na dziś to wszystko. Kolejny wpis już niebawem (nastąpi to znacznie szybciej niż dotychczas – idą święta, więcej czasu dla siebie) w którym to powiemy sobie o kolejności wykonywania działań w C# .NET.
Bardzo dobry wpis, super blog 🙂
Dziękuję. Choć powiem szczerze, Twój podoba mi się bardziej 🙂
Świetnie się czyta Twoje wpisy, nie przestawaj tego robić. Nawet jak się starasz i nie wychodzi to i tak wychodzi 😉
Dziękuję Ci za te słowa. Motywują do dalszego działania 🙂