Javaを使って電卓を作る

広告

Java を使ったプログラムのサンプルとして、電卓を作成してみます。

コマンドライン引数を取得する

電卓をどのように作成するかですが、コマンドライン引数に「数値」「演算子」「数値」の 3 つの値を指定するようにしてみます。例えば Dentaku 3 * 4 のようにプログラムを実行すると、 3 * 4 の演算結果を返すようにします。

それでは最初にコマンドライン引数の値を取得してみます。テキストエディタで次のように記述したあと、 Dentaku.java という名前で保存します。

class Dentaku{
  public static void main(String args[]){
    int val1 = 0;  /* 最初の数字 */
    int val2 = 0;  /* 次の数字 */
    String ope;    /* 演算子 */

    if (args.length != 3){
      System.out.println("Usage : java Dentaku 数値 演算子 数値");
      System.out.println("演算子は * / + - の4つです");
      return;  /* プログラムを終了する */
    }

    val1 = Integer.parseInt(args[0]);
    val2 = Integer.parseInt(args[2]);
    ope = args[1];

    System.out.println("入力された式は " + val1 + " " + ope + " " + val2 + " です");
  }
}

コマンドライン引数が 3 かどうかをチェックし、 3 つだった場合は 1 番目と 3 番目の引数の値を数値に変換して保存し、 2 番目の引数は文字列として保存しています。

なおコマンドライン引数で * は特別な意味を持つため、 * だけはダブルクォーテーションを付けて "*" のように入力する必要があります。

コンパイルを行います。

javac -encoding UTF-8 Dentaku.java

その後で、次のように実行してください。

java Dentaku 4 + 7

コマンドライン引数を取得する(1)

入力された値を取り出すことができました。

コマンドライン引数が 3 つでない場合は使い方を表示してプログラムを終了します。例えば次のように実行してみます。

java Dentaku 4 +

コマンドライン引数を取得する(2)

コマンドライン引数が 2 つなので、使い方を表示してプログラムが終了しました。

演算子のチェック

コマンドライン引数の 2 番目の値が * / + - のいずれかであるかどうかをチェックします。今回は正規表現を使って次のようにチェックをしました。

if (!ope.matches("[*/+-]")) {
  System.out.println("エラー: 演算子には * / + - のいずれかを指定してください。");
  return;
}

正規表現を使用しない方法はいくつかありますが、例えば switch を使用しても記述できます。

boolean isValid = false;
switch (ope) {
    case "*":
    case "/":
    case "+":
    case "-":
        isValid = true;
        break;
    default:
        isValid = false;
}

if (!isValid) {
    System.out.println("エラー: 演算子には * / + - のいずれかを指定してください。");
    return;
}

if を使用しても記述できます。

if (!(ope.equals("*") || ope.equals("/") || ope.equals("+") || ope.equals("-"))) {
    System.out.println("エラー: 演算子には * / + - のいずれかを指定してください。");
    return;
}

今回は最初の正規表現を使用する方法を使います。サンプルを次のように書き換えました。

class Dentaku{
  public static void main(String args[]){
    int val1 = 0;  /* 最初の数字 */
    int val2 = 0;  /* 次の数字 */
    String ope;    /* 演算子 */

    if (args.length != 3){
      System.out.println("Usage : java Dentaku 数値 演算子 数値");
      System.out.println("演算子は * / + - の4つです");
      return;  /* プログラムを終了する */
    }

    val1 = Integer.parseInt(args[0]);
    val2 = Integer.parseInt(args[2]);

    ope = args[1];
    if (!ope.matches("[*/+-]")) {
      System.out.println("エラー: 演算子には * / + - のいずれかを指定してください。");
      return;
    }

    System.out.println("入力された式は " + val1 + " " + ope + " " + val2 + " です");
  }
}

コンパイルを行います。

javac -encoding UTF-8 Dentaku.java

その後で、次のように実行してください。

java Dentaku 4 + 7

コマンドライン引数を取得する(3)

4 つの演算子のいずれかを指定している場合は、問題なく表示されました。

2 番目のコマンドライン引数が指定した演算子でない場合は使い方を表示してプログラムを終了します。例えば次のように実行してみます。

java Dentaku 4 @ 7

コマンドライン引数を取得する(4)

2 番目のコマンドライン引数が指定した演算子ではないので、使い方を表示してプログラムが終了しました。

数値のチェック

コマンドライン引数の 1 番目と 3 番目の値が数値かどうかをチェックします。現時点でのプログラムで、例えば次のように 1 番目の引数に数値以外を指定してプログラムを実行してみます。

