基本情報技術者試験の過去問と解説
[TOP] [午前分野別] [午後分野別] [キーワード索引] [令和元年秋午前] [令和元年秋午後]

平成14年 春期 基本情報技術者 午後 問12
問12   Java

〔プログラムの説明〕

 飛行機の利用者の種別(一般利用者,ゴールド利用者)と 利用区間からマイレージを求めて積算マイレージを計算するプログラムである。 利用者の各種別のマイレージの計算方法は,次のとおりである。

・一般利用者:  マイレージ=基準距離

・ゴールド利用者:マイレージ=基準距離× 1.25

利用区間とその基準距離を,次表に示す。

  表 利用区間と基準距離 

  利用区間   基準距離
成田     − 関西300
成田     − ロサンゼルス5,400
成田     − パリ6,200
関西     − ロサンゼルス5,700
関西     − パリ6,100
ロサンゼルス − パリ4,000

 計算したマイレージを,それまでの積算マイレージに加える。 利用者は積算マイレージを無料往復チケットに交換することができる。

プログラムは,次の五つのクラスと一つのインタフェースで構成されている。

MileageTest

メソッド main をもつテスト用のクラスであり,次の処理を行う。

(1) 一般利用者とゴールド利用者のインスタンスを生成し,利用者名, 積算マイレージの情報を初期化する。

(2) 新しい積算マイレージを計算し,実行結果を出力する。

コンストラクタ MileageTest の引数は,利用者名,出発地,到着地, 無料往復チケット指定である。 無料往復チケット指定には,無料往復チケットに交換する場合は交換に必要なマイレージを 指定し,無料往復チケットに交換しない場合は 0 を指定する。

Passenger

利用者を表す抽象クラスである。 抽象メソッド addMileage は,積算マイレージを計算する。 メソッド awardTravel は,無料往復チケットの交換が可能か否かの判定を行い, 可能であれば積算マイレージから無料往復チケット交換に必要なマイレージを減算し, 不可能であれば例外処理によってメッセージを出力する。 メソッド
getMileage は,積算マイレージを返す。メソッド getName は,利用者名を返す。

NormalPassenger

一般利用者を表すクラスであり,積算マイレージを計算するメソッド addMileageを実装する。

GoldPassenger

ゴールド利用者を表すクラスであり,積算マイレージを計算するメソッド addMileage を実装する。

NotEnoughMileageException

無料往復チケットに交換できない場合の処理を行うクラスである。

MileageServices

プログラムで使用する定数を宣言しているインタフェースである。

〔プログラム〕

