総視聴再生時間43万分以上(2017年5月13日現在)の動画で基本情報技術者試験の過去問&キーワード解説!スキマ時間に動画!〜これじょIT〜

PR広告

平成28年度春 基本情報技術者試験午後 過去問11 ソフトウェア開発(Java) 設問2 合格率アップ!動画付き解説

TOP :

問11 ソフトウェア開発(Java)

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

〔プログラムの説明〕

 "すべきこと"(以下、ToDo という)を管理するプログラムである。

(1) クラス ToDo は ToDo を表すクラスであり、コンストラクタで主題、期限、重要度を指定する。期限は、年月日を表す8桁又は年月日時分を表す12桁の数字から成る文字列(以下、日時という)であり、例えば、2016年4月16日を表す文字列は"2O16O416"、2016年4月16日午後1時0分を表す文字列は"2O16O41613OO"である。ここで、日時に誤りはないものとする。

 主題、期限、重要度を取得する各メソッドと、状態を設定及び取得するメソッド、ToDo を識別するフィールド id をもつ。

 列挙 Priority は ToDo の重要度を表す列挙であり、重要度が低い順に LOW、MIDDLE、HIGH である。

 列挙 State は ToDo の状態を表す列挙であり、NOT_YET_STARTED は未着手、STARTED は着手済み、DONE は完了を表す。

(2) クラス ToDoList は ToDo のリストを保持するクラスである。

 リスト中に、フィールド id の値が同じ ToDo を複数個含まないことを保証する。

 ToDo を追加するメソッド add と、ToDo の更新を行うメソッド update、条件に合う ToDo のリストを返すメソッド select をもつ。

 メソッド add の引数に、既にリストに保持されている ToDo を指定したとき、及びメソッド update の引数に、リストにない ToDo を指定したときは何もしない。

 メソッド setect の引数には、条件を0個以上指定できる。条件を指定したときは、全ての条件に合致する ToDo から成るリストを返す。条件を指定しないときは、保持する全ての ToDo から成るリストを返す。

(3) インタフェース Condition は、ToDo を選択する際の条件を表すクラスが実装するインタフェースである。メソッド test は条件に合致するときに true を返す。

(4) クラス ToDoListTester は、テスト用のクラスである。

[プログラム1]

import fava.util.UUID;

public class ToDo {
   public enum Priority { LOW, MIDDLE, HIGH }
   public enum State { NOT_YET_STARTED, STARTED, DONE }
   
   // 8桁又は12桁の数字から成る文字列と一致する正規表現
   private staric final String DEADLINE_PATTERN = "\\d{8}|\\d{12}";
   private final String id;
   private String subject;
   private String deadline;
   private Priority priority;
   private State state;
   
   private ToDo(String subject, String deadline, Priority priority, String id, State state) {
      if(!deadLine.matches(DEADLINE_PATTERN)) {
         throw new IllegalArgumentException();
      }
      this.subject = subject;
      this.deadline = deadline;
      this.priority = priority;
      this.id = id;
      this.state = state;
   }
   
   public ToDo(String subject, String deadline, Priority priority) {
      this(subject, deadline, priority,
         UUID.randomUUID().toString(), State.NOT_YET_STARTED);
   }
   
   public ToDo(ToDo todo) {
      this(todo.subject, todo.deadline, todo.priority, todo.id, todo.state);
   }
   
   public String getSubject() { return subject; }
   public String getDeadLine() { return deadline; }
   public Priority getPriority() { return priority; }
   public State getState() { return state; }
   public void setState(State state) { this.state = state; }
   public int hashCode() { return id.hashCode(); }
   
   public boolean equals(Object o) {
      return o instanceof ToDo && a;
   }
   
   public String toString() {
      return String.format("主題: %s, 期限: %s, 優先度: %s, 状態: %s",
                           subject, deadline, priority, state);
   }
}

[プログラム2]

import java.util.ArrayList;
import java.util.List;

public class ToDoList {
   private List<todo> todoList = new ArrayList<todo>();
   
   public void add(ToDo todo) {
      if(b) {
         todoList.add(new ToDo(todo));
      }
   }
   
   public void update(ToDo todo) {
      int index = todoList.indexOf(todo);
      if (index c) {
         todoList.set(index, todo);
      }
   }
   
   public List<todo> select(Condition... conditions) {
      List result = new ArrayList<todo>();
      for (ToDo todo : todoList) {
         d;
         for (Conditon condition : conditions) {
            selected e condition.test(todo);
            if (!selected) break;
         }
         if (selected) {
            result.add(new ToDo(todo));
         }
      }
      return result;
   }
}

[プログラム3]

public interface Condition {
    boolean test(ToDo todo);
}

[プログラム4]

