Jeśli zaczynasz naukę programowania w C++, to jednym z ważnych elementów, które musisz poznać, jest instrukcja warunkowa if. Pozwala one na wykonanie różnych akcji w zależności od spełnienia określonych warunków. W tym artykule przyjrzymy się bliżej rodzajom instrukcji warunkowej w C++ i ich zastosowaniu na przykładzie historii o… robieniu zupy pomidorowej. Jesteś akurat przed obiadem? No to zaczynamy!
Zanim przystąpimy do gotowania zupy pomidorowej, musimy sprawdzić, czy mamy wszystkie składniki. Najważniejsze są oczywiście pomidory, dlatego trzeba zerknąć do spiżarki, czy je mamy. Możemy to zrobić za pomocą zmiennej logicznej hasTomatoes
, którą ustawimy na wartość true
, jeśli posiadamy pomidory lub false
, jeśli ich nie posiadamy.
bool hasTomatoes = true;
Następnie sprawdźmy, czy mamy również cebulę i czosnek:
bool hasOnion = true;
bool hasGarlic = false;
Zanim pójdziemy kupić czosnek, sprawdźmy, czy mamy bulion. Ten składnik jest akurat opcjonalny, zamiast niego możemy użyć wody, ale wtedy zupa nie będzie taka dobra. Do tego jeszcze wrócimy.
bool hasBroth = true;
Czosnek kupiony? W takim razie możemy przejść do omówienia instrukcji warunkowej w C++.
Instrukcja warunkowa if
, czyli gotujemy pomidorową
Tak wygląda konstrukcja instrukcji warunkowej if
:
if (we_have_all_ingredients) {
// we can cook
}
Jeśli we have all ingredients
– mamy wszystkie składniki, to nasz warunek został spełniony, wtedy możemy wykonać planowane działanie, czyli we can cook
– możemy gotować.
Ważne: nigdy nie zapominaj o klamerkach {}
! Jeśli o nich zapomnisz, to wykona się tylko pierwsza instrukcja. Zerknij tutaj
Sprawdźmy jednak, czy NA PEWNO mamy wszystkie składniki. Pomoże nam w tym operator logiczny i (&&, and
):
if (hasTomatoes && hasOnion && hasGarlic)
W przypadku użycia operatora &&
wszystkie trzy powyższe warunki muszą zostać spełnione, inaczej kod wewnątrz instrukcji się nie wykona, czyli nici z naszej pomidorowej.
Brakuje nam jeszcze płynu, czyli bulionu, albo wody. W tym przypadku możemy skorzystać z operatora logicznego lub (||, or
):
if (hasBroth || hasWater)
Tutaj wystarczy, że przynajmniej jeden z dwóch warunków będzie spełniony, aby kod wewnątrz instrukcji warunkowej się wykonał. Oczywiście zupa na bulionie byłaby lepsza, ale nie jest to warunek konieczny.
Operatory &&
i ||
można ze sobą łączyć wewnątrz jednej instrukcji, dlatego nasz przepis na pomidorową można podsumować w ten sposób:
if (hasTomatoes && hasOnion && hasGarlic && (hasBroth || hasWater))
Instrukcja warunkowa if else
, czyli co zrobić, kiedy mamy za mało pomidorów?
Bywa i tak, że któryś warunek się nie spełni, albo przynajmniej nie do końca tak, jakbyśmy sobie tego życzyli. Co wtedy? Możemy skorzystać z instrukcji warunkowej if else
i wymusić na programie inne zachowanie.
if (tomatoCount <= 1) {
// not enough tomatoes
} else if (tomatoCount == 2) {
// small portion of tomato soup
} else {
// big portion of tomato soup
}
Jeśli mamy tylko jednego pomidora, to nie warto nawet brać się za gotowanie. Jeśli mamy dwa, to możemy spróbować, ale wyjdzie z tego mała zupa na raz. Natomiast, jeśli mamy więcej, to wtedy wyjdzie duża porcja zupy i będziemy mogli zostawić sobie trochę na później, albo kogoś poczęstować.
Możemy tworzyć wiele drabinek if else
, które będą sprawdzały kolejne warunki. Trzeba jednak pamiętać, że kod wykona się tylko dla pierwszego prawdziwego warunku.
Instrukcja warunkowa switch/case
, czyli jednak ogórkowa
Istnieje jeszcze jeden typ instrukcji warunkowej, w której możemy sprawdzić konkretny przypadek. Wyobraź sobie, że zgłębiliśmy zawartość naszej spiżarki i zamiast pomidorów znaleźliśmy ogórki. Co wtedy?
switch (ingredient) {
case Ingredient::Tomatoes:
prepareTomatoSoup();
break;
case Ingredient::Cucumbers:
prepareCucumberSoup();
break;
case Ingredient::Cauliflower:
prepareCauliflowerSoup();
break;
default:
// do nothing
}
Jeśli nasz główny składnik to ogórki, a nie pomidory, to kod nie wykona pierwszej instrukcji. Przejdzie za to do kolejnej i zdecyduje, że robimy zupę ogórkową, a następnie wykona break
, czyli wyjdzie z instrukcji warunkowej. Gdyby nie było break
, to kod przeszedłby do instrukcji z kolejnego case
i zrobiłby także zupę kalafiorową bez sprawdzania, czy w ogóle mamy kalafior! Jeśli natomiast żaden warunek nie zostałby spełniony, to program dotrze do default
, co w tym przypadku oznacza do nothing
– nic nie robimy, bo nie mamy z czego.
Uwaga – zmienna sterująca instrukcją switch/case
musi być typu liczbowego całkowitego, czyli np. int, char, long etc. Może być także typu wyliczeniowego
enum, który także jest widziany przez program jako liczba całkowita. W naszym przypadku
ingredient
było właśnie takim enumem.
A co na drugie?
Jak widzisz, instrukcja warunkowa w C++ jest bardzo przydatna, gdy chcemy kontrolować, jakie akcje są wykonywane w zależności od określonych warunków.
Teraz kiedy już znasz instrukcję warunkową, masz podstawę do wykonywania bardziej skomplikowanych zadań programistycznych. Dzięki instrukcjom warunkowym możesz m.in.:
- sprawdzać warunki logiczne
- wykonywać różne działania w zależności od warunków
- obsługiwać błędy
- wykonywać iteracje w pętlach
I wiele, wiele innych rzeczy, dlatego musisz je znać, bo to podstawowy element języka C++.
Jeśli chcesz poznać inne podstawowe zagadnienia, obczaj nasz kurs Podstawy C++.
Smacznego!