# Question10 - インスタンスとクラス 本資料の練習問題は、複数のプログラミング言語(Java / C# / PHP / Python)で共通して利用できるよう記述されています。静的型付け・動的型付けの違いや文字列の連結ルールなど、言語固有の文法仕様に基づき、問題文の表現をご使用の言語の仕様に適宜読み替えて進めてください。 ## この問題のねらい - クラスから作られたインスタンス(実体)を変数に代入し、そのフィールド(保持しているデータ)に値を読み書きできること - インスタンスが持つメソッド(処理)を呼び出せること - 与えられた仕様のとおりに、自分でクラス(フィールドとメソッドの組み合わせ)を作成できること - 同じ型の複数のインスタンスを配列(一覧)にまとめて扱い、繰り返し処理でそれぞれに同じ処理を行えること 以下の設問はそれぞれ独立したプログラムとして実装してください。ただし、設問5で作成するクラスは設問6・設問8でも使用します。 --- ## 設問1 次の仕様を満たすクラスを作成してください。 - クラス名: `User` - フィールド - `id`: 整数 - `name`: 文字列 - メソッド - `printProfile`(引数なし、戻り値なし): `ID` と `id` フィールドの値と `:` と `name` フィールドの値をつなげて画面に出力する その上で、このプログラムでは、`User` 型の変数 `user` を宣言し、`User` のインスタンスを代入したうえで、次を行ってください。 1. `user` の `id` フィールドに `1000` を代入する 2. `user` の `name` フィールドに `山田太郎` を代入する 3. `user` の `id` フィールドの値をそのまま出力する 4. `user` の `name` フィールドの値をそのまま出力する - 出力(2行): - `1000` - `山田太郎` --- ## 設問2 設問1と同じ `User` クラスを使用します(内容は設問1を参照)。 `User` 型の変数 `user` を宣言し、`User` のインスタンスを代入したうえで、次を行ってください。 1. `user` の `id` フィールドに `2000` を代入する 2. `user` の `name` フィールドに `佐藤二郎` を代入する 3. `user` の `printProfile` メソッドを呼び出す - 出力: `ID2000:佐藤二郎` --- ## 設問3 次の仕様を満たすクラスを新しく作成してください。 - クラス名: `Student` - フィールド - `studentId`: 整数 - `name`: 文字列 - `mail`: 文字列 - `password`: 文字列 - メソッド: なし その上で、このプログラムから、`Student` 型の変数 `student` を宣言し、`Student` のインスタンスを代入したうえで、次を行ってください。 1. `student` の `studentId` フィールドに `10` を代入する 2. `student` の `name` フィールドに `田中二郎` を代入する 3. `student` の `mail` フィールドに `test@mail.com` を代入する 4. `student` の `password` フィールドに `pass` を代入する 5. `student` の4つのフィールド(`studentId`、`name`、`mail`、`password`)の値を、それぞれ出力する - 出力(4行、各フィールドの値がそれぞれ出力されればよい): - `10` - `田中二郎` - `test@mail.com` - `pass` --- ## 設問4 次の仕様を満たすクラスを新しく作成してください。 - クラス名: `Calculation` - フィールド - `baseNum`: 整数 - メソッド - `add`(引数: 整数 `num`、戻り値なし): フィールド `baseNum` に引数 `num` の値を加算する その上で、このプログラムから、`Calculation` 型の変数 `cal` を宣言し、`Calculation` のインスタンスを代入したうえで、次を行ってください。 1. `cal` の `baseNum` フィールドに `100` を代入する 2. `cal` の `add` メソッドを、引数に `100` を渡して呼び出す 3. `cal` の `baseNum` フィールドの値を出力する - 出力: `200` --- ## 設問5 次の仕様を満たすクラスを新しく作成してください。 - クラス名: `Car` - フィールド - `color`: 文字列 - `gasoline`: 整数 - メソッド - `run`(引数なし、戻り値: 整数) - 処理1: `gasoline` フィールドの値を1減らす - 処理2: 減算後の `gasoline` フィールドの値が負の数になっていない場合は、1〜15のいずれかのランダムな整数(車が進んだ距離)を戻り値として返す - 処理3: 減算後の `gasoline` フィールドの値が負の数になった場合(これ以上車が進めないことを表す)は、`-1` を戻り値として返す その上で、このプログラムから、`Car` 型の変数 `car` を宣言し、`Car` のインスタンスを代入したうえで、次を行ってください。 1. `car` の `color` フィールドに `赤` を代入する 2. `car` の `gasoline` フィールドに `50` を代入する 3. `car` の `run` メソッドを1回実行する 4. `「x色の車はy進みました」`(xは `car` の `color` フィールドの値、yは3.で `run` メソッドが返した値)という形式で画面に出力する 5. `car` の `gasoline` フィールドの値を出力する(`49` が出力されれば正解) - 出力例(1行目のyの値は、乱数のため実行のたびに変わってよい): - `赤色の車は8進みました` - `49` --- ## 設問6 設問5で作成した `Car` クラスを使用します(内容は設問5を参照)。 `Car` 型の変数 `car` を宣言し、`Car` のインスタンスを代入したうえで、次を行ってください。 1. `car` の `color` フィールドに `赤` を代入する 2. `car` の `gasoline` フィールドに `50` を代入する 3. 目的地までの距離を表す値として `300` を用意する 4. `car` の `run` メソッドを繰り返し使って、目的地まで進める - 途中でガソリンがなくなり、目的地に到達できなかった場合は、`「x色の車は目的地に到達できませんでした」`(xは `car` の `color` フィールドの値)と出力する - 目的地に到達できた場合は、`「x色の車は目的地にまでy時間かかりました。残りのガソリンは、zリットルです」`(xは `car` の `color` フィールドの値、yは `run` メソッドを実行した回数、zは残っている `gasoline` フィールドの値)と出力する - 期待される結果: 実行結果に応じて、上記いずれかの文言が1回出力される --- ## 設問7 設問1と同じ `User` クラスを使用します(内容は設問1を参照)。 このプログラムでは、次を行ってください。 1. `User` 型の値を3つ格納できる配列 `userList` を宣言し、確保する 2. `User` 型のインスタンスを3つ作成し、それぞれ `user1`、`user2`、`user3` という名前の変数に代入する 3. 作成した3つのインスタンスのフィールドに、それぞれ次の値を代入する - `user1`: `id` フィールドに `1`、`name` フィールドに `一郎` - `user2`: `id` フィールドに `2`、`name` フィールドに `二郎` - `user3`: `id` フィールドに `3`、`name` フィールドに `三郎` 4. `userList` に、作成した `user1`、`user2`、`user3` を追加する 5. 繰り返し処理を使って `userList` の中身を順番に取り出し、それぞれの `printProfile` メソッドを実行する - 出力(3行): - `ID1:一郎` - `ID2:二郎` - `ID3:三郎` --- ## 設問8 設問5で作成した `Car` クラスを使用します(内容は設問5を参照)。 このプログラムでは、次を行ってください。 1. `Car` 型のインスタンスを3件作成し、それぞれ次のように `color` フィールド・`gasoline` フィールドを設定する - 1台目: `color` フィールドに `赤`、`gasoline` フィールドに `50` - 2台目: `color` フィールドに `青`、`gasoline` フィールドに `60` - 3台目: `color` フィールドに `黄`、`gasoline` フィールドに `70` 2. 作成した3件のインスタンスを、配列(一覧)にまとめる 3. 目的地までの距離を表す値として `300` を用意する 4. 2.で用意した配列(一覧)に対する繰り返し処理を使って、それぞれの `car` インスタンスについて `run` メソッドを繰り返し使い、目的地まで進める(1件ずつ個別の変数に対して同じ処理を3回書く方法ではなく、配列に対する繰り返し処理として実装すること) - 途中でガソリンがなくなり、目的地に到達できなかった場合は、`「x色の車は、目的地に到達できませんでした」`(xはそのインスタンスの `color` フィールドの値)と出力する - 目的地に到達できた場合は、`「x色の車は、目的地にまでy時間かかりました。残りのガソリンは、zリットルです」`(xはそのインスタンスの `color` フィールドの値、yは `run` メソッドを実行した回数、zは残っている `gasoline` フィールドの値)と出力する - 期待される結果: 3件の `Car` インスタンスそれぞれについて、上記いずれかの文言が1回ずつ出力される(合計3行)