JAVA練習問題4-☆2:図書館管理システムを作ろうpart2

記事内に商品プロモーションを含む場合があります

JAVAの初心者向け問題4-☆2:図書館管理システムを作ろうpart2

この問題を解くために必要な知識:
【レベル1~3の知識】
コメントの書き方、変数と定数、基本データ型とプリミティブ型、四則演算と論理演算、入力と出力(Scannerクラス)、配列、分岐処理(if、if~else、switch)、繰り返し処理(for、while、do~while)、メソッドの定義と呼び出し、メソッドの戻り値、メソッドのオーバーロード、例外処理(try-catch文、throws、throw)、クラスの定義と使用、インスタンス、コンストラクタ、コレクションの基礎、コレクション(List, ArrayList)、コレクション(HashSet, TreeSet)、コレクション(HashMap, TreeMap)

【レベル4の知識】
ゲッターとセッター、カプセル化、クラスメンバ、インスタンスメソッド、クラスの継承、抽象クラス、インターフェース

<<前の問題 問題集Top 次の問題>>

JAVA練習問題4-☆2:図書館管理システムを作ろうpart2





インターフェースと抽象クラスを使用して図書館の書籍管理システムを作成しましょう。

このシステムはユーザーが入力した本のタイトルと著者を管理し、かつ全ての書籍情報を表示する機能を持ちます。

この問題の要件

以下の要件に従った作成して下さい。

  • 書籍情報(タイトルと著者)を管理する抽象クラス Book を定義してください。
  • 書籍情報を表示するメソッドを含むインターフェース Displayable を定義してください。
  • Book を継承し、Displayable を実装する LibraryBook クラスを作成してください。
  • LibraryBook クラスには書籍情報を表示する display メソッドを実装してください。
  • 書籍を管理する Library クラスを作成し、書籍の追加と表示の機能を実装してください。
  • ユーザーからの入力を受け付けて書籍を追加し、追加された書籍の一覧を表示してください。

ただし、以下のような実行結果となること。

----- ↓出力される結果の例↓ -----

新しい書籍を追加しますか? (yes/no): yes
タイトル: Java入門
著者: 山田太郎
新しい書籍を追加しますか? (yes/no): yes
タイトル: Pythonの基礎
著者: 佐藤花子
新しい書籍を追加しますか? (yes/no): no
追加された書籍一覧:
タイトル: Java入門, 著者: 山田太郎
タイトル: Pythonの基礎, 著者: 佐藤花子

----- ↑出力される結果の例↑ -----

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。

1.import文
1-1. ArrayListクラスのインポート
1-2. Scannerクラスのインポート

2.抽象クラス Bookの定義
2-1. フィールド titleとauthorの定義
2-1-1. titleフィールドの宣言
2-1-2. authorフィールドの宣言
2-2. コンストラクタの定義
2-2-1. titleフィールドの初期化
2-2-2. authorフィールドの初期化
2-3. タイトルを取得するゲッターメソッドgetTitleの定義
2-4. 著者を取得するゲッターメソッドgetAuthorの定義
2-5. 抽象メソッドdisplayの宣言

3.インターフェース Displayableの定義
3-1. displayメソッドの宣言

4.具象クラス LibraryBookの定義
4-1. Bookクラスの継承とDisplayableインターフェースの実装
4-2. コンストラクタの定義
4-2-1. スーパークラスBookのコンストラクタを呼び出す
4-3. displayメソッドのオーバーライド
4-3-1. タイトルと著者の情報を表示する

5.図書館クラス Libraryの定義
5-1. フィールド booksの定義
5-1-1. ArrayList<LibraryBook> booksフィールドの宣言
5-2. コンストラクタの定義
5-2-1. booksフィールドの初期化
5-3. 書籍を追加するメソッドaddBookの定義
5-3-1. ArrayListに書籍を追加
5-4. 全ての書籍を表示するメソッドshowBooksの定義
5-4-1. ループで全書籍のdisplayメソッドを呼び出す

6.LibraryManagementSystemクラスの定義
6-1. mainメソッドの定義
6-1-1. Scannerオブジェクトの作成
6-1-2. Libraryオブジェクトの作成
6-1-3. ユーザー入力を受け付けるループ
6-1-3-1. ユーザーに新しい書籍の追加を尋ねる
6-1-3-2. 書籍情報の入力
6-1-3-2-1. タイトルの入力
6-1-3-2-2. 著者の入力
6-1-3-3. 入力された書籍情報を元にLibraryBookオブジェクトを作成し追加
6-1-3-4. ユーザーが「no」と答えた場合ループを終了
6-1-4. 追加された書籍の表示
6-2. Scannerオブジェクトのクローズ

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

