Złożona Logika i Priorytety

Javascript
Priorytet: Normalny Szkic

Zadanie 6.5: Złożona Logika i Priorytety

Wstęp

W poprzednich zadaniach używaliśmy prostych warunków. Jednak w prawdziwych aplikacjach (np. bankowych, grach) decyzje zależą od wielu czynników jednocześnie, a kolejność sprawdzania ma ogromne znaczenie. Czy wiedziałeś, że && działo "silniej" niż ||?

Cel zadania

Zrozumienie priorytetów operatorów logicznych, grupowania warunków nawiasami oraz tworzenia czytelnych, wielo-zmiennych instrukcji decyzyjnych.

Wymagania techniczne

  1. Rozumienie, że AND ma wyższy priorytet niż OR.
  2. Umiejętne stosowanie nawiasów () do wymuszania kolejności.
  3. Budowanie warunków z 4+ zmiennymi.

Teoria: Kolejność Działań (Precedence)

W matematyce mnożenie wykonujemy przed dodawaniem: 2 + 2 * 2 to 6, a nie 8. W logice jest tak samo!

  1. ! (NOT) - Najwyższy priorytet (najsilniejszy)
  2. && (AND) - Średni priorytet
  3. || (OR) - Najniższy priorytet (najsłabszy)

Przykład pułapki

Chcemy wpuścić nastolatka, jeśli ma bilet LUB zaproszenie, ORAZ ma zgodę rodzica.

let bilet = true;
let zaproszenie = false;
let zgoda = false;

// ŹLE:
if (bilet || zaproszenie && zgoda) { ... }

Komputer zrozumie to tak: bilet || (zaproszenie && zgoda). Ponieważ bilet jest true, cały warunek będzie true, mimo braku zgody! Operator && "przykleił się" tylko do zaproszenia.

POPRAWNIE: Używamy nawiasów, by wymusić kolejność:

// (Bilet LUB Zaproszenie) I Zgoda
if ((bilet || zaproszenie) && zgoda) { ... }

Kroki do wykonania

Stwórz plik system_bankowy.js.

Przykład: Analiza wniosku kredytowego

Bank udzieli kredytu, jeśli:

  1. Wnioskodawca ma stałą pracę.
  2. Zarobki są powyżej 3000 zł.
  3. LUB jeśli klient jest VIP-em (wtedy praca i zarobki nie są aż tak ważne, ale musi mieć pozytywną historię kredytową).
  4. W KAŻDYM PRZYPADKU wnioskodawca nie może być na "czarnej liście".

Przeanalizujmy kod:

let stalaPraca = false;
let zarobki = 2500;
let isVIP = true;
let historiaKredytowaWzorowa = true;
let czarnaLista = false;

// Warunek podstawowy: Praca I Zarobki
let zdolnoscPodstawowa = stalaPraca && zarobki > 3000;

// Warunek VIP: Bycie VIP I Historia
let zdolnoscVIP = isVIP && historiaKredytowaWzorowa;

// Decyzja końcowa: (Podstawowa LUB VIP) I (NIE czarna lista)
if ((zdolnoscPodstawowa || zdolnoscVIP) && !czarnaLista) {
    console.log("Kredyt przyznany.");
} else {
    console.log("Odmowa.");
}

Zadanie praktyczne

Napisz system dla "Inteligentnego Domu", który decyduje, czy włączyć alarm.

  1. Zdefiniuj zmienne:

    • czujnikRuchu (boolean)
    • czujnikDrzwi (boolean - true jeśli otwarte)
    • czujnikOkna (boolean - true jeśli otwarte)
    • domownicyWDomu (boolean)
    • trybNocny (boolean)
    • uprawnionyUzytkownik (boolean - np. przyszedł ktoś z pilotem)
  2. Alarm powinien się włączyć (console.log("ALARM!")) w dwóch sytuacjach:

    • Sytuacja A (Włamanie pod nieobecność): Nikogo nie ma w domu (!domownicyWDomu) ORAZ (wykryto ruch LUB otwarto drzwi LUB otwarto okno).
    • Sytuacja B (Włamanie w nocy): Jest tryb nocny ORAZ (otwarto drzwi LUB otwarto okno) -> ruch ignorujemy, bo domownicy mogą chodzić do łazienki.
  3. WYJĄTEK: Alarm NIGDY nie może się włączyć, jeśli system rozpoznał uprawnionego użytkownika (uprawnionyUzytkownik), nawet jeśli czujniki szaleją.

  4. Napisz JEDNĄ instrukcję if, która obsłuży całą tę logikę. Użyj nawiasów i zmiennych pomocniczych (opcjonalnie), aby kod był czytelny.

Przykład struktury (uzupełnij warunek):

if ( ...warunek... ) {
    console.log("ALARM! Wzywam policję!");
} else {
    console.log("System czuwa. Jest bezpiecznie.");
}

[!TIP] Rozbij problem na mniejsze kawałki. Możesz stworzyć zmienną czyIntruz = (ruch || drzwi || okna) i użyć jej w dalszej części.

[!IMPORTANT] Commit: Zadanie 6.5 - Złożona Logika.