Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Nefunguje více početních operací najednou

Aktivity
Avatar
Ryouji
Člen
Avatar
Ryouji:17.5.2017 14:30

Dobrý den.

Proč mi nejde více početních operací najednou?

Jde to udělat bez toho, aniž bych musel použít závorky?

<!DOCTYPE html>

<html>

        <head>
                <title></title>

                <meta charset="UTF-8">

                <script type="text/javascript">
                obrazVysledek = document.getElementById("obrazVysledek");

                function nacti(tlacitko) {
                        obrazVysledek = document.getElementById("obrazVysledek");
                        switch(tlacitko) {
                                case "x²":
                                obrazVysledek.value = obrazVysledek.value + "²";
                                break;

                                case "√x":
                                obrazVysledek.value = obrazVysledek.value + "√";
                                break;

                                case "←":
                                var str = obrazVysledek.value.slice(0, -1);
                                obrazVysledek.value = str;
                                break;

                                case "+":
                                obrazVysledek.value = obrazVysledek.value + "+";
                                break;

                                case "7":
                                obrazVysledek.value = obrazVysledek.value + "7";
                                break;

                                case "8":
                                obrazVysledek.value = obrazVysledek.value + "8";
                                break;

                                case "9":
                                obrazVysledek.value = obrazVysledek.value + "9";
                                break;

                                case "-":
                                obrazVysledek.value = obrazVysledek.value + "-";
                                break;

                                case "4":
                                obrazVysledek.value = obrazVysledek.value + "4";
                                break;

                                case "5":
                                obrazVysledek.value = obrazVysledek.value + "5";
                                break;

                                case "6":
                                obrazVysledek.value = obrazVysledek.value + "6";
                                break;

                                case "*":
                                obrazVysledek.value = obrazVysledek.value + "*";
                                break;

                                case "1":
                                obrazVysledek.value = obrazVysledek.value + "1";
                                break;

                                case "2":
                                obrazVysledek.value = obrazVysledek.value + "2";
                                break;

                                case "3":
                                obrazVysledek.value = obrazVysledek.value + "3";
                                break;

                                case "/":
                                obrazVysledek.value = obrazVysledek.value + "/";
                                break;

                                case "0":
                                obrazVysledek.value = obrazVysledek.value + "0";
                                break;

                                case ".":
                                obrazVysledek.value = obrazVysledek.value + ".";
                                break;

                                case "C":
                                obrazVysledek.value = "";
                                break;

                                case "=":
                                obrazVysledek.value = obrazVysledek.value + "√x";
                                break;
                        }
                }

                function vysledek() {
                        var obrazVysledek = document.getElementById("obrazVysledek");

                        if (obrazVysledek.value.indexOf("+") !== -1) {
                                var pole = obrazVysledek.value.split("+");
                                obrazVysledek.value = Number(pole[0]) + Number(pole[1]);
                        }
                        else if (obrazVysledek.value.indexOf("-") !== -1) {
                                var pole = obrazVysledek.value.split("-");
                                obrazVysledek.value = Number(pole[0]) - Number(pole[1]);
                        }
                        else if (obrazVysledek.value.indexOf("*") !== -1) {
                                var pole = obrazVysledek.value.split("*");
                                obrazVysledek.value = Number(pole[0]) * Number(pole[1]);
                        }
                        else if (obrazVysledek.value.indexOf("/") !== -1) {
                                var pole = obrazVysledek.value.split("/");
                                obrazVysledek.value = Number(pole[0]) / Number(pole[1]);
                        }
                        else if (obrazVysledek.value.indexOf("²") !== -1) {
                                var pole = obrazVysledek.value.split("²");
                                obrazVysledek.value = Number(pole[0]) * Number(pole[0]);
                        }
                        else if (obrazVysledek.value.indexOf("√") !== -1) {
                                var pole = obrazVysledek.value.split("√");
                                obrazVysledek.value = Math.sqrt(Number(pole[1]));
                        }
                }
                </script>
        </head>

        <body>
                <input type="text" id="obrazVysledek" disabled>
                <br>
                <input type="button" id="x²" name="x²" value="x²" style="width: 39.2px; margin-top: 3px;" onclick="nacti(this.name);">
                <input type="button" id="√x" name="√x" value="√x" style="width: 39.2px;" onclick="nacti(this.name);">
                <input type="button" id="←" name="←" value="←" style="width: 39.2px;" onclick="nacti(this.name);">
                <input type="button" id="+" name="+" value="+" style="width: 39.2px;" onclick="nacti(this.name);">
                <br>
                <input type="button" id="7" name="7" value="7" style="width: 39.2px; margin-top: 3px;" onclick="nacti(this.name);">
                <input type="button" id="8" name="8" value="8" style="width: 39.2px;" onclick="nacti(this.name);">
                <input type="button" id="9" name="9" value="9" style="width: 39.2px;" onclick="nacti(this.name);">
                <input type="button" id="-" name="-" value="-" style="width: 39.2px;" onclick="nacti(this.name);">
                <br>
                <input type="button" id="4" name="4" value="4" style="width: 39.2px; margin-top: 3px;" onclick="nacti(this.name);">
                <input type="button" id="5" name="5" value="5" style="width: 39.2px;" onclick="nacti(this.name);">
                <input type="button" id="6" name="6" value="6" style="width: 39.2px;" onclick="nacti(this.name);">
                <input type="button" id="*" name="*" value="*" style="width: 39.2px;" onclick="nacti(this.name);">
                <br>
                <input type="button" id="1" name="1" value="1" style="width: 39.2px; margin-top: 3px;" onclick="nacti(this.name);">
                <input type="button" id="2" name="2" value="2" style="width: 39.2px;" onclick="nacti(this.name);">
                <input type="button" id="3" name="3" value="3" style="width: 39.2px;" onclick="nacti(this.name);">
                <input type="button" id="/" name="/" value="/" style="width: 39.2px;" onclick="nacti(this.name);">
                <br>
                <input type="button" id="0" name="0" value="0" style="width: 82.5px; margin-top: 3px;" onclick="nacti(this.name);">
                <input type="button" id="." name="." value="." style="width: 39.2px;" onclick="nacti(this.name);">
                <input type="button" id="C" name="C" value="C" style="width: 39.2px;" onclick="nacti(this.name);">
                <br>
                <input type="button" id="=" name="=" value="=" style="width: 168.7px; margin-top: 3px;" onclick="vysledek();">
                <p id="lol"></p>
        </body>