(行番号)
 1  public class MileageTest implements MileageServices {
 2    public static void main(String args[]) {
 3      NormalPassenger taro = new NormalPassenger("Taro", 0);
 4      GoldPassenger mark = new GoldPassenger("Mark", 100000);
 5      NormalPassenger june = new NormalPassenger("June", 0);
 6      GoldPassenger jiro = new GoldPassenger("Jiro", 50000);
 7      new MileageTest(taro, NARITA, PARIS, 
 8                      DOMESTIC_ROUND_TRIP);
 9      new MileageTest(mark, LOSANGELES, PARIS, 
10                      ASIA_PACIFIC_ROUND_TRIP);
11      new MileageTest(june, PARIS, KANSAI, US_ROUND_TRIP);
12      new MileageTest(jiro, KANSAI, NARITA, 0);
13      new MileageTest(taro, PARIS, NARITA, DOMESTIC_ROUND_TRIP);
14    }
15    public MileageTest(Passenger passenger, int from, int to,
16                       int awardTrip) {
17      passenger.addMileage(from, to);
18      System.out.println("\n" + passenger.getName() +
19                         "'s mileage: " + passenger.getMileage());
20      if (  != 0)
21        try {
22          passenger.awardTravel(awardTrip);
23          System.out.println("You get an award trip.\n" +
24                             "Your mileage is now " +
25                             passenger.getMileage() + ".");
26        } catch (NotEnoughMileageException e) {
27          System.out.println(e);
28        }
29    }
30  }
31
32  interface MileageServices {
33    final static int NARITA = 0; 
34    final static int KANSAI = 1; 
35    final static int LOSANGELES = 2; 
36    final static int PARIS = 3; 
37    final static int[][] MILEAGE = {{   0,  300, 5400, 6200},
38                                    { 300,    0, 5700, 6100},
39                                    {5400, 5700,    0, 4000},
40                                    {6200, 6100, 4000,    0}
41                                   };
42    final static int DOMESTIC_ROUND_TRIP = 15000;
43    final static int ASIA_PACIFIC_ROUND_TRIP = 20000;
44    final static int US_ROUND_TRIP = 40000;
45
46    final static double NORMAL = 1.00;
47    final static double GOLD = 1.25;
48  }
49
50   class Passenger implements MileageServices {
51    int totalMileage;
52    String name;
53
54    (String name, int totalMileage) {
55      this.name = name;
56      this.totalMileage = totalMileage;
57    }
58    public abstract void addMileage(int from, int to);
59    public void awardTravel(int award) throws 
60                                  NotEnoughMileageException {
61      if (award > )
62        throw new NotEnoughMileageException(name);
63      else
64        totalMileage -= award;
65    }
66    public int getMileage() {
67      return totalMileage;
68    }
69    public String getName() {
70      return name;
71    }
72  }
73
74  class NormalPassenger extends Passenger {
75    NormalPassenger(String name, int totalMileage) {
76      super(name, totalMileage);
77    }
78    public void addMileage(int from, int to) {
79      totalMileage += (int)(MILEAGE[from][to] * NORMAL);
80    }
81  }
82
83  class GoldPassenger extends Passenger {
84    GoldPassenger(String name, int totalMileage) {
85      super(name, totalMileage);
86    }
87    public void addMileage(int from, int to) {
88      totalMileage += (int)(MILEAGE[from][to] * GOLD);
89    }
90  }
91
92  class NotEnoughMileageException extends Exception {
93    String name;
94    public NotEnoughMileageException(String name) {
95      this.name = name;
96    }
97    public String toString() {
98      return "Sorry, your mileage isn't enough for " +
99             "your award trip, " + name + ".";
100    }
101  }

 プログラムの実行結果を図に示す。


Taro's mileage: 6200

Sorry, your mileage isn't enough for your award trip, Taro.

Mark's mileage: 105000

You get an award trip.

Your mileage is now 85000.

June's mileage: 6100

Sorry, your mileage isn't enough for your award trip, June.

Jiro's mileage: 50375

Taro's mileage: 12400

Sorry, your mileage isn't enough for your award trip, Taro.


  図 実行結果

基本情報技術者試験


設問1  プログラム中の に入れる正しい答えを, 解答群の中から選べ。

解答群

ア abstract     イ awardTrip

ウ GoldPassenger    エ NormalPassenger

オ Passenger     カ private

キ public      ク totalMileage

解答 a ←クリックすると正解が表示されます

解答 b ←クリックすると正解が表示されます

解答 c ←クリックすると正解が表示されます

解答 d ←クリックすると正解が表示されます

基本情報技術者試験


設問2 プログラムの行番号 5 を次のとおりに変更した場合, 行番号 11 を実行した後の,利用者 June の積算マイレージの値として正しい答えを, 解答群の中から選べ。

NormalPassenger june = new NormalPassenger("June", 50000);

解答群

ア 3900     イ 10000

ウ 16100     エ 96100

解答 ←クリックすると正解が表示されます

基本情報技術者試験


設問3 プログラムの行番号 37 〜 41 を次のとおりに変更したとき, 同じ結果を得るために,行番号 78 の直後及び行番号 87 の直後に 挿入する内容として正しい答えを,解答群の中から選べ。

final static int[][] MILEAGE = {{   0},
                                { 300,    0},
                                {5400, 5700,    0},
                                {6200, 6100, 4000, 0}
                               };

解答群

if (from == 0) {
     int tmp = from;
     from = to;
     to = tmp;
}
if (from != to) {
      int tmp = from;
      from = to;
      to = tmp;
}
if (from > to) {
     int tmp = from;
     from = to;
     to = tmp;
}
if (from < to) {
      int tmp = from;
      from = to;
      to = tmp;  
}

解答 ←クリックすると正解が表示されます

[←前の問題] [次の問題→] [問題一覧表] [分野別] [基本情報技術者試験TOP ]