public class ToDoListTester {
    public static void main(String[] args) {
       ToDoList list = new ToDoList();
       list.add(new ToDo("メール送信","201604181500", ToDo.Priority.HIGH));
       list.add(new ToDo("ホテル予約","20160420", ToDo.Priority.LOW));
       list.add(new ToDo("チケット購入","20160430", ToDo.Priority.MIDDLE));
       list.add(new ToDo("報告書作成","20160428", ToDo.Priority.HIGH));
       list.add(new ToDo("会議室予約","201605301200", ToDo.Priority.HIGH));
       list.update(new ToDo("PC購入","20160531", ToDo.Priority.HIGH));
       
       for (ToDo todo : list.select()) {
          todo.setState(ToDo.State.STARTED);
          list.update(todo);
       }
       
       Condition condition1 = new Condition() {
          public boolean test(ToDo todo) {
             return todo.getDeadline().compareTo("20160501") < 0;
          }
       };
       
       Condition condition2 = new Condition() {
          public boolean test(ToDo todo) {
             return todo.getPriority().equals(ToDo.Priority.HIGH);
          }
       };
       
       for (ToDo todo : list.select(condition1, condition2)) {
          System.out.println(todo)
       }
    }
}

設問2

プログラム4の実行結果を図1に示す。 に入れる正しい答えを、解答群の中から選べ

平成28年度春応用情報技術者試験午問11 データ構造及びアルゴリズム 合格率アップ!動画解説!

解答群

  1. 主題: PC購入、期限: 20160531、優先度: HIGH
  2. 主題: 会議室予約、期限: 201605301200、優先度: HIGH
  3. 主題: チケット購入、期限: 20160430、優先度: MIDDLE
  4. 主題: 報告書作成、期限: 20160428、優先度: HIGH
  5. 主題: ホテル予約、期限: 20160420、優先度: L0W
  6. 主題: メール送信、期限: 201604181500、優先度: HIGH

解説

まず、各ToDoを格納しています。「PC購入」はリストにないToDoなので更新されないので存在しません(アはなし)。

次に検索条件です。

condition1をみると「todo.getDeadline().compareTo("20160501") < 0;」であることから、2016年5月1日より前のToDoを抽出します。

condition2をみると「todo.getPriority().equals(ToDo.Priority.HIGH);」であることから、優先順位が"HIGH(高い)"のToDoを抽出します。

この2つの条件に一致するのは「報告書作成」と「メール送信」です。

エ 主題: 報告書作成、期限: 20160428、優先度: HIGH

カ 主題: メール送信、期限: 201604181500、優先度: HIGH

表示は登録順に行われるので、

fには「カ 主題: メール送信、期限: 201604181500、優先度: HIGH」

gには「エ 主題: 報告書作成、期限: 20160428、優先度: HIGH」

という順番で出力されます。

[プログラム4]

public class ToDoListTester {
    public static void main(String[] args) {
       ToDoList list = new ToDoList();
       list.add(new ToDo("メール送信","201604181500", ToDo.Priority.HIGH));
       list.add(new ToDo("ホテル予約","20160420", ToDo.Priority.LOW));
       list.add(new ToDo("チケット購入","20160430", ToDo.Priority.MIDDLE));
       list.add(new ToDo("報告書作成","20160428", ToDo.Priority.HIGH));
       list.add(new ToDo("会議室予約","201605301200", ToDo.Priority.HIGH));
       list.update(new ToDo("PC購入","20160531", ToDo.Priority.HIGH));
       
       for (ToDo todo : list.select()) {
          todo.setState(ToDo.State.STARTED);
          list.update(todo);
       }
       // 2016年5月1日前のものを検索条件とする
       Condition condition1 = new Condition() {
          public boolean test(ToDo todo) {
             return todo.getDeadline().compareTo("20160501") < 0;
          }
       };
       // 優先順位が「HIGH(高い)」ものを検索条件とする
       Condition condition2 = new Condition() {
          public boolean test(ToDo todo) {
             return todo.getPriority().equals(ToDo.Priority.HIGH);
          }
       };
       
       for (ToDo todo : list.select(condition1, condition2)) {
          System.out.println(todo)
       }
    }
}

平成28年度春 基本情報技術者試験午後 目次

TOP :

タグ: ,

PR広告

フェイスブックコメント

平成28年度秋 基本情報技術者試験 午後 テキスト・動画解説

平成28年度秋 基本情報技術者試験 午前 テキスト・動画解説

平成28年度春 基本情報技術者試験 午後 テキスト・動画解説

平成28年度春 基本情報技術者試験 午前 テキスト・動画解説

平成27年度秋 基本情報技術者試験 午後 テキスト・動画解説

平成27年度春 基本情報技術者試験 午後 テキスト・動画解説

平成27年度春 基本情報技術者試験 午前 テキスト・動画解説

平成26年度秋 基本情報技術者試験 午前 テキスト・動画解説

平成26年度春 基本情報技術者試験 午前 テキスト・動画解説