Warunki - Programowanie jest łatwe

Warunek to nie tylko rozwiązanie dla studentów. Za pomocą warunków można rozwidlać algorytm i tworzyć nowe ścieżki, którymi ma podążać. Prezentuję podstawy instrukcji warunkowych.

Procesor przetwarza instrukcję sekwencyjnie, jedna po drugiej. Miejsce, w którym następuje warunkowe rozwidlenie algorytmu, tworzy konieczność użycia instrukcji procesora, która przeskoczy z jednego miejsca programu w inne miejsce. Takie instrukcje nazywają się instrukcjami skoku i są powiązane z warunkiem "skocz, jeśli…". Procesor posiada kilka instrukcji porównań, które są zespolone ze skokiem: skocz jeśli większe, skocz jeśli mniejsze, skocz jeśli mniejsze równe, skocz jeśli większe równe, skocz jeśli równe. To "jeśli" to właśnie warunek, którym będziemy się teraz zajmować.

Używając języków wyższego poziomu, niż asembler, mamy do czynienia z konstrukcjami języka, które w elegancki sposób pozwalają nam na warunkowe wykonywanie bloków programu. Ogólna koncepcja jest następująca: tworzymy warunek, który należy spełnić, aby wykonał się blok instrukcji. Ma to (w zdecydowanej większości języków) konstrukcję:

if (warunek) {
  // blok instrukcji
}

Dodatkowo istnieje jeszcze konstrukcja, która pozwala utworzyć bloku programu, który ma się wykonać w przypadku przeciwnym, niż ten umieszczony w warunku:

if (warunek) {
 // blok instrukcji
}
else {
 // blok instrukcji, gdy warunek nie jest spełniony
}

Warunki

Warunek jest spełniony, to znaczy, że wyrażenie warunkowe przyjmuje wartość prawdziwą. Prawdą jest wszystko to, co nie jest zerem (0, false, null, undefined). Wartości dodatnie i ujemne są traktowane jako prawda.

Int c = -1;

if (c) {
  // ten blok się wykona
}

Niektóre języki jednak nie pozwolą na taki zapis i wymuszają użycie operatora logicznego. Swoją drogą, dobrą praktyką jest zawsze używanie operatora- pozwoli to na zaoszczędzenie późniejszego degubowania, np. Gdy powstanie sytuacja, gdy wartość ujemna pojawi się jako wartość zmiennej.

Warunek może składać się z więcej niż jednego porównania. Aby łączyć wiele warunków należy użyć koniunkcji lub alternatywy (w zależności od języka && albo AND - dla koniunkcji i || albo OR - dla alternatywy).

Np. gdy chcemy, aby warunek był spełniony tylko wtedy, gdy wartość zmiennej jest większa od 10 ale mniejsza od 100, możemy to zapisać w następujący sposób:

if (c > 100 && c < 100) {
  // blok instrukcji
}

Nie ma ograniczeń, jeżeli chodzi o ilość porównań, która może wystąpić w warunku, należy pamiętać o czytelność zapisu. W przypadku, gdy potrzebujemy bardziej wyrafinowanych warunków jak np. Alternatywa wykluczająca, z pomocą przychodzą Prawa De Morgana, nie trzeba jednak znać ich na pamięć- w pewnym momencie, po napisaniu tysiąca warunków ich użycie jest naturalne, można z nich korzystać bez świadomości, że właśnie taką mają nazwę.

Bloki instrukcji

Jak napisałem wcześniej, po spełnionym warunku program przejdzie do wykonywania instrukcji zawartych w bloku spełnionego warunku. Języki umożliwiają tworzenie konstrukcji warunkowych bez użycia bloku: gdy warunek jest spełniony, zostanie wykonana pierwsza instrukcja, która następuje po warunku:

if (c == 100) 
printf("c jest rowne 100, ide dalej");
c = 123;

Osobiście odradzam taką formę "krótkich ifów" ponieważ istnieje zbyt duże ryzyko pomyłki (np. gdy z rozpędu dodamy kolejną instrukcję, która powinna być umieszczona w bloku). Moim zdaniem lepiej jest zawsze tworzyć nowy blok ponieważ zwiększa to czytelność a te dwa dodatkowe znaki to nie jest aż tak duży nadmiar wysiłku (dla zwolenników pisania "optymalnego kodu" podpowiem, że takie krótkie warunki kompilator i tak optymalizuje za nas).

Wiele rozwidleń

