###前提・実現したいこと
HTMLのフォームから「式」を取得し、四則演算記号を判別して演算の順番通りに計算をこなしていくということを実現したいです。 仕組みとしては、四則演算子を一つずつ潰していく感じになります。今対応させるのは自然数のみです。 最終的に結果が全て計算されたものになるようなプログラムを目指しています。
###発生している問題・エラーメッセージ
乗除計算では値が不自然なものに、和と差の計算では結果に"NaN"が含まれかつ式も右にそのまま出てきます。 三項以上の掛け算でNaNが出現します。
###該当のソースコード
JavaScript
1function keisan() { //a 2 /*try{*/ 3 var chk1 = 0 4 var str = document.siki.mainsiki.value; 5 var strlong = str.length; 6 for (var cnt = 0; cnt < 10; cnt++) { //b 7 if (str.indexOf(cnt, 0) != 0) { //c 8 chk1++ 9 } //c 10 } //b 11 if (chk1 > 9) { //d 12 alert("最初の文字は数字にしてください"); 13 return; 14 } //d 15 var siki = str; 16 var sikilong = siki.length; 17 var sisoku = new Array(); 18 sisoku[0] = '+'; 19 sisoku[1] = '-'; 20 sisoku[2] = '*'; 21 sisoku[3] = '/'; 22 var sisokunum = 0; 23 for (var cntstrnum = 0; cntstrnum < sikilong; cntstrnum++) { //e 24 var chk = siki.charAt(cntstrnum); 25 for (var cnta = 0; cnta < 4; cnta++) { //f 26 if (chk == sisoku[cnta]) { //g 27 sisokunum = sisokunum + 1; 28 } //g 29 } //f 30 } //e 31 if (sisokunum == 0) { //h 32 alert("答え:" + siki); 33 return; 34 } //h 35 //×÷の計算 36 var nisokukw = 0; 37 for (var cntnuma = 0; cntnuma < sikilong; cntnuma++) { //1 38 var chk = siki.charAt(cntnuma); 39 for (var cntb = 2; cntb < 4; cntb++) { //2 40 if (chk == sisoku[cntb]) { //3 41 nisokukw = nisokukw + 1; 42 } //3 43 } //2 44 } //1 45 var kakerupo = -1; 46 var warupo = -1; 47 for (var cntmaina = 0; cntmaina <= nisokukw; cntmaina++) { //4 48 for (var cntc = 2; cntc < 4; cntc++) { //5 49 if (siki.indexOf(sisoku[cntc]) != -1) { //6 50 if (cntc == 2) { //7 51 kakerupo = siki.indexOf(sisoku[cntc]); 52 } else if (cntc == 3) { //7 53 warupo = siki.indexOf(sisoku[cntc]); 54 } //7 55 } //6 56 } //5 57 if (kakerupo == -1 && warupo == -1) { 58 break; 59 } 60 if (kakerupo != -1 && warupo != -1) { //8 61 if (kakerupo > warupo) { //9 62 var levelrl = kakerupo; 63 } else { //9 64 var levelrl = warupo; 65 } //9 66 } else if (kakerupo != -1) { //8 67 var levelrl = kakerupo; 68 } else if (warupo != -1) { //8 69 var levelrl = warupo; 70 } //8 71 var levelll = -1; 72 for (var cntd = levelrl - 1; cntd >= 0; cntd--) { //i 73 if (levelll != -1) { //j 74 break; 75 } //j 76 for (var cntnumb = 0; cntnumb < 4; cntnumb++) { //k 77 if (siki.charAt(cntd) == sisoku[cntnumb]) { //l 78 var levelll = cntd; 79 break; 80 } //l 81 if (levelll != -1) { //m 82 break; 83 } //m 84 } //k 85 } //i 86 if (levelll == -1) { //n 87 levelll = 0; 88 } //n 89 a = siki.substring(levelll, levelrl - 1); 90 sikipa = siki.substring(0, levelll); 91 var levellr = levelrl; 92 var levelrr = -1; 93 for (var cnte = levellr + 1; cnte < sikilong; cnte++) { //o 94 for (var cntnumc = 0; cntnumc < 4; cntnumc++) { //p 95 if (siki.charAt(cnte) == sisoku[cntnumc]) { //q 96 levelrr = siki.charAt(cnte); 97 break; 98 } //q 99 if (levelrr != -1) { //r 100 break; 101 } //r 102 } //p 103 if (levelrr != -1) { ///u 104 break; 105 } ///u 106 } //o 107 if (levelrr == -1) { //s 108 levelrr = sikilong; 109 } //s 110 b = siki.substring(levellr + 1, levelrr); 111 sikipb = siki.substring(levelrr, sikilong - 1); 112 if (levelrr == sikilong - 1){ 113 sikipb = ""; 114 } 115 if (siki.charAt(levelrl) == sisoku[2]) { //t 116 en = a * b; 117 } else if (siki.charAt(levelrl) == sisoku[3]) { //t 118 en = a / b; 119 } //t 120 if (levelll == 0){ 121 sikipa = ""; 122 } 123 siki = sikipa + en + sikipb; 124 sikilong = siki.length; 125 } //4 126 //+-の計算 127 var nisokuth = 0; 128 for (var cntf = 0; cntf <= sikilong; cntf++) { 129 for (var cntnumd = 0; cntnumd < 4; cntnumd++) { 130 if (sisoku[cntnumd] == siki.charAt(cntf)) { 131 nisokuth++; 132 } 133 } 134 } 135 for (var cntmainb = 0; cntmainb <= nisokuth; cntmainb++) { //1 136 var middle = -1; 137 for (var cntg = 0; cntg < sikilong; cntg++) { //2 138 for (var cntnume = 0; cntnume < 2; cntnume++) { //3 139 if (sisoku[cntnume] == siki.charAt(cntg)) { //4 140 var middle = cntg; 141 break; 142 } //4 143 if (middle != -1) { //5 144 break; 145 } //5 146 } //3 147 if (middle == -1) { 148 break; 149 } 150 var lrright = -1; 151 var llleft = 0; 152 var llright = middle - 1; 153 var lrleft = middle + 1; 154 for (var cntaa = lrleft; cntaa < sikilong - lrleft + 1; cntaa++) { 155 for (var cntnumaa = 0; cntnumaa < 2; cntnumaa++) { 156 if (sisoku[cntnumaa] == siki.charAt(cntaa)) { 157 lrright = cntaa - 1; 158 break; 159 } 160 } 161 if (lrright == -1) { 162 lrlight = sikilong; 163 } 164 } 165 var a = siki.substring(llleft, llright); 166 var b = siki.substring(lrleft, lrright); 167 if (siki.charAt(middle) == sisoku[0]) { 168 en = a + b; 169 } else if (siki.charAt(middle) == sisoku[1]) { 170 en = a - b; 171 } 172 var sikipb = substring(lrright, sikilong); 173 siki = en + sikipb; 174 } //2 175 if (middle == -1) { 176 alert("答え:" + siki); 177 return; 178 } 179 } //1 180 /*}catch(e){ 181 alert("式が不適合もしくはエラーです。"); 182 return; 183 } 184 finally{ 185 return; 186 }*/ 187} //a
###試したこと
コードを見たらわかるかと思いますが、括弧がちゃんと対応しているか英数字をふって確かめたりしました。
デバッグも粗方行いました。
###補足情報(言語/FW/ツール等のバージョンなど)
特になし
回答4件
あなたの回答
tips
プレビュー