###前提・実現したいこと
フォームから得られた自然数で四則演算のみが用いられた数式を評価して、答えを返すというプログラムの製作途中です。
###発生している問題
ブレークポイントを用いて確認したところ、break subloop;でsubloop:に戻るという動作を期待しているのですが、なぜかいくらかforが実行された後for文を抜けて最後のアラート(式の評価)に飛びます。感覚的にはbreak ラベル;が実行されていない感じです。
###該当のソースコード
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; //0-x + 1 17 var sisoku = new Array(); 18 sisoku[0] = '+'; 19 sisoku[1] = '-'; 20 sisoku[2] = '*'; 21 sisoku[3] = '/'; 22 var sisokunum = 0; 23 /*var sisokunochk = 0;*///不要? 24 for (var cntstrnum = 0; cntstrnum < sikilong; cntstrnum++) { //e 25 var chk = siki.charAt(cntstrnum); 26 for (var cnta = 0; cnta < 4; cnta++) { //f 27 if (chk == sisoku[cnta]) { //g 28 sisokunum = sisokunum + 1; 29 } //g 30 } //f 31 } //e 32 if (sisokunum == 0) { //h 33 alert("答え:" + siki); 34 return; 35 } //h 36 var sisokunochk = 0;//テスト// 37 /*loop:*/ 38 for (var cntmain = 0; cntmain < 2; cntmain++) { //i////gotoの代わり 39 /*var sikip = ""; 40 if (sisokunochk != 0) { 41 continue loop; 42 }*/ 43 subloop: 44 for (var cntb = 0; cntb < sikilong; cntb++) { //j 45 var sisokunochk = 0;//テスト// 46 var sikip = "";//テスト// 47 var counter = 0; 48 var countertwo = 0; 49 var sikipa = ""; 50 var sikipb = ""; 51 var sikisisoku = ""; 52 var sikiright = ""; 53 var twosisoku = 0;//// 54 for (var cntxyz = 2; cntxyz < 4; cntxyz++) {//xyz 55 if (sisoku[cntxyz] == siki.charAt(cntb)){//cntxyz 56 twosisoku = 1; 57 }//cntxyz 58 }//xyz 59 for (var cntz = 0; cntz < 4; cntz++) { //k 60 if (sisoku[cntz] == siki.charAt(cntb)) { //l 61 counter = 1; 62 } //l 63 } //k 64 if (counter == 0) { //m 65 sikip = sikip + siki.charAt(cntb); //sikipはsikiの計算する部分の記録用 66 if (cntb == sikilong - 1) { //n 67 sikipb = sikip; 68 } //n 69 } else if (counter == 1) { //m 70 for (var cnty = 2; cnty < 4; cnty++) { //o 71 if (sisoku[cnty] == siki.charAt(cntb)) { //p 72 if (sikipa == "") { //q 73 sikipa = sikip; 74 sikip = ""; 75 } else { //q 76 sikipb = sikip; 77 sikiright = siki.substr(cntb + 1, sikilong - 1); //怪しい 78 } //q 79 sikisisoku = siki.charAt(cntb); 80 continue; 81 } //p 82 } //o 83 } //m 84 for (var cntx = 0; cntx < 2; cntx++) { //r 85 if (sisoku[cntx] == siki.charAt(cntb) && twosisoku == 0) { //s//twosisokuは*/の数 86 sikipa = sikip 87 sikip = ""; 88 sikisisoku = siki.charAt(cntb); 89 } else if (sisoku[cntx] == siki.charAt(cntb) && twosisoku > 0) { //s 90 sikip = ""; 91 } //s 92 } //r 93 94 if (sikisisoku != "" && sikipa != "" && sikipb != "") { //s2 95 if (sikisisoku == sisoku[0]) { //t 96 sikileft = sikipa + sikipb; 97 siki = sikileft.toString() + sikiright.toString(); //以下共通 98 } else if (sikisisoku == sisoku[1]) { //t 99 sikileft = sikipa - sikipb; 100 siki = sikileft.toString() + sikiright.toString(); 101 } else if (sikisisoku == sisoku[2]) { //t 102 sikileft = sikipa * sikipb; 103 siki = sikileft.toString() + sikiright.toString(); 104 } else if (sikisisoku == sisoku[3]) { //t 105 sikileft = sikipa / sikipb; 106 siki = sikileft.toString() + sikiright.toString(); 107 } //t 108 } //s2 109 sikilong = siki.length; //計算後を想定した記述 110 sisokunochk = 0; 111 for (var cntc = 0; cntc < sikilong; cntc++) { //t 112 var chka = siki.charAt(cntc); 113 for (var cntd = 0; cntd < 4; cntd++) { //u 114 if (chka == sisoku[cntd]) { //v 115 sisokunochk = sisokunochk + 1; 116 } //v 117 } //u 118 } //t 119 if (sisokunochk == 0) { //w 120 continue; //もう四則演算子がない 121 } //w 122 if (sisokunochk != 0) { //x 123 continue subloop; //まだ四則演算子がある 124 } //x 125 } //j 126 127 } //i 128 alert("答え:" + siki); 129 return; 130 131 /*}catch(e){ 132 alert("式が不適合もしくはエラーです。"); 133 return; 134 } 135 finally{ 136 return; 137 }*/ 138 } //a
###試したこと
ブレークポイントを設定し、どうプログラムが進んでいるのかを詳細に調べました。また、ラベルで該当する文を{}で囲み、for文としてでなくラベル文として機能するようにしました。
###補足
"1+4"で検証しました。
###修正したこと
ラベル {}の{}を削除
break ラベルをcontinue ラベルに変更
回答2件
あなたの回答
tips
プレビュー