Avatar
Ryouji
Člen
Avatar
Ryouji:17. května 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  -1 17. května 14:30
Avatar
Odpovídá na Ryouji
Michal Štěpánek:17. května 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. května 16:28
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Fredep
Redaktor
Avatar
Odpovídá na Ryouji
Fredep:17. května 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. května 17:10
Týmová práce je důležitá proto, aby bylo možno obvinit z neúspěchu někoho jiného.
Avatar
Ryouji
Člen
Avatar
Odpovídá na Fredep
Ryouji:19. května 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. května 21:55
Avatar
gcx11
Redaktor
Avatar
Odpovídá na Ryouji
gcx11:20. května 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. května 2:37
 
Nahoru Odpovědět 20. května 2:35
Avatar
Fredep
Redaktor
Avatar
Odpovídá na Ryouji
Fredep:20. května 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. května 10:03
Týmová práce je důležitá proto, aby bylo možno obvinit z neúspěchu někoho jiného.
Avatar
Ryouji
Člen
Avatar
Ryouji:23. května 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. května 13:49
Avatar
Ryouji
Člen
Avatar
Ryouji:23. května 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. května 15:02
Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět 23. května 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.