import java.util.ArrayList;
import java.util.Scanner;

// 抽象クラス Book
abstract class Book {
    private String title;
    private String author;

    // コンストラクタ
    public Book(String title, String author) {
        ***ここにコンストラクタのコードを書いてください***
    }

    // タイトルを取得するゲッター
    public String getTitle() {
        ***ここにタイトルを取得するゲッターのコードを書いてください***
    }

    // 著者を取得するゲッター
    public String getAuthor() {
        ***ここに著者を取得するゲッターのコードを書いてください***
    }

    // 書籍情報を表示する抽象メソッド
    public abstract void display();
}

// インターフェース Displayable
interface Displayable {
    void display();
}

// 具象クラス LibraryBook
class LibraryBook extends Book implements Displayable {
    // コンストラクタ
    public LibraryBook(String title, String author) {
        ***ここにLibraryBookのコンストラクタのコードを書いてください***
    }

    // display メソッドの実装
    @Override
    public void display() {
        ***ここにdisplayメソッドの実装コードを書いてください***
    }
}

// 図書館クラス
class Library {
    private ArrayList<LibraryBook> books;

    // コンストラクタ
    public Library() {
        ***ここにLibraryのコンストラクタのコードを書いてください***
    }

    // 書籍を追加するメソッド
    public void addBook(LibraryBook book) {
        ***ここに書籍を追加するメソッドのコードを書いてください***
    }

    // 全ての書籍を表示するメソッド
    public void showBooks() {
        ***ここに全ての書籍を表示するメソッドのコードを書いてください***
    }
}

public class LibraryManagementSystem {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Library library = new Library();

        // ユーザーからの入力を受け付ける
        while (true) {
            System.out.println("新しい書籍を追加しますか? (yes/no): ");
            String response = scanner.next();
            if (response.equalsIgnoreCase("no")) {
                break;
            }

            // 書籍情報の入力
            System.out.print("タイトル: ");
            String title = scanner.next();
            System.out.print("著者: ");
            String author = scanner.next();

            // 書籍を追加
            LibraryBook book = new LibraryBook(title, author);
            ***ここに書籍を追加するコードを書いてください***
        }

        // 追加された書籍の表示
        System.out.println("追加された書籍一覧:");
        ***ここに追加された書籍を表示するコードを書いてください***
    }
}

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。



解答例

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

********************

import java.util.ArrayList;
import java.util.Scanner;

// 抽象クラス Book
abstract class Book {
    private String title;
    private String author;

    // コンストラクタ
    public Book(String title, String author) {
        this.title = title;
        this.author = author;
    }

    // タイトルを取得するゲッター
    public String getTitle() {
        return title;
    }

    // 著者を取得するゲッター
    public String getAuthor() {
        return author;
    }

    // 書籍情報を表示する抽象メソッド
    public abstract void display();
}

// インターフェース Displayable
interface Displayable {
    void display();
}

// 具象クラス LibraryBook
class LibraryBook extends Book implements Displayable {
    // コンストラクタ
    public LibraryBook(String title, String author) {
        super(title, author);
    }

    // display メソッドの実装
    @Override
    public void display() {
        System.out.println("タイトル: " + getTitle() + ", 著者: " + getAuthor());
    }
}

// 図書館クラス
class Library {
    private ArrayList<LibraryBook> books;

    // コンストラクタ
    public Library() {
        books = new ArrayList<LibraryBook>();
    }

    // 書籍を追加するメソッド
    public void addBook(LibraryBook book) {
        books.add(book);
    }

    // 全ての書籍を表示するメソッド
    public void showBooks() {
        for (LibraryBook book : books) {
            book.display();
        }
    }
}

public class LibraryManagementSystem {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Library library = new Library();

        // ユーザーからの入力を受け付ける
        while (true) {
            System.out.println("新しい書籍を追加しますか? (yes/no): ");
            String response = scanner.next();
            if (response.equalsIgnoreCase("no")) {
                break;
            }

            // 書籍情報の入力
            System.out.print("タイトル: ");
            String title = scanner.next();
            System.out.print("著者: ");
            String author = scanner.next();

            // 書籍を追加
            LibraryBook book = new LibraryBook(title, author);
            library.addBook(book);
        }

        // 追加された書籍の表示
        System.out.println("追加された書籍一覧:");
        library.showBooks();
    }
}

 

