Przejdź do treści

Temat 05 · 2 × 45 minINF.03

Porównania i instrukcje warunkowe

Program, który zawsze robi to samo, nie jest zbyt użyteczny. Prawdziwe skrypty podejmują decyzje: czy rabat się należy, czy hasła są zgodne, czy numer paliwa to 1 czy 2. W JavaScripcie decyzje podejmujesz porównaniami (dają true albo false) i instrukcjami warunkowymi (if, ?:, switch), które wybierają, który fragment kodu się wykona. To najczęściej sprawdzany temat w części pisemnej INF.03 i obecny w połowie zadań praktycznych – warto go opanować dokładnie.

Porównania dają true albo false

Operator porównania bierze dwie wartości i zwraca wartość logiczną (boolean). Taką wartość możesz wypisać, zapisać w zmiennej albo – najczęściej – wstawić do if.

OperatorZnaczeniePrzykładWynik
===równe (wartość i typ)5 === 5true
!==różne (wartość lub typ)5 !== "5"true
==równe po konwersji typów5 == "5"true
!=różne po konwersji typów5 != "5"false
<, >mniejsze, większe3 > 7false
<=, >=mniejsze lub równe, większe lub równe7 >= 7true
Sprawdź się

Co wypisze ten kod?

let a = 10;
let b = "10";
console.log(a == b, a === b, a != b, a !== b);
porownania.js
const punkty = 50;
console.log(punkty > 40);     // true
console.log(punkty >= 50);    // true – „co najmniej 50” to >=, nie >
console.log(punkty === 50);   // true
console.log(punkty === "50"); // false – liczba to nie napis
console.log(punkty == "50");  // true – == najpierw ujednolica typy
console.log("Słoń".toLowerCase() === "słoń"); // true – wynik porównania, nie napis
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik

Ostatnia linia to przykład z informatora CKE: document.write(word.toLowerCase() == 'słoń') wyświetla true, bo wypisujemy wynik porównania, a nie napis.

== czy ===?

== („luźna równość”) przed porównaniem próbuje sprowadzić obie strony do tego samego typu. Reguły są zaskakujące: 0 == "" to true, "" == false to true, null == undefined to true. === („ścisła równość”) nie konwertuje nic – różne typy oznaczają false. W swoim kodzie używaj === i !==; == musisz tylko umieć czytać, bo w arkuszach egzaminacyjnych jest wszędzie.

luzna-rownosc.js
console.log(0 == "");          // true – zaskakujące
console.log(0 === "");         // false – przewidywalne
console.log(null == undefined);  // true
console.log(null === undefined); // false
console.log("2" > "12");       // true! dwa napisy porównują się jak w słowniku ("2" > "1")
console.log(2 > "12");         // false – liczba z napisem: napis zamienia się w liczbę
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik

Co jest „prawdą” w if?

W if (…) możesz wstawić dowolną wartość, nie tylko boolean. JavaScript sam zamienia ją na true lub false. Tylko kilka wartości daje false – nazywamy je falsy: false, 0, "" (pusty napis), null, undefined, NaN (oraz rzadko spotykane -0 i 0n). Wszystko inne jest truthy, w tym napis "0", napis "false" i każda niepusta tablica.

truthy-falsy.js
const imie = "";
if (imie) {
  console.log("Witaj,", imie);
} else {
  console.log("Nie podano imienia"); // pusty napis jest falsy
}
console.log(Boolean("0"), Boolean(0), Boolean("false")); // true false true
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik

To wygodne przy sprawdzaniu, czy pole formularza jest puste (if (pole.value)), ale bywa pułapką: if (liczbaSztuk) odrzuci też poprawne zero.

if, else if, else

Instrukcja if wykonuje blok w klamrach, gdy warunek jest prawdziwy. else dodaje blok „w przeciwnym razie”, a else if – kolejny warunek sprawdzany tylko wtedy, gdy poprzednie zawiodły.

