Developer

【はじめてのJava】金額計算プログラムを作ってみよう②【Javaプログラム実践編】
2022.01.31
Lv1

【はじめてのJava】金額計算プログラムを作ってみよう②【Javaプログラム実践編】

はじめてのJava

このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。


今回は、今まで学習してきた内容を組み合わせて実際のプログラムを作成してみようと思います。
前回のレジの動作を再現したプログラムの続きを作成していきます。

目次


作成するプログラムの確認

前回に引き続き、お店のレジの動作を再現したようなプログラムを作成して行きます。
具体的には以下の3つの操作を行います。

①商品の代金を入力させる。
②支払金額を入力させる。
③お釣りの金額を計算し、金額とどの通貨が何枚必要かを計算して表示する。

(2000円札は考えないこととします。)
※画面に入力したデータが不正(数字じゃない or マイナスの数字になっている)な場合には、エラー表示を行います。
<正しく実行された場合>

<入力したデータが不正な場合>

また、クラス設計は以下のようになっていました。

①CashRegisterクラス(金額の計算を行う側)

 →こちらのクラスでは、入力された金額を受け取って、お釣りの金額や貨幣の枚数を計算します。

②ExecuteCashRegisterクラス(金額の入力をする側)

 →こちらのクラスでは、画面から値を入力して、そのチェックを行い、CashRegisterクラスへと値を渡します。

今回は、②のExecuteCashRegisterクラスを作成します。
こちらのクラスを作成する際のポイントは、画面からの入力を受け取る方法と、そのデータをどのようにチェックするのかです。


ExecuteCashRegisterクラス

ExecuteCashRegisterクラスでは、画面からの入力と値のチェックを行います。
まず、処理を実行するためのmainメソッドを定義していきます。

1
2
3
4
5
public class ExecuteCashRegister {
    public static void main(String[] args) {
     
    }
}

mainメソッドの中で、データの入力とチェックを行います。
データの入力は、Scannerクラスを利用して行います。
今回は、数字を入力させるので、「nextInt()メソッド」を利用します。
入力したデータはローカル変数に格納し、入力後に値をcalcChangeメソッドに渡して計算を行います。
Scannerクラスの使い方の復習はこちら↓
【はじめてのJava】キーボード入力【いろいろなクラス編】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class ExecuteCashRegister {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
 
        //代金の入力
        System.out.print("代金を入力 : ");
        int price = sc.nextInt();
 
        //預り金の入力
        System.out.print("支払金額を入力 : ");
        int payment = sc.nextInt();
         
    }
}

次に、入力されたデータのチェックを行います。
行いたいチェックは以下の3つです。

①入力されたデータがint型になっているか
②マイナスの数値が入力されていないか
③支払金額が代金以上の値になっているか

入力されたデータのチェック方法としては、例外処理やif文での分岐を利用して行います。
今回の入力チェックでは、①のデータ型のチェックは例外処理で、②と③のチェックはif文を利用して行います。
①のチェックでは、ScannerクラスのnextInt()メソッドが例外を発生させることを利用してチェックを行います。
nextInt()メソッドで取り出そうとしたデータ型と異なるメソッドのデータが格納されていた場合、メソッドは「InputMismatchException」という例外を発生させます。
この例外を利用してデータ型のチェックを行います。
また、②と③のチェックでは、if文を利用してデータの値をチェックします。
もし、値が不正な場合には、throw句で「InputMismatchException」を発生させて①のチェックと同じように例外処理を行わせます。
データの入力を行う部分全体をtryブロックで囲んで、catchブロックでInputMismatchExceptionを処理します。
例外処理の復習はこちら↓
【はじめてのJava】例外の対応【例外処理編】
【はじめてのJava】例外を発生させる【例外処理編】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class ExecuteCashRegister {
    public static void main(String[] args) {
 
        Scanner sc = new Scanner(System.in);
 
        try {
            //代金の入力
            System.out.print("代金を入力 : ");
            int price = sc.nextInt();
            if (price <= 0) {
                //値が0以下の場合にはInputMismatchExceptionを発生させる
                throw new InputMismatchException();
            }
 
            //預り金の入力
            System.out.print("支払金額を入力 : ");
            int payment = sc.nextInt();
            if (payment <= 0) {
                //値が0以下の場合にはInputMismatchExceptionを発生させる
                throw new InputMismatchException();
            }
             
            //代金≦支払金額になっているかのチェック
            if(price > payment) {
                //代金の方が大きい場合にはInputMismatchExceptionを発生させる
                throw new InputMismatchException();
            }
 
        } catch (InputMismatchException e) {
            //入力チェックでエラーが起きた場合このcatchブロックに処理が移る。
            System.out.println("不正な値が入力されました。初めからやり直してください。");
        }
    }
}

最後に、入力チェックが終わった後で前回作成したCashRegisterクラスに定義された「calcChangeメソッド」を呼び出してお釣りの計算を行います。
また、Scannerクラスは利用後にリソースの解放を行う必要があるため、finallyブロックでclose()を行います。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class ExecuteCashRegister {
    public static void main(String[] args) {
 
        Scanner sc = new Scanner(System.in);
 
        try {
            //代金の入力
            System.out.print("代金を入力 : ");
            int price = sc.nextInt();
            if (price <= 0) {
                throw new InputMismatchException();
            }
 
            //預り金の入力
            System.out.print("支払金額を入力 : ");
            int payment = sc.nextInt();
            if (payment <= 0) {
                throw new InputMismatchException();
            }
             
            //代金≦支払金額になっているかのチェック
            if(price > payment) {
                throw new InputMismatchException();
            }
 
            //お釣りの計算と通貨の枚数を表示
            CashRegister.calcChange(price,payment);
 
        } catch (InputMismatchException e) {
            System.out.println("不正な値が入力されました。初めからやり直してください。");
        } finally {
            sc.close();
        }
    }
}


実践編・次回の内容

今回は、レジプログラムの画面からデータを受け取る部分を作成しました。
前回の計算部分と今回のプログラムを繋げることでレジのプログラムが完成です。
今までに解説してきた様々な知識を各所で使っていましたので、復習になったのではないでしょうか。
Javaプログラム実践編では、今回のような実際のプログラムで構文などの復習をしていきたいと思っています。


初めてのJavaシリーズの目次はこちら
Javaプログラム実践編の記事一覧はこちら


java 11 の練習問題一覧はこちら
はじめてのJavaシリーズの練習問題一覧はこちら