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

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

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

( Java プログラムで使用する API の説明は,この冊子の末尾を参照してください。)

〔プログラムの説明〕

 図書の貸出しと返却の処理をするプログラムである。図書には書籍と雑誌があり, 利用者が借りることのできる図書の冊数には上限がある。

(1) 抽象クラス Book は,図書に共通の属性と処理を定義する。 属性 name は図書の名前であり,属性 id は図書に一意に付けられた識別子である。

(2) クラス RegularBook は 書籍を表す。

(3) クラス Magazine は雑誌を表す。 属性 issueNo は,雑誌の創刊号からの号数で,古い号から昇順の値をもつ。 各雑誌について,issueNo が最大のものが最新号である。

(4) クラス User は図書の利用者を表す。 属性 name は利用者の名前であり,属性idは利用者に一意に付けられた識別子である。

(5) クラス Library は,貸出しと返却の処理をする。属性 availables は貸出し

可能な図書の集合を表し,属性 checkedOut は貸出し中の図書の集合を表す。

属性 limit は利用者が借りることのできる図書の冊数の上限を与える。 メソッド checkoutBook は,貸出し処理を実行する。 指定された図書が既に貸し出されている場合と利用者が既に貸出し冊数の上限まで図書を 借りている場合,例外を投げる。 メソッド returnBook は返却処理を実行する。

 メソッド main はテスト用のメインプログラムである。実行結果を図に示す。

Taro is checking out Magazine: JITEC News, No.3912 (M001)
Taro is checking out Magazine: JITEC News, No.4001 (M002)
Taro is checking out Book: Java Programming (P001)
Taro is checking out Book: Ruby Programming (P003)
  => failed: exceeding checkout limit
Taro returned Magazine: JITEC News, No.3912 (M001)
Hana is checking out Magazine: JITEC News, No.3912 (M001)
Hana is checking out Book: Java Programming (P001)
  => failed: unavailable

   図 実行結果

〔プログラム〕

(行番号)

  1  import java.util.*;
  2  
  3  abstract class Book {
  4     String name;
  5     String id;
  6     Book(String name, String id) {
  7        this.name = name;
  8        this.id = id;
  9     }
 10     public boolean equals(Object object) {
 11        return (object instanceof Book)
                   && id.equals(((Book) object).id);
 12     }
 13     public int hashCode() {
 14        return id.hashCode();
 15     }
 16  }
 17  
 18  class RegularBook extends Book {
 19     RegularBook(String name, String id) {
 20        ;
 21     }
 22     public String toString() {
 23        return "Book: " + name + " (" + id + ")";
 24     }
 25  }
 26  
 27  class Magazine extends Book {
 28     int issueNo;
 29     Magazine(String name, int issueNo, String id) {
 30        ;
 31        this.issueNo = issueNo;
 32     }
 33     public String toString() {
 34        return "Magazine: " + name + ", No." + issueNo 
                                                + " (" + id + ")";
 35     }
 36  }
 37  
 38  class User {
 39     String name;
 40     String id;
 41     User(String name, String id) {
 42        this.name = name;
 43        this.id = id;
 44     }
 45     public String toString() {
 46        return "User: " + name + " (" + id + ")";
 47     }
 48  }
 49  class Library {
 50     Set<Book> availables = new HashSet<Book>();
 51     Map<Book, User> checkedOut = new HashMap<Book, User>();
 52     int limit;
 53     Library(Book[] books, int limit) {
 54        for (Book book : books) register(book);
 55        this.limit = limit;
 56     }
 57     void register(Book book) {
 58        availables.add(book);
 59     }
 60     void checkoutBook(User user, Book book) throws Exception {
 61        if (! availables.contains(book))
 62           ("unavailable");
 63        int count = 0;
 64        for (Map.Entry<Book, User> entry : 
                                       checkedOut.entrySet())
 65           if (entry.getValue().equals(user)) count++;
 66        if (count >= limit)
 67           ("exceeding checkout limit");
 68        availables.remove(book);
 69        checkedOut.put(book, user);
 70     }
 71     void returnBook(Book book) {
 72        for (Map.Entry<Book, User> entry : 
                                        checkedOut.entrySet())
 73           if (entry.getKey().equals(book)) {
 74              (book);
 75              availables.add(book);
 76              return;
 77           }
 78     }
 79     public static void main(String[] args) {
 80        Book
 81           java  = new RegularBook("Java Programming", "P001"),
 82           perl  = new RegularBook("Perl Programming", "P002"),
 83           ruby  = new RegularBook("Ruby Programming", "P003"),
 84           jit39_12 = new Magazine("JITEC News", 3912, "M001"),
 85           jit40_01 = new Magazine("JITEC News", 4001, "M002");
 86        Book[] books = {java, perl, ruby, jit39_12, jit40_01};
 87        Library library = new Library(books, 3);
 88        User taro = new User("Taro", "ID-01");
 89        User hana = new User("Hana", "ID-02");
 90        Book[] books1 = {jit39_12, jit40_01, java, ruby};
 91        for (Book book : books1)
 92           try {
 93              System.out.print("Taro is checking out " + book);
 94              library.checkoutBook(taro, book);
 95              System.out.println();
 96           }
 97           catch (Exception e) {
 98              System.out.println("\n" + "   => failed: " 
                                      + e.getMessage());
 99           }
100        library.returnBook(jit39_12);
101        System.out.println("Taro returned " + jit39_12);
102        Book[] books2 = {jit39_12, java};
103        for (Book book : books2)
104           try {
105              System.out.print("Hana is checking out " + book);
106              library.checkoutBook(hana, book);
107              System.out.println();
108           }
109           catch (Exception e) {
110              System.out.println("\n" + "   => failed: " 
                                      + e.getMessage());
111           }
112     }
113  }

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

a に関する解答群

ア new Book()

イ new Book(name, id)

ウ super()

エ super(name, id)

オ this.name = name; this.id = id

b に関する解答群

ア return Exception     イ return new Exception

ウ System.err.println    エ System.out.println

オ throw Exception      カ throw new Exception

c に関する解答群

ア checkedOut.add    イ checkedOut.remove

ウ entry.add       エ entry.remove

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

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

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

基本情報技術者試験


設問2 雑誌について,最新号の貸出しを禁止する処理を追加したい。 このため,次のようにプログラムを変更する。 次の記述中の に入れる正しい答えを,解答群の中から選べ。 ただし,各雑誌の各号は1冊ずつしかなく,雑誌の登録は,必ずしも古い号から行われるとは限らない。 また, には設問1の正しい答えが入っているものとする。

処置 追加内容
行番号 50 の
直後に追加
Set<Magazine> latestMagazines = new HashSet<Magazine>();
行番号 58 の
直後に追加
if (book instanceof Magazine)
   updateLatestMagazineList((Magazine) book);
行番号 62 の
直後に追加

if (book instanceof Magazine) {
   Magazine magazine = (Magazine) book;
   if (latestMagazines.contains(magazine))
      ("latest issue");

}
行番号 78 の
直後に追加

void updateLatestMagazineList(Magazine magazine) {
   for (Magazine magazine2 : latestMagazines)
      if (magazine2.name.equals(magazine.name)) {
         if (magazine.issueNo  magazine2.issueNo) {
             return;
         } else {
             latestMagazines.remove(magazine2);
             break;
         }
      }
   ;
}

d に関する解答群

ア <     イ >     ウ !=     エ ==

e に関する解答群

ア latestMagazines.add(magazine)

イ register((Magazine) book)

ウ return

エ returnBook(magazine)

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

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


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