Bez problemu można tworzyć warunki, które będą miały wiele innych bloków "w przeciwnym razie". Np. Jeżeli zarobiłem do 100PLN to kupię palto, jeżeli zarobiłem do tysiąc złotych to kupię skórzaną kurtkę a w innym przypadku wszystko zainswestuję:

int wyplata = 230;

if (wyplata <= 100) {
  printf("palto");
}
else if (wyplata > 100 && wyplata <= 1000) {
  printf ("skorka");
}
else {
  printf("inwestycja");
}

Ćwiczenia

  1. W jaki sposób zmienisz warunek na fałszywy? Jakim operatorem się posłużysz?
  2. Zapisz warunek przy użyciu zmiennych a i b, który będzie prawdziwy tylko wtedy, gdy tylko jedna z tych zmiennych jest prawdziwa.
  3. Jak nazywa się to, co stworzyłeś/stworzyłaś powyżej?
  4. Przeczytaj poniższy kod, co się stanie i dlaczego:
    
    int c = 10;
    if (c > 20); {
    printf("c wieksze od 20");
    }

4. Napisz kod, który wyświetli "igielka", gdy zmienna ```c``` będzie większa od 400, Następnie, gdy c jest większe od 400 ale mniejsze od 500, wyświetli "petarda", w innym przypadku "bomba".
5. Napisz kod, który wyświetli liczbę kartonów wraz z etykietą, tj. wyświetli wartość liczbową a następnie poprawnie odmieniony rzeczownik, np. "3 kartonow", "1 karton", etc.
6. Czy istnieje (a jeżeli tak, to jaki), uniwersalny sposób na poprawne wyświetlanie odmienionej formy rzeczowników? (zadanie z gwiazdką)

- - - 
- _Następna część: [Warunki, odpowiedzi](https://programowaniejestlatwe.pl/artykul/warunki-odpowiedzi?internal=1 "Warunki, odpowiedzi")_

Dodano: 2018-03-24 12:01 przez Piotr Poźniak

ćwiczenia , warunki , if , else alternatywa , koniunkcja , XOR ,
Piotr Poźniak
O autorze:

Programuję od ponad 15 lat. Prowadzę software house. Angażuję i zachęcam wszystkich do programowania w ramach inicjatywy Programowanie jest łatwe.

Komentarze:

Skomentowano: 2018-03-27 10:22 przez angelikajanowicz

  1. if (i == 0)
  2. if (a != 0 || b!=0) alternatywa
  3. blok wykona się, ponieważ po warunku występuje średnik.
  4. if (c > 400) { cout << "igielka"; }

if.(c > 400 && c < 500) { cout << "petarda";} else { cout<< "bomba";}

Skomentowano: 2018-03-27 05:36 przez Piotr Poźniak

@angelikajanowicz no no, nieźle :)

ad 1. można tak ale jest także specjalny operator, jaki to operator? ad 2. alternatywa, którą użyłaś dopuszcza sytuację, gdy a i b są prawdziwe a pytanie dotyczy sytuacji, gdy tylko jedna z nich ma być prawdziwa. ad 3. Bingo! A czym jest ten średnik? Możesz rozwinąć? ad 4. pomijając kropkę za if jest to poprawna odpowiedź. Teraz zdałem sobie sprawę, że niewłaściwie zadałem pytanie :/ Ale punkt dla Ciebie, zostało jeszcze jedno zadanie :)

Skomentowano: 2018-03-27 09:05 przez angelikajanowicz

Średnik jest tutaj zakończeniem warunku i po nim wykonuje się blok, który tego warunku już nie dotyczy, tak myślę.

  1. Hmm, nie wiem czy poprawny jest zapis if (a != 0, b == 0 ^ a == 0, b != 0). W każdym razie chodzi o alternatywę rozłączną, tak?

Piąte:

if (liczba_kartonow == 1) {
  cout << "1 karton";
}
else if (liczba_kartonow > 1 && liczba_kartonow < 5) {
  cout << liczba_kartonow << "kartony";
}
else if (liczba_kartonow == 0 && liczba_kartonow > 5 && liczba_kartonow < 22) { 
  cout << liczba_kartonow << "kartonow";
}

Skomentowano: 2018-03-28 08:49 przez Piotr Poźniak

@angelikajanowicz w drugim dobrze tropisz ale zapis jest nieprawidłowy- używaj operatorów || dla alternatywy i && dla koniunkcji. W piątym ostatni warunek będzie spełniony tylko wtedy, gdy liczba_kartonow jest równa zero i większa od 5 a to nie jest możliwe (niewłaściwy operator). Dodatkowo, co się stanie, gdy będzie 25 kartonów? :)