MENU

【JAVA】この前作った電卓を改造した。

こんにちは。くまごろーです。
先日作成した電卓は、数値を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, '÷');
    }
    }
}

 
一応、実施結果はこんな感じです。

f:id:kumaGoro_95:20200818210959p:plain