[Java] 変数の応用 キーボードからの入力を受け取って計算

2017年3月18日(更新: 2017年3月18日)

前回は、Javaで計算を行う際に使われる演算子や変数を利用した計算の例を紹介しました。

今回は、変数を利用して少し複雑な計算を行うプログラムの作成例を紹介します。

三角形の面積を求めるプログラム

底辺の長さと高さを与えると、三角形の面積を計算してくれるプログラムを作ってみましょう。

長さや面積は小数となる場合がありますので、これらの値を保持する変数として float型 の変数を用意します。

public class Test {
 
    public static void main(String args[]) {
 
        // 底辺の長さ
        float width = 5.0f;
 
        // 高さ
        float height = 8.0f;
 
        // 面積
        float area = width * height / 2;
 
        // 答えを表示する
        System.out.println("三角形の面積は" + area + "です。");
    }
}

float型の変数に値を代入する際は、上の例のように、代入する数値の後に f と書く必要があります。

もし f を書かなかった場合、代入する数値が double型 であるとみなされますので、以下のようにエラーとなります。

float型の数値に f をつけなかった時のエラー

エラーのアイコン(電球に×印)にマウスを乗せると、エラーの詳細が確認できます。

double型 を float型 に変換できないと言われています。float型 は double型 の変数に代入できますが、逆は特別な変換が必要となります。

float と double の型の不一致

上記のプログラムの実行結果は以下のようになります。

三角形の面積を求めるプログラムの実行結果

数値を変えて動作を確かめてみてください。

プログラムで使用する数値を自由に入力する

先ほどの三角形の面積を計算するプログラムでは、底辺の長さと高さは変数に格納されていますので、測りたい三角形によって変数の値を変える必要があります。

しかし、これらの値を変更できるのはプログラムの実行前(ソースコード作成時)のみです。

このプログラムを他の利用者(ユーザー)に配る場合を考えてみましょう。ユーザーはこのプログラムを使って様々な三角形の面積を測りたいと思います。しかし、ユーザーに配られるのは既に実行形式となったファイルであり、ソースコードを編集する事はできません。

したがって、先ほどプログラムを使っても、底辺5、高さ8(変数に代入された値)の三角形以外の面積は求められませんのでユーザーは不満です。

このようなプログラムの書き方をハードコードと言い、応用ができないプログラムとなってしまいます。

ハードコードとは、ソフトウェア開発の際に、特定の動作環境を決め打ちして、その環境を前提とした処理やデータをソースコードの中に直に記述すること。

ハードコードされたデータなどはプログラムの完成後、実行時などに容易に変更することはできないため、後から利用者などの手で変更する必要が無いか薄いと判断されたデータがハードコードされることが多い。
ハードコードとは|ハードコーディング|hard code : 意味/定義 – IT用語辞典

既にソースコードで決められた値を使うのではなく、プログラム実行時にユーザーが入力する数値を使うようにすれば、色々な三角形の面積を求めるができます。

では、プログラム実行時に底辺の長さと高さを入力できるようプログラムを改良してみましょう。

数値が入力できるプログラム

数値の入力を受け取るには、キーボードからの入力を読み取る仕組みが必要です。

ここでは Scanner というクラス(仕組み)を使います。

Scanner scan = new Scanner();

この一文をmainメソッド内の一番上に書き加えて下さい。その際、次のように警告が出ると思います。

scannerクラスの宣言

警告が出ている行の左にあるエラーのアイコンをクリックして、”Import ‘Scanner’ (java.util)” をクリックします。

Scannerのインポート

すると、プログラムのはじめの方に以下の一文が追加されます。

import java.util.Scanner;

これは Scanner というクラスを使うために必要なライブラリが取り込む処理です。

その後、new Scanner() の括弧の中に System.in と書いて準備完了です。

Scanner scan = new Scanner(System.in);

以上の手順を全て行って、ユーザーの入力を受け取るように改良したプログラムは以下のようになります。

import java.util.Scanner;

public class Test {
  
  public static void main(String args[]) {
    
      Scanner scan = new Scanner(System.in);
      
      System.out.print("底辺の長さを入力して下さい: ");

      // 底辺の長さ
      float width = scan.nextFloat();

      System.out.print("高さを入力して下さい: ");
      
      // 高さ
      float height = scan.nextFloat();
      
      // キーボードからの入力を終了する
      scan.close();

      // 面積
      float area = width * height / 2;

      // 答えを表示する
      System.out.println("三角形の面積は" + area + "です。");
  }
}

変更されたのは、変数 width と height の代入部分です。代入が 5.0f や 8.0f などの数値ではなく、 scan.nextFloat() という命令になっています。

これは「キーボードからのfloat型の数値入力を取得する」という意味の命令です。

このプログラム内では、この命令を二度を使っていますので、二回数値を入力する状態となるはずです。

入力を受け取る状態になると、数値を入力してEnterキーを押すまで、プログラムの流れが止まります。

実際にプログラムを実行して確かめてみましょう。数値は半角で入力してください

キーボードからの数値入力を受け取って計算するプログラム

この画像では緑色の数値が入力したものです。入力した数値に応じた面積の値が計算されているのが確認できます。

Scannerを使うために書いた命令には new など見慣れない記述が多いと思いますが、後ほど解説しますので今は決まり文句だと思ってください。

プログラムの問題点 不正な値の入力

これで様々な三角形の面積を求めるプログラムが完成したかに思えます。

しかし、もしマイナスの整数が入力されてしまった場合はどうなるでしょうか。

マイナスの長さや面積というのは現実ではありえませんから、計算の対象から外すべきです。

次回は、この問題を解決するために必要な条件分岐について紹介します。

[Java] 変数の応用 キーボードからの入力を受け取って計算」への1件のフィードバック

  1. ピンバック: [java] 条件によって処理を分ける if文とbooleanについて | JoyPlotドキュメント

コメントを残す

メールアドレスが公開されることはありません。