java Dentaku a + 5

コマンドライン引数を取得する(5)

数値ではない値を数値に変換しようとしたため NumberFormatException という例外が発生しプログラムが終了します。

そこで NumberFormatException が発生した場合は、 1 番目か 3 番目の引数の値が数値ではないので、その場合はエラーを表示してプログラムを終了させるようにします。

try {
  val1 = Integer.parseInt(args[0]);
  val2 = Integer.parseInt(args[2]);
} catch (NumberFormatException e) {
  System.out.println("エラー: 数値を正しく入力してください。");
}

サンプルを次のように書き換えました。

class Dentaku{
  public static void main(String args[]){
    int val1 = 0;  /* 最初の数字 */
    int val2 = 0;  /* 次の数字 */
    String ope;    /* 演算子 */

    if (args.length != 3){
      System.out.println("Usage : java Dentaku 数値 演算子 数値");
      System.out.println("演算子は * / + - の4つです");
      return;  /* プログラムを終了する */
    }

    try {
      val1 = Integer.parseInt(args[0]);
      val2 = Integer.parseInt(args[2]);
    } catch (NumberFormatException e) {
      System.out.println("エラー: 数値を正しく入力してください。");
      return;
    }

    ope = args[1];
    if (!ope.matches("[*/+-]")) {
      System.out.println("エラー: 演算子には * / + - のいずれかを指定してください。");
      return;
    }

    System.out.println("入力された式は " + val1 + " " + ope + " " + val2 + " です");
  }
}

コンパイルを行います。

javac -encoding UTF-8 Dentaku.java

その後で、次のように実行してください。

java Dentaku 4 + 7

コマンドライン引数を取得する(6)

1 番目と 3 番目の引数の値が数値の場合は、問題なく表示されました。

1 番目か 3 番目のコマンドライン引数が数値でない場合は使い方を表示してプログラムを終了します。例えば次のように実行してみます。

java Dentaku a + 7

コマンドライン引数を取得する(7)

1 番目のコマンドライン引数が数値ではないので、使い方を表示してプログラムが終了しました。

演算結果を表示する

コマンドライン引数のチェックが終わりましたので、演算結果を画面に出力するように修正します。注意点として割り算の場合に 0 で割ってしまうことがないようにチェックしています。

サンプルを次のように書き換えました。 swtich を使って演算子毎に演算をおこない、結果を画面に出力しています。

class Dentaku{
  public static void main(String args[]){
    int val1 = 0;  /* 最初の数字 */
    int val2 = 0;  /* 次の数字 */
    String ope;    /* 演算子 */

    if (args.length != 3){
      System.out.println("Usage : java Dentaku 数値 演算子 数値");
      System.out.println("演算子は * / + - の4つです");
      return;  /* プログラムを終了する */
    }

    try {
      val1 = Integer.parseInt(args[0]);
      val2 = Integer.parseInt(args[2]);
    } catch (NumberFormatException e) {
      System.out.println("エラー: 数値を正しく入力してください。");
      return;
    }

    ope = args[1];
    if (!ope.matches("[*/+-]")) {
      System.out.println("エラー: 演算子には * / + - のいずれかを指定してください。");
      return;
    }

    int result = 0;

    switch (ope) {
      case "+":
        result = val1 + val2;
        break;
      case "-":
        result = val1 - val2;
        break;
      case "*":
        result = val1 * val2;
        break;
      case "/":
        if (val2 == 0) {
          System.out.println("エラー: 0で割ることはできません。");
          return;
        } else {
          result = val1 / val2;
        }
        break;
    }

    System.out.println(val1 + " " + ope + " " + val2 + " = " + result);
  }
}

コンパイルを行います。

javac -encoding UTF-8 Dentaku.java

色々な引数を指定してプログラムを実行してみると、演算結果が画面に出力されます。

java Dentaku 4 + 7
java Dentaku 5 "*" 3
java Dentaku 8 - 2
java Dentaku 9 / 3

コマンドライン引数を取得する(8)

割り算の場合だけ 3 番目の引数に 0 を指定するとエラーを表示してプログラムを終了します。

java Dentaku 4 + 7
java Dentaku 5 "*" 3
java Dentaku 8 - 2
java Dentaku 9 / 3

コマンドライン引数を取得する(9)

電卓のプログラムはこれで完成です。

-- --

Java を使ったサンプルプログラムとして簡易的な電卓を作成しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。