Wyrażenia logiczne: Prawda i fałsz

Kurs: Wstęp do programowania
Lekcja 2: Podstawy składni języka programowania
Temat 3: Wyrażenia w programowaniu
Podtemat 2: Wyrażenia logiczne: Prawda i fałsz

⇓ spis treści ⇓


Wyrażenia logiczne to podstawowy element każdego języka programowania, który umożliwia podejmowanie decyzji na podstawie warunków. Używając wyrażeń logicznych, programy mogą wykonywać różne ścieżki kodu w zależności od tego, czy określone warunki są spełnione, czy nie. Wyrażenia te zawsze zwracają wartość logiczną: true (prawda) lub false (fałsz).

W programowaniu wyrażenia logiczne są szeroko stosowane w instrukcjach warunkowych, takich jak if, oraz w pętlach, aby kontrolować, kiedy dany fragment kodu powinien być wykonany. Aby w pełni zrozumieć ich działanie, musimy najpierw omówić podstawowe operatory logiczne, sposób ich użycia oraz typowe zastosowania w kodzie.

Podstawowe operatory logiczne

W językach programowania mamy do dyspozycji kilka podstawowych operatorów logicznych, które umożliwiają tworzenie wyrażeń logicznych:

1. Operator && zwraca true tylko wtedy, gdy oba wyrażenia, które łączy, są prawdziwe. Jeśli którekolwiek z wyrażeń jest fałszywe, wynik będzie false.

int a = 10;
int b = 5;
bool wynik = (a > 0 && b < 10);  // wynik będzie true, ponieważ oba warunki są prawdziwe

2. Operator || (OR): Operator || zwraca true, jeśli przynajmniej jedno z wyrażeń, które łączy, jest prawdziwe. Wynik będzie false tylko wtedy, gdy oba wyrażenia są fałszywe.

int a = 10;
int b = 20;
bool wynik = (a > 15 || b < 25);  // wynik będzie true, ponieważ jeden z warunków (b < 25) jest prawdziwy

3. Operator ! (NOT): Operator ! neguje wartość logiczną. Jeśli wyrażenie jest prawdziwe, ! zmienia je na fałsz, i odwrotnie.

bool jestPrawda = true;
bool wynik = !jestPrawda;  // wynik będzie false, ponieważ negujemy wartość true

Operatory te są fundamentalne w budowaniu bardziej złożonych wyrażeń logicznych i umożliwiają programom reagowanie na różne sytuacje, w zależności od danych wejściowych lub stanu programu.

Operatory porównania

Oprócz operatorów logicznych, wyrażenia logiczne często wykorzystują operatory porównania, które służą do porównywania wartości. Oto podstawowe operatory porównania:

1. == (równość): Sprawdza, czy dwie wartości są równe. Zwraca true, jeśli są równe, i false, jeśli nie.

int a = 5;
int b = 5;
bool wynik = (a == b);  // wynik będzie true, ponieważ a jest równe b

2. != (nierówność): Sprawdza, czy dwie wartości nie są równe. Zwraca true, jeśli wartości są różne, i false, jeśli są takie same.

int a = 5;
int b = 10;
bool wynik = (a != b);  // wynik będzie true, ponieważ a jest różne od b

3. < (mniejsze niż): Sprawdza, czy pierwsza wartość jest mniejsza od drugiej. Zwraca true, jeśli tak jest, i false w przeciwnym razie.

int a = 3;
int b = 7;
bool wynik = (a < b);  // wynik będzie true, ponieważ a jest mniejsze od b

4. > (większe niż): Sprawdza, czy pierwsza wartość jest większa od drugiej. Zwraca true, jeśli tak jest, i false w przeciwnym razie.

int a = 10;
int b = 5;
bool wynik = (a > b);  // wynik będzie true, ponieważ a jest większe od b

5. <= (mniejsze lub równe): Sprawdza, czy pierwsza wartość jest mniejsza lub równa drugiej. Zwraca true, jeśli tak jest, i false w przeciwnym razie

int a = 5;
int b = 5;
bool wynik = (a <= b);  // wynik będzie true, ponieważ a jest równe b

6. >= (większe lub równe): Sprawdza, czy pierwsza wartość jest większa lub równa drugiej. Zwraca true, jeśli tak jest, i false w przeciwnym razie.

Tworzenie złożonych wyrażeń logicznych

Złożone wyrażenia logiczne można budować, łącząc proste wyrażenia za pomocą operatorów && i ||. Na przykład:

int a = 10;
int b = 5;
int c = 20;
bool wynik = (a > b && c > a);  // wynik będzie true, ponieważ oba warunki są prawdziwe

W powyższym przykładzie wyrażenie (a > b && c > a) zwraca true, ponieważ oba warunki są spełnione: a jest większe od b, a c jest większe od a.

Kolejność wykonywania operacji logicznych

Podobnie jak w matematyce, w wyrażeniach logicznych obowiązuje kolejność wykonywania operacji. Najpierw wykonywane są operacje logiczne NOT (!), następnie AND (&&), a na końcu OR (||). Można jednak zmienić kolejność za pomocą nawiasów, co jest powszechną praktyką, aby poprawić czytelność kodu.

Przykład z użyciem nawiasów:

bool wynik = (a > b || (c > d && e < f));

W tym przypadku warunek c > d && e < f zostanie oceniony jako pierwszy, a następnie wynik tej operacji zostanie użyty w operacji OR z a > b.

