こんにちは,さかなです.
今回から計算機アプリver2として引き続きプログラムを書いていきます.
前回は四則計算の法則を無視して入力された順に計算されるところまで行きました.
今回は四則演算の法則に従った計算(1+3×3=10 のように)ができるようになるまでをやります.
変更したのはイコールボタンが押された時に呼ばれるメソッドのみで,他の部分は前回までと変わっていません.
まず,フィールド部分です.
既存の最終的な答えを格納するdouble型変数answerに加え,新たに乗除をする際にその計算結果を一時的に保存しておくdouble型変数answer2,式が加減のみか乗除のみかを判断するboolean型のallEqual1,allEqual2を初期値trueで宣言しています.(詳しくは後述)
answer2の初期値設定の部分です.式に乗除がある場合,最初に乗除が行われる際の数字をanswer2の初期値としています.
詳しくは後で述べますが,これは1+3*4*2+1などの式の時にanser2 = 3 * 4 * 2 とするのではなく,answer2 *= 4,answer2 *=2というようにしていくプログラムにしているため,このように初期値を設定しています.
式が加減のみまたは乗除のみの場合,今まで通り左から順に計算していけばよいことになります.
そこでここでは四則演算記号を表す数字を格納しているnumberPreservationをfor文でチェックしていき,answerに加減または乗除していきます.(answerの初期値はtrueValue.get(0))
もし,加減のみ,乗除のみではないと分かった時,allEqual1,allEqual2にfalseを代入し,forループを抜けます.
この画像には映っていませんが,抜けた際にanswerの値は初期値とは変わっているため,再びtrueValue.get(0)を初期値に設定しなおしています.
次に式に加減乗除が混同している場合の処理です.(式が加減のみ,乗除のみではないとき)
コードが長いのでここでは足し算,掛け算の処理のみを載せています.
画像の一枚目の解説です.
まず,足し算が行われる際,次の計算記号が加減か乗除かで計算の順序が変わってきます.
次の計算記号が加減の場合,今まで通り左から計算していくようにしています.
次の計算記号が乗除の場合,乗除を先に計算しなければいけないため,ひとまず計算はさせずに加減の記号がある場所をint型変数jに記憶させています.
次に画像の二枚目の解説です.
まず,乗除の記号があった時,anser2に乗除する形で計算させていきます.
そしてその後,まだ計算をしていない加減のある個所jに先に計算されたanswer2をanswerに加減しています.
ですので,最終的な答えは今まで通りanswerに格納されるようにしています.
この画像には載っていませんが,最後にanswerを返してこのメソッドは終わらせています.
また,上記画像の両方にあるif (i + 1 == numberPreservation.size())はiの値が式の最後の計算記号の時の処理を書いています.(こうしないとアプリを実行したときにうまくいかないので.コンパイルは通りますが)
ところどころ省略していますが,以上が四則演算の法則に沿った計算器のプログラムです.
以下の画像はタブレットでの実行画面です.
このように,法則に沿って計算をしています.
今回はここまで!ようやく実際の計算機ぽくなってきました!
次は小数点入力の実装をしようと思っていますが,調べてみるとfloat,doubleだと誤差が生じるみたいです.なのでBigDecimalというのを使わないと正確に計算できないだとか...
π,eの実装の方が早いかも...
次は何をするかは未定ですが,先に進んだら更新しようと思います.
以下,覚え書き
【ver2で実装したいこと】
・小数点対応
・一文字削除ボタン
・割り算の際,0で割れないようにする
・割り算の余りの計算
・π
・自然対数(e)
・√
・階上
【ver3以降実装したいこと】
・三角関数
・指数,対数関数
・微分,積分





