Złożona Logika i Priorytety
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
- Rozumienie, że
ANDma wyższy priorytet niżOR. - Umiejętne stosowanie nawiasów
()do wymuszania kolejności. - 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!
!(NOT) - Najwyższy priorytet (najsilniejszy)&&(AND) - Średni priorytet||(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:
- Wnioskodawca ma stałą pracę.
- Zarobki są powyżej 3000 zł.
- LUB jeśli klient jest VIP-em (wtedy praca i zarobki nie są aż tak ważne, ale musi mieć pozytywną historię kredytową).
- 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.
-
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)
-
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.
- Sytuacja A (Włamanie pod nieobecność): Nikogo nie ma w domu (
-
WYJĄTEK: Alarm NIGDY nie może się włączyć, jeśli system rozpoznał uprawnionego użytkownika (
uprawnionyUzytkownik), nawet jeśli czujniki szaleją. -
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.