settingsログイン
メニュー

得た数式(四則演算)を分析し、答えを表示するようにしたいです

閲覧 70
まず、JavaScriptでコードを書くのは久しぶりで、かつ、プログラミング自体が皆さんより経験が浅いのでご理解ください。
さて、具体的に申しますと、例えば「13*4+567/32-44」というような式がフォームから得られたとして、その式を左から順に計算していくプログラムを考えます。無論、乗除が先に計算されるように、最初は+-を無視して、乗除がなくなれば和差を考えます。そして最終的に式が計算された答えをアラートで表示するというものです。
現在の問題点は、なぜか式がそのまま答えとして出てきます。また、上記の通りなので、気づいてない問題が他にもあるかもしれません。
自分で書いたコードなのですが、恥ずかしながら混乱しております。ご協力よろしくお願いします。

<コード>
<!DOCTYPE HTML>
<html>

<head>
    <title>万能電卓</title>
    <script>
        /*順番方式*/
        function keisan() { //a
            /*try{*/
            var chk1 = 0
            var str = document.siki.mainsiki.value;
            var strlong = str.length;
            for (var cnt = 0; cnt < 10; cnt++) { //b
                if (str.indexOf(cnt, 0) != 0) { //c
                    chk1++
                } //c
            } //b
            if (chk1 > 9) { //d
                alert("最初の文字は数字にしてください");
                return;
            } //d
            var siki = str;
            var sikilong = siki.length; //0-x + 1
            var sisoku = new Array();
            sisoku[0] = '+';
            sisoku[1] = '-';
            sisoku[2] = '*';
            sisoku[3] = '/';
            var sisokunum = 0;
            var sisokunochk = 0;
            for (var cntstrnum = 0; cntstrnum < sikilong; cntstrnum++) { //e
                var chk = siki.charAt(cntstrnum);
                for (var cnta = 0; cnta < 4; cnta++) { //f
                    if (chk == sisoku[cnta]) { //g
                        sisokunum = sisokunum + 1;
                    } //g
                } //f
            } //e
            if (sisokunum == 0) { //h
                alert("答え:" + siki);
                return;
            } //h
            loop:
            for (var cntmain = 0; cntmain < 1; cntmain++) { //i////gotoの代わり
                var sikip = "";
                if (sisokunochk != 0) {
                    break loop;
                }
                subloop:
                for (var cntb = 0; cntb < sikilong; cntb++) { //j
                    var counter = 0;
                    var countertwo = 0;
                    var sikipa = "";
                    var sikipb = "";
                    var sikisisoku = "";
                    var sikiright = "";
                    for (var cntz = 0; cntz < 4; cntz++) { //k
                        if (sisoku[cntz] == siki.charAt(cntb)) { //l
                            counter = 1;
                        } //l
                    } //k
                    if (counter == 0) { //m
                        sikip = sikip + siki.charAt(cntb); //sikipはsikiの計算する部分の記録用
                        if (cntb == sikilong - 1) { //n
                            sikipb = sikip;
                        } //n
                    } else if (counter == 1) { //m
                        for (var cnty = 2; cnty < 4; cnty++) { //o
                            if (sisoku[cnty] == siki.charAt(cntb)) { //p
                                if (sikipa == "") { //q
                                    sikipa = sikip;
                                    sikip = "";
                                } else { //q
                                    sikipb = sikip;
                                    sikiright = siki.substr(cntb + 1, sikilong - 1); //怪しい
                                } //q
                                sikisisoku = siki.charAt(cntb);
                                break;
                            } //p
                        } //o
                    } //m
                    for (var cntx = 0; cntx < 2; cntx++) { //r
                        if (sisoku[cntx] == siki.charAt(cntb) && twosisoku == 0) { //s//twosisokuは*/の数
                            sikipa = sikip
                            sikip = "";
                            sikisisoku = siki.charAt(cntb);
                        } else if (sisoku[cntx] == siki.charAt(cntb) && twosisoku > 0) { //s
                            sikip = "";
                        } //s
                    } //r

                    if (sikisisoku != "" && sikipa != "" && sikipb != "") { //s
                        if (sikisisoku == sisoku[0]) { //t
                            sikileft = sikipa + sikipb;
                            siki = sikileft.toString() + sikiright.toString(); //以下共通
                        } else if (sikisisoku == sisoku[1]) { //t
                            sikileft = sikipa - sikipb;
                            siki = sikileft.toString() + sikiright.toString();
                        } else if (sikisisoku == sisoku[2]) { //t
                            sikileft = sikipa * sikipb;
                            siki = sikileft.toString() + sikiright.toString();
                        } else if (sikisisoku == sisoku[3]) { //t
                            sikileft = sikipa / sikipb;
                            siki = sikileft.toString() + sikiright.toString();
                        } //t
                    } //s
                    sikilong = siki.length; //計算後を想定した記述
                    sisokunochk = 0;
                    for (var cntc = 0; cntc < sikilong; cntc++) { //t
                        var chka = siki.charAt(cntc);
                        for (var cntd = 0; cntd < 4; cntd++) { //u
                            if (chka == sisoku[cntd]) { //v
                                sisokunochk = sisokunochk + 1;
                            } //v
                        } //u
                    } //t
                    if (sisokunochk == 0) { //w
                        break; //もう四則演算子がない
                    } //w
                    if (sisokunochk != 0) { //x
                        break subloop; //まだ四則演算子がある
                    } //x
                } //j
                alert("答え:" + siki);
                return;
            } //i

            /*}catch(e){
            alert("式が不適合もしくはエラーです。");
            return;
            }
            finally{
            return;
            }*/
        } //a
    </script>
</head>

<body>
    <form name="siki">
        式:<input type="text" name="mainsiki" value="">
        <br>
        <input type="button" value="計算" onclick="keisan()">
    </form>

</body>

</html>
匿名 2017 1/6 質問 JavaScript

ログインまたはユーザー登録してから回答してください。

プログラミング・開発言語、JavaScript の企業/事業者/教室/プロの方のホームページの集客、アクセスアップ、SEO対策効果が期待できるリスティングサイト=Ask-itをぜひご活用ください

Ask IT にようこそ。ここではコミュニティメンバーに質問したり、回答を得ることができます。
ITについて質問したい方へ ITについてプロに質問したい方は会員登録後すぐに質問をする事ができます。

プロフェッショナルの方へ 質問に答えていただけるプロフェッショナルの方は下記をご覧下さい

お気づきの点があれば是非お知らせください
...