Files
2026-10-05 11:23:25 +09:00

8.3 KiB
Raw Permalink Blame History

Question11 - コンストラクタと静的メンバー

本資料の練習問題は、複数のプログラミング言語(Java / C# / PHP / Python)で共通して利用できるよう記述されています。静的型付け・動的型付けの違いや文字列の連結ルールなど、言語固有の文法仕様に基づき、問題文の表現をご使用の言語の仕様に適宜読み替えて進めてください。

この問題のねらい

  • インスタンスを作成する際に、引数の有無や内容に応じて異なる初期化処理を自動的に実行する仕組み(コンストラクタに相当)を定義し、利用できること
  • 特定のインスタンスに紐付かず、そのクラスの全てのインスタンス間で共有される情報(静的フィールド/クラス変数に相当)を定義し、読み書きできること
  • 特定のインスタンスを介さずに呼び出せる、クラス全体に属する処理(静的メソッド/クラスメソッドに相当)を定義し、呼び出せること
  • あるクラスのフィールドとして、別のクラスのインスタンスを保持し、それらを連携させて処理を行えること

以下の設問はそれぞれ独立したプログラムとして実装してください。


設問1

次の仕様を満たす2つのクラスを作成してください。

  • クラス名: Wallet
    • フィールド: money(整数)
  • クラス名: User
    • フィールド
      • name: 文字列
      • wallet: Wallet 型
    • メソッド
      • useMoney(引数: 整数 money、戻り値なし): wallet フィールドが指す Wallet の money フィールドから、引数 money の値を減算する。処理後、「x(nameフィールドの値)は財布の中のお金をy(引数money)円使用しました」と出力する
      • confirmWallet(引数なし、戻り値なし): 「x(nameフィールドの値)の財布の中の残額はy(walletフィールドが指すWalletのmoneyフィールドの値)円です」と出力する

その上で、このプログラムでは、次を行ってください。

  1. Wallet 型の変数 wallet を宣言し、Wallet のインスタンスを代入する
  2. wallet の money フィールドに 10000 を代入する
  3. User 型の変数 user を宣言し、User のインスタンスを代入する
  4. user の name フィールドに 太郎 を代入する
  5. user の wallet フィールドに、1.で作成した wallet を代入する
  6. user の confirmWallet メソッドを実行する
  7. user の useMoney メソッドを、引数 1000 で実行する
  8. user の confirmWallet メソッドを再度実行する
  • 出力(3行):
    • 太郎の財布の中の残額は10000円です
    • 太郎は財布の中のお金を1000円使用しました
    • 太郎の財布の中の残額は9000円です

設問2

次の仕様を満たす2つのクラスを作成してください。

  • クラス名: Wallet
    • フィールド: money(整数)
  • クラス名: Atm
    • フィールド: credit(整数。インスタンスを作成した時点で 100000 に初期化されている)
    • メソッド
      • withdraw(引数: Wallet 型 wallet、整数 money、戻り値なし)
        • credit フィールドの値が引数 money より小さい場合、「預金残高不足です。現金の引き出しに失敗しました。」と出力する
        • そうでない場合、credit フィールドの値から引数 money を減算し、wallet の money フィールドに引数 money を加算したうえで、「ATMの残り残高はx(減算後のcreditフィールドの値)です」と出力する

その上で、このプログラムでは、次を行ってください。

  1. Wallet 型の変数 wallet を宣言し、Wallet のインスタンスを代入する
  2. wallet の money フィールドに 10000 を代入する
  3. Atm 型の変数 atm を宣言し、Atm のインスタンスを代入する
  4. atm の withdraw メソッドを、第一引数に wallet、第二引数に 100000 を渡して呼び出す
  5. wallet の money フィールドの値を出力する(110000 になっていれば正解)
  6. atm の withdraw メソッドを、再度同じ引数(第一引数 wallet、第二引数 100000)で呼び出す(残高不足のため引き出しに失敗するはず)
  7. wallet の money フィールドの値を出力する(110000 のまま変わっていなければ正解)
  • 出力(4行):
    • ATMの残り残高は0です
    • 110000
    • 預金残高不足です。現金の引き出しに失敗しました。
    • 110000

設問3

次の仕様を満たすクラスを作成してください。

  • クラス名: Cat
  • フィールド: name(文字列)
  • 初期化の仕組み(コンストラクタに相当)を2種類用意する
    1. 引数なしで作成した場合: name フィールドに タマ を代入する
    2. 文字列を1つ引数に取って作成した場合: name フィールドに、渡された引数の値を代入する

その上で、このプログラムから、次を行ってください。

  1. Cat 型の変数 cat1 を、引数なしでインスタンス化する
  2. cat1 の name フィールドの値を出力する(タマ と出力されれば正解)
  3. Cat 型の変数 cat2 を、引数に ミケ を渡してインスタンス化する
  4. cat2 の name フィールドの値を出力する(ミケ と出力されれば正解)
  • 出力(2行):
    • タマ
    • ミケ

設問4

次の仕様を満たすクラスを作成してください。

  • クラス名: Student
  • フィールド
    • name: 文字列(インスタンスごとに個別の値を持つ)
    • group: 文字列(特定のインスタンスに紐付かず、このクラスの全てのインスタンス間で共有される値。教室の名前を表す)
    • teacher: 文字列(group と同様に、全てのインスタンス間で共有される値。先生の名前を表す)
  • メソッド
    • studentProfile(インスタンスに対して呼び出す。引数なし、戻り値なし): 「x(nameフィールドの値)はy(groupフィールドの値)教室の生徒です。」と出力する
    • groupProfile(特定のインスタンスを介さずに呼び出せる。引数なし、戻り値なし): 「x(groupフィールドの値)教室の担任はy(teacherフィールドの値)先生です。」と出力する

その上で、このプログラムでは、次を行ってください。

  1. 生徒の名前(name フィールド)に 太郎 を設定する
  2. 教室の名前(group フィールド)に A を設定する
  3. 先生の名前(teacher フィールド)に 山田 を設定する
  4. studentProfile メソッドを実行する
  5. groupProfile メソッドを実行する
  • 出力(2行):
    • 太郎はA教室の生徒です。
    • A教室の担任は山田先生です。

設問5

次の2つのクラスを作成してください。

  • クラス名: Jam
    • フィールド: material(文字列)
    • 初期化の仕組み(コンストラクタに相当): 文字列を1つ引数に取り、material フィールドにその値を代入する
  • クラス名: Toast
    • フィールド: jam(Jam 型)
    • 初期化の仕組み(コンストラクタに相当): Jam 型の値を1つ引数に取り、jam フィールドにその値を代入する
    • メソッド: taste(引数なし、戻り値なし): 「x味のトーストです。」(xは jam フィールドが指す Jam インスタンスの material フィールドの値)と出力する

その上で、このプログラムから、次を行ってください。

  1. Jam 型のインスタンスを、引数に ブルーベリー を渡して作成する
  2. Toast 型のインスタンスを、1.で作成した Jam インスタンスを引数に渡して作成する
  3. 2.で作成した Toast インスタンスの taste メソッドを呼び出す
  • 出力: ブルーベリー味のトーストです。