Przykłady zastosowań wyrażeń logicznych

Instrukcje warunkowe

Wyrażenia logiczne są powszechnie używane w instrukcjach warunkowych, które pozwalają programowi podjąć decyzję na podstawie określonych warunków. Na przykład:

int wiek = 20;
if (wiek >= 18 && wiek < 65) {
    std::cout << "Jesteś w wieku produkcyjnym." << std::endl;
} else {
    std::cout << "Nie jesteś w wieku produkcyjnym." << std::endl;
}

W powyższym przykładzie program sprawdza, czy wartość zmiennej wiek mieści się w przedziale od 18 do 64 lat. Jeśli oba warunki są spełnione, wypisuje komunikat „Jesteś w wieku produkcyjnym”, w przeciwnym razie – „Nie jesteś w wieku produkcyjnym”.

Pętle

Wyrażenia logiczne są również używane do kontrolowania pętli. Na przykład, w pętli while wyrażenie logiczne decyduje o tym, jak długo pętla będzie się wykonywać:

int licznik = 0;
while (licznik < 10) {
    std::cout << "Licznik: " << licznik << std::endl;
    licznik++;
}

Pętla while będzie się wykonywać, dopóki licznik jest mniejszy niż 10. Wyrażenie licznik < 10 jest wyrażeniem logicznym, które zwraca true lub false.

Pułapki i błędy w wyrażeniach logicznych

1. Przypisanie zamiast porównania: Jednym z najczęstszych błędów w wyrażeniach logicznych jest użycie operatora = (przypisanie) zamiast == (porównanie). Na przykład:

if (a = 5) {  // Błąd: przypisanie zamiast porównania
    // Kod zostanie zawsze wykonany, ponieważ a = 5 zwraca true
}

W tym przypadku zmienna a zostanie ustawiona na 5, a wyrażenie logiczne zawsze będzie zwracać true. Poprawne porównanie wygląda tak:

if (a == 5) {
    // Kod zostanie wykonany tylko wtedy, gdy a wynosi 5
}

2. Kolejność operatorów: Błędy mogą wynikać z nieprawidłowego użycia operatorów lub niezrozumienia kolejności wykonywania operacji. Warto stosować nawiasy, aby upewnić się, że wyrażenie jest oceniane w oczekiwany sposób.

3. Porównywanie zmiennoprzecinkowych: W przypadku porównywania liczb zmiennoprzecinkowych, takich jak 0.1 i 0.2, mogą wystąpić błędy precyzji. Zamiast używać operatora ==, warto sprawdzać, czy różnica między liczbami jest mniejsza od pewnego marginesu błędu.

double a = 0.1;
double b = 0.2;
if (fabs(a + b - 0.3) < 1e-9) {  // Sprawdzanie z marginesem błędu
    std::cout << "Liczby są równe." << std::endl;
}

Zastosowania wyrażeń logicznych w praktyce

  1. Weryfikacja danych wejściowych: Wyrażenia logiczne są używane do sprawdzania poprawności danych wejściowych, na przykład sprawdzanie, czy wiek użytkownika jest w odpowiednim przedziale, czy wprowadzony numer jest dodatni itp.
  2. Autoryzacja i uprawnienia: W systemach zabezpieczeń wyrażenia logiczne są używane do sprawdzania, czy użytkownik ma odpowiednie uprawnienia do wykonania danej operacji.
  3. Filtrowanie danych: W aplikacjach przetwarzających dane wyrażenia logiczne są wykorzystywane do filtrowania danych, na przykład wybierania tylko tych rekordów, które spełniają określone warunki.

Podsumowanie

Wyrażenia logiczne odgrywają kluczową rolę w programowaniu, umożliwiając podejmowanie decyzji i kontrolowanie przepływu programu. Dzięki operatorom logicznym i porównania możemy tworzyć warunki, które sterują działaniem programu w zależności od danych wejściowych lub stanu programu. Zrozumienie, jak działają wyrażenia logiczne i jakie są ich typowe pułapki, jest niezbędne do pisania poprawnego i efektywnego kodu. W tej lekcji nauczyłeś się, jak używać operatorów logicznych i porównania, jak budować złożone wyrażenia oraz jakie są najlepsze praktyki, aby unikać typowych błędów.

Następny podtemat ==> Praca z tekstem: Znaki i napisy



Spis Treści - Wstęp do programowania

Lekcja 3: Rozwiązywanie problemów i poprawność programów Lekcja 4: Praca z różnymi typami danych Lekcja 5: Obsługa plików i pamięci Lekcja 6: Zaawansowane techniki programistyczne Lekcja 7: Wskaźniki i pamięć dynamiczna Lekcja 8: Struktura kodu i abstrakcja Lekcja 9: Rekurencja i jej zastosowania Lekcja 10: Analiza wydajności algorytmów Lekcja 11: Technika "dziel i zwyciężaj" Lekcja 12: Struktury danych o dynamicznej budowie Lekcja 13: Struktury hierarchiczne: Drzewa Lekcja 14: Struktury danych z bibliotek Lekcja 15: Algorytmy z nawrotami Lekcja 16: Programowanie dynamiczne Lekcja 17: Programowanie zachłanne Lekcja 18: Praca z grafami

Jeśli chciałbyś być poinformowany o następnych kursach to zapisz się do naszego newslettera: