Po dłuższej przerwie w publikacji postów na moim blogu – czas na powrót. I to powrót w nie byle jakim stylu, bo niesie on ze sobą instrukcje warunkowe.
W poprzednim wpisie z tej serii, zatytułowanym jako kolejność wykonywania działań w C#, jak i w pozostałych wpisach, gdzie uruchamialiśmy swój kod, wszystkie programy działały w sposób liniowy, gdzie polecenia wykonywane były od pierwszego do ostatniego.
Życie jednak nie jest tak proste i praktyka nie działa w tak łatwy sposób – niemal w każdym programie zachodzi konieczność podjęcia decyzji – wykonania lub nie wykonania pewnego fragmentu programu.
O czym powiemy sobie kilka słów w dzisiejszym wpisie poświęconym zagadnieniu instrukcji warunkowych.
1. Instrukcje warunkowe w .NET C# – Instrukcja IF
Składnia instrukcji IF
1 2 |
if (wyrazenie logiczne) instrukcja; |
Powyższe linie to nic prostszego jak składania zwykłej instrukcji IF, która mówi, że jeśli wyrażenie logiczne przyjmie wartość true to wykonana zostanie instrukcja.
Częstym przypadkiem jest również sytuacja w której w instrukcji IF znajdować się może cały blog instrukcji, który wówczas należy objąć nawiasami klamrowymi, tak jak jest to widoczne poniżej.
1 2 3 4 5 |
if ( x > 10 && x < 45 ) { y++; s = s * y; } |
Przykład 1
Poniższy przykład oblicza delte ze wskazanego wyrażenia, tj.:
Δ = b2 – 4ac, jeżeli Δ = 0, to x = – b / 2a
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class Program { static void Main(string[] args) { double a = 1, b = -4, c = 4, delta, x; delta = Math.Pow(b, 2.0) -4 * a * c; Console.WriteLine("Delta={0}", delta); if (delta == 0) { x = -b / (2 * a); Console.WriteLine("Pierwiastek={0}", x); } Console.ReadKey(); } } |
Przykład ten przedstawia instrukcje IF dla spełnionego warunku. Co zatem w przypadku, gdy warunek naszej instrukcji nie zostaje spełniony?
2. Instrukcje warunkowe w .NET C# – Instrukcja IF ELSE
Do obsługi sytuacji, która jako scenariusz przyjmuje również wariant w którym nasz warunek nie zostaje spełniony, stosowana jest instrukcja IF ELSE, która pozwala nam niejako na alternatywę.
Składnia instrukcji IF ELSE
1 2 3 4 |
if (wyrazenie logiczne) instrukcja1 else instrukcja2 |
Powyższy zapis mówi, że jeśli wyrażenie logiczne przyjmuje wartość true wykonana zostanie instrukcja1, w przeciwnym wypadku, wykonana zostanie instrukcja2 – proste? Proste.
Podobnie jak przy zastosowaniu w instrukcji IF bloku warunków, tu również stosujemy nawiasy klamrowe, co uwidacznia nam poniższy zapis.
1 2 3 4 |
if ( x > 0 ) y = ++x; else y = --x; |
Przykład 2
Stosując już wcześniej wykorzystane wyrażenie pozwalające nam na obliczenie delty równania kwadratowego, zobaczmy jak możemy je zapisać z zastosowaniem alternatywy instrukcji IF ELSE.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class Program { static void main(string[] args) { double a = 0, b = -4, c = 4, delta; if (a != 0) { delta = Math.Pow(b, 2.0) -4 * a * c; Console.WriteLine("Delta={0}", delta); } else { Console.WriteLine("Współczynnik a jest równy zero"); } Console.ReadKey(); } } |
Instrukcja IF ELSE może być również wielowarunkowa, ogólnie rzecz ujmując nie ma w tej kwestii ograniczeń co do liczby warunków. Składnia takiej postaci wielowarunkowej może przyjąć postać:
1 2 3 4 5 6 |
if (cyfra == 0) slownie = "zero"; else if (cyfra == 1) slownie = "jeden"; else if (cyfra == 2) slownie = "dwa"; |
Przykład 3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
class Program { static void main(string[] args) { double a = 0, b = -4, c = 4, delta; if (a != 0) { delta = Math.Pow(b, 2.0) -4 * a * c; Console.WriteLine("Delta={0}", delta); if (delta == 0) { Console.WriteLine("Pierwiastek x={0,6:F2}", -b / (2 * a)); } Console.WriteLine("Pierwiastek x1= {0,6:F2}", (-b + Math.Sqrt(delta)) / (2 * a)); Console.WriteLine("Pierwiastek x2= {0,6:F2}", (-b - Math>Sqrt(delta)) / (2 * a)); } else { Console.WriteLine("Delta jest ujemna - brak pierwiastka"); } Console.ReadKey(); } } |
3. Instrukcje warunkowe w .NET C# – Operator warunkowy
Instrukcja IF ELSE to jednak nie wszystko. W sytuacji prostych instrukcji warunkowych, wykorzystać możemy również operator warunkowy, który działa w bardzo podobny sposób jak instrukcja IF ELSE.
Składnia operatora warunkowego
1 |
(wyrazenie logiczne) ? wyrazenie1 : wyrazenie2 |
Zapis ten mówi nam, że jeśli wyrażenie logiczne przyjmie wartość true wynikiem naszym będzie wyrazenie1, w przeciwnym przypadku w wyniku możemy spodziewać się wyrazenia2.
Przykłady
1 2 |
int x = 1; int y = (x > 0) ? 5 : 6 //y będzie równe 5 |
1 |
int y = (x > 0) ? ++x : --x //y będzie równe 2 (kod równoważny z kodem z przykładu 2 dla instrukcji if) |
4. Instrukcje warunkowe w .NET C# – Instrukcja SWITCH CASE
Wcześniej opisane metody/instrukcje, które niewątpliwie znajdą swoje rozwiązanie w nieco bardziej skomplikowanych przypadkach, możemy niekiedy zastąpić, co sprawia, że instrukcje warunkowe w języku .NET C# dają nam pewną dowolność.
Możemy tego dokonać w sytuacjach, kiedy program powinien uwzględnić proste, konkretne wartości poprzez zastosowanie instrukcji wielowarunkowej SWITCH CASE.
Składnia/Przykład
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
class Program { static void main([string] args) { Console.WriteLine("Wpisz porę roku po polsku"); string poraRoku = Console.ReadLine(); switch (poraRoku) { case "Wiosna": Console.WriteLine("Spring"); break; case "Lato": Console.WriteLine("Summer"); break; case "Jesień": Console.WriteLine("Autumn"); break; case "Zima": Console.WriteLine("Winter"); break; } Console.ReadKey(); } } |
W powyższym przykładzie dobrze będzie jeśli zastosujemy opcję default, która niejako obsłuży nam wyjątek w momencie, gdy wpiszemy błędną wartość.
Np.:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
class Program { static void main([string] args) { Console.WriteLine("Wpisz porę roku po polsku"); string poraRoku = Console.ReadLine(); switch (poraRoku) { case "Wiosna": Console.WriteLine("Spring"); break; case "Lato": Console.WriteLine("Summer"); break; case "Jesień": Console.WriteLine("Autumn"); break; case "Zima": Console.WriteLine("Winter"); break; default: Console.WriteLine("Nie ma takiej pory roku"); break; } Console.ReadKey(); } } |
Instrukcja SWITCH CASE może również obsłużyć kilka przypadków szczególnych. Do takich należy m.in. sytuacja w której potrzebujemy aby nasz blok CASE przyjmował więcej niże jedną instrukcję, np. :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
class Program { static void main([string] args) { Console.WriteLine("Wpisz porę roku po polsku"); string poraRoku = Console.ReadLine(); switch (poraRoku) { case "Wiosna": Console.WriteLine("Spring1"); Console.WriteLine("Spring2"); //dodatkowa instrukcja break; case "Lato": Console.WriteLine("Summer"); Console.WriteLine("Summer2"); //dodatkowa instrukcja break; case "Jesień": Console.WriteLine("Autumn"); Console.WriteLine("Autumn2"); //dodatkowa instrukcja break; case "Zima": Console.WriteLine("Winter"); Console.WriteLine("Winter2"); //dodatkowa instrukcja break; default: Console.WriteLine("Nie ma takiej pory roku"); break; } Console.ReadKey(); } } |
W powyższej sytuacji, jak widzimy, w przeciwieństwie do innych instrukcji w języku .NET C#, tego bloku nie musimy ujmować w nawiasy klamrowe. W instrukcji CASE, wszystko co znajduje się pomiędzy słowem kluczowym CASE oraz jego wartością, a słowem opuszczającym blok CASE lub całą instrukcję – w tym przypadku – BREAK, traktowane jest jako blok instrukcji.
Kolejnym przypadkiem jest sytuacja w której zachodzi potrzeba aby program po wykonaniu bloku kodu dla danego przypadku, program wykonał dodatkowo kod dla innego przypadku, zapisany w innej instrukcji CASE. Możliwość taką daje zastąpienie polecenia BREAK poleceniem GOTO CASE, np.:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
class Program { static void main([string] args) { Console.WriteLine("Wpisz porę roku po polsku"); string poraRoku = Console.ReadLine(); switch (poraRoku) { case "Wiosna": Console.WriteLine("Spring1"); Console.WriteLine("Spring2"); //dodatkowa instrukcja //break; goto case "Lato"; case "Lato": Console.WriteLine("Summer"); Console.WriteLine("Summer2"); //dodatkowa instrukcja break; case "Jesień": Console.WriteLine("Autumn"); Console.WriteLine("Autumn2"); //dodatkowa instrukcja break; case "Zima": Console.WriteLine("Winter"); Console.WriteLine("Winter2"); //dodatkowa instrukcja break; default: Console.WriteLine("Nie ma takiej pory roku"); break; } Console.ReadKey(); } } |
Kolejnym przypadkiem jest sytuacja w której program nie zawiera w sobie żadnej instrukcji warunkowej. Jeśli występuje taka konieczność, jest ona również związana z tym, że w kodzie nie ma także żadnej instrukcji wychodzącej (np. BREAK).
Sytuacja taka przez kompilator będzie interpretowana w taki sposób, że:
jeśli dla danej wartości w przypadku CASE nie ma żadnych instrukcji tzn., że przypadek kolejny ma przejąć tę funkcję.
Przykład
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
class Program { static void main([string] args) { Console.WriteLine("Wpisz porę roku po polsku"); string poraRoku = Console.ReadLine(); switch (poraRoku) { case "Wiosna": //Console.WriteLine("Spring1"); //break; case "Lato": Console.WriteLine("Spring or Summer"); break; case "Jesień": Console.WriteLine("Autumn"); break; case "Zima": Console.WriteLine("Winter"); break; default: Console.WriteLine("Nie ma takiej pory roku"); break; } Console.ReadKey(); } } |
WAŻNE
W instrukcji SWITCH CASE, przy jej stosowaniu należy pamiętać, że zmienna, której wartość będzie testowana (w naszym przypadku była to zmienna poraRoku) nie może być dowolnego typu.
Wśród dopuszczalnych typów tej zmiennej, są: bool, char, string, int oraz enum.
Ponadto, musimy również pamiętać, aby wartości, które pojawiają się po słowie kluczowym CASE (w powyższych przykładach: Wiosna, Lato, Jesień, Zima) muszą być w postaci stałej lub literału, ewentualnie wyrażenia używającego literałów lub stałych.
Po krótce omówiliśmy sobie w tym wpisie Instrukcje warunkowe w języku C#.
Kolejny wpis z tej serii dotyczył będzie Instrukcji cyklicznych – pętli i pojawi się znacznie szybciej niż obecny – obiecuję 🙂
Długo kazałeś czekać, ale warto było:) Art pochłonięty, czekam na kolejny!
Przepraszam, ale w ostatnim czasie dużo się dzieje. Nie mniej jednak cieszy myśl, że ktoś czeka. Kolejny, jeszcze w tym tygodniu – może nawet dwa 🙂 Obiecuję. Pozdrawiam
Ja też czekałem i przegapiłem. Dopiero dzisiaj udało mi się wciągnąć artykuł na raz, oczywiście z przyjemnością i łatwością.