shiisuke’s blog

文系卒。社会人5年目くらい。ITやプログラミングの勉強で学んだことを書きます。

ゆうパックの料金計算プログラムを作ってみた(Java)

Ⅰ.きっかけ

Javaの勉強で、基本的な構文と継承までを大まかに理解できました。今回、その理解をより確かなものにしようと、自分で手と頭を動かしてプログラムを作ってみることにしました。

Ⅱ.作成したもの

f:id:shiisuke1229:20190331235438p:plain

  • 荷物は「東京」から送る
  • 料金は「お届け先」と「荷物のサイズ」で決まる
    • お届け先は「東京」または「北海道」
    • 荷物のサイズ(3辺の長さの合計)は 170cm以内

Ⅲ.実際に書いたプログラム

import java.io.*;
public class Postage {
    public static void main(String[] args)throws IOException {
        int size, place;
        int rate[][] = {{0,800,1280},{60,1010,1500},{80,1260,1730},{100,1500,1980},{120,1750,2220},{140,1970,2440},{160,2300,2800},{170,0,0}};
               
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        System.out.println("----宛先の地域を選択してください。----\n1:東京\n2:北海道");
        place = Integer.parseInt(br.readLine());
        
        while(place < 0 || place > 2){
            System.out.println("1 または 2を選択してください。");
            place = Integer.parseInt(br.readLine());
        }
                
        System.out.println("\n----荷物のサイズ(3辺の長さの合計,1~170)を入力してください。----");
        size = Integer.parseInt(br.readLine());
        
        while(size <= 0 || size > 170){
            System.out.println("1~170 の間で入力してください。");
            size = Integer.parseInt(br.readLine());
        }
        
        int charge = 0;        
        
        for(int i = 0; i < 7; i++){
            
            if(rate[i][0] < size && size <= rate[i+1][0]){
                charge = rate[i][place]; //rate[i][place];  
                break;
            }else{
            }
        }        
        System.out.println("\n料金は " + charge + "円 です。");        
    }    
}

Ⅳ.実行結果

1.宛先を「東京」、サイズを「140」とした場合

----宛先の地域を選択してください。----
1:東京
2:北海道
1

----荷物のサイズを入力してください。----
140

料金は 1750円 です。

下記の料金表と整合するので◎。

f:id:shiisuke1229:20190401002600p:plain:w400

2.宛先を「北海道」、サイズを「170」とした場合

----宛先の地域を選択してください。----
1:東京
2:北海道
2

----荷物のサイズを入力してください。----
170

料金は 2800円 です。

下記の料金表と整合するので◎。

f:id:shiisuke1229:20190401003633p:plain:w400

3.サイズを「200」とした場合

----宛先の地域を選択してください。----
1:東京
2:北海道
2

----荷物のサイズを入力してください。----
200
1~170 の間で入力してください。
200
1~170 の間で入力してください。
200
1~170 の間で入力してください。
200
1~170 の間で入力してください。

「荷物のサイズ(3辺の長さの合計)は 170cm以内」という条件に反するので、先に進めなくて◎。

4.宛先選択で「1」「2」以外を選択した場合

---宛先の地域を選択してください。----
1:東京
2:北海道
3
1 または 2を選択してください。
3
1 または 2を選択してください。
3
1 または 2を選択してください。
3
1 または 2を選択してください。

「お届け先は『東京』または『北海道』」という条件に反するので、先に進めなくて◎。

Ⅴ.迷った点・つまづいた点

1.サイズ「161~170」の扱い

  • 料金は、2次元配列で以下のような表を作って計算した(1列目が「サイズの範囲」を表し、2,3列目が「地域」を表す)
  • その際、「サイズの範囲」は 指定されたサイズが 下の表のどの行の間に入るか(たとえば、サイズ「50」は 配列[0][0]と配列[1][0]の間に入る)という形で特定している都合上、サイズ「161~170」を扱うためには「170」の行を作る必要があったため、料金表に「170, 0 ,0」という行を作った

f:id:shiisuke1229:20190401011119p:plain:w200

2.入力値の検証

  • while文を使って、正しい値が入力されるまで入力を繰り返させるようにした(参考

3.変数「charge」の初期化

  • for文の中で使用している「charge」は、先に初期化しておかないとコンパイルエラーとなったので(参考) 、for文の前に「 int charge = 0; 」を追加した

4.for文の中にif文を入れる

  • 「break」の使いどころと、「if else」の中身をどうすれば良いのかがイマイチわからなかった(要勉強)

5.関係演算子 ≧ の書き方

  • 正)<=  
  • 誤)=<

Ⅴ.感想

今回初めて、自分でテーマを設定して、どうしたらうまくいくかを考えながらプログラムを作りましたが、教科書のコードを書き写すだけの作業よりもずっと面白かったです。また、二次元配列など、理解があやふやだった点が分かってとても有意義でした。

Ⅵ.参考