こんにちは。くまごろーです。
先日作成した電卓は、数値を2つまでしか入力できない仕様になっていたので、手を加えて2つ以上の数を計算できるようにしました。
一応形にはなったんですが、気が付いたらこんなに長いコードになってしまいました。
もっとシンプルにできただろってすごく思います・・・こういうのが本当よくないんですね
まあでも、今回の電卓作成で、今までやったことのないことを色々取り入れられたので、すごく勉強にはなりました。
今回やってみたこと&感じた
・ BigDecimal型を使ってみる
・ 可変長配列(Listクラス)を使用
・ indexOfメソッドを実際に使ってみてありがたさを感じた
・ メソッドを役割ごとにクラス分けすると本当にわかりやすい
・ インスタンスをnewしてメソッド実行すると本当に楽(-_-)
・ コンストラクタが有能(newした時に引数渡せるの楽)
まだまだ色々と穴があるので完成とはいえませんが・・・
なんかもう酒も入っててよくわからない感じになってきましたが(-"-)
作るのって楽しいですね。
https://github.com/kumaGoro95/Calculator
<Main.java>
import java.math.BigDecimal; import java.util.Scanner; import java.util.ArrayList; public class Main{ public static void main(String [] args){ Scan a = new Scan(); System.out.println(); System.out.println("---------"); System.out.println("電卓アプリ"); System.out.println("---------"); System.out.println(); a.numberScan(); //計算式を入力 Print b = new Print(a.getNumberArr(), a.getOperaArr()); b.numberPrint(); //入力した式を表示 Calc c = new Calc(a.getNumberArr(), a.getOperaArr()); c.multiplyAndDivide(); //最初に掛け算と割り算 c.addAndSubtract(); //最後に足し算と引き算 c.resultPrint(); //結果を表示 } }
<Scan.java>
import java.math.BigDecimal; import java.util.Scanner; import java.util.ArrayList; public class Scan{ private ArrayList<BigDecimal> numberArr = new ArrayList<>(); //数字を入れる配列 private ArrayList<Character> operaArr = new ArrayList<>(); //演算子を入れる配列 public ArrayList<BigDecimal> getNumberArr(){ return this.numberArr; } public ArrayList<Character> getOperaArr(){ return this.operaArr; } public void numberScan(){ System.out.println("数値を入力してください"); Scanner scan1 = new Scanner(System.in); Double double1 = scan1.nextDouble(); BigDecimal big1 = BigDecimal.valueOf(double1); numberArr.add(big1); System.out.println("演算子を選択してください"); System.out.println("[ 1: + 2: - 3: * 4: / ]"); Scanner scan3 = new Scanner(System.in); char opera = scan3.next().charAt(0); operaArr.add(opera); System.out.println("数値を入力してください"); Scanner scan2 = new Scanner(System.in); Double double2 = scan2.nextDouble(); BigDecimal big2 = BigDecimal.valueOf(double2); numberArr.add(big2); for(int i= 0; i < 100; i++){ System.out.println("演算子を選択してください"); System.out.println("終了する場合は5を入力してください"); System.out.println("[ 1: + 2: - 3: * 4: / ]"); Scanner scanA = new Scanner(System.in); char operaA = scanA.next().charAt(0); if(operaA == '5'){ break; } operaArr.add(operaA); System.out.println("数値を入力してください"); Scanner scanB = new Scanner(System.in); Double doubleA = scanB.nextDouble(); BigDecimal bigA = BigDecimal.valueOf(doubleA); numberArr.add(bigA); } } }
<Calc.java>
import java.math.BigDecimal; import java.util.Scanner; import java.util.ArrayList; public class Calc{ private ArrayList<BigDecimal> numberArr; private ArrayList<Character> operaArr; Calc(ArrayList<BigDecimal>numberArr,ArrayList<Character>operaArr){ this.numberArr = numberArr; this.operaArr = operaArr; } public ArrayList<BigDecimal> getNumberArr(){ return this.numberArr; } public ArrayList<Character> getOperaArr(){ return this.operaArr; } public void addAndSubtract(){ //足し算と引き算を行う for(int i = 0; i <= operaArr.size();){ if(operaArr.isEmpty()){ //演算子がなくなれば終了 break; }else if(operaArr.get(i) == '+'){ //'+'を見つけると足し算 BigDecimal addResult = numberArr.get(i).add(numberArr.get(i+1)); numberArr.set(i, addResult); //結果を代入 numberArr.remove(i+1); //計算し終わった箇所は削除 operaArr.remove(i); }else{ //それ以外は引き算 BigDecimal subtractResult = numberArr.get(i).subtract(numberArr.get(i+1)); numberArr.set(i,subtractResult); //結果を代入 numberArr.remove(i+1); //計算し終わった箇所は削除 operaArr.remove(i); } } } public void multiplyAndDivide(){ //掛け算割り算を行う for(int i = 0; i <= 100; i++){ int index1 = operaArr.indexOf('×'); //'×'の位置を検索 int index2 = operaArr.indexOf('÷'); //'÷'の位置を検索 if((index1<index2&&index1!=-1)||(index1>index2&&index2==-1)){ //手前から計算 BigDecimal multiplyResult = numberArr.get(index1).multiply(numberArr.get(index1+1)); numberArr.set(index1, multiplyResult); //結果を代入 numberArr.remove(index1+1); //計算し終わった箇所は削除 operaArr.remove(index1); }else{ if(index2 == -1){ break; } BigDecimal divideResult = numberArr.get(index2).divide (numberArr.get(index2+1), 3 , BigDecimal.ROUND_DOWN); numberArr.set(index2, divideResult); //結果を代入 numberArr.remove(index2+1); //計算し終わった箇所は削除 operaArr.remove(index2); } } } public void resultPrint(){ //計算結果を表示 System.out.print(numberArr.get(0)); System.out.println(); } }
<Print.java>
import java.math.BigDecimal; import java.util.Scanner; import java.util.ArrayList; public class Print{ private ArrayList<BigDecimal> numberArr; private ArrayList<Character> operaArr; Print(ArrayList<BigDecimal>numberArr, ArrayList<Character>operaArr){ this.numberArr = numberArr; this.operaArr = operaArr; } public ArrayList<BigDecimal> getNumberArr(){ return this.numberArr; } public ArrayList<Character> getOperaArr(){ return this.operaArr; } public void numberPrint(){ operaSet(); System.out.println(); System.out.println("---------"); System.out.println("計算結果"); System.out.println("---------"); System.out.println(); for(int j = 0; j < operaArr.size(); j++){ System.out.print(numberArr.get(j)+" "); System.out.print(operaArr.get(j)+" "); } System.out.print(numberArr.get(operaArr.size())+" "); System.out.print("= "); } public void operaSet(){ //数字で選択した演算子を記号に変換する for(int i = 0; i < operaArr.size(); i++){ int index = operaArr.indexOf('1'); if(index == -1){ break; } operaArr.set(index, '+'); } for(int i = 0; i < operaArr.size(); i++){ int index = operaArr.indexOf('2'); if(index == -1){ break; } operaArr.set(index, '-'); } for(int i = 0; i < operaArr.size(); i++){ int index = operaArr.indexOf('3'); if(index == -1){ break; } operaArr.set(index, '×'); } for(int i = 0; i < operaArr.size(); i++){ int index = operaArr.indexOf('4'); if(index == -1){ break; } operaArr.set(index, '÷'); } } }
一応、実施結果はこんな感じです。