</html>
 
Odpovědět
17.5.2017 14:30
Avatar
Odpovídá na Ryouji
Michal Štěpánek:17.5.2017 16:28

Asi jsem na jiný sjezdovce, ale jak to myslíš, více početních operací najednou? Každý ten input (jestli jsem to z toho kódu dobře pochopil) reaguje na událost "onclick", ale každý je nastaven samostatně na tu událost, takže když se spustí script, vezme si do parametru jen data, která se toho týkají, tzn. toho konkrétního inputu.

Nahoru Odpovědět
17.5.2017 16:28
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Ryouji
Neaktivní uživatel:17.5.2017 17:10

Ahoj, tak samotná funkce vysledek ověří, zda se tam nachází daný početní znak a pokud ano, tak předpokládá, že nalevo od něj je číslo a napravo taky, tak je sečte. Nemůžeš předpokládat, že ti to spočítá nějakou složitější rovnici.

15+16*17 bude vyhodnoceno jako číslo 15 plus text "16*17"

Jak chceš násobit číslo a text, který obsahuje nečíselné znaky?

Musel bys udělat rekurzivní funkci, která prvně ten vstup rozdělí a potom postupně provádí elementární početní operace, což není tak triviální.

Nahoru Odpovědět
17.5.2017 17:10
Neaktivní uživatelský účet
Avatar
Ryouji
Člen
Avatar
Odpovídá na Neaktivní uživatel
Ryouji:19.5.2017 21:55

Můžeš mi dát, nebo kdokoli jiný, trošku inspiraci, jak by daná funkce měla vypadat?

Stačí nějaký návrh, nechci funkci přímo, na tu bych chtěl přijít sám.

 
Nahoru Odpovědět
19.5.2017 21:55
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Ryouji
gcx11:20.5.2017 2:35

Napřed ten string rozdělíš na jednotlivé podčásti:

"15+16*17" -> ("15", číslo) ("+", znaménko plus) ("16", číslo) ("*", znaménko krát) ("17", číslo)

Poté z toho sestrojíš strom pomocí toho, že víš, jaký token má přednost.
(otec, levý syn, pravý syn)
(+,15,(*,16,17))
A ten vyhodnotíš postupně rekurzí.

Editováno 20.5.2017 2:37
 
Nahoru Odpovědět
20.5.2017 2:35
Avatar
Odpovídá na Ryouji
Neaktivní uživatel:20.5.2017 10:03

Ahoj, tady na ITnetworku je toto celkem časté téma. Myslím, že někdo psal přímo i podrobný postup, jak toto funguje, ale to jsem bohužel nenašel, tak přikládám jen programy se zdrojovým kódem, kde se toto řeší.

Nahoru Odpovědět
20.5.2017 10:03
Neaktivní uživatelský účet
Avatar
Ryouji
Člen
Avatar
Ryouji:23.5.2017 13:49

Tohle funguje:

case "π":
displej.value += document.getElementById("π").value;
π = Math.PI;

Ale tohle už ne, proč?

case "x":
displej.value += document.getElementById("x").value;
X = "*";
break;

Výsledek jsem nakonec udělal přes eval.

 
Nahoru Odpovědět
23.5.2017 13:49
Avatar
Ryouji
Člen
Avatar
Ryouji:23.5.2017 15:01

Jednoduše bych potřeboval udělat, aby nějaké početní znaménko mohlo být něco jiného, tzv. místo / třeba ÷.

Zkoušel jsem takovou primitivní věc, ale bez úspěchu.

Do funkce pro výsledek, jsem vložil:

var y = "*";
var x = "x";
y = x;

Tady je celý kód:

function tlačítko(tlačítko) {
                document.getElementById("displej").value += tlačítko;
            }

function výsledek() {
                document.getElementById("displej").value = eval(document.getElementById("displej").value);
            }
Editováno 23.5.2017 15:02
Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět
23.5.2017 15:01
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.