Schemat blokowy: warunek punkty >= 50 rozdziela wykonanie na gałąź true (wynik = zdane) i false (wynik = niezdane), po czym obie gałęzie łączą się w kodzie po if
Rys. 1. Wykonuje się dokładnie jedna gałąź, potem program idzie dalej.
ocena.js
const procent = 72;
let ocena;

if (procent >= 90) {
  ocena = "celujący";
} else if (procent >= 75) {
  ocena = "bardzo dobry";
} else if (procent >= 50) {
  ocena = "dostateczny";
} else {
  ocena = "niedostateczny";
}
console.log(`${procent}% → ${ocena}`);
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik

Zwróć uwagę na kolejność. Warunki są sprawdzane od góry, a wykonuje się pierwszy pasujący. Gdyby procent >= 50 stało na początku, 72 % i 95 % dostałyby „dostateczny”. Przy zakresach układaj progi od największego do najmniejszego (albo od najmniejszego z <), nigdy na przemian.

Sprawdź się

Co wypisze ten kod?

var wiek = 17;
if (wiek >= 18) document.write("dorosły");
else if (wiek >= 13) document.write("nastolatek");
else document.write("dziecko");

Operatory logiczne: &&, ||, !

Pojedyncze porównanie rzadko wystarcza. Warunki łączysz trzema operatorami:

OperatorCzyta sięWynik true, gdy…Przykład
a && b„i” (AND)oba warunki są prawdziwewiek >= 18 && maBilet
a || b„lub” (OR)co najmniej jeden jest prawdziwydzien === "sob" || dzien === "nd"
!a„nie” (NOT)warunek jest fałszywy!zalogowany

Tabela prawdy do zapamiętania:

aba && ba || b!a
truetruetruetruefalse
truefalsefalsetruefalse
falsetruefalsetruetrue
falsefalsefalsefalsetrue
logiczne.js
const zakupy = 250;
const kolor = "zielony";

console.log(zakupy > 200 && kolor === "zielony");  // true && true  → true
console.log(zakupy > 300 || kolor === "zielony");  // false || true → true
console.log(!(zakupy > 200));                      // !true → false
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik

Nawiasy: && wiąże silniej niż ||

Tak jak mnożenie wykonuje się przed dodawaniem, tak && wykonuje się przed ||. Zapis a || b && c znaczy a || (b && c). Jeśli chcesz najpierw „lub”, musisz dać nawiasy. To sedno najczęstszego pytania w części pisemnej.

Zadanie w stylu CKE: „Rabat przysługuje, gdy wartość zakupów przekracza 200 zł i sweter jest zielony lub niebieski”.

rabat.js
function czyRabat(zakupy, kolor) {
  return zakupy > 200 && (kolor === "zielony" || kolor === "niebieski");
}
console.log(czyRabat(250, "zielony"));    // true  – spełnione oba
console.log(czyRabat(250, "czerwony"));   // false – zły kolor
console.log(czyRabat(150, "niebieski"));  // false – za mało zakupów

// Bez nawiasów znaczenie się zmienia: (zakupy > 200 && zielony) || niebieski
function zleBezNawiasow(zakupy, kolor) {
  return zakupy > 200 && kolor === "zielony" || kolor === "niebieski";
}
console.log(zleBezNawiasow(150, "niebieski")); // true – rabat za 150 zł! błąd
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik
Sprawdź się

Które wyrażenie sprawdza, że pracownik ma umowę o pracę i zarabia od 4000 do 4500 zł włącznie?

Od zdania do warunku

Na egzaminie dostajesz zdanie po polsku i cztery wyrażenia. Tłumacz słowo po słowie:

W treści zadaniaW kodzie
„i”, „oraz”, „jednocześnie”, „a także”&&
„lub”, „albo”, „bądź”||
„nie”, „różny od”!, !==
„przekracza”, „większy niż”, „powyżej”>
„co najmniej”, „nie mniej niż”, „minimum”>=
„mniej niż”, „poniżej”<
„co najwyżej”, „nie więcej niż”, „maksymalnie”<=
„od A do B włącznie”, „w przedziale”x >= A && x <= B
„równa się”, „wynosi”, „jest równy”=== (w arkuszach ==)
„X lub Y” o jednej zmiennej(z === X || z === Y) – w nawiasach, gdy obok stoi &&
Sprawdź się

