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

Print Friendly, PDF & Email

ここでは、当社の新人研修受講者に向けて、基本情報のJavaの過去問を掲載しています。

想定しているのは、NetBeansなどのIDEにコピー・ペーストしたうえで、自分の正しいと思う答えを埋めて動作を確認するという使い方です。


プログラムの説明

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

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

・ゴールド利用者:マイレージ=基準距離× 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
プログラムで使用する定数を宣言しているインタフェースである。

[プログラム]※問題の箇所をコメント/* */で示している

package fe14a.pmt12;

public class MileageTest implements MileageServices {
  public static void main(String args[]) {
    NormalPassenger taro = new NormalPassenger("Taro", 0);
    GoldPassenger mark = new GoldPassenger("Mark", 100000);
    NormalPassenger june = new NormalPassenger("June", 0);
    GoldPassenger jiro = new GoldPassenger("Jiro", 50000);
    new MileageTest(taro, NARITA, PARIS, 
                    DOMESTIC_ROUND_TRIP);
    new MileageTest(mark, LOSANGELES, PARIS, 
                    ASIA_PACIFIC_ROUND_TRIP);
    new MileageTest(june, PARIS, KANSAI, US_ROUND_TRIP);
    new MileageTest(jiro, KANSAI, NARITA, 0);
    new MileageTest(taro, PARIS, NARITA, DOMESTIC_ROUND_TRIP);
  }
  public MileageTest(Passenger passenger, int from, int to,
                     int awardTrip) {
    passenger.addMileage(from, to);
    System.out.println("\n" + passenger.getName() +
                       "'s mileage: " + passenger.getMileage());
    if (/*(  a  )*/ != 0)
      try {
        passenger.awardTravel(awardTrip);
        System.out.println("You get an award trip.\n" +
                           "Your mileage is now " +
                           passenger.getMileage() + ".");
      } catch (NotEnoughMileageException e) {
        System.out.println(e);
      }
  }
}

interface MileageServices {
  final static int NARITA = 0; 
  final static int KANSAI = 1; 
  final static int LOSANGELES = 2; 
  final static int PARIS = 3; 
  final static int[][] MILEAGE = {{   0,  300, 5400, 6200},
                                  { 300,    0, 5700, 6100},
                                  {5400, 5700,    0, 4000},
                                  {6200, 6100, 4000,    0}
                                 };
  final static int DOMESTIC_ROUND_TRIP = 15000;
  final static int ASIA_PACIFIC_ROUND_TRIP = 20000;
  final static int US_ROUND_TRIP = 40000;

  final static double NORMAL = 1.00;
  final static double GOLD = 1.25;
}

/*(  b  )*/ class Passenger implements MileageServices {
  int totalMileage;
  String name;

  /*(  c  )*/(String name, int totalMileage) {
    this.name = name;
    this.totalMileage = totalMileage;
  }
  public abstract void addMileage(int from, int to);
  public void awardTravel(int award) throws 
                                NotEnoughMileageException {
    if (award > /*(  d  )*/)
      throw new NotEnoughMileageException(name);
    else
      totalMileage -= award;
  }
  public int getMileage() {
    return totalMileage;
  }
  public String getName() {
    return name;
  }
}

class NormalPassenger extends Passenger {
  NormalPassenger(String name, int totalMileage) {
    super(name, totalMileage);
  }
  public void addMileage(int from, int to) {
    totalMileage += (int)(MILEAGE[from][to] * NORMAL);
  }
}

class GoldPassenger extends Passenger {
  GoldPassenger(String name, int totalMileage) {
    super(name, totalMileage);
  }
  public void addMileage(int from, int to) {
    totalMileage += (int)(MILEAGE[from][to] * GOLD);
  }
}

class NotEnoughMileageException extends Exception {
  String name;
  public NotEnoughMileageExce

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

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

設問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;  
}
セイ・コンサルティング・グループのお問い合わせ