[JS] problem z prostym kalkulatorem

0

Witam,
Zrobiłem kalkulator z wykorzystaniem prostego eval:

<script> function oblicz(kalk) { kalk.wynik.value = eval(kalk.wynik.value) } var jeden = '1' var dwa = '2' var trzy = '3' var cztery = '4' var piec = '5' var szesc = '6' var siedem = '7' var osiem = '8' var dziewiec = '9' var zero = '0' var dodawanie = '+' var odejmowanie = '-' var mnozenie = '*' var dzielenie = '/' var kropka = '.' function enter(kalk, string) { kalk.wynik.value += string } function czysc(kalk) { kalk.wynik.value = '0' } </script> </p>

<form name="calc">

<input size="30" name="wynik" action="oblicz(this.form)"></input>
<input onclick="enter(this.form, siedem)" type="button" value=" 7 "></input>
<TD><INPUT onclick="enter(this.form, osiem)" type=button value=       "  8  "></INPUT> 

<TD><INPUT onclick="enter(this.form, dziewiec)" type=button value=    "  9  "></INPUT> 

<TD><INPUT onclick="enter(this.form, dzielenie)" type=button value=   "  /  "></INPUT> 
<input onclick="enter(this.form, cztery)" type="button" value=" 4 "></input>
<TD><INPUT onclick="enter(this.form, piec)" type=button value=        "  5  "></INPUT> 

<TD><INPUT onclick="enter(this.form, szesc)" type=button value=       "  6  "></INPUT> 

<TD><INPUT onclick="enter(this.form, mnozenie)" type=button value=    "  *  "></INPUT> 
<input onclick="enter(this.form, jeden)" type="button" value=" 1 "></input>
<TD><INPUT onclick="enter(this.form, dwa)" type=button value=         "  2  "></INPUT> 

<TD><INPUT onclick="enter(this.form, trzy)" type=button value=        "  3  "></INPUT> 

<TD><INPUT onclick="enter(this.form, odejmowanie)" type=button value= "  -  "></INPUT> 
<input onclick="enter(this.form, zero)" type="button" value=" 0 "></input>
<TD><INPUT onclick="enter(this.form, kropka)" type=button value=        "  .  "></INPUT> 

<TD><INPUT onclick="enter(this.form, dodawanie)" type=button value=     "  +  "></INPUT> 
<input onclick="oblicz(this.form)" type="button" value=" = "></input>
<TD colSpan=2><INPUT onclick=czysc(this.form) type=button value=        " Zeruj "></INPUT> 
</form></p>

I mam teraz takie pytania:

  1. Jak zrobić by po wpisaniu z klawiatury jakieś litery wyskakiwał mi alert że nie moge wpisać litery tylko powinienem wpisać liczbe?
    Lub inaczej, jak zablokować INPUT żeby nie dało się nic tam wpisać z klawiatury?
  2. Jak zrobić żeby sprawdzało mi poprawność wpisanego działania? tzn jeśli źle jest wpisane działanie to error np. 2++2 lub 2*/2.

Głównie chciałbym zrobić obsługę zdarzeń błędnych oczywiście na podstawie tego kodu.

Proszę o odpowiedź.
Z góry dziękuję o jakiekolwiek podpowiedzi w formie kodu:)

0
xyz99 napisał(a)

jak zablokować INPUT żeby nie dało się nic tam wpisać z klawiatury?

<INPUT .... DISABLED> :-)

0

Dzięki Zawadzki:)

Jeszcze proszę o pkt. 2
2. Jak zrobić żeby sprawdzało mi poprawność wpisanego działania? tzn jeśli źle jest wpisane działanie to error np. 2++2 lub 2*/2.

0

Wiesz co nie znam sie dobrze na JS, właściwie znam najmniejsze podstawy. Proponuje zmienić funkcje czysc , ponieważ po zerowaniu pojawia się cyfra zero i nie mogę wpisać "2", bo mogę tylko "02".

function czysc(kalk) {

   kalk.wynik.value = ''  // zamiat 0

}

A jeśli chcesz sprawdzić czy nie ma "++", to w funkcji enter() sprawdz czy ostatni znak "kalk.wynik.value" to "=", "-" itd.... chętnie bym Ci napisał tą funkcje ale nie znam się na JS.

0
Zawadzki napisał(a)

A jeśli chcesz sprawdzić czy nie ma "++", to w funkcji enter() sprawdz czy ostatni znak "kalk.wynik.value" to "=", "-" itd.... chętnie bym Ci napisał tą funkcje ale nie znam się na JS.

Ja dopiero zaczynam się uczyć JS i właśnie też nie wiem jak to napisać. Domyślam się tylko że może to wyglądać jakoś tak:
if "kalk.wynik.value" != "liczba""znak""liczba""znak""liczba"" itd. { alert("nie poprawne działanie");}

To są moje początki, proszę o wyrozumiałość:)

0

problem w tym że to nie przeszkadza że są np dwa plusy koło siebie i wynik zostanie dobrze przedstawiony więc żadne try czy sprawdzanie undefined nie wchodzi w grę

co do kodu to po co definiujesz pierdoły typu siedem = '7'
jak możesz po prostu zamiast funkcja(siedem) potem dać funkcja(7) a kod się skróci kilkunastokrotnie razy

0
Adamo napisał(a)

problem w tym że to nie przeszkadza że są np dwa plusy koło siebie i wynik zostanie dobrze przedstawiony

Wynik się nie wyświetla, wyskakuje błąd na stronie jak robie coś takiego 2++2. Sprawdź sam.

Adamo napisał(a)

więc żadne try czy sprawdzanie undefined nie wchodzi w grę

potrzebne jest sprawdzenie działania bo inaczej nie zadziała skrypt, wyskoczy błąd na stronie:)

0

no to w takim razie try, no tak - sprawdzałem na standardowo 2 + + 2 * 2 - możesz po wszystkim robić spację to nie będzie błędu ;) bo fucktycznie przyzwyczajenie robienia spacji wzięło przewagę nad doświadczeniem, więc 2++2*2 oczywiście nie zadziała bo występuje tu ++ czyli inkrementacja poprzedniej zmiennej która tutaj jest stałą cyfrą "2" - więc występuje błąd, a potem już całkiem wszystko jest bez sensu

więc albo try:

try{
  cos.value = eval('2++2');
}
catch(e){
  cos.value = 'ERROR !';
}

albo zamiast "+" dodawaj do stringa " +" (spacja przed) ;P tylko że drugie wyjście niekoniecznie musi zadziałać przy każdej implementacji javascriptu i nie zadziała z kropkami więc jest do bani ;)

0

Dzięki Adamo za wskazówke, zrobiłem try i działa:)))

Ale mam jeszcze jedno takie małe pytanie:)

Czy ktoś może wie jak zrobić obsługę pamięci tzn żeby wynik był zapisywany do pamięci poprzez M+, wywoływany z pamięci poprzez MR i kasowany z pamięci poprzez M- tak jak w zwykłym kalkulatorze?????

0

nie możesz po prostu stworzyć "var memo = ''0" ? i zmieniać ją po kliknięciu M+ a zerować po M- ?

0

Zrobiłem to "po prostu" jak mówi Zawadzki:) Dziękuje

1 użytkowników online, w tym zalogowanych: 0, gości: 1