MODUŁ 09
Obliczenia kosztów, rabaty i podsumowania
PPrezentacja dla nauczyciela
Tworzenie interaktywnych kalkulatorów wycen, koszyków zakupowych i konfiguratorów usług to jedno z najczęstszych zadań programistycznych. W tym module opanujesz precyzyjne operacje na kwotach, naliczanie progów rabatowych oraz dynamiczne sumowanie wielu zaznaczonych pozycji.
Pobieranie danych liczbowych i kalkulacja kwot
Kalkulatory cenowe na stronach internetowych bazują na prostych operacjach arytmetycznych: mnożeniu liczby zamówionych jednostek przez stawkę jednostkową oraz sumowaniu pozycji składowych. Wartości pobierane z kontrolek formularza zawsze odczytujemy jako tekst, dlatego pierwszym krokiem skryptu musi być konwersja na typ liczbowy za pomocą Number() lub parseFloat().
Chociaż operator mnożenia (*) w JavaScript potrafi niejawnie przekształcić łańcuchy cyfr na liczby, pominięcie jawnego rzutowania prowadzi do trudnych do wykrycia błędów, gdy w kolejnym kroku zechcemy dodać do siebie dwie kwoty (operator + zinterpretuje je jako łączenie tekstów).
Końcowy wynik finansowy należy sformatować za pomocą metody kwota.toFixed(2). Zwraca ona łańcuch znaków z dokładnie dwoma miejscami po przecinku, gwarantując czytelną i profesjonalną prezentację sumy (np. 68.00 zł zamiast 68 zł lub wartości z drobnymi niedokładnościami zmiennoprzecinkowymi).
function obliczBilety() {
const normalne = Number(document.getElementById('biletyNormalne').value);
const ulgowe = Number(document.getElementById('biletyUlgowe').value);
const wynik = document.getElementById('wynikBiletow');
const kosztNormalne = normalne * 25;
const kosztUlgowe = ulgowe * 18;
const razem = kosztNormalne + kosztUlgowe;
wynik.textContent = 'Do zapłaty: ' + razem.toFixed(2) + ' zł';
}
Warunkowe naliczanie rabatów i zniżek
W wielu systemach zamówień ostateczna cena zależy od spełnienia określonych kryteriów, takich jak wielkość zamówienia czy posiadanie karty lojalnościowej. Do wyznaczenia stawki rabatowej stosuje się instrukcje warunkowe if / else if / else.
Procenty w kodzie JavaScript zapisujemy w postaci ułamków dziesiętnych: rabat 10% odpowiada mnożnikowi 0.10, a 25% to 0.25. Kwotę zaoszczędzoną obliczamy przez pomnożenie ceny bazowej przez stawkę rabatu: kwotaZnizki = cenaBazowa * rabat, po czym odejmujemy ją od sumy początkowej.
Jeżeli rabaty mogą się kumulować (np. upust za liczbę sztuk plus dodatkowy bonus za posiadanie karty stałego klienta), wygodnie jest zainicjować zmienną rabatu o wartości początkowej 0, a następnie zwiększać ją za pomocą operatora += po spełnieniu każdego z warunków.
function obliczRabatHurtowy() {
const sztuki = Number(document.getElementById('liczbaSztuk').value);
const maKarte = document.getElementById('kartaKlienta').checked;
const wynik = document.getElementById('wynikRabatu');
const cenaBazowa = sztuki * 40;
let rabat = 0;
if (sztuki >= 20) {
rabat += 0.20;
} else if (sztuki >= 10) {
rabat += 0.10;
}
if (maKarte) {
rabat += 0.05;
}
const wartoscRabatu = cenaBazowa * rabat;
const cenaKoncowa = cenaBazowa - wartoscRabatu;
wynik.textContent = 'Cena: ' + cenaKoncowa.toFixed(2) + ' zł (rabat: ' + (rabat * 100) + '%, oszczędzasz ' + wartoscRabatu.toFixed(2) + ' zł)';
}
Sumowanie usług dodatkowych i wielokrotnego wyboru
Gdy formularz pozwala na wybór dowolnej liczby opcji dodatkowych (np. usług serwisowych, ubezpieczenia czy akcesoriów), ręczne sprawdzanie każdego checkboxa osobną instrukcją if staje się nieefektywne. Wygodniejszym podejściem jest przechowywanie kosztu w atrybucie danych data-cena każdego znacznika HTML.
W kodzie JavaScript pobieramy wszystkie aktualnie zaznaczone kontrolki za pomocą selektora pseudoklasy: document.querySelectorAll('.dodatek:checked'). Zwraca on kolekcję NodeList, po której możemy przejść pętlą forEach.
Przed pętlą deklarujemy zmienną akumulatora (np. let suma = kosztDiagnozy;), a w każdym obiegu pętli odczytujemy wartość z pole.dataset.cena, rzutujemy ją na liczbę za pomocą Number() i dodajemy do sumy całkowitej. Taki mechanizm jest w pełni elastyczny i działa poprawnie niezależnie od tego, ile pozycji zaznaczy użytkownik.
function policzKosztSerwisu() {
const kosztDiagnozy = 80;
let suma = kosztDiagnozy;
const wybraneUslugi = document.querySelectorAll('.dodatek:checked');
wybraneUslugi.forEach(function(pole) {
const cenaDodatku = Number(pole.dataset.cena);
suma += cenaDodatku;
});
const wynik = document.getElementById('wynikSerwisu');
wynik.textContent = 'Całkowity koszt naprawy: ' + suma.toFixed(2) + ' zł (wybrano dodatków: ' + wybraneUslugi.length + ')';
}
Ćwiczenia
- 1Podstawowy kalkulator wartości towaruOblicz wartość zamówienia mnożąc cenę przez ilość i sformatuj wynik toFixed(2).Zadanie i podpowiedzi →
- 2Wyliczenie samej kwoty podatku VATOblicz kwotę podatku VAT 23% z podanej kwoty netto i sformatuj wynik.Zadanie i podpowiedzi →
- 3Stały rabat kwotowy powyżej proguOdejmij 20 zł od kwoty zamówienia, jeżeli przekracza ona próg 100 zł.Zadanie i podpowiedzi →
- 4Procentowy rabat ilościowyPrzyznaj 10% rabatu przy zakupie co najmniej 5 sztuk towaru.Zadanie i podpowiedzi →
- 5Dwuprogowy rabat wartości koszykaZastosuj konstrukcję else if do przypisania rabatu 20% od 500 zł lub 10% od 200 zł.Zadanie i podpowiedzi →
- 6Kumulacja rabatów z operatorem +=Zsumuj niezależne upusty procentowe w jednej zmiennej akumulującej stawkę.Zadanie i podpowiedzi →
- 7Odczyt atrybutu data-cena z elementuPobierz wartość numeryczną zapisaną w atrybucie danych data-cena za pomocą właściwości dataset.Zadanie i podpowiedzi →
- 8Sumowanie zaznaczonych opcji pętlą forEachPobierz zaznaczone checkboxy za pomocą querySelectorAll i zsumuj ich wartości w pętli forEach.Zadanie i podpowiedzi →
- 9Sumowanie atrybutów data-cena pętlą forEachZsumuj ceny dodatków zapisane w atrybutach data-cena z zaznaczonych pól.Zadanie i podpowiedzi →
- 10Kalkulator tankowania paliwaOblicz koszt tankowania na podstawie liczby litrów i ceny za litr.Zadanie i podpowiedzi →
- 11Kalkulator opłaty parkingowejOblicz opłatę za postój: 5 zł za pierwszą godzinę i 3 zł za każdą kolejną.Zadanie i podpowiedzi →
- 12Koszty dostawy z darmowym progiem wysyłkiDolicz 15 zł za dostawę lub ustaw 0 zł, gdy wartość koszyka przekracza 250 zł.Zadanie i podpowiedzi →
- 13Kalkulator punktu druku i kseroZsumuj koszty druku stron czarno-białych i kolorowych z różnymi stawkami.Zadanie i podpowiedzi →
- 14Ulga studencka 50% z checkboxaOdlicz 50% zniżki na bilet, jeżeli zaznaczono checkbox uprawnienia studenckiego.Zadanie i podpowiedzi →
- 15Wycena serwisu z opłatą startową i data-cenaZsumuj stałą opłatę startową z cenami usług zaznaczonych przez użytkownika.Zadanie i podpowiedzi →
- 16Kompleksowy konfigurator sprzętu z rabatemPołącz wybór bazy z radio, dodatki z pętli forEach oraz próg rabatowy.Zadanie i podpowiedzi →