ゆうパックの料金計算プログラムを作ってみた(Java)
Ⅰ.きっかけ
Javaの勉強で、基本的な構文と継承までを大まかに理解できました。今回、その理解をより確かなものにしようと、自分で手と頭を動かしてプログラムを作ってみることにしました。
Ⅱ.作成したもの
- テーマは身近なところから「ゆうパック」とした
- 以下の「ゆうパック」の料金表をもとに、料金計算プログラムを作った
- 荷物は「東京」から送る
- 料金は「お届け先」と「荷物のサイズ」で決まる
- お届け先は「東京」または「北海道」
- 荷物のサイズ(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円 です。
下記の料金表と整合するので◎。
2.宛先を「北海道」、サイズを「170」とした場合
----宛先の地域を選択してください。---- 1:東京 2:北海道 2 ----荷物のサイズを入力してください。---- 170 料金は 2800円 です。
下記の料金表と整合するので◎。
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」という行を作った
2.入力値の検証
- while文を使って、正しい値が入力されるまで入力を繰り返させるようにした(参考)
3.変数「charge」の初期化
4.for文の中にif文を入れる
- 「break」の使いどころと、「if else」の中身をどうすれば良いのかがイマイチわからなかった(要勉強)
5.関係演算子 ≧ の書き方
- 正)<=
- 誤)=<
Ⅴ.感想
今回初めて、自分でテーマを設定して、どうしたらうまくいくかを考えながらプログラムを作りましたが、教科書のコードを書き写すだけの作業よりもずっと面白かったです。また、二次元配列など、理解があやふやだった点が分かってとても有意義でした。
Ⅵ.参考
- 平成29年度春期 基本情報技術者試験 午後問題 問11