Paczka jest darmowa, gdy klient ma dokładnie 20 punktów, zamawia co najmniej 3 paczki i dystans wynosi 200 km. Który zapis jest poprawny?

Sprawdź się

Dla jakiego x warunek x > 5 && x < 10 || x == 0 jest prawdziwy?

Leniwe obliczanie

&& i || przestają sprawdzać, gdy znają wynik. false && cokolwiek nie oblicza prawej strony; true || cokolwiek też nie. Dlatego bezpieczny jest zapis if (tab !== null && tab.length > 0) – gdy tab jest null, prawa strona nigdy się nie wykona i nie będzie błędu.

Operator warunkowy ?:

Gdy w zależności od warunku chcesz wybrać wartość (a nie wykonać kilka instrukcji), wygodniejszy od if/else jest operator warunkowy, zwany też trójargumentowym: warunek ? wartośćGdyTrue : wartośćGdyFalse.

Sprawdź się

Co wypisze ten kod?

const temperatura = 3;
const komunikat = temperatura > 0 ? "plus" : "mróz";
console.log(komunikat);
ternary.js
const sztuk = 1;
const koncowka = sztuk === 1 ? "sztuka" : "sztuk";
console.log(`${sztuk} ${koncowka}`);

// To samo przez if/else – dłużej:
let koncowka2;
if (sztuk === 1) {
  koncowka2 = "sztuka";
} else {
  koncowka2 = "sztuk";
}
console.log(koncowka === koncowka2); // true – obie wersje są równoważne
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik

Zasada: ?: do jednej wartości w jednej linii. Zagnieżdżone a ? b : c ? d : e da się napisać, ale jest nieczytelne – wtedy wracaj do if/else if.

switch: wiele wariantów jednej wartości

Gdy sprawdzasz jedną zmienną wobec kilku konkretnych wartości („1 → benzyna, 2 → diesel, 3 → LPG”), czytelny jest switch. Każdy case kończ instrukcją break, inaczej wykonanie „przelewa się” do następnego przypadku. default łapie wszystko, co nie pasowało.

switch.js
const dzien = 6;
let nazwa;

switch (dzien) {
  case 1:
    nazwa = "poniedziałek";
    break;
  case 6:
  case 7:                 // dwa przypadki, jedna akcja – celowe „przelanie”
    nazwa = "weekend";
    break;
  default:
    nazwa = "dzień roboczy";
}
console.log(nazwa); // weekend
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik

Kiedy co wybrać: switch – jedna zmienna, kilka konkretnych wartości; if/else if – zakresy (>=), warunki złożone, różne zmienne; ?: – wybór jednej z dwóch wartości.

Zagnieżdżanie warunków

if może być w środku innego if. Działa, ale szybko robi się nieczytelne. Często zagnieżdżenie zamienisz na &&, a „sprawdź i wyjdź” załatwisz wcześnie – np. w funkcji przez return (lekcja Funkcje).

zagniezdzenie.js
const wiek = 16;
const zgodaRodzica = true;

// wersja zagnieżdżona
if (wiek < 18) {
  if (zgodaRodzica) {
    console.log("Udział dozwolony (zgoda rodzica)");
  } else {
    console.log("Brak zgody rodzica");
  }
} else {
  console.log("Udział dozwolony (pełnoletni)");
}

// wersja płaska – to samo znaczenie
if (wiek >= 18 || zgodaRodzica) {
  console.log("Udział dozwolony");
} else {
  console.log("Brak zgody rodzica");
}
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik

Zapowiedź: warunek w przeglądarce

DOM poznasz od lekcji Model DOM, ale zobacz już teraz, jak if steruje stroną. Kliknij przycisk i podaj kwotę.

Rabat w sklepie
const przycisk = document.getElementById('sprawdz');
const akapit = document.getElementById('wynik');

