Warunki, odpowiedzi - Programowanie jest łatwe

Żona mówi do męża: idź do sklepu i kup 10 jajek, jak będą parówki, kup 3. Mąż wraca z trzema jajkami.

fork.jpg Ten klasyczny żart brzmi nieco lepiej po angielsku, ponieważ w języku polskim wszystko zdradza odmiana rzeczownika. Nie mniej jednak, ten gag pokazuje jak ważne jest poprawne tworzenie warunków, ponieważ na złych zakupach może się nie skończyć.

  1. W jaki sposób zmienisz warunek na fałszywy? Jakim operatorem się posłużysz?

Jest kilka sposobów ale wszystkie mają wspólny mianownik: operator negacji !. W przypadku porównywania zmiennej do zera można użyć operatora != (nierówność), czyli np. if (zmienna != 0)

Następnie można zanegować zmienną, np. if (!zmienna). Jest to tożsame z zapisem powyżej. Można także negować całe wyrażenia oraz ich zestawienia, np. if (!(zmienna == 3)), co inaczej zapisane wygląda następująco: if (zmienna != 3). Możemy objąć nawiasem dowolne wyrażenia i zanegować całość albo część z nich. Ogólnie wszystko sprowadza się do Praw DeMorgana.

  1. Zapisz warunek przy użyciu zmiennych a i b, który będzie prawdziwy tylko wtedy, gdy tylko jedna z tych zmiennych jest prawdziwa.

Pytanie dotyczy alternatywy wyłącznej (czy wykluczającej się), w skrócie nazywanej XOR (od eXclusive OR): jedno albo drugie ale nie oba na raz. Tabela prawdy dla takiej konstrukcji wygląda następująco:

a | b | XOR
---------------
0 | 0 | 0
1 | 0 | 1
0 | 1 | 1
1 | 1 | 0

Czyli w przypadku, gdy zarówno a i b są fałszywe bądź oba są prawdziwe, wynikiem jest fałsz. Zapisać można to następująco:

if (a && !b || !a && b) Czytając "jeżeli a i nie b lub nie a i b". Korzystając z praw DeMorgana można zapisać warunek tak: if (a || b && !(a && b) ) Czytając: "jeżeli a lub b i nieprawda że a i b"- to znaczy, że dopuszczamy alternatywę ale wykluczamy sytuację, w której oba zdania są prawdziwe).

  1. Jak nazywa się to, co stworzyłeś/stworzyłaś powyżej?

Jak już wcześniej odpowiedziałem: alternatywa wykluczająca, czyli XOR (ksor). XOR odpowiada na pytanie: jaka jest różnica między "lub" i "albo", gdzie "lub" to alternatywa a "albo" to alternatywa wykluczająca. Pamiętaj o tym następnym razem, gdy zadasz komuś pytanie czy chce kawę czarną czy z mlekiem, co oznacza, że proponujesz dwie różne kawy w tym samym czasie :)

Przeczytaj poniższy kod, co się stanie i dlaczego:

int c = 10;
if (c > 20); {
  printf("c wieksze od 20");
}

Po wystąpieniu warunku musi wystąpić instrukcja albo blok instrukcji. W tym przypadku pomiędzy warunek a blok instrukcji wdał się średnik, który sam w sobie znaczy tyle co "zakończenie instrukcji" czy inaczej mówiąc "pustą instrukcję". To znaczy, że po spełnieniu warunku stanie się "nic" a następnie wykona się (zawsze! Bez znaczenia czy warunek był spełniony czy nie) blok, który wyświetli wiadomość na ekranie.

  1. 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".

Jest to proste zadanie bez żadnej podpuchy:

if (c > 400) {
  cout << "igielka";
}
else if (c > 400 && c < 500) {
  cout << "petarda";
}
else {
  cout << "bomba";
}
  1. 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.

To zadanie nie jest takie proste, ponieważ odmiana słowa "karton" zmienia się w zależności od liczebnika: 0 kartonów 1 karton 2 kartony 3 kartony 4 kartony 5 kartonów 6 kartonów … 21 kartonów 22 kartony 23 kartony 24 kartony 25 kartonów … 32 kartony 33 kartony 34 kartony 35 kartonów … Etc.

Czyli, 0 oraz 1 są specjalne i występują tylko raz. Następnie w zależności od jedności w liczebniku od 2 do 4, słowo karton ma formę "kartony" a w każdym innym przypadku odmienia się "kartonów". Trudność polega na określeniu jaka jest część jedności- czy jest ona większa równa 2 i mniejsza od 5. W trybie ekspert, na szybko można to sprawdzić nakładając maskę 0x2 na przesuniętą bitowo w prawo wartość zmiennej, i sprawdzając czy wynik jest niezerowy:

(ilosc_kartonów >> 1 ) & 0x2)

Żartowałem :)

Najprościej część dziesiętną wyłonić poprzez sprawdzenie jaka jest reszta z dzielenia danej liczby przez 10 (tzw. operacja modulo). Resztę z dzielenia uzyskujemy używając operatora arytmetycznego %. Czyli: 213 % 10 = 3 2 % 10 = 2 12422217 % 10 = 7 Zatem, jeżeli wynik modulo zmiennej przez 10 daje wynik większy i równy 2 ale mniejszy i równy 4, to znaczy, że odmieniony rzeczownik brzmi "kartony". Rozwiązanie wygląda następująco:

int ilosc_kartonow = 123;
if (ilosc_kartonow == 0) {
  cout "0 kartonow";
}
else if (ilosc_kartonow == 1) {
  Cout << "1 karton";
}
else if (ilosc_kartonow % 10 >= 2 && ilosc_kartonow % 10 <= 4) {
  cout << ilosc_kartonow << " kartony";
}
else {
  cout << ilosc_kartonow << " kartonow";
}

Dodano: 2018-03-30 07:38 przez Piotr Poźniak

ćwiczenia , odpowiedzi , 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.