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

Print Friendly, PDF & Email

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

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


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

〔プログラムの説明〕

 電気ポットの状態遷移を模したプログラムである。この電気ポットは,電源に接続すると休止状態になり,沸騰ボタンが押されると加熱を開始する。沸点に到達すると加熱を終了し,休止状態に戻る。ただし,電気ポットに水がない場合は,沸騰ボタンが押されても加熱を開始せず,警告を表示する。電気ポットの状態遷移図を図1に示す。

pot
(1) 抽象クラス State は,電気ポットの状態を定義する。
(2) クラス Idie 及びクラスHeating は,それぞれ,休止状態と加熱中状態を示す State のサブクラスである。

(3) クラス ElectricPot は電気ポットを表す。フィールド currentState は ,電気ポットの状態を示す。フィールド content は,水量を示す。メソッド heat は, 沸騰ボタンが押されたときに呼ばれ,電気ポットに水があれば加熱を開始する(電気ポットの状態を加熱中に遷移)。水がない場合は例外を投げる。メソッド boiled は,水が沸点に到達したときに呼ばれ,加熱を終了する(電気ポットの状態を休上に遷移)。メソッド isEmpty は,水がない場合 true,それ以外の場合 false を返す。メソッド main はテスト用のメインプログラムである。

実行結果を図2に示す。

Idle -> Heating
Heating -> Idle
No Water!

図2 メソッドmainの実行例

[プログラム1]

public abstract class State {
   public static final State IDLE = new Idle();
   public static final State HEATING = new Heating(); 

   public void heat(ElectricPot pot) throws Exception {
      if (/*  a  */)
           /*  b  */;
      pot.changeState(HEATING); 
   }

   public void boiled(ElectricPot pot) {
      pot.changeState(IDLE); 
   }

   private static class Idle /*  c  */ {
      public String toString() { return "Idle"; } 
   }

   private static class Heating /*  c  */  {
      public String toString() { return "Heating"; }
   }
}

[プログラム2

public class ElectricPot {
   private State currentState = State.IDLE; 
   private int content;

   public ElectricPot(int content) { this.content = content; } 
   public void setContent(int content) {
      this.content = content; 
   }

   public boolean isEmpty() { return (content == 0); } 
   public void changeState(State newState) {
      System.out.println(currentState + " -> " + newState);
      currentState = newState;
   } 

   public void heat() throws Exception {
       /*  d  */.heat(this);
   }

   public void boiled() {
       /*  d  */.boiled(this);
   }

   public static void main(String[] args) {
      try {
         ElectricPot pot = new ElectricPot(10);
         pot.heat();
         pot.boiled();
         pot.setContent(0);
         pot.heat();
         pot.boiled();
      } catch (Exception e) {
         System.out.println(e.getMessage());
      }
   }
}

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

a に関する解答群

ア isEmpty()        イ !isEmpty()

ウ pot.isEmpty()      エ !pot.isEmpty()

オ pot == null       カ pot != null

b に関する解答群

ア return "No Water!"

イ System.out.println("No Water!")

ウ throw "No Water!"

エ throw new Exception("No Water!");

c に関する解答群

ア extends Exception     イ extends Object

ウ extends State       エ implements Exception

オ implements Object     カ implements State

d に関する解答群

ア currentState        イ State

ウ super           エ this