przycisk.addEventListener('click', () => {
  const zakupy = Number(prompt('Wartość zakupów (zł):'));
  const kolor = prompt('Kolor swetra:');

  if (zakupy > 200 && (kolor === 'zielony' || kolor === 'niebieski')) {
    akapit.textContent = `Rabat przysługuje (${zakupy} zł, sweter ${kolor}).`;
  } else {
    akapit.textContent = 'Brak rabatu.';
  }
});
Podgląd

Na egzaminie

Ściąga

SkładniaCo robiPrzykład
a === b, a !== brówność / nierówność ścisła (wartość i typ)"5" === 5 → false
a == b, a != brówność / nierówność z konwersją typów (dialekt egzaminacyjny)"5" == 5 → true
<, <=, >, >=porównania liczb (napisy – jak w słowniku)7 >= 7 → true
a && bprawda, gdy oba prawdziwe; wiąże silniej niż ||x > 0 && x < 10
a || bprawda, gdy co najmniej jeden prawdziwyk === "a" || k === "b"
!azaprzeczenie!zaznaczony
( … )wymusza kolejnośća && (b || c)
if (w) { } else if (w2) { } else { }pierwsza pasująca gałąźif (p >= 50) {…} else {…}
w ? x : ywartość x, gdy w prawdziwe, inaczej yn === 1 ? "szt." : "sztuk"
switch (v) { case a: … break; default: … }dopasowanie v do wartości (ściśle, jak ===)case "1": cena = 4; break;
falsyfalse, 0, "", null, undefined, NaNif (pole.value) – puste pole to false

Zadania

Zadanie 1
łatwe

Ocena z punktów

Zapisz w stałej punkty liczbę od 0 do 100. Wypisz w konsoli ocenę według progów: 90 i więcej – „celujący”, 75–89 – „bardzo dobry”, 50–74 – „dostateczny”, mniej niż 50 – „niedostateczny”. Dodatkowo, jeżeli punkty jest poza zakresem 0–100, wypisz tylko „Błędna liczba punktów” i nic więcej. Sprawdź program dla wartości 95, 75, 49 i 120.

Pokaż rozwiązanie
ocena.js
const punkty = 75;

if (punkty < 0 || punkty > 100) {
  // sprawdzamy zakres NAJPIERW, inaczej 120 dostałoby „celujący”
  console.log("Błędna liczba punktów");
} else if (punkty >= 90) {
  console.log("celujący");
} else if (punkty >= 75) {
  console.log("bardzo dobry");       // 75 wchodzi tu: 75 >= 75 jest true
} else if (punkty >= 50) {
  console.log("dostateczny");
} else {
  console.log("niedostateczny");
}
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik
Zadanie 2
średnie

Zdania na warunki

Dla każdego zdania napisz funkcję zwracającą true/false (nazwa funkcji ma opisywać, co sprawdza) i wywołaj ją z dwoma zestawami danych – jednym spełniającym, drugim nie:

  1. Rabat na farbę przysługuje, gdy kolor to „niebieski” lub „zielony” i pojemność puszki wynosi 2 l.
  2. Uczeń dostaje stypendium, gdy średnia jest co najmniej 4,75 lub zajął miejsce 1–3 w konkursie (włącznie).
  3. Hasło jest poprawne, gdy ma od 8 do 16 znaków włącznie i nie jest równe loginowi.
  4. Bilet ulgowy należy się osobie poniżej 18 lat albo powyżej 65 lat, ale tylko w dni robocze (zmienna weekend typu boolean).
Pokaż rozwiązanie
warunki.js
function rabatNaFarbe(kolor, pojemnosc) {
  // „lub” między kolorami w nawiasach, bo obok stoi &&
  return (kolor === "niebieski" || kolor === "zielony") && pojemnosc === 2;
}
console.log(rabatNaFarbe("zielony", 2), rabatNaFarbe("zielony", 5)); // true false