********************

コードの解説

このコードを理解することで、オブジェクト指向プログラミングや抽象クラス、インターフェースの基本的な概念に触れることができます。

抽象クラス Book

abstract class Book {
    private String title;
    private String author;

    // コンストラクタ
    public Book(String title, String author) {
        this.title = title;
        this.author = author;
    }

    // タイトルを取得するゲッター
    public String getTitle() {
        return title;
    }

    // 著者を取得するゲッター
    public String getAuthor() {
        return author;
    }

    // 書籍情報を表示する抽象メソッド
    public abstract void display();
}
  • ここでは、Bookという抽象クラスが定義されています。抽象クラスとは、インスタンス化(newでオブジェクトを作成すること)ができないクラスであり、他のクラスで継承されて使われます。
  • titleauthorは書籍のタイトルと著者名を表すフィールドで、プライベートアクセス修飾子によって外部から直接アクセスできないように保護されています。
  • getTitle()getAuthor()は、それぞれ書籍のタイトルと著者名を取得するためのメソッドです(ゲッター)。
  • display()メソッドは抽象メソッドとして定義されています。これは、Bookを継承したクラスで具体的に実装する必要があるという意味です。

インターフェース Displayable

interface Displayable {
    void display();
}
  • インターフェースは、クラスが実装すべきメソッドを定義するための仕組みです。Displayabledisplay()メソッドを持ち、このインターフェースを実装するクラスは必ずこのメソッドを実装する必要があります。
  • インターフェースを使うことで、複数のクラスが共通のメソッドを持つことを保証できます。

クラス LibraryBook

class LibraryBook extends Book implements Displayable {
    // コンストラクタ
    public LibraryBook(String title, String author) {
        super(title, author);
    }

    // display メソッドの実装
    @Override
    public void display() {
        System.out.println("タイトル: " + getTitle() + ", 著者: " + getAuthor());
    }
}
  • LibraryBookクラスは、Bookクラスを継承し、Displayableインターフェースを実装しています。
  • super(title, author)は、スーパークラス(Bookクラス)のコンストラクタを呼び出しています。これにより、LibraryBookのオブジェクトを作成するときに、タイトルと著者名を設定できます。
  • display()メソッドは、Bookクラスで定義された抽象メソッドを具象クラスとして実装しています。このメソッドは、タイトルと著者を表示する役割を果たします。

図書館クラス Library

class Library {
    private ArrayList<LibraryBook> books;

    // コンストラクタ
    public Library() {
        books = new ArrayList<LibraryBook>();
    }

    // 書籍を追加するメソッド
    public void addBook(LibraryBook book) {
        books.add(book);
    }

    // 全ての書籍を表示するメソッド
    public void showBooks() {
        for (LibraryBook book : books) {
            book.display();
        }
    }
}
  • Libraryクラスは図書館を表しています。このクラスは、LibraryBookオブジェクトを格納するリストを持っています。
  • addBook()メソッドは、書籍をリストに追加する機能を提供します。
  • showBooks()メソッドは、リストに追加された全ての書籍の情報を表示します。ここで、LibraryBookdisplay()メソッドが呼び出されています。

メインクラス LibraryManagementSystem

public class LibraryManagementSystem {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Library library = new Library();

        // ユーザーからの入力を受け付ける
        while (true) {
            System.out.println("新しい書籍を追加しますか? (yes/no): ");
            String response = scanner.next();
            if (response.equalsIgnoreCase("no")) {
                break;
            }

            // 書籍情報の入力
            System.out.print("タイトル: ");
            String title = scanner.next();
            System.out.print("著者: ");
            String author = scanner.next();

            // 書籍を追加
            LibraryBook book = new LibraryBook(title, author);
            library.addBook(book);
        }

        // 追加された書籍の表示
        System.out.println("追加された書籍一覧:");
        library.showBooks();
    }
}
  • LibraryManagementSystemクラスのmainメソッドは、プログラムのエントリーポイントです。
  • ユーザーに書籍のタイトルと著者を入力させ、その情報を基に新しいLibraryBookオブジェクトを作成して図書館に追加します。
  • whileループを使って複数の書籍を追加することができます。ユーザーがnoと入力するまで、書籍の追加が繰り返されます。
  • 最後に、追加された全ての書籍をlibrary.showBooks()メソッドで表示します。
<<前の問題 問題集Top 次の問題>>




この問題への質問・コメント

この問題を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    JAVA練習問題集へ戻る
    トップページへ戻る