前提・実現したいこと
計算問題が生成されるプログラムを作成しています。
条件は以下の通りです。
・計算式は全てで5問表示される。
・1問、4つの数字をランダム、3つの演算子をランダムに表示させる。
・5問の中で4つすべての算術演算子が使われるようにする。
・1つの計算式に使われる算術演算子は最低2つ。
しかし、÷0の問題が出力されると問題が発生します。
初心者の書くコードなんて読み辛いことこの上ないでしょうが、
以下のことを教えていただけると嬉しいです。
・問題点に対する具体的な対処方法。
・(もしよろしければ)その他コードの添削。
発生している問題
÷0の問題が出力された際、その問題が表示され、回答が入力できてしまう。
該当のソースコード
java
1public class Main { 2 public static void main(String[] args) { 3 4 Calculation.setOperator(); 5 6 } 7}
java
1import java.util.ArrayList; 2import java.util.InputMismatchException; 3import java.util.List; 4import java.util.Random; 5import java.util.Scanner; 6 7public class Calculation { 8 9 //演算子を決めるメソッド 10 public static void setOperator() { 11 12 Random rm = new Random(); 13 String[] operators = { "+", "-", "×", "÷" }; 14 15 //フラグ判定 16 boolean[] used = new boolean[4]; 17 18 //3つの演算子を5セット格納 19 String operator[][] = new String[5][3]; 20 21 while (true) { 22 23 for (int i = 0; i < 4; i++) { 24 used[i] = false; 25 } 26 27 for (int i = 0; i < 5; i++) { 28 29 //1つの式に最低2つ以上の演算子が使われているかを確認 30 while (true) { 31 int o = rm.nextInt(4); 32 operator[i][0] = operators[o]; 33 used[o] = true; 34 35 o = rm.nextInt(4); 36 operator[i][1] = operators[o]; 37 used[o] = true; 38 39 o = rm.nextInt(4); 40 operator[i][2] = operators[o]; 41 used[o] = true; 42 if (!operator[i][0].equals(operator[i][1]) && !operator[i][0].equals(operator[i][2])) { 43 break; 44 } 45 } 46 } 47 48 //5つの式で4つの演算子が使われているかを確認 49 boolean ok = true; 50 for (int i = 0; i < 4; i++) { 51 if (used[i] == false) 52 ok = false; 53 } 54 if (ok) { 55 break; 56 57 } 58 } 59 60 for (int i = 0; i < 5; i++) { 61 calculate(operator[i][0], operator[i][1], operator[i][2], i); 62 } 63 64 } 65 66 //四則演算メソッド 67 public static void calculate(String operator1, String operator2, String operator3, int count) { 68 69 Random rm = new Random(); 70 71 List<String> list = new ArrayList<>(); 72 73 boolean aaa = true; 74 75 //計算式を表示するためのリスト 76 List<String> formulaList = new ArrayList<>(); 77 78 String operator = null; 79 80 int value = rm.nextInt(5); 81 int beforeValue = value; 82 formulaList.add(String.valueOf(beforeValue)); 83 84 for (int i = 0; i < 3; i++) { 85 switch (i) { 86 case 0: 87 operator = operator1; 88 formulaList.add(operator1); 89 break; 90 91 case 1: 92 operator = operator2; 93 formulaList.add(operator2); 94 break; 95 96 case 2: 97 operator = operator3; 98 formulaList.add(operator3); 99 break; 100 101 } 102 103 value = rm.nextInt(5); 104 formulaList.add(String.valueOf(value)); 105 106 //×,÷を先に計算、+,-はリストに格納 107 switch (operator) { 108 case "+": 109 list.add(beforeValue + ""); 110 list.add("+"); 111 beforeValue = value; 112 break; 113 114 case "-": 115 list.add(beforeValue + ""); 116 list.add("-"); 117 beforeValue = value; 118 break; 119 120 case "×": 121 beforeValue *= value; 122 break; 123 124 case "÷": 125 try { 126 beforeValue /= value; 127 } catch (ArithmeticException e) { 128 129 System.out.println("※÷0はだめです。"); 130 System.out.println("========================="); 131 132 } 133 break; 134 } 135 } 136 137 list.add(beforeValue + ""); 138 int correctAnswer = Integer.parseInt(list.get(0)); 139 140 //リストに+,-があれば計算 141 for (int i = 0; i < list.size(); i++) { 142 String s = list.get(i); 143 if (s.equals("+")) { 144 correctAnswer += Integer.parseInt(list.get(i + 1)); 145 } else if (s.equals("-")) { 146 correctAnswer -= Integer.parseInt(list.get(i + 1)); 147 } 148 } 149 150 question(formulaList, count, correctAnswer); 151 152 } 153 154 //問題表示メソッド 155 static void question(List<String> formulaList, int count, int correctAnswer) { 156 157 int correctInput; 158 159 // 「1」を返されると同じ問題を繰り返す 160 do { 161 System.out.print("問題" + (count + 1) + ")"); 162 163 for (int i = 0; i < formulaList.size(); i++) { 164 System.out.print(formulaList.get(i)); 165 } 166 167 System.out.println("="); 168 correctInput = decide(correctAnswer); 169 170 } while (correctInput == 1); 171 172 } 173 174 //正誤判定メソッド 175 static int decide(int correctAnswer) { 176 177 int yourAnswer = 0; 178 Scanner scanner = new Scanner(System.in); 179 180 //数字以外を入力すると「1」を返す 181 try { 182 yourAnswer = scanner.nextInt(); 183 } catch (InputMismatchException e) { 184 System.out.println("※整数を入力してください。"); 185 return 1; 186 } 187 188 if (yourAnswer == correctAnswer) { 189 System.out.println("【正解】"); 190 191 } else { 192 System.out.println("【不正解】"); 193 194 } 195 System.out.println("========================="); 196 return 0; 197 198 } 199 200} 201 202
試したこと
÷0をキャッチした回数分、問題を再生成させるようにするために以下のコードを書いた。
ただ、問題の表示がおかしくなる。
試したソースコード
java
1public class Main { 2 public static void main(String[] args) { 3 4 Calculation.setOperator(0); 5 6 } 7} 8
Java
1import java.util.ArrayList; 2import java.util.InputMismatchException; 3import java.util.List; 4import java.util.Random; 5import java.util.Scanner; 6 7public class Calculation { 8 9 //演算子を決めるメソッド 10 public static void setOperator(int count) { 11 12 Random rm = new Random(); 13 String[] operators = { "+", "-", "×", "÷" }; 14 15 //フラグ判定 16 boolean[] used = new boolean[4]; 17 18 //3つの演算子を5セット格納 19 String operator[][] = new String[5][3]; 20 21 while (true) { 22 23 for (int i = 0; i < 4; i++) { 24 used[i] = false; 25 } 26 27 for (int i = 0; i < 5; i++) { 28 29 //1つの式に最低2つ以上の演算子が使われているかを確認 30 while (true) { 31 int o = rm.nextInt(4); 32 operator[i][0] = operators[o]; 33 used[o] = true; 34 35 o = rm.nextInt(4); 36 operator[i][1] = operators[o]; 37 used[o] = true; 38 39 o = rm.nextInt(4); 40 operator[i][2] = operators[o]; 41 used[o] = true; 42 if (!operator[i][0].equals(operator[i][1]) && !operator[i][0].equals(operator[i][2])) { 43 break; 44 } 45 } 46 } 47 48 //5つの式で4つの演算子が使われているかを確認 49 boolean ok = true; 50 for (int i = 0; i < 4; i++) { 51 if (used[i] == false) 52 ok = false; 53 } 54 if (ok) { 55 break; 56 57 } 58 } 59 60 if (count == 0) { 61 for (int i = 0; i < 5; i++) { 62 calculate(operator[i][0], operator[i][1], operator[i][2], i); 63 } 64 } else { 65 66 calculate(operator[count][0], operator[count][1], operator[count][2], count); 67 68 } 69 70 } 71 72 //四則演算メソッド 73 public static void calculate(String operator1, String operator2, String operator3, int count) { 74 75 Random rm = new Random(); 76 77 List<String> list = new ArrayList<>(); 78 79 boolean aaa = true; 80 81 //計算式を表示するためのリスト 82 List<String> formulaList = new ArrayList<>(); 83 84 String operator = null; 85 86 int value = rm.nextInt(5); 87 int beforeValue = value; 88 formulaList.add(String.valueOf(beforeValue)); 89 90 for (int i = 0; i < 3; i++) { 91 switch (i) { 92 case 0: 93 operator = operator1; 94 formulaList.add(operator1); 95 break; 96 97 case 1: 98 operator = operator2; 99 formulaList.add(operator2); 100 break; 101 102 case 2: 103 operator = operator3; 104 formulaList.add(operator3); 105 break; 106 107 } 108 109 value = rm.nextInt(5); 110 formulaList.add(String.valueOf(value)); 111 112 //×,÷を先に計算、+,-はリストに格納 113 switch (operator) { 114 case "+": 115 list.add(beforeValue + ""); 116 list.add("+"); 117 beforeValue = value; 118 break; 119 120 case "-": 121 list.add(beforeValue + ""); 122 list.add("-"); 123 beforeValue = value; 124 break; 125 126 case "×": 127 beforeValue *= value; 128 break; 129 130 case "÷": 131 try { 132 beforeValue /= value; 133 } catch (ArithmeticException e) { 134 135 System.out.println("※÷0はだめです。"); 136 System.out.println("========================="); 137 setOperator(count); 138 139 } 140 break; 141 } 142 } 143 144 list.add(beforeValue + ""); 145 int correctAnswer = Integer.parseInt(list.get(0)); 146 147 //リストに+,-があれば計算 148 for (int i = 0; i < list.size(); i++) { 149 String s = list.get(i); 150 if (s.equals("+")) { 151 correctAnswer += Integer.parseInt(list.get(i + 1)); 152 } else if (s.equals("-")) { 153 correctAnswer -= Integer.parseInt(list.get(i + 1)); 154 } 155 } 156 157 question(formulaList, count, correctAnswer); 158 159 } 160 161 //問題表示メソッド 162 static void question(List<String> formulaList, int count, int correctAnswer) { 163 164 int correctInput; 165 166 // 「1」を返されると同じ問題を繰り返す 167 do { 168 System.out.print("問題" + (count + 1) + ")"); 169 170 for (int i = 0; i < formulaList.size(); i++) { 171 System.out.print(formulaList.get(i)); 172 } 173 174 System.out.println("="); 175 correctInput = decide(correctAnswer); 176 177 } while (correctInput == 1); 178 179 } 180 181 //正誤判定メソッド 182 static int decide(int correctAnswer) { 183 184 int yourAnswer = 0; 185 Scanner scanner = new Scanner(System.in); 186 187 //数字以外を入力すると「1」を返す 188 try { 189 yourAnswer = scanner.nextInt(); 190 } catch (InputMismatchException e) { 191 System.out.println("※整数を入力してください。"); 192 return 1; 193 } 194 195 if (yourAnswer == correctAnswer) { 196 System.out.println("【正解】"); 197 198 } else { 199 System.out.println("【不正解】"); 200 201 } 202 System.out.println("========================="); 203 return 0; 204 205 } 206 207}
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/26 11:12