function maStypendium(srednia, miejsce) {
  // zakres 1–3 to dwa warunki z &&; całość z || bo wystarczy jedno
  return srednia >= 4.75 || (miejsce >= 1 && miejsce <= 3);
}
console.log(maStypendium(4.2, 2), maStypendium(4.2, 7)); // true false

function hasloPoprawne(haslo, login) {
  return haslo.length >= 8 && haslo.length <= 16 && haslo !== login;
}
console.log(hasloPoprawne("tajne1234", "ania"), hasloPoprawne("ania", "ania")); // true false

function biletUlgowy(wiek, weekend) {
  // „poniżej 18 albo powyżej 65” w nawiasach, „tylko w dni robocze” to && !weekend
  return (wiek < 18 || wiek > 65) && !weekend;
}
console.log(biletUlgowy(70, false), biletUlgowy(70, true)); // true false
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik
Zadanie 3
trudnejak na INF.03

Cennik paliwa w trzech wersjach

Zadanie według wzoru z sesji czerwiec 2022: na stronie obliczenia.html są dwa pola numeryczne – rodzaj paliwa (1 lub 2) i liczba litrów – oraz przycisk „OBLICZ”. Pod przyciskiem, w akapicie, ma się pojawić tekst koszt paliwa: <kwota> zł. Cena litra: rodzaj 1 → 4 zł, rodzaj 2 → 3,5 zł, każdy inny → 0 zł.

Formularz zrobisz w lekcji Wzorzec kalkulator. Dziś napisz samą logikę: funkcję kosztPaliwa(rodzaj, litry), która zwraca gotowy napis, w trzech wersjach – z if/else if/else, ze switch i z operatorem ?:. Przetestuj każdą dla danych (1, 10), (2, 10) i (7, 10).

Kryteria w stylu „Zasad oceniania” (każde 0/1):

  • 5.1 kod jest poprawnym składniowo JavaScriptem i wykonuje się bez błędów,
  • 5.2 dla rodzaju 1 cena litra wynosi 4, dla rodzaju 2 – 3,5, dla innego – 0,
  • 5.3 koszt to cena litra pomnożona przez liczbę litrów,
  • 5.4 wynik ma dokładnie postać koszt paliwa: 40 zł (małe litery, dwukropek, spacja, „zł”),
  • 5.5 nazwy funkcji i zmiennych odzwierciedlają ich przeznaczenie (nie a, x1, f).
Pokaż rozwiązanie
paliwo.js
// Wersja 1: if / else if / else
function kosztPaliwaIf(rodzaj, litry) {
  let cenaLitra;
  if (rodzaj === 1) {
    cenaLitra = 4;
  } else if (rodzaj === 2) {
    cenaLitra = 3.5;
  } else {
    cenaLitra = 0;
  }
  return `koszt paliwa: ${cenaLitra * litry} zł`;
}

// Wersja 2: switch – jedna zmienna, konkretne wartości
function kosztPaliwaSwitch(rodzaj, litry) {
  let cenaLitra;
  switch (rodzaj) {
    case 1:
      cenaLitra = 4;
      break;
    case 2:
      cenaLitra = 3.5;
      break;
    default:
      cenaLitra = 0;
  }
  return `koszt paliwa: ${cenaLitra * litry} zł`;
}

// Wersja 3: operator ?: – dwa poziomy, bo są trzy wyniki
function kosztPaliwaTernary(rodzaj, litry) {
  const cenaLitra = rodzaj === 1 ? 4 : rodzaj === 2 ? 3.5 : 0;
  return `koszt paliwa: ${cenaLitra * litry} zł`;
}

// Testy – te same dane do każdej wersji
console.log(kosztPaliwaIf(1, 10), "|", kosztPaliwaSwitch(1, 10), "|", kosztPaliwaTernary(1, 10)); // 40 zł
console.log(kosztPaliwaIf(2, 10), "|", kosztPaliwaSwitch(2, 10), "|", kosztPaliwaTernary(2, 10)); // 35 zł
console.log(kosztPaliwaIf(7, 10), "|", kosztPaliwaSwitch(7, 10), "|", kosztPaliwaTernary(7, 10)); // 0 zł
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik

Uwaga na egzaminie: wartość z pola formularza będzie napisem "1", więc przed switch (rodzaj) z case 1: trzeba ją zamienić na liczbę (Number(pole.value)), inaczej żaden case nie pasuje i wychodzi 0 zł.

Zadanie 4
trudne

Rok przestępny i bilet do kina

Dwa niezależne warunki do napisania:

  1. Funkcja czyPrzestepny(rok) – rok jest przestępny, gdy dzieli się przez 4, ale nie przez 100, chyba że dzieli się też przez 400. Sprawdź dla 2024 (tak), 1900 (nie), 2000 (tak), 2023 (nie). Przypomnienie: rok % 4 === 0 oznacza podzielność przez 4.
  2. Funkcja cenaBiletu(wiek, godzina, czyWtorek) – cena bazowa 30 zł; osoby poniżej 12 lat i od 65 lat płacą 18 zł; seans przed 13:00 obniża każdą cenę o 5 zł; we wtorek wszyscy płacą 15 zł niezależnie od reszty. Zwróć liczbę. Sprawdź: (30, 20, false) → 30; (10, 20, false) → 18; (10, 11, false) → 13; (40, 11, true) → 15.
Pokaż rozwiązanie
przestepny-bilet.js
function czyPrzestepny(rok) {
  // (podzielny przez 4 i niepodzielny przez 100) lub podzielny przez 400
  return (rok % 4 === 0 && rok % 100 !== 0) || rok % 400 === 0;
}
console.log(czyPrzestepny(2024), czyPrzestepny(1900), czyPrzestepny(2000), czyPrzestepny(2023));
// true false true false

function cenaBiletu(wiek, godzina, czyWtorek) {
  if (czyWtorek) {
    return 15;                     // wtorek przebija wszystko – sprawdzamy go pierwszego
  }
  let cena = (wiek < 12 || wiek >= 65) ? 18 : 30;
  if (godzina < 13) {
    cena -= 5;
  }
  return cena;
}
console.log(cenaBiletu(30, 20, false), cenaBiletu(10, 20, false), cenaBiletu(10, 11, false), cenaBiletu(40, 11, true));
// 30 18 13 15
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik

Test powtórkowy

Test powtórkowy

Format jak w części pisemnej INF.03: jedna poprawna odpowiedź. Kod bywa w dialekcie egzaminacyjnym (var, ==, document.write).

0/0poprawnych
Sprawdź się

Zniżka na bilet przysługuje, gdy osoba ma mniej niż 18 lat lub więcej niż 65 lat i jednocześnie posiada kartę miejską. Który warunek jest poprawny?

Sprawdź się

Dlaczego poniższy kod nie wyświetli komunikatu?

var x = 10;
switch (x) {
case "10":
  alert("dziesięć");
  break;
}
Sprawdź się

Co wyświetli ten kod?

var a = 5, b = "5";
document.write(a == b);
document.write(a === b);
Sprawdź się

Który fragment jest funkcjonalnie równoważny kodowi: if (n > 0) { znak = 1; } else { znak = -1; }

Sprawdź się

Wyrażenie wiek >= 18 jest prawdziwe dla:

Sprawdź się

Co wypisze ten kod?

var kolor = "czerwony";
if (kolor = "zielony") {
console.log("rabat");
} else {
console.log("brak rabatu");
}
Sprawdź się

Które z wyrażeń jest prawdziwe dla KAŻDEJ liczby x, więc nie nadaje się do sprawdzania zakresu?

Sprawdź się

Co wypisze ten kod?

var ilosc = 0;
if (ilosc) {
document.write("w koszyku");
} else {
document.write("pusty koszyk");
}
Sprawdź się

Które zdanie opisuje działanie kodu if (a > b) max = a; else max = b;?

Sprawdź się

W kodzie switch (opcja) { case 1: cena = 5; case 2: cena = 6; break; default: cena = 0; } dla opcja = 1 zmienna cena przyjmie wartość: