回答編集履歴

2 コメントを受けて指摘/回答中の問題部分について注記

dodox86

dodox86 score 6579

2019/04/13 11:07  投稿

> 1+2+3のような、連続した計算のやり方がわかりません。
ご提示のコードは数字や演算子のボタンがたくさんありそうなのでコードを読んだ限りで、実際には試していないのですが、例えば「`1 + 2 + 3 - 4 =`」などと入力されるケースでは演算子の次の整数(または小数)が確定したときに答えを求めて表示してしまえば良いと思います。例えば、
0. "1" が入力されたら(最初なので)ただ、変数`v1`(名前は何でも良いし、プロパティで可)に保存する。表示もする。
0. "+" が入力されたら演算子なので、"+"を保存する。(既に`arithmetic sign`で使っていますよね)
0. "2" が入力されたら既に整数`v1` に値が保存されてあり、演算子"+"もあるので計算可能な状態とみなせる。`1 + 2` を計算して答え3 を表示する。3は引き続き次の計算に使うため、変数`v1` に保存する。
0. "2" が入力されたら既に整数`v1` に値が保存されてあり、演算子"+"もあるので~~計算可能な状態とみなせる。`1 + 2` を計算して答え3 を表示する。~~**(表示タイミングは再考/この時点で表示してしまうと2桁以上の数値入力で破綻してしまうので不適切です - 追記をご覧ください)**3は引き続き次の計算に使うため、変数`v1` に保存する。
0. "+" が入力されたら演算子なので、"+"を保存する。
0. "3" が入力されたら変数`v1` と`arithmetic sign`で示される"+"で `3 + 3` を計算し、答6 を表示する。6は、引き続き次の計算に使うため、変数`v1` に保存する。
0. "-" が入力されたら演算子なので、"-"を保存する。
0. "4" が入力されたら変数`v1` と`arithmetic sign`で示される"-"で `6 - 4` を計算し、答2 を表示する。2は、引き続き次の計算に使うため、変数`v1` に保存する。
0. "=" が入力されたら、答え表示完了の為の色々な処理をする。(既に答えは表示されてるけど)
...以下同じ
整数や小数、演算子が入力されるごとに逐一「今現在、どんな状態で何ができるか」を意識して処理すると良いです。「状態遷移」の考え方です。一例として参考にしてみてください。
整数や小数、演算子が入力されるごとに逐一「今現在、どんな状態で何ができるか」を意識して処理すると良いです。「状態遷移」の考え方です。一例として参考にしてみてください。
---
**コメントを受けて追記しました:2019/04/13 11:06**
※オリジナルの回答を大きく編集してしまうと、コメントでいただいた指摘事項の対応が分かりづらくなると思いましたので、編集は最低限にしました。
**数値の範囲と入力確定の問題**(Zuishinさんのご指摘より):
回答では数値として1桁だけのものを例示してしまいましたが、当然そんなものでは実用にならないわけで、考慮不足であったことは失礼しました。2桁以上入力すると破綻しますので、少なくとも数値の入力を確定するのは次の演算子(+, -, * , /, =)入力時点とすべきでしょう。
**演算子の優先順位の問題**(YAmaGNZさんのご指摘より):
簡単な四則演算をする電卓でも、演算子の優先順位(乗除は加減を優先)を考慮するものとしないものがあります。
(1) 演算子の優先順位を考慮する電卓
iPhone(iOS12.2)の「計算機」やAndroid(6.0.x)標準の「電卓」で確認したところでは、優先順位を意識した動きになっていて、常に数式の全体を見て、再計算されます。(私はこれは今回初めて知りました)
使ってみて面白いと思ったのは、例えばAndroidで表示領域が大きいものでは2桁以上の値を入力すると逐次に再計算される、と言うことです。
「1 + 23 * 45」の場合、「1 + 2 で 3を表示」「1 + 23 で 24を表示」「1 + 23 * 4 で 93を表示」で「1 + 23 * 45 で1036を表示」と遷移していきます。
いずれにせよYAmaGNZさんのご指摘のように、入力された数式を何らかの方法ですべて覚えていて、終わりを示す演算子の入力(例えば`=`)が無ければ答えは出ないということになります。面倒ですが、単語分割(トークナイズ)など様々な検討事項が増えて、プログラミングトピック的には面白いとは思います。
(2) 演算子の優先順位を考慮しない電卓
一般的な実物の電卓では優先順位は考慮せず、逐次に計算されるものが多いようです。例えば 「1 + 2 * 3 = 9」となります。(手持ちのCanon HS-2200Aで確認)関数電卓などでは違うかもしれません。回答では勝手にこの動きを想定してしまいましたが、質問者さんのケースではどちらかを動作仕様として意識する必要があるかと思います。
尚、Windows (7と10で確認)の「電卓」では、メニューで選択するところの「普通の電卓」でこの動きとなり、「関数電卓」と「プログラマ」では優先順位を考慮する動きになっています。
逐次に答えが完成する、と言う意味ではこちらの方が簡単ではあります。
本件と直接関係あるとは限りませんが、teratailでも「電卓」に関して過去、様々な質問回答があったようです。teratail「電卓」で検索するとたくさん出てきます。改めて考えると、プログラミングの課題(なのか分かりませんが)として適切なもののひとつなのかもしれません。
1 記述修正

dodox86

dodox86 score 6579

2019/04/13 03:02  投稿

> 1+2+3のような、連続した計算のやり方がわかりません。
ご提示のコードは数字や演算子のボタンがたくさんありそうなのでコードを読んだ限りで、実際には試していないのですが、例えば「`1 + 2 + 3 - 4 =`」などと入力されるケースでは演算子の次の整数(または小数)が確定したときに答えを求めて表示してしまえば良いと思います。例えば、
0. "1" が入力されたら(最初なので)ただ、変数`v1`(名前は何でも良いし、プロパティで可)に保存する。表示もする。
0. "+" が入力されたら演算子なので、"+"を保存する。(既に`arithmetic sign`で使っていますよね)
0. "2" が入力されたら既に整数`v1` に値が保存されてあり、演算子"+"もあるので計算可能な状態とみなせる。`1 + 2` を計算して答え3 を表示する。3は引き続き次の計算に使うため、変数`v1` に保存する。
0. "+" が入力されたら演算子なので、"+"を保存する。
0. "3" が入力されたら変数`v1` と`arithmetic sign`で示される"+"で `3 + 3` を計算し、答6 を表示する。6は、引き続き次の計算に使うため、変数`v1` に保存する。
0. "-" が入力されたら演算子なので、"-"を保存する。
0. "4" が入力されたら変数`v1` と`arithmetic sign`で示される"-"で `6 - 4` を計算し、答2 を表示する。2は、引き続き次の計算に使うため、変数`v1` に保存する。
0. "=" が入力されたら、答え表示完了の為の色々な処理をする。(既に答えは表示されてるけど)
...以下同じ

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る