Codewawa
Wszystkie kursy
Projekty / Tworzenie prostego kalkulatora

JS: Przyciski

Przyciski usuwania

Teraz musimy do każdego przycisku dodać mechanizm działający po jego kliknięciu. Najpierw zaczniemy od przycisków usuwania. Chcemy, aby po kliknięciu na CE wszystko wróciło do wartości początkowych.

document.querySelector("#CE").addEventListener("click", function(){
  nums[0] = 0;
  nums[1] = null;
  cur = 0;
  operation = " ";
  add_comma = false;
  show();
});

Kolejnym przyciskiem, którym się zajmiemy, będzie C. Zamiast, tak jak CE, wracać do wartości początkowych, będzie on zmieniać wartość nums[cur] na 0.

document.querySelector("#C").addEventListener("click", function(){
  nums[cur] = 0;
  add_comma = false;
  show();
});

Trochę trudniejszym jest działanie przycisku backspace. Chcemy, aby usuwał on ostatnią cyfrę z nums[cur]. Robimy to w ten sposób, że zamieniamy tę liczbę na słowo, tworzymy kolejne, bez ostatniego znaku z poprzedniego słowa i zamieniamy je ponownie na liczbę. Musimy do tego użyć funkcji toString() i Number(). Wartość cur=-1 zmienna ta w naszym kalkulatorze przyjmuje po kliknięciu przycisku =. To pozornie dziwne rozwiązanie ma swoje cele. Jednym z nich jest właśnie uniemożliwienie użycia backspace po =. Możesz sprawdzić, że również na kalkulatorze Windowsa (jest to ideał, do którego dążymy)backspace nie działa po =.

document.querySelector("#backspace").addEventListener("click", function(){
  if(cur != -1){
    let res = nums[cur].toString(10);
    let res2 = "";
    for(var i = 0; i < res.length; i++)
    {
      if(i < res.length-1){
        res2 += res[i];
      }
    }
    nums[cur] = Number(res2);
    show();
  }
});

Przycisk przecinka

Jego mechanizm jest bardzo prosty, ponieważ po kliknięciu będzie on ustawiał po prostu wartość add_comma na true.

document.querySelector("#comma").addEventListener("click",function(){
    add_comma = true;
});

Przyciski cyfr

Ponieważ działanie każdego przycisku cyfry jest bardzo podobne, zdefiniujemy funkcję addDigit(). Jako parametr otrzymuje ona cyfrę, którą chcemy dodać. Musimy w tej funkcji rozważyć trzy osobne przypadki. Pierwszy z nich, to sytuacja, gdy nums[cur] != null. Jest to ten najbardziej intuicyjny przypadek - po prostu na końcu dopisujemy kolejną cyfrę. Musimy jednak sprawdzić, czy add_comma jest równe true. Jeśli tak, to przed tą cyfrą musimy dopisać jeszcze kropkę.

function addDigit(num){
  if(nums[cur] != null){
    let x = nums[cur].toString();
    if(add_comma)
    {
      x += ".";
      add_comma = false;
    }
    x += num.toString();
    nums[cur] = Number(x); 
    show();
  }
}

Drugi przypadek, czyli nums[cur] === null i cur === 1 zachodzi, gdy użyjemy przycisku cyfry bezpośrednio po operacji arytmetycznej. W tym przypadku nie tyle dopisujemy cyfrę na końcu liczby, ale zmieniamy jej wartość z null na poprawną wartość liczbową. Jednak znowu musimy sprawdzić, czy powinniśmy dodać do liczby kropkę. Jeśli tak, to musimy przed nią wstawić jeszcze 0.

else if(cur > -1){
  let x = "";
  if(add_comma)
  {
    x += "0.";
    add_comma = false;
  }
  x += num.toString();
  nums[cur] = Number(x);
  show();
}

Pozostał nam już teraz tylko trzeci przypadek, czyli nums[cur] === null i cur === -1. Taka sytuacja ma miejsce, gdy chcemy wpisać liczbę po kliknięciu na przycisk =. Właśnie aby wyróżnić ten przypadek ustawiamy wtedy cur na -1. Jeśli użyjemy = na ekranie kalkulatora pojawi się nam wynik poprzedniego zadania. Jak zobaczysz później, ten wynik jest zapisywany również do nums[0], na wypadek, gdyby użytkownik chciał go użyć do kolejnej operacji. Jednak, jeśli bezpośrednio po = zostanie kliknięta jakaś cyfra, to oznacza, że kalkulator ma rozpocząć zupełnie nowe działanie. Dlatego tę cyfrę wpisujemy na nums[0] i ustawiamy cur na 0. Również w tym przypadku dodajemy do liczby napis 0., jeśli tak każe add_comma.

else{
  cur = 0;
  let x = "";
  if(add_comma)
  {
    x += "0.";
    add_comma = false;
  }
  x += num.toString();
  nums[cur] = Number(x);
  show();
}

Pozostaje nam już tylko dodanie reakcji przycisków cyfr na kliknięcie, poprzez wywołanie addDigit().

document.querySelector("#n0").addEventListener("click", function(){
    addDigit(0);
});

Powyższy kod dotyczy przycisku 0. Trzeba go użyć dla wszystkich pozostałych przycisków, odpowiednio zmieniając cyfry.

Obliczanie wyniku

Zdefiniujemy pomocniczą funkcję operate(), która zwraca nam wynik działania (bądź Error przy dzieleniu przez 0).

function operate(n1, n2, op){
  let x = 0;
  switch(op){
    case "+":
      x = n1+n2;
      break;
    case "-":
      x = n1-n2;
      break;
    case "*":
      x = n1*n2;
      break;
    case "/":
      if(n2 === 0){
          return "error";
      }
      x = n1/n2;
      break;
    case " ":
      x = n1;
      break;
  }
  return x;
}

Możemy teraz zdefiniować działanie przycisku =. Chcemy, aby pod nums[0] wstawił on wynik działania, nums[1] zmienił na null, ustawił cur na -1 i wymazał znak poprzedniej operacji. Oczywiście może się okazać, że pod nums[0] daliśmy Error. Dlatego w takim przypadku ustawiamy je na 0. Na wszelki wypadek ustalamy add_comma na false, aby w kolejnym działaniu nie okazało się, że niepotrzebnie dodaliśmy przecinek.

document.querySelector("#equals").addEventListener("click",function(){
  add_comma = false;
  nums[0] = operate(nums[0], nums[1], operation);
  nums[1] = null;
  operation = " ";
  show();
  if(nums[0] === "error"){
    nums[0] = 0;
  }
  cur = -1;
});

Przyciski działań

Nasz kalkulator jest już prawie gotowy, jednak musimy jeszcze dodać mechanizmy przycisków działań arytmetycznych. Również w tutaj musimy rozważyć trzy przypadki. Pierwszy z nich to cur < 1 (czyli cur = 0 lub cur = -1). W tej sytuacji po prostu ustawiamy odpowiednio znak operacji i przesuwamy cur na 1. Drugi przypadek to cur = 1 i nums[cur] != null. Dzieje się tak wtedy, gdy użytkownik wpisze działanie, ale zamiast kliknąć na przycisk =, użyje przycisku działania. Chcemy wtedy, aby ta poprzednia operacja się wykonała i została podstawiona po nums[0]. Oprócz tego musimy wtedy odpowiednio zmienić operation i wyzerować nums[1]. Trzeci przypadek to cur = 1 i nums[cur] = null. Taka sytuacja zachodzi wtedy, gdy użytkownik użyje jakiegoś przycisku działania, a później kliknie na inny. Wystarczy wtedy odpowiednio zmienić wartość operation. Tak jak w przypadku przycisku =, tutaj też musimy ustawić add_comma na false. Poniższy kod dotyczy przycisku +. Analogicznie powinien on wyglądać dla wszystkich przycisków działań.

document.querySelector("#plus").addEventListener("click",function(){
  add_comma = false;
  if(cur < 1){
    cur = 1;
    operation  = "+";
  }
  else{
    if(nums[cur] != null){
      nums[0] = operate(nums[0],nums[1],operation);
      nums[1] = 0;
      operation = "+";
    }
    else
    {
      operation = "+";
    }
  }
  show();
});

Nasz kalkulator jest teraz w pełni funkcjonalny.