8.3 KiB
8.3 KiB
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フィールドの値)円です」と出力する
- フィールド
その上で、このプログラムでは、次を行ってください。
Wallet型の変数walletを宣言し、Walletのインスタンスを代入するwalletのmoneyフィールドに10000を代入するUser型の変数userを宣言し、Userのインスタンスを代入するuserのnameフィールドに太郎を代入するuserのwalletフィールドに、1.で作成したwalletを代入するuserのconfirmWalletメソッドを実行するuserのuseMoneyメソッドを、引数1000で実行する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フィールドの値)です」と出力する
- フィールド:
その上で、このプログラムでは、次を行ってください。
Wallet型の変数walletを宣言し、Walletのインスタンスを代入するwalletのmoneyフィールドに10000を代入するAtm型の変数atmを宣言し、Atmのインスタンスを代入するatmのwithdrawメソッドを、第一引数にwallet、第二引数に100000を渡して呼び出すwalletのmoneyフィールドの値を出力する(110000になっていれば正解)atmのwithdrawメソッドを、再度同じ引数(第一引数wallet、第二引数100000)で呼び出す(残高不足のため引き出しに失敗するはず)walletのmoneyフィールドの値を出力する(110000のまま変わっていなければ正解)
- 出力(4行):
ATMの残り残高は0です110000預金残高不足です。現金の引き出しに失敗しました。110000
設問3
次の仕様を満たすクラスを作成してください。
- クラス名:
Cat - フィールド:
name(文字列) - 初期化の仕組み(コンストラクタに相当)を2種類用意する
- 引数なしで作成した場合:
nameフィールドにタマを代入する - 文字列を1つ引数に取って作成した場合:
nameフィールドに、渡された引数の値を代入する
- 引数なしで作成した場合:
その上で、このプログラムから、次を行ってください。
Cat型の変数cat1を、引数なしでインスタンス化するcat1のnameフィールドの値を出力する(タマと出力されれば正解)Cat型の変数cat2を、引数にミケを渡してインスタンス化するcat2のnameフィールドの値を出力する(ミケと出力されれば正解)
- 出力(2行):
タマミケ
設問4
次の仕様を満たすクラスを作成してください。
- クラス名:
Student - フィールド
name: 文字列(インスタンスごとに個別の値を持つ)group: 文字列(特定のインスタンスに紐付かず、このクラスの全てのインスタンス間で共有される値。教室の名前を表す)teacher: 文字列(groupと同様に、全てのインスタンス間で共有される値。先生の名前を表す)
- メソッド
studentProfile(インスタンスに対して呼び出す。引数なし、戻り値なし):「x(nameフィールドの値)はy(groupフィールドの値)教室の生徒です。」と出力するgroupProfile(特定のインスタンスを介さずに呼び出せる。引数なし、戻り値なし):「x(groupフィールドの値)教室の担任はy(teacherフィールドの値)先生です。」と出力する
その上で、このプログラムでは、次を行ってください。
- 生徒の名前(
nameフィールド)に太郎を設定する - 教室の名前(
groupフィールド)にAを設定する - 先生の名前(
teacherフィールド)に山田を設定する studentProfileメソッドを実行するgroupProfileメソッドを実行する
- 出力(2行):
太郎はA教室の生徒です。A教室の担任は山田先生です。
設問5
次の2つのクラスを作成してください。
- クラス名:
Jam- フィールド:
material(文字列) - 初期化の仕組み(コンストラクタに相当): 文字列を1つ引数に取り、
materialフィールドにその値を代入する
- フィールド:
- クラス名:
Toast- フィールド:
jam(Jam型) - 初期化の仕組み(コンストラクタに相当):
Jam型の値を1つ引数に取り、jamフィールドにその値を代入する - メソッド:
taste(引数なし、戻り値なし):「x味のトーストです。」(xはjamフィールドが指すJamインスタンスのmaterialフィールドの値)と出力する
- フィールド:
その上で、このプログラムから、次を行ってください。
Jam型のインスタンスを、引数にブルーベリーを渡して作成するToast型のインスタンスを、1.で作成したJamインスタンスを引数に渡して作成する- 2.で作成した
Toastインスタンスのtasteメソッドを呼び出す
- 出力:
ブルーベリー味のトーストです。