teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

コード修正2

2016/11/10 13:45

投稿

naomi3
naomi3

スコア1105

answer CHANGED
@@ -54,4 +54,102 @@
54
54
  kotae.value += digit;
55
55
  };
56
56
  }
57
+ ```
58
+
59
+ 私の答えはこうです。よくある状態遷移です。
60
+ [AC]ボタンはご自身で実装してみてください。
61
+ ```JavaScript
62
+ var kotae = document.getElementById('ans');
63
+
64
+ var zeroToNine = ["zero", "one", "two", "three", "four",
65
+ "five", "six", "seven", "eight", "nine"];
66
+ var digitButtons = new Array(10);
67
+
68
+ // 演算子ボタン
69
+ var operators = ["plus", "minus", "mul", "div"];
70
+ var operatorButtons = new Array(operators.length);
71
+
72
+ var calculatingButton = document.getElementById('equ');
73
+
74
+ // 状態定数
75
+ var STATE = {
76
+ INITIAL : 0,
77
+ DIGIT_BUTTON_PRESSED_AT_FIRST : 1,
78
+ OPERATOR_BUTTON_PRESSED : 2,
79
+ DIGIT_BUTTON_PRESSED_AT_SECOND : 3,
80
+ CALCULATING_BUTTON_PRESSED : 4
81
+ };
82
+ // 状態変数
83
+ var state = STATE.INITIAL;
84
+
85
+ // 数値記憶用
86
+ var memory = 0;
87
+ // 押された演算子
88
+ var pressedOperator = '';
89
+
90
+ for (var i = 0; i <= 9; i++) {
91
+ digitButtons[i] = document.getElementById(zeroToNine[i]);
92
+ digitButtons[i].onclick = function() {
93
+ // アラビア数字に変換
94
+ var digit = zeroToNine.indexOf(this.id) + '';
95
+
96
+ switch (state) {
97
+ case STATE.INITIAL:
98
+ case STATE.DIGIT_BUTTON_PRESSED_AT_FIRST:
99
+ kotae.value += digit;
100
+ state = STATE.DIGIT_BUTTON_PRESSED_AT_FIRST;
101
+ break;
102
+
103
+ case STATE.OPERATOR_BUTTON_PRESSED:
104
+ kotae.value = '';
105
+ // noBreak;
106
+ case STATE.DIGIT_BUTTON_PRESSED_AT_SECOND:
107
+ kotae.value += digit;
108
+ state = STATE.DIGIT_BUTTON_PRESSED_AT_SECOND;
109
+ break;
110
+
111
+ }
112
+ };
113
+ }
114
+
115
+ for (i = 0; i < operatorButtons.length; i++) {
116
+ operatorButtons[i] = document.getElementById(operators[i]);
117
+ operatorButtons[i].onclick = function() {
118
+ switch (state) {
119
+ case STATE.DIGIT_BUTTON_PRESSED_AT_FIRST:
120
+ case STATE.CALCULATING_BUTTON_PRESSED:
121
+ pressedOperator = this.id;
122
+ memory = parseInt(kotae.value, 10);
123
+ state = STATE.OPERATOR_BUTTON_PRESSED;
124
+ break;
125
+ }
126
+ };
127
+ }
128
+
129
+ calculatingButton.onclick = function() {
130
+ if (state === STATE.DIGIT_BUTTON_PRESSED_AT_SECOND) {
131
+ var operand = parseInt(kotae.value, 10);
132
+
133
+ switch (pressedOperator) {
134
+ case "plus":
135
+ kotae.value = memory + operand;
136
+ break;
137
+
138
+ case "minus":
139
+ kotae.value = memory - operand;
140
+ break;
141
+
142
+ case "mul":
143
+ kotae.value = memory * operand;
144
+ break;
145
+
146
+ case "div":
147
+ kotae.value = memory / operand;
148
+ break;
149
+
150
+ }
151
+
152
+ state = STATE.CALCULATING_BUTTON_PRESSED;
153
+ }
154
+ };
57
155
  ```

1

コード修正

2016/11/10 13:45

投稿

naomi3
naomi3

スコア1105

answer CHANGED
@@ -32,4 +32,26 @@
32
32
  }
33
33
  ```
34
34
  数字のキーはこのようにすると、コードを短縮でき、間違えにくくなります。
35
- 2桁以上にも対応しています。
35
+ 2桁以上にも対応しています。
36
+
37
+ これでどうですか。
38
+ ```JavaScript
39
+ var kotae = document.getElementById('ans');
40
+ var zeroToNine = ["zero", "one", "two", "three", "four",
41
+ "five", "six", "seven", "eight", "nine"];
42
+ var digitElements = new Array(10);
43
+ var tasu = document.getElementById('plus');
44
+ var hiku = document.getElementById('minus');
45
+ var kakeru = document.getElementById('mul');
46
+ var waru = document.getElementById('div');
47
+ var ikoru = document.getElementById('equ');
48
+
49
+ for (var i = 0; i <= 9; i++) {
50
+ digitElements[i] = document.getElementById(zeroToNine[i]);
51
+ digitElements[i].onclick = function() {
52
+ // アラビア数字に変換
53
+ var digit = zeroToNine.indexOf(this.id) + '';
54
+ kotae.value += digit;
55
+ };
56
+ }
57
+ ```