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

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

次の Java プログラムの説明及びプログラムを読んで,設問1,2に答えよ。

〔プログラムの説明〕

A を起点,D を終点とする四つの駅 A,B,C,D からなる路線の各駅に設置された自動改札機の 処理を模したプログラムである。 この路線では片道切符(以下,切符という)とプリペイドカード(以下,カードという)の 2種類の乗車券が使用できる。

路線の運賃は駅間の距離で決められる。 距離が 4 km までは 120 円(この運賃を初乗り運賃という)で,それを超えると 2 km ごとに 30 円加算される。2 km 未満は
2 km に切り上げる。例えば,距離が 7 km のとき,運賃は 180 円である。

切符には,乗車駅で自動改札機を通って入場するとき,乗車駅の情報が記録される。 降車駅で自動改札機を通って出場するとき,運賃が計算され,金額が不足しているときは ゲートが閉じられ,出場できない。 一度使用した切符は無効となる。 この路線では切符を発券した駅にかかわらず,どの駅の自動改札機からでも入場し,乗車できる。 例えば,A 駅で発券された切符で B 駅の自動改札機から入場できる。

カードには,乗車駅で自動改札機を通って入場するとき,乗車駅の情報が記録される。 このとき,カードの残高が 0 円の場合は,ゲートが閉じられ,入場できない。 降車駅で自動改札機を通って出場するとき,精算処理が行われる。 すなわち,運賃が計算され,カードの残高から引かれる。 このとき,カードの残高が運賃に満たない場合は,ゲートが閉じられ,出場できない。

クラス Line は路線を表す。 メソッド getFare は与えられた距離から運賃を計算して返す。

クラス Gate は,自動改札機を表す。クラス Line のフィールド A,B,C,D は

Gate のインスタンスであり,それぞれ A,B,C,D の各駅に設置された自動改札機を表す。 コンストラクタ及び各メソッドは,次の処理を行う。

(1) コンストラクタは,Gate のインスタンスを生成する。 最初の引数に駅名,2番目の引数に路線の起点である A 駅からの距離を指定する。

(2) メソッド enter は,自動改札機を通って入場するときの処理を行う。 乗車券が適正でない場合はゲートを閉じる。 入場処理が正常に行われた場合は,乗車券に乗車駅の情報を記録する。

(3) メソッド exit は,自動改札機を通って出場するときの処理を行う。 乗車券の金額(残高)が不足するなど,適正でない場合はゲートを閉じる。

(4) メソッド open 及び close は,それぞれゲートの開閉を表すメッセージを出力する。

抽象クラス Ticket は,この路線の乗車券を表し,このクラスを継承して切符やカードを定義する。 コンストラクタ及び各メソッドは,次の処理を行う。

(1) コンストラクタは,購入時の金額を初期値として乗車券に保持する。

(2) メソッド getValue は,呼び出された時点での乗車券の金額(残高)を返す。

(3) メソッド adjustValue は,必要であれば精算処理を行う。

(4)  メソッド deduct は,引数で指定された金額を乗車券の金額(残高)から 差し引いて金額(残高)を更新する。

(5) メソッド setOrigin は,指定された Gate を乗車駅として記録する。 null が指定されたときは,乗車駅の記録を消去する。

(6) メソッド getOrigin は,記録されている乗車駅を返す。 記録されていないときは null を返す。

クラス OneWayTicket は切符を表し,クラス PrepaidCard はカードを表す。 それぞれの乗車券の処理で,抽象メソッドを実装し, 必要に応じて Ticket のメソッドをオーバライドする。

〔プログラム1〕

public final class Line {
   public static final Gate A = new Gate("A", 0);
   public static final Gate B = new Gate("B", 5);
   public static final Gate C = new Gate("C", 8);
   public static final Gate D = new Gate("D", 14);
   public static int getFare(int distance) {
      return 120 + (Math.max(distance - 3, 0) / 2) * 30;
   }
}

〔プログラム2〕

public class Gate {
   private final String name;
   private final int distance;
   public Gate(String name, int distance) {
      this.name = name;
      this.distance = distance;
   }
   public void enter(Ticket ticket) {
      if (ticket.isValid() && ticket.getOrigin() == null) {
         ;
         open();
      } else {
         close();
      }
   }
   public void exit(Ticket ticket) {
      Gate origin = ticket.getOrigin();
      if (origin != null) {
          int d = Math.abs(origin.distance - distance);
          int fare = Line.getFare(d);
          if () {
             ticket.adjustValue(fare);
             ticket.setOrigin(null);
             open();
             return;
          }
      }
      close();
   }
   private void open() { System.out.println(name + ": open"); }
   private void close() {
      System.out.println(name + ": closed");
   }
}

〔プログラム3〕

public abstract class Ticket {
   private Gate origin;
   private int value;
   public Ticket(int value) {
      this.value = value;
   }
   public int getValue() { return value; }
   public void deduct(int amount) { value -= amount; }
   public void setOrigin(Gate gate) { origin = gate; }
   public Gate getOrigin() { return origin; }
   public abstract void adjustValue(int amount);
   public abstract boolean isValid();
}

〔プログラム4〕

public class OneWayTicket extends Ticket {
   private boolean valid = true;
   public OneWayTicket(int value) {
      ;
   }
   public void setOrigin(Gate gate) {
      super.setOrigin(gate);
      if (gate == null)
         valid = false;
   }
   public void adjustValue(int amount) { }
   public boolean isValid() { return valid; }
}

〔プログラム5〕

public class PrepaidCard extends Ticket {
   public PrepaidCard(int value) {
      ;
   }
   public void adjustValue(int amount) { deduct(amount); }
   public boolean isValid() {
      return getValue() > 0;
   }
}

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

a に関する解答群

ア ticket.setOrigin(Line.A)    イ ticket.setOrigin(Line.D)

ウ ticket.setOrigin(null)     エ ticket.setOrigin(this)

オ ticket.setOrigin(ticket)

b に関する解答群

ア ticket.getValue() < fare    イ ticket.getValue() <= fare

ウ ticket.getValue() == fare     エ ticket.getValue() > fare

オ ticket.getValue() >= fare

c に関する解答群

ア super()       イ super(this)

ウ super(value)    エ super(); this.value = value

オ this(value)

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

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

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

基本情報技術者試験


設問2 この路線で,新しいタイプの乗車券を発売することになった。 この乗車券は発券した時刻から 24 時間以内は全駅で乗り降り自由な乗車券である。 発券から 24 時間経過すると出場はできるが入場はできなくなる。これに伴い,抽象クラス Ticket を継承して新しいクラスを定義し,クラス Gate には修正を加えずに この乗車券をサポートしたい。 このクラスのコンストラクタ及びメソッドの処理を次の表にまとめた。 表中の に入れる正しい答えを,解答群の中から選べ。 ここで,解答群中の value は,クラス Ticket のフィールド value であり, コンストラクタで初期値を設定し,値はメソッド getValue で得るものとする。

コンストラクタ及びメソッド処理
コンストラクタ
メソッド getValue
メソッド setOriginスーパクラスで定義されたとおり
メソッド getOriginスーパクラスで定義されたとおり
メソッド adjustValue何もしない(メソッド本体が文を含まない)。
メソッド isValid

解答群

ア value が路線の最高運賃(全運賃の最大値)以上のときだけ true を返す。 それ以外は false を返す。

イ value が路線の初乗り運賃以上のときだけ true を返す。 それ以外は false を返す。

ウ value の初期値に,理論的に 24 時間かかっても使い切れない金額を設定する。

エ value の初期値に,路線の最高運賃(全運賃の最大値)を設定し,発券時刻を記録する。

オ スーパクラスで定義されたとおり

カ 常に 0 を返す。

キ 常に路線の初乗り運賃の値を返す。

ク 何もしない(メソッド本体が文を含まない)。

ケ メソッド deduct を,amount を引数として呼び出す。

コ 呼び出されたときの時刻がインスタンスに格納されている発券時刻から 24 時間以内の ときだけ true を返す。それ以外は false を返す。

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

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

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


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