新規作成

This commit is contained in:
m-kyono
2026-10-05 11:23:25 +09:00
commit d9529e2971
26 changed files with 2801 additions and 0 deletions

View File

@@ -0,0 +1,90 @@
# Question01 - プログラムの開始
本資料の練習問題は、複数のプログラミング言語(Java / C# / PHP / Python)で共通して利用できるよう記述されています。静的型付け・動的型付けの違いや文字列の連結ルールなど、言語固有の文法仕様に基づき、問題文の表現をご使用の言語の仕様に適宜読み替えて進めてください。
## この問題のねらい
- プログラムの実行結果として文字や値を画面に出力できること
- コメント(実行されないメモ書き)を使って、コードの一部を無効化できること
- 基本的なデータの種類(真偽値・文字・整数・小数など)を使い分けて、変数の宣言・値の代入・出力ができること
以下の設問はそれぞれ独立したプログラムとして実装してください。
---
## 設問1
画面に次の文字列をそのまま出力してください。
- 出力: `Hello,world`
---
## 設問2
任意のプログラムを用意し、実行(コンパイル)エラーが出ないように、どちらもコメントとして無効化してください。
1. 任意の1行 → **1行だけを無効化する方法**(単一行コメント)で無効化する
2. 任意の3行にまたがる部分 → **複数行をまとめて無効化する方法**(複数行コメント)で無効化する
- 期待される結果: プログラムが実行(コンパイル)できること(無効化した部分を除いた出力・動作になっていればよい)
- 補足: 使用する言語に複数行をまとめて無効化する構文が無い場合は、単一行の無効化を複数行分繰り返すなど、同等の効果が得られる方法で代用してよい
---
## 設問3
文字列を保持できる変数 `str` を宣言し、値 `こんにちは` を代入したうえで、`str` の値をそのまま出力してください。
- 出力: `こんにちは`
---
## 設問4
整数を保持できる変数 `number` を宣言し、値 `10` で初期化したうえで、`number` の値をそのまま出力してください。
- 出力: `10`
---
## 設問5
1文字を保持できる変数 `ch` を宣言し、値 `A` で初期化したうえで、`ch` の値をそのまま出力してください。
- 出力: `A`
---
## 設問6
真偽値(true/falseのような、2値しか取らない値)を保持できる変数 `bo` を宣言し、値 `true` で初期化したうえで、`bo` の値をそのまま出力してください。
- 出力: `true`
---
## 設問7
大きな桁数の整数も扱える型の変数 `lo` を宣言し、値 `1000000000000` で初期化したうえで、`lo` の値をそのまま出力してください。
- 出力: `1000000000000`
---
## 設問8
小数を保持できる変数 `fl` を宣言し、値 `3.14` で初期化したうえで、`fl` の値をそのまま出力してください。
- 出力: `3.14`
- 補足: 使用する言語・環境によって小数の出力表現(末尾の0や桁数など)が変わる場合があるが、値として `3.14` を表せていればよい
---
## 設問9
この言語で扱える基本的なデータの種類(真偽値・文字・整数・大きな整数・小数など)を、できるだけ多く使って、それぞれ変数を宣言してください(変数名は自由でよい)。
- 宣言した各変数に、任意の値を代入してください
- それぞれの変数の値を出力してください
- 単一のデータの種類に偏らず、複数の種類を使い分けること

View File

@@ -0,0 +1,107 @@
# Question02 - 式と演算
本資料の練習問題は、複数のプログラミング言語(Java / C# / PHP / Python)で共通して利用できるよう記述されています。静的型付け・動的型付けの違いや文字列の連結ルールなど、言語固有の文法仕様に基づき、問題文の表現をご使用の言語の仕様に適宜読み替えて進めてください。
## この問題のねらい
- 四則演算(足し算・引き算・掛け算・割り算)や、割り算の余りを求める計算ができること
- 文字列同士、または文字列と値をつなげて出力できること
- 既存の変数の値を使って新しい値を計算し、同じ変数に代入し直すことができること
- 整数と小数など、扱う値の種類の違いを理解し、意図した計算結果になるように修正できること
以下の設問はそれぞれ独立したプログラムとして実装してください。
---
## 設問1
整数を保持できる5つの変数 `sum`, `diff`, `mulch`, `div`, `rem` を宣言すること。それぞれ次の計算を行い、対応する変数に結果を代入すること。
- `sum`: 6 と 2 を足した値
- `diff`: 6 から 2 を引いた値
- `mulch`: 6 と 2 を掛けた値
- `div`: 6 を 2 で割った値(商)
- `rem`: 17 を 5 で割った余り
代入後、各変数の値を次の形式で出力すること(ラベルと値の組み合わせが分かればよく、区切り記号や余白は厳密に一致しなくてよい)。
- 出力:
```
変数sum :8
変数diff :4
変数mulch:12
変数div :3
変数rem :2
```
---
## 設問2
姓を保持する文字列変数 `lastName`(値: `山田`)と、名を保持する文字列変数 `firstName`(値: `太郎`)を宣言すること。この2つの変数の値を「姓+名」の順につなげて、1つの文字列として出力すること。
- 出力: `山田太郎`
- 補足: 画面に文字を出す命令は1回だけ使うこと。
---
## 設問3
整数を保持できる変数 `num` が `10` で初期化されている。`num` の値に `5` を足した結果を、`num`自身に代入し直すこと。
- 出力: `15`
---
## 設問4
整数しか保持できない変数として `sum` を宣言し、そこに整数の `10` と小数の `3.14` を足した結果(小数を含む値)を代入しようとすると、値の種類が合わず実行(コンパイル)エラーになる。
`10` と `3.14` という数値そのものは変更せずに、`sum` を宣言する際の値の種類(保持できる値の種類)を、小数も保持できるものに直し、エラーが起きないように実装すること。
- 出力: `13.14`
---
## 設問5
変数 `age`(値: `20`)と変数 `diff`(値: `5`)を使って、次の2行を出力すること。
1. `山田さんは20歳です。`
2. `5年後には25歳になります。`(`age` と `diff` を数値として足し算した結果 `25` を使った内容にすること)
2行目を実装する際、`age` と `diff` をそのまま文字として連結すると、数値としての足し算にならず `5年後には205歳になります。` のような誤った内容になってしまうため、そうならないように注意すること。
- 出力:
```
山田さんは20歳です。
5年後には25歳になります。
```
---
## 設問6
`9` を `2` で割った結果を出力すること。整数同士の割り算として実装すると、小数点以下が切り捨てられて `4` と出力されてしまうため、小数点以下を切り捨てずに正しい商が出力されるように実装すること。
- 出力: `4.5`
---
## 設問7
整数しか保持できない変数として `num` を宣言し、そこに小数の値 `1.0` をそのまま代入しようとすると、値の種類が合わず実行(コンパイル)エラーになる。
`1.0` という数値そのものは変更せずに、小数の値を整数の値に変換する処理を加えるなどして、`num` にエラーなく代入できるように実装すること。
- 出力: `1`
---
## 設問8
所持金を保持する変数 `money`(値: `1000`)、税抜きの商品価格を保持する変数 `price`(値: `580`)、消費税率を保持する変数 `taxRate`(値: `0.08`)を宣言すること。
商品価格に消費税率を加味した税込み価格を計算し(端数は切り捨てる)、所持金からその税込み価格を引いた値を、新しい所持金として `money` に代入し直すこと。
- 出力: `残金は374円です。`

51
Question03-if/仕様.md Normal file
View File

@@ -0,0 +1,51 @@
# Question03 - 条件分岐
本資料の練習問題は、複数のプログラミング言語(Java / C# / PHP / Python)で共通して利用できるよう記述されています。静的型付け・動的型付けの違いや文字列の連結ルールなど、言語固有の文法仕様に基づき、問題文の表現をご使用の言語の仕様に適宜読み替えて進めてください。
## この問題のねらい
- 条件式(比較や論理演算)を使って、値の真偽を判定できること
- 条件が真の場合と偽の場合とで、異なる処理を行えること
- 複数の条件を「かつ」「または」で組み合わせた判定ができること
- 複数の分岐を段階的に組み合わせて、値の範囲に応じた処理を書き分けられること
以下の設問はそれぞれ独立したプログラムとして実装してください。
---
## 設問1
整数を保持できる変数 `num` を宣言し、`100` で初期化すること。そのうえで、「`num` の値が `100` と等しい」という条件が真の場合に `条件に合致しました` と出力する条件分岐を実装すること。
- 出力: `条件に合致しました`
---
## 設問2
整数を保持できる変数 `num` を宣言し、`65` で初期化すること。そのうえで、`num` の値が `65` 以上の場合は `合格です`、そうでない場合は `不合格です` と出力する条件分岐を実装すること。
- 出力: `合格です`
---
## 設問3
整数を保持できる変数 `num` が `10` で初期化されている。「`num` が2で割り切れる」かつ「`num` が5で割り切れる」という条件がともに真の場合に、`num` の値を含めた次の形式のメッセージを出力する条件分岐を実装すること。
- 出力: `10は2でも5でも割り切れます。`
---
## 設問4
画面に `降水確率を入力してください。(数字のみ)` と出力したあと、数値の入力を1つ受け取り、整数として変数 `num` に格納すること(標準的な入力手段を使ってよい)。
そのうえで、`num` の値に応じて次の内容を出力する条件分岐を実装すること。
- `num` が `0` より小さい、または `100` より大きい場合: `不正な値が入力されました`
- 上記に当てはまらず、`num` が `75` 以上の場合: `雨が降る確率が高いです`
- 上記に当てはまらず、`num` が `30` 以上 `75` 未満の場合: `雨が降るかもしれないです`
- 上記のいずれにも当てはまらない場合(`num` が `30` 未満): `雨はまず降らないでしょう`
- 補足: 範囲外の値(`0`未満または`100`より大きい)の判定は、他の条件より優先して行われること(範囲外の値を入力した場合に、誤って他のメッセージが出力されないようにすること)。

View File

@@ -0,0 +1,88 @@
# Question04 - 繰り返し
本資料の練習問題は、複数のプログラミング言語(Java / C# / PHP / Python)で共通して利用できるよう記述されています。静的型付け・動的型付けの違いや文字列の連結ルールなど、言語固有の文法仕様に基づき、問題文の表現をご使用の言語の仕様に適宜読み替えて進めてください。
## この問題のねらい
- ある条件を満たす間、処理を繰り返すことができること
- 繰り返しを続けるかどうかの判定条件を、目的に応じて設定できること
- 繰り返しの実行中に、その場で繰り返し自体を打ち切る(早期終了する)ことができること
- 繰り返しの中で変数の値を更新しながら、状態を進めていく処理を書けること
- 入力の受け取り・繰り返し・条件分岐を組み合わせて、簡単なゲームのような一連の処理を組み立てられること
以下の設問はそれぞれ独立したプログラムとして実装してください。
---
## 設問1
0~9のいずれかのランダムな整数を生成し、画面に出力する処理を、生成するたびに繰り返す実装を行うこと。
生成された値が `5` になった時点で繰り返し自体を終了するように、**繰り返しを続けるかどうかの判定条件**を使って終了させること(判定条件を設けなければ、際限なく繰り返され続けてしまう)。
- 出力: 0~9のいずれかの整数を1行に1つずつ出力し続け、`5` を出力した時点で繰り返しを終了する(ランダムな値を使うため、出力される行数や値そのものは実行のたびに変わる)。
---
## 設問2
整数を保持できる変数 `num` を宣言し、`2` で初期化すること。`num` の値が `1000` を超えるまで、繰り返しのたびに `num` の値を2倍にした値を `num` に代入し直すこと。繰り返しが終了したら、`num` の値を出力すること。
- 出力: `1024`
---
## 設問3
0~9のいずれかのランダムな整数を生成し、画面に出力する処理を繰り返す実装を行うこと。
繰り返しを続けるかどうかの判定条件は使わずに(=条件だけを見れば際限なく繰り返され続ける実装のまま)、生成された値が `5` であった場合に、繰り返しの実行中にその場で繰り返し処理を打ち切る(早期終了する)ように実装すること。
- 出力: 0~9のいずれかの整数を1行に1つずつ出力し続け、`5` を出力した時点で繰り返しを終了する(ランダムな値を使うため、出力される行数や値そのものは実行のたびに変わる)。
- 補足: 設問1とは異なり、繰り返し自体の継続条件は変更しないこと。
---
## 設問4
双六(すごろく)を模したプログラムを作成する。
- 双六の総マス数を表す整数変数 `map` を宣言し、`50` で初期化すること。
- 現在までに進んだマス数を表す整数変数 `progress` を宣言し、`0` で初期化すること。
`===== START =====` と出力したあと、`progress` が `map` に到達する(ゴールする)まで、次の処理を繰り返すこと。
1. `Enterキーを押してください。さいころをふります。` と出力し、何らかの入力(内容は問わない)を1行分待ち受ける。
2. 1~6のいずれかのランダムな整数を生成し、さいころの目とする。
3. 出た目の値を使って、`3の目が出ました。` のように、値を含めたメッセージを出力する。
4. `progress` に、出たさいころの目の値を加算する。
5. まだゴールしていない場合は、`残りのマスは47マスです。` のように、残りのマス数(`map` から `progress` を引いた値)を含めたメッセージを出力する。ゴールした場合はこのメッセージを出力しない。
繰り返しが終わったら `===== GOAL =====` と出力すること。
- 補足: さいころの目や繰り返し回数はランダムな値によって変わるため、出力される行数や具体的な値は実行のたびに変わってよい。上記のメッセージの形式・内容が満たされていることを確認する。
---
## 設問5
じゃんけんを行うプログラムを作成する。手は次の整数値で表す。
- `0`: グー
- `1`: チョキ
- `2`: パー
勝敗の状態を表す真偽値の変数 `winFlag` があり、初期値は「負け」を表す値になっている。プレイヤーが勝つまで、次の処理を繰り返すこと。
1. `じゃんけんを行います。`、`あなたの出す手を入力してください`、`0:グー, 1:チョキ, 2:パー` と出力し、数値の入力を1つ受け取って、プレイヤーの手を表す変数 `playerHand` に格納する。
2. `playerHand` の値に応じて、`あなたはグーを出しました`(`0`の場合)のように、選ばれた手が分かるメッセージを出力する。`1`(チョキ)・`2`(パー)の場合も同様に、対応する手の名前を含めたメッセージを出力する。
3. 0~2のいずれかのランダムな整数を生成し、対戦相手の手を表す変数 `npcHand` に格納する。
4. `npcHand` の値に応じて、`相手はグーを出しました`(`0`の場合)のように、対戦相手の手が分かるメッセージを出力する。`1`・`2`の場合も同様に対応する手の名前を含めたメッセージを出力する。
5. 次の勝敗ルールに従って `playerHand` と `npcHand` を比較し、じゃんけんの結果(勝ち・負け・引き分け)が分かるメッセージを出力すること。
- グー(`0`)はチョキ(`1`)に勝つ
- チョキ(`1`)はパー(`2`)に勝つ
- パー(`2`)はグー(`0`)に勝つ
- 同じ手同士は引き分け
6. プレイヤーが勝った場合は、繰り返しを終了してプログラムを終了させること。それ以外(負け・引き分け)の場合は、繰り返しの最後に空行を1行出力してから、次の回を繰り返すこと。
- 補足: 対戦相手の手や繰り返し回数はランダムな値によって変わるため、出力される行数や具体的な内容は実行のたびに変わってよい。

View File

@@ -0,0 +1,82 @@
# Question05 - 値ごとの分岐
本資料の練習問題は、複数のプログラミング言語(Java / C# / PHP / Python)で共通して利用できるよう記述されています。静的型付け・動的型付けの違いや文字列の連結ルールなど、言語固有の文法仕様に基づき、問題文の表現をご使用の言語の仕様に適宜読み替えて進めてください。
## この問題のねらい
- 1つの値についてとりうる複数のケースを列挙し、値ごとに異なる処理を行う分岐を書けること
- どのケースにも当てはまらない場合の処理(既定の処理)を書けること
- 複数の条件を組み合わせて、最終的な結果を判定できること
以下の設問はそれぞれ独立したプログラムとして実装してください。
---
## 設問1
`今日の運勢を占います。` と出力したあと、0~5のいずれかのランダムな整数を生成し、変数 `num` に格納すること。
`num` の値に応じて、次のいずれかを出力すること。
- `0` の場合: `あなたの運勢は「大吉」です`
- `1` の場合: `あなたの運勢は「吉」です`
- `2` の場合: `あなたの運勢は「中吉」です`
- `3` の場合: `あなたの運勢は「小吉」です`
- `4` の場合: `あなたの運勢は「末吉」です`
- `5` の場合: `あなたの運勢は「凶」です`
- 補足: `num` の値はランダムに決まるため、実行のたびに出力内容は変わってよい。`num` の取りうる値(0~5)それぞれに対応する出力が正しく行われることを確認する。
---
## 設問2
`1つ目の数値を入力してください` と出力したあと数値の入力を1つ受け取り、整数として変数 `num1` に格納すること。続けて `2つ目の数値を入力してください` と出力したあと数値の入力を1つ受け取り、整数として変数 `num2` に格納すること。さらに `計算方法を選択してください` と出力したあと、計算方法を表す1文字の記号の入力を受け取り、文字列として変数 `choice` に格納すること。
`choice` の値に応じて、次の計算を行い、その結果の数値を出力すること。
- `+` の場合: `num1` と `num2` を足した値
- `-` の場合: `num1` から `num2` を引いた値
- `*` の場合: `num1` と `num2` を掛けた値
- `/` の場合: `num1` を `num2` で割った値(商)
- `%` の場合: `num1` を `num2` で割った余り
- 上記のいずれでもない場合: `計算に失敗しました` と出力する
---
## 設問3
ハイ&ローゲームを行うプログラムを作成する。
1. 次の内容を出力する(区切り線の記号や幅、見出しの位置などの体裁は下記と厳密に一致しなくてよい)。
```
=========================================
ゲームの説明
=========================================
これからハイ&ローゲームを行います。
ハイ&ローゲームは、あなたのカードがディーラーのカードより大きいか小さいかを予想するゲームです。
=========================================
ゲーム開始
=========================================
```
2. 1~13のいずれかのランダムな整数を生成し、ディーラーのカードを表す変数 `dealerCard` に格納する。
3. `ディーラーのカードは{dealerCardの値}です` と出力する。
4. 1~13のいずれかのランダムな整数を生成し、自分のカードを表す変数 `myCard` に格納する(この時点ではまだ出力しない)。
5. 空行を1行出力したあと、`あなたのカードがディーラのカードより大きい場合は H 小さい場合は L を入力してください。` と `※ カードの数値が同じ場合はあなたの勝ちです。` を出力する。そのうえで、あなたのカードがディーラーのカードより大きいか小さいかを、1文字の記号(`H`: 大きい、`L`: 小さい)で予想させ、その入力を文字列として変数 `judgement` に格納する。
6. `あなたのカードは{myCardの値}です` と出力する。
7. 空行を1行出力したあと、次の区切り線を出力する。
```
=========================================
勝敗判定
=========================================
```
8. 次のルールに従って勝敗を判定し、結果を出力すること。
- `myCard` と `dealerCard` が同じ値の場合は、予想の内容によらず勝ちとする。
- `judgement` が `H` で、`myCard` が `dealerCard` より大きい場合は勝ち。
- `judgement` が `L` で、`myCard` が `dealerCard` より小さい場合は勝ち。
- 上記に当てはまらない場合は負けとする。
- ただし `judgement` が `H`・`L` のいずれでもない場合は、勝敗を判定せずに `不正な値が入力されました` と出力する。
- 予想が当たった場合は `あなたの勝ちです`、外れた場合は `あなたの負けです` と出力する。
- 補足: `dealerCard` と `myCard` の値はランダムに決まるため、実行のたびに出力内容は変わってよい。上記の勝敗判定ルールが正しく反映されていることを確認する。

100
Question06-for/仕様.md Normal file
View File

@@ -0,0 +1,100 @@
# Question06 - 条件分岐と繰り返し処理
本資料の練習問題は、複数のプログラミング言語(Java / C# / PHP / Python)で共通して利用できるよう記述されています。静的型付け・動的型付けの違いや文字列の連結ルールなど、言語固有の文法仕様に基づき、問題文の表現をご使用の言語の仕様に適宜読み替えて進めてください。
## この問題のねらい
- 繰り返し処理を使って、指定した範囲の値を順に処理できること
- 繰り返しの中で条件分岐を組み合わせ、条件を満たす場合だけ処理を行えること
- 繰り返しの中で、特定の条件のときだけその回の処理を打ち切れること
- 繰り返しを組み合わせて(繰り返しの中でさらに繰り返しを行って)、行と列からなる出力を作成できること
以下の設問はそれぞれ独立したプログラムとして実装してください。
---
## 設問1
繰り返し処理を使って、0から99までの整数を小さい順にすべて出力してください。
- 出力: 0から99までの整数を、小さい順に1つずつ出力する
---
## 設問2
以下の出力結果が得られるプログラムを作成してください。
```
■■■■■
```
- 出力: `■` を5個並べた文字列を1行出力する
---
## 設問3
0から100までの整数を1つずつ順に確認し、2で割り切れる整数(偶数)のときだけ、その値をそのまま出力してください。
- 対象範囲: 0以上100以下(0と100を含む)
- 出力: 対象範囲の中で2で割り切れる整数を、小さい順にそのまま出力する(0, 2, 4, ... , 100)
---
## 設問4
1から49までの整数を1つずつ順に確認し、次の規則に従って出力してください。
1. 3で割り切れる場合は `fizz` と出力する
2. 5で割り切れる場合は `buzz` と出力する
3. 3でも5でも割り切れる場合は `fizzbuzz` と出力する(この場合、`fizz` や `buzz` は出力しない)
4. 上記のいずれにも当てはまらない場合は、その整数の値をそのまま出力する
- 対象範囲: 1以上49以下
- 出力: 対象範囲の整数を小さい順に1つずつ確認し、それぞれについて上記の規則に従った結果を1つずつ出力する
---
## 設問5
0以上2以下の範囲のランダムな整数を1つ生成する、という試行を10回繰り返してください。生成した値が2の場合はその回では何も出力せず、2以外の場合はその値をそのまま出力してください。
- 期待される結果: 10回の試行のうち、生成された値が2以外だった回数分だけ、その値が出力される(値はランダムなため、実行するたびに出力される個数や内容は変わってよい)
- 補足: ランダムな整数の生成には、使用する言語の標準的な手段を用いてよい
---
## 設問6
以下の出力結果が得られるプログラムを作成してください。
```
■■■■■
■■■■■
■■■■■
■■■■■
■■■■■
```
- 出力: `■` を5個並べた行を、5行分出力する
---
## 設問7
1から9までのかけ算九九の表と同じ内容が得られるプログラムを作成してください。
- 出力: 1から9までの整数を1つずつ順に取り上げ、それぞれについて1倍から9倍までの積を順に並べた行を、9行分出力する。具体的な期待結果は以下の通り(見やすさのために桁を揃えているが、桁揃えなどの見た目上の書式は問わない。各行に、その行に対応する9個の積が1倍から9倍の順で含まれていればよい)。
```
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
```

137
Question07-Array/仕様.md Normal file
View File

@@ -0,0 +1,137 @@
# Question07 - 配列
本資料の練習問題は、複数のプログラミング言語(Java / C# / PHP / Python)で共通して利用できるよう記述されています。静的型付け・動的型付けの違いや文字列の連結ルールなど、言語固有の文法仕様に基づき、問題文の表現をご使用の言語の仕様に適宜読み替えて進めてください。
## この問題のねらい
- 複数の値を1つのまとまり(一覧)として宣言し、扱えること
- 一覧の要素に対して、位置(先頭から数えた順番)を指定して値を設定・取得できること
- 繰り返し処理を使って、一覧の全要素を順に(先頭から末尾へ、または末尾から先頭へ)処理できること
- 行と列を持つ表形式のデータ(一覧の一覧)を扱えること。行ごとに要素数が異なる場合を含む
- 一覧の有効な範囲を超えた位置にアクセスするとエラーになることを理解し、範囲内に収まるように処理を修正できること
以下の設問はそれぞれ独立したプログラムとして実装してください。
---
## 設問1
5個の整数を格納できる一覧を宣言してください。宣言した一覧に、先頭から順に1, 3, 5, 7, 9を設定したうえで、一覧の先頭から2番目の要素を出力してください。
- 出力: `3`
---
## 設問2
整数を格納できる一覧を宣言し、先頭から順に1, 10, 100の3つの値で初期化してください。この一覧の先頭から1番目の値と3番目の値を足した値を出力してください。
- 出力: `101`
---
## 設問3
次の5個の文字列を、先頭から順に格納した一覧を用意してください。
- 森, 山, 沼, 島, 平地
繰り返し処理を使って、この一覧の全要素を先頭から順にすべて出力してください。
- 出力: 森, 山, 沼, 島, 平地 の順に、すべての要素を出力する
---
## 設問4
1000個の整数を格納できる一覧を用意してください。
繰り返し処理を使って、この一覧の先頭から順に1から1000までの整数を1つずつ設定してください。そのうえで、繰り返し処理を使ってこの一覧の全要素を先頭から順にすべて出力してください。
- 出力: 1, 2, 3, ... , 1000 の順に、すべての要素を出力する
---
## 設問5
次の5個の文字列を、先頭から順に格納した一覧を用意してください。
- 森, 山, 沼, 島, 平地
0以上4以下の範囲のランダムな整数を1つ生成し、その値が示す位置(先頭を0番目として数える)に対応する、一覧の要素を出力してください。
- 期待される結果: 一覧に含まれる5つの文字列(森・山・沼・島・平地)のいずれか1つが出力される(値はランダムなため、実行するたびに出力される文字列が変わってよい)
- 補足: ランダムな整数の生成には、使用する言語の標準的な手段を用いてよい
---
## 設問6
次の5個の文字列を、先頭から順に格納した一覧を用意してください。
- 森, 山, 沼, 島, 平地
繰り返し処理を使って、この一覧の内容を末尾から先頭に向かって順にすべて出力してください。
- 出力: 平地, 島, 沼, 山, 森 の順に、すべての要素を出力する
---
## 設問7
「行」が時限(1時間目から5時間目まで)を表し、各行の要素が月曜日から金曜日までの科目名を順に並べたものである、次のような表形式のデータ(行と列を持つ一覧)を用意してください。
| | 月 | 火 | 水 | 木 | 金 |
|----------|------|------|------|------|------|
| 1時間目 | 国語 | 社会 | 国語 | 理科 | 社会 |
| 2時間目 | 英語 | 数学 | 英語 | 数学 | 国語 |
| 3時間目 | 理科 | 国語 | 理科 | 国語 | 理科 |
| 4時間目 | 社会 | 社会 | 数学 | 社会 | 数学 |
| 5時間目 | 数学 | 英語 | 英語 | 理科 | 英語 |
このデータから、金曜日の2時間目に対応する科目名を取得して出力してください。
- 出力: `国語`
---
## 設問8
行ごとに要素数が異なってもよい、整数を格納した表形式のデータ(行と列を持つ一覧)として、次の2行から成るデータを用意してください。
- 1行目: 1, 3, 5, 7
- 2行目: 11, 13, 17, 19, 23, 29
繰り返し処理を使って、このデータに含まれるすべての整数要素を、1行目・2行目の順に、それぞれの行では先頭から末尾の順に出力してください。
- 出力: 1, 3, 5, 7, 11, 13, 17, 19, 23, 29 の順に、すべての要素を出力する
---
## 設問9
設問8と同じ、次の2行から成る表形式のデータ(行と列を持つ一覧)を用意してください。
- 1行目: 1, 3, 5, 7
- 2行目: 11, 13, 17, 19, 23, 29
繰り返し処理を使って、このデータに含まれるすべての整数要素の平均値を、小数として出力してください。
- 出力: `12.8`
- 補足: 使用する言語・環境によって小数の出力表現(末尾の0や桁数など)が変わる場合があるが、値として12.8を表せていればよい
---
## 設問10
整数を100個格納できる一覧(有効な位置は先頭を0番目として、0番目から99番目まで)を用意します。
次の処理は、この一覧の中身を先頭から順に1, 2, 3, ... , 100という100個の連続した整数にしようとしていますが、有効な範囲を超えた位置にアクセスしてしまい、実行時にエラーが発生します。
(元の処理の意図)
- 変数`i`を1から開始し、`i`が100以下である間、一覧の`i`番目の位置に`i + 1`の値を設定するという処理を、`i`を1ずつ増やしながら繰り返す
この処理を、エラーが発生せず、かつ一覧の中身が先頭から順に1, 2, 3, ... , 100となるように修正してください。修正後、繰り返し処理を使って一覧の全要素を先頭から順にすべて出力してください。
- 出力: 1, 2, 3, ... , 100 の順に、すべての要素を出力する
- 補足: 一覧(配列)は、あらかじめ決められた有効な範囲を超えた位置にアクセスするとエラーになります。この問題では、有効な範囲内だけを使って意図した中身になるように、代入する位置と値の対応関係を見直してください

110
Question08-Method/仕様.md Normal file
View File

@@ -0,0 +1,110 @@
# Question08 - 関数
本資料の練習問題は、複数のプログラミング言語(Java / C# / PHP / Python)で共通して利用できるよう記述されています。静的型付け・動的型付けの違いや文字列の連結ルールなど、言語固有の文法仕様に基づき、問題文の表現をご使用の言語の仕様に適宜読み替えて進めてください。
## この問題のねらい
- 処理をひとまとまりの単位(関数)として定義し、呼び出せること
- 関数に引数を渡し、その値を使った処理を実装できること
- 関数から結果(戻り値)を呼び出し元に返し、受け取った値を利用できること
- 戻り値として一覧(配列)を返す関数を実装できること
- 同じ役割の処理を、渡す値の種類や個数に応じて使い分けられるようにすること
以下の設問はそれぞれ独立したプログラムとして実装してください。
---
## 設問1
「呼び出されると、`こんにちは` という文字列を出力する、戻り値のない処理」を `hello` という名前の関数として用意してください。プログラムの実行開始点から、この `hello` 関数を呼び出してください。
- 出力: `こんにちは`
---
## 設問2
「1つの文字列を引数として受け取り、`こんにちは。(引数の値)です` という文字列を出力する、戻り値のない処理」を `hello` という名前の関数として用意してください。プログラムの実行開始点から、引数に `山田` を渡してこの `hello` 関数を呼び出してください。
- 出力: `こんにちは。山田です`
---
## 設問3
「呼び出されると、文字列 `こんにちは` を戻り値として返す処理」を `hello` という名前の関数として用意してください。プログラムの実行開始点で、`hello` 関数を呼び出した戻り値を、文字列を保持できる変数 `str` に代入したうえで、`str` の値を出力してください。
- 出力: `こんにちは`
---
## 設問4
「2つの整数 `x`, `y` を引数として受け取り、その合計を整数の戻り値として返す処理」を `sum` という名前の関数として用意してください。プログラムの実行開始点で、引数に1と2を渡してこの `sum` 関数を呼び出し、戻り値を変数 `sum` に代入したうえで、`sum` の値を出力してください。
- 出力: `3`
- 補足: 変数名と関数名を同じ名前にできるかどうかは言語の仕様によるため、同じ名前にできない場合は変数名を適宜変更してよい
---
## 設問5
プログラムの実行開始点で、以下の処理を実装してください。
- `1つ目の数値を入力してください` という案内を表示したうえで、キーボードから入力された整数を変数 `num1` に代入する
- `2つ目の数値を入力してください` という案内を表示したうえで、キーボードから入力された整数を変数 `num2` に代入する
そのうえで、「2つの整数 `x`, `y` を引数として受け取り、その合計を整数の戻り値として返す処理」を `sum` という名前の関数として作成してください。作成した `sum` 関数に、`num1` と `num2` を引数として渡して呼び出し、戻り値を変数 `sum` に代入したうえで、`sum` の値を出力してください。
- 出力: 入力された2つの整数の合計値
- 補足: キーボードからの入力の受け取りには、使用する言語の標準的な手段を用いてよい
---
## 設問6
「2つの整数 `x`, `y` を引数として受け取り、2個の整数を格納できる新しい一覧を作り、その一覧の先頭(0番目)に `x`、次(1番目)に `y` を設定したうえで、その一覧を戻り値として返す処理」を `addArray` という名前の関数として作成してください。プログラムの実行開始点で、引数に10と20を渡してこの `addArray` 関数を呼び出し、戻り値を変数 `array` に代入したうえで、`array` に含まれる全要素を出力してください。
- 出力: 10, 20 の順に、すべての要素を出力する
---
## 設問7
「渡された値を使って `引数は(値)です` という文字列を出力する、戻り値のない処理」を `printValue` という名前の処理として、渡される値の種類(文字列・整数・小数・1文字)ごとに用意してください。
プログラムの実行開始点から、作成した `printValue` を、次の4種類の値をそれぞれ渡して呼び出してください。
1. 文字列 `こんにちは` を渡して呼び出す
2. 整数 `100` を渡して呼び出す
3. 小数 `10.1` を渡して呼び出す
4. 1文字だけを保持する値 `A` を渡して呼び出す
- 出力:
```
引数はこんにちはです
引数は100です
引数は10.1です
引数はAです
```
- 補足: 同じ名前の処理を、渡す値の種類によって使い分けられる言語では、`printValue` という同じ名前のまま、種類ごとに処理を用意してください。同じ名前のまま値の種類で使い分ける仕組みがない言語では、`printValueString`、`printValueInt` のように区別できる名前を付けて、上記と同じ呼び出し結果が得られるようにしてください
---
## 設問8
「渡されたすべての整数の合計を、整数の戻り値として返す処理」を `sum` という名前の処理として、引数の個数(2個・3個・4個)ごとに用意してください。
プログラムの実行開始点から、作成した `sum` を、次の3種類の整数をそれぞれ渡して呼び出し、戻り値を出力してください。
- 2個の場合: 1, 2
- 3個の場合: 1, 2, 3
- 4個の場合: 1, 2, 3, 4
- 出力:
```
3
6
10
```
- 補足: 同じ名前の処理を、引数の個数によって使い分けられる言語では、`sum` という同じ名前のまま、個数ごとに処理を用意してください。同じ名前のまま個数で使い分ける仕組みがない言語では、`sum2`、`sum3`、`sum4` のように区別できる名前を付けて、上記と同じ呼び出し結果が得られるようにしてください

View File

@@ -0,0 +1,54 @@
# Question09 - 名前空間
本資料の練習問題は、複数のプログラミング言語(Java / C# / PHP / Python)で共通して利用できるよう記述されています。静的型付け・動的型付けの違いや文字列の連結ルールなど、言語固有の文法仕様に基づき、問題文の表現をご使用の言語の仕様に適宜読み替えて進めてください。
## この問題のねらい
- コードを整理するための名前空間(グループ分けの仕組み。)を作成し、その中にクラスを配置できること
- 同じ名前空間に属するクラスの処理を、名前空間の指定なしで呼び出せること
- 異なる名前空間に属するクラスの処理を、名前空間を含めた完全な呼び出し名で呼び出せること
- 呼び出し時に名前空間の指定を省略できるようにする宣言を使って、異なる名前空間に属するクラスの処理を呼び出せること
以下の設問はそれぞれ独立したプログラムとして実装してください。ただし、設問2で作成するクラス・処理は設問3でも使用します。
---
## 設問1
あなたが作成するプログラムと同じ名前空間の中に、次のクラスを作成してください。
- クラス名: `Util`
- メソッド: `hello`(引数なし、戻り値なし)
- 処理: 画面に `こんにちは` と出力する
その上で、このプログラムから、作成した `Util` クラスの `hello` メソッドを呼び出してください。同じ名前空間に属しているため、名前空間の指定なしで呼び出せます。
- 出力: `こんにちは`
---
## 設問2
次の要件を満たすクラスを用意してください。
1. `common` という名前の名前空間を新しく作成する
2. その `common` 名前空間の中に、`Util` という名前のクラスを作成する(設問1の `Util` クラスとは異なる名前空間に属する、別のクラスです)
3. 作成した `Util` クラスに、次の仕様を満たすメソッド `showSum` を作成する
- メソッド名: `showSum`
- 戻り値: なし
- 引数: 整数 `num1`、整数 `num2`
- 処理: `num1` と `num2` の合計値を画面に出力する
その上で、このプログラムから、作成した `showSum` メソッドを、名前空間を含めた完全な呼び出し名を使って呼び出してください。引数には任意の整数を2つ与えてください。
- 期待される結果: 与えた2つの整数の合計値が画面に出力される
---
## 設問3
設問2で作成した、`common` 名前空間に属する `Util` クラスの `showSum` メソッドを使用します。
このプログラムから、`showSum` メソッドを呼び出してください。その際、呼び出しのたびに名前空間を含めた完全な名前を書くのではなく、あらかじめ名前空間の指定を省略できるようにする宣言(importに相当する仕組み)を行ったうえで、省略した名前で呼び出してください。引数には任意の整数を2つ与えてください。
- 期待される結果: 与えた2つの整数の合計値が画面に出力される

View File

@@ -0,0 +1,185 @@
# 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行)

View File

@@ -0,0 +1,147 @@
# 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` メソッドを呼び出す
- 出力: `ブルーベリー味のトーストです。`

View File

@@ -0,0 +1,65 @@
# Question12 - カプセル化
本資料の練習問題は、複数のプログラミング言語(Java / C# / PHP / Python)で共通して利用できるよう記述されています。静的型付け・動的型付けの違いや文字列の連結ルールなど、言語固有の文法仕様に基づき、問題文の表現をご使用の言語の仕様に適宜読み替えて進めてください。
## この問題のねらい
- データ項目を外部から直接書き換えられないように保護し、決められた手段(値を設定する手段・値を取得する手段=アクセサ)を通してだけ読み書きさせられるようにすること(カプセル化)
- データ項目や振る舞いには「公開範囲」を指定できること、公開範囲によって参照できる場所が変わることを理解すること
## 公開範囲についての前提
この問題では、データ項目(フィールド相当)の公開範囲として、次の2段階を区別します。
- **完全非公開**:そのクラスの内部からしか参照できない
- **完全公開**:どこからでも参照できる
以下の設問はそれぞれ独立したプログラムとして実装してください。
---
## 設問1
利用者情報を保持するデータの入れ物(以下「User」とする)を用意します。Userは次の4つの項目を保持します。
- 利用者ID(整数)
- 利用者名(文字列)
- メールアドレス(文字列)
- パスワード(文字列)
### 要件
- 上記4つの項目は、いずれも**完全非公開**にしてください。
- 4つの項目それぞれについて、値を設定する手段と値を取得する手段(アクセサ)を用意し、これらは**完全公開**にしてください。
- 呼び出し側のプログラムでは、Userのインスタンスを生成し、各項目に直接値を代入するのではなく、用意した「値を設定する手段」を通じて次の値を設定してください。
- 利用者ID:`1000`
- 利用者名:`リゾーム太郎`
- メールアドレス:`rhizome@hogehoge.com`
- パスワード:`12345`
- 続けて、「値を取得する手段」を通じて4項目の値を取得し、次の形式で出力してください(各行の項目名と値の間の空白・全角文字はそのまま再現すること)。
```
ID :1000
名前 :リゾーム太郎
メールアドレス  :rhizome@hogehoge.com
パスワード  :12345
```
---
## 設問2
名称(文字列)を1つだけ保持するデータの入れ物(以下「Item」とする)を作成してください。名称は**完全非公開**にし、初期値は `アイテムA` としてください。
その上で、次の処理を行う呼び出し側のプログラムを作成してください。
1. Itemのインスタンスを生成する
2. 生成したインスタンスの名称の値を、そのまま出力する
上記の状態では、Itemの名称の項目が**完全非公開**に設定されているため、呼び出し側から値を直接参照できず、コンパイル(実行)エラーになります。
### 要件
- Itemに、名称の値を取得する手段(アクセサ)を追加してください。名称の項目自体は**完全非公開**のまま変更しないこと。
- 呼び出し側のプログラムを、名称の値を直接参照するのではなく、追加した「値を取得する手段」を通じて取得・出力するように修正し、エラーが出ないようにしてください。
- 期待される出力:`アイテムA`

View File

@@ -0,0 +1,223 @@
# Question13 - 継承
本資料の練習問題は、複数のプログラミング言語(Java / C# / PHP / Python)で共通して利用できるよう記述されています。静的型付け・動的型付けの違いや文字列の連結ルールなど、言語固有の文法仕様に基づき、問題文の表現をご使用の言語の仕様に適宜読み替えて進めてください。
## この問題のねらい
- 継承を使って、共通の性質・振る舞いを持つ複数の種類を、重複を排除して表現できること
- 継承先で、継承元の振る舞いの一部だけを独自の内容に置き換え(上書き)できること
- 継承元の初期化処理や振る舞いを、継承先から適切に呼び出し・利用できること
- あるクラスを継承したクラスを、さらに継承して性質を拡張できること
以下の設問はそれぞれ独立したプログラムとして実装してください。ただし、設問3・4で作成する「Hero」「Slime」は設問5で、設問6で作成する「SuperHero」は設問7で、それぞれ再利用します。
---
## 共通の下地1:Animal(設問1・2で使用)
次の性質・振る舞いを持つ「Animal」を作成してください(この後の設問では、これを継承する形で取り組んでください)。
- 保持するデータ:名前(文字列、完全非公開)
- 振る舞い
- 走る:`{名前}は走りました。` と出力する
- 食べる:`{名前}は食事をしました。` と出力する
- 名前を設定する/取得する(アクセサ)
---
## 設問1
Animalの性質・振る舞いをすべて引き継いだ「Cat」クラスを、継承を使って定義してください。追加の振る舞いは不要です(Animalの振る舞いをそのまま使います)。
次の処理を行うプログラムを作成してください。
1. Catのインスタンスを生成する
2. 名前に `タマ` を設定する
3. 走る振る舞いを実行する(期待出力:`タマは走りました。`)
4. 食べる振る舞いを実行する(期待出力:`タマは食事をしました。`)
---
## 設問2
Animalの性質・振る舞いを引き継いだ「Dog」クラスを、継承を使って定義してください。ただし、「食べる」の振る舞いだけは独自の内容に置き換え(上書き)てください。「走る」は引き継いだままの内容を使います。
- 食べる(上書き後):`{名前}はドッグフードを食べました。` と出力する
次の処理を行うプログラムを作成してください。
1. Dogのインスタンスを生成する
2. 名前に `ポチ` を設定する
3. 走る振る舞いを実行する(期待出力:`ポチは走りました。`)
4. 食べる振る舞いを実行する(期待出力:`ポチはドッグフードを食べました。`)
---
## 共通の下地2:Character(設問3・4・6・7で使用)
次の性質・振る舞いを持つ「Character」クラスを作成してください(この後の設問では、これを継承する形で取り組んでください)。
- 保持するデータ(いずれも完全非公開)
- 名前(文字列。値を設定しない間の初期値は `キャラクター`)
- 体力(整数)
- 力(整数)
- 防御力(整数)
- 生成方法:生成時に体力・力・防御力の初期値を指定できる
- 振る舞い
- 名前を設定する/取得する(アクセサ)
- 攻撃する:自身の「力」の値をそのまま返す
- ダメージを受ける(相手の攻撃値を受け取る)
1. ダメージ量 = 受け取った攻撃値 − 自身の防御力(ただし、この結果が0以下になる場合はダメージ量を1とする)
2. 自身の体力からダメージ量を引く
3. 体力が0以下になった場合は、体力を0に補正し、「戦闘不能」の状態とする
4. 次の内容をこの順番で出力する
- `{名前}は{ダメージ量}のダメージを受けた。`
- `{名前}の残り体力は{体力}。`
- 戦闘不能になった場合のみ、さらに `{名前}はちからつきた。`
- `↓`
5. 戦闘不能になったかどうかを真偽値で返す
- パラメーター表示:名前・体力・力・防御力を含む、次の形式の複数行の文字列を**返す**(出力ではなく、呼び出し元に返す文字列である点に注意)
```
名 前:{名前}
体 力:{体力}
 力 :{力}
耐 久:{防御力}
```
---
## 設問3
Characterの性質・振る舞いを引き継いだ「Hero」クラスを、継承を使って定義してください。
- Heroを生成する際は、呼び出し側が数値を指定しなくても、必ず体力25・力10・防御力7で初期化されるようにしてください。
- 追加の振る舞いは不要です。
次の処理を行うプログラムを作成してください。
1. Heroのインスタンスを生成する
2. 名前に `勇者` を設定する
3. パラメーター表示の文字列を取得し、出力する
期待出力:
```
名 前:勇者
体 力:25
 力 :10
耐 久:7
```
---
## 設問4
Characterの性質・振る舞いを引き継いだ「Slime」クラスを、継承を使って定義してください。
- Slimeを生成する際は、呼び出し側が数値を指定しなくても、必ず体力10・力5・防御力2で初期化されるようにしてください。
- 追加の振る舞いは不要です。
次の処理を行うプログラムを作成してください。
1. Slimeのインスタンスを生成する
2. 名前に `スライム` を設定する
3. パラメーター表示の文字列を取得し、出力する
期待出力:
```
名 前:スライム
体 力:10
 力 :5
耐 久:2
```
---
## 設問5
設問3・4で作成した「Hero」「Slime」を使用してください。
次の処理を行うプログラムを作成してください。
1. Heroのインスタンスを生成し、名前に `勇者` を設定する
2. Slimeのインスタンスを生成し、名前に `スライム` を設定する
3. 次の手順を、いずれかの体力が0になるまで繰り返す
1. Heroが攻撃し、その攻撃値をもとにSlimeがダメージを受ける。この結果Slimeが戦闘不能になったら、Heroの勝利として繰り返しを終了する。
2. まだ終了していなければ、Slimeが攻撃し、その攻撃値をもとにHeroがダメージを受ける。この結果Heroが戦闘不能になったら、Slimeの勝利として繰り返しを終了する。
4. 戦闘が終了したら、勝利した側の名前を「○○」、敗北した側の名前を「■■」として、`○○は■■との戦闘に勝利した` の形式で出力する
「ダメージを受ける」振る舞いを実行するたびに、その振る舞い自体が経過を表すメッセージを自動的に出力する点に注意してください(この設問側で個別に出力する必要はありません)。上記の値・アルゴリズムどおりに実装した場合、出力は次の順序・内容になります。
```
スライムは8のダメージを受けた。
スライムの残り体力は2。
↓
勇者は1のダメージを受けた。
勇者の残り体力は24。
↓
スライムは8のダメージを受けた。
スライムの残り体力は0。
スライムはちからつきた。
↓
勇者はスライムとの戦闘に勝利した
```
---
## Item(設問6・7で使用)
次の性質を持つ「Item」クラスを作成してください(この後の設問で使用します)。
- 保持するデータ(いずれも完全非公開)
- 装備品名(文字列)
- 追加ダメージ量(整数)
- 生成方法:生成時に装備品名・追加ダメージ量の初期値を指定できる
- 各データについて、値を設定する/取得する(アクセサ)
---
## 設問6
設問3で作成した「Hero」の性質・振る舞いをさらに引き継いだ「SuperHero」クラスを、継承を使って定義してください。
- SuperHeroを生成する際の体力・力・防御力の初期値は、Heroと同じ(体力25・力10・防御力7)とする。
- SuperHeroは新たに、装備品(Item)を1つ保持できるようにする。装備品については、値を設定する/取得する(アクセサ)を用意する。
- 「攻撃する」振る舞いを独自の内容に置き換え(上書き)る:自身の「力」の値に、保持している装備品の「追加ダメージ量」を加算した値を返すようにする。
次の処理を行うプログラムを作成してください。
1. SuperHeroのインスタンスを生成し、名前に `勇者(装備あり)` を設定する
2. Slime(設問4)のインスタンスを生成し、名前に `スライム` を設定する
3. Itemのインスタンスを、装備品名 `こんぼう`・追加ダメージ量 `5` として生成する
4. SuperHeroの装備品として、3で生成したItemを設定する
5. SuperHeroの攻撃する振る舞いを実行し、戻り値を出力する
期待出力:`15`
---
## 設問7
設問6で作成した「SuperHero」と、設問4の「Slime」を使用してください。
次の処理を行うプログラムを作成してください。
1. SuperHeroのインスタンスを生成し、名前に `勇者(装備あり)` を設定する
2. Slimeのインスタンスを生成し、名前に `スライム` を設定する
3. Itemのインスタンスを、装備品名 `ロングソード`・追加ダメージ量 `20` として生成する
4. SuperHeroの装備品として、3で生成したItemを設定する
5. 次の手順を、いずれかの体力が0になるまで繰り返す
1. SuperHeroが攻撃し、その攻撃値をもとにSlimeがダメージを受ける。この結果Slimeが戦闘不能になったら、SuperHeroの勝利として繰り返しを終了する。
2. まだ終了していなければ、Slimeが攻撃し、その攻撃値をもとにSuperHeroがダメージを受ける。この結果SuperHeroが戦闘不能になったら、Slimeの勝利として繰り返しを終了する。
6. 戦闘が終了したら、勝利した側の名前を「○○」、敗北した側の名前を「■■」として、`○○は■■との戦闘に勝利した` の形式で出力する
上記の値・アルゴリズムどおりに実装した場合、出力は次の順序・内容になります(SuperHeroの攻撃値は 力10+追加ダメージ20=30 となり、Slimeは初回の攻撃で戦闘不能になります)。
```
スライムは28のダメージを受けた。
スライムの残り体力は0。
スライムはちからつきた。
↓
勇者(装備あり)はスライムとの戦闘に勝利した
```

View File

@@ -0,0 +1,68 @@
# Question14 - 共通の振る舞いの定義(インタフェース・抽象クラス相当)
本資料の練習問題は、複数のプログラミング言語(Java / C# / PHP / Python)で共通して利用できるよう記述されています。静的型付け・動的型付けの違いや文字列の連結ルールなど、言語固有の文法仕様に基づき、問題文の表現をご使用の言語の仕様に適宜読み替えて進めてください。
## この問題のねらい
- 「共通の振る舞いの定義」(実装内容を持たず、必ず用意しなければならない振る舞いの一覧だけを定めたもの。多くの言語で抽象クラス・インタフェースと呼ばれる仕組みに相当する)に従って、具体的な内容を実装できること
- 同じ定義に従う実装であれば、中身が違っても同じ扱い方(呼び出し方)ができることを理解すること
## 「共通の振る舞いの定義」について
この問題でいう「共通の振る舞いの定義」とは、それ自体はインスタンスを生成できず、必ず実装しなければならない振る舞いの名前・受け取る値・返す値の約束だけを定めたものです。この定義に含まれる各振る舞いは、中身を持たない「抽象メソッド」に相当します。
実際にインスタンスを生成して使うのは、その定義に従って中身を実装した具体的なクラス(例:後述の「本」の定義に従う「プログラミング基礎入門」の実装)です。具体的なクラス側では、定義された振る舞いのそれぞれについて、中身を実装(オーバーライド)する必要があります。使用する言語に用意されている、抽象クラスやインタフェースなど、この仕組みに相当する機能を使って表現してください。
以下の設問はそれぞれ独立したプログラムとして実装してください。
---
## 設問1
「本」についての共通の振る舞いの定義を作成してください。この定義は、次の2つの振る舞いを必ず実装することを求めるものとします。
- 本のタイトルを返す
- 本の章立ての一覧(章タイトルの並び)を返す
上記の定義に従い、「プログラミング基礎入門」を表す実装を作成してください。
- 本のタイトル:`プログラミング基礎入門`
- 章立ての一覧(この順序で5件):`式と変数` / `制御構文` / `メソッド` / `オブジェクト指向` / `継承`
次の処理を行うプログラムを作成してください。
1. 上記の本のインスタンスを生成する
2. インスタンスから本のタイトルを取得し、出力する
3. インスタンスから章立ての一覧を取得し、出力する
### 期待される結果
- 手順2の出力:`プログラミング基礎入門`
- 手順3の出力:一覧に含まれる5件の章タイトル `式と変数`・`制御構文`・`メソッド`・`オブジェクト指向`・`継承` が、この順序ですべて分かるように出力されていること(1行にまとめて出力しても、1件ずつ複数行に分けて出力してもよい)
---
## 設問2
「車」についての共通の振る舞いの定義を作成してください。この定義は、次の2つの振る舞いを必ず実装することを求めるものとします。
- ガソリンを補充する(補充量を表す数値を受け取る)
- 走る(速度を表す数値を受け取る)
上記の定義に従い、「スポーツカー」を表す実装を作成してください。
- ガソリンを補充する:受け取った数値を x として、`ハイオクをxリットル補充した` と出力する
- 走る:受け取った数値を x として、`スポーツカーは時速xキロで走った` と出力する。ただし、受け取った数値が `300` を超える場合は、その出力の代わりに `速度オーバーです` と出力する
次の処理を行うプログラムを作成してください。
1. 上記のスポーツカーのインスタンスを生成する
2. ガソリンを補充する振る舞いに `100` を渡して実行する
3. 走る振る舞いに `100` を渡して実行する
4. 走る振る舞いに `301` を渡して実行する
### 期待される結果
- 手順2の出力:`ハイオクを100リットル補充した`
- 手順3の出力:`スポーツカーは時速100キロで走った`
- 手順4の出力:`速度オーバーです`

View File

@@ -0,0 +1,88 @@
# Question15 - 多態性(ポリモーフィズム)
本資料の練習問題は、複数のプログラミング言語(Java / C# / PHP / Python)で共通して利用できるよう記述されています。静的型付け・動的型付けの違いや文字列の連結ルールなど、言語固有の文法仕様に基づき、問題文の表現をご使用の言語の仕様に適宜読み替えて進めてください。
## この問題のねらい
- 変数の型(扱いとしての種類)と、実際に代入されているデータの種類が異なっていても、代入先の型として扱えることを理解する
- 複数の異なる種類のデータを、共通の型としてまとめて一覧に格納し、順に処理できることを理解する
- 共通の型として扱っている変数を、元々の具体的な種類として扱いなおす(型の変換)方法を理解する
以下の設問はそれぞれ独立したプログラムとして実装してください。
---
## 共通のデータ定義(各設問で共通して使用する)
以下の3種類のデータ定義を、共通の性質を引き継ぐ関係を使って作成したうえで、各設問に解答してください。これらは全ての設問で共通して使用し、内容は変更しないものとします。
### 種類1: Car(車)
- 保持するデータ
- 名前(文字列)
- 速度(整数)
- 生成方法:生成時に名前・速度の初期値を指定できる
- 振る舞い
- 走る:`(名前)は時速(速度)で走った` という文字列を出力する
### 種類2: SportsCar(スポーツカー)
Carの性質・振る舞いをすべて引き継いだ種類として定義してください。
- 保持するデータ:Carと同じ(名前・速度)
- 生成方法:生成時にパラメータを指定できないようにし、生成すると自動的に名前「スポーツカー」・速度100に固定して初期化されるようにする
- 振る舞い
- 走る:Carの振る舞いをそのまま使う(独自の内容に置き換えない)
- ターボで走る(独自に追加する振る舞い):`(名前)は時速(速度の3倍)で走った` という文字列を出力する
### 種類3: Truck(トラック)
Carの性質・振る舞いをすべて引き継いだ種類として定義してください。
- 保持するデータ:Carと同じ(名前・速度)
- 生成方法:生成時にパラメータを指定できないようにし、生成すると自動的に名前「トラック」・速度30に固定して初期化されるようにする
- 振る舞い:Carの振る舞い(走る)をそのまま使う。独自の振る舞いは追加しない。
---
## 設問1
次の手順を実装してください。
1. SportsCarの性質を持つインスタンスを1つ生成し、Carの型として扱える変数に代入する
2. その変数に対して「走る」処理を実行する
- 出力: `スポーツカーは時速100で走った`
3. Truckの性質を持つインスタンスを1つ生成し、Carの型として扱える変数に代入する
4. その変数に対して「走る」処理を実行する
- 出力: `トラックは時速30で走った`
- 補足: 変数をCarの型として扱っていても、実際に代入されているインスタンスの種類(SportsCarかTruckか)によって「走る」処理の結果が変わることを確認する設問である
---
## 設問2
次の手順を実装してください。
1. SportsCarの性質を持つインスタンスを1つ生成し、Carの型として扱える変数に代入する
2. Truckの性質を持つインスタンスを1つ生成し、Carの型として扱える変数に代入する
3. Carの型の値を複数格納できる一覧(配列)を作成し、上記2つのインスタンスを両方追加する
4. 一覧の中身を順番に取り出し、それぞれに対して「走る」処理を実行する
- 出力:
```
スポーツカーは時速100で走った
トラックは時速30で走った
```
---
## 設問3
1. Carの型として扱える変数 `car` を宣言し、SportsCarの性質を持つインスタンスを1つ生成して代入してください
2. 変数 `car` が保持しているインスタンスを、SportsCar固有のふるまい(ターボで走る)を呼び出せる形に変換してください
3. 変換した後、ターボで走る処理を実行してください
- 出力: `スポーツカーは時速300で走った`
- 補足: 変数をCarの型のまま扱っている状態では、SportsCarだけが持つ独自のふるまい(ターボで走る)は呼び出せない。呼び出せるようにするために必要な変換を行うこと

View File

@@ -0,0 +1,109 @@
# Question16 - 例外処理の基本
本資料の練習問題は、複数のプログラミング言語(Java / C# / PHP / Python)で共通して利用できるよう記述されています。静的型付け・動的型付けの違いや文字列の連結ルールなど、言語固有の文法仕様に基づき、問題文の表現をご使用の言語の仕様に適宜読み替えて進めてください。
## この問題のねらい
- 実行時に発生する異常な状態(例外)を捕捉し、プログラムを異常終了させずに対処できること
- 例外の種類ごとに異なる対処を行えること(複数の異なる種類の例外を区別して捕捉できること)
- 例外が発生したかどうかに関わらず、必ず実行したい後始末の処理を用意できること
- 独自の例外の種類を定義し、意図的に発生させたうえで、それを呼び出し元で捕捉できること
以下の設問はそれぞれ独立したプログラムとして実装してください。
---
## 設問1
2つの整数(割られる数・割る数)を受け取り、割り算した結果を返す処理を実装してください。
次の処理を行う呼び出し元プログラムを作成してください。
1. `10` と `2` を渡してこの処理を呼び出し、戻り値を出力する
2. `10` と `0` を渡してこの処理を呼び出す
割る数に `0` を渡した場合、実行時にエラー(例外的な状況)が発生します。このエラーを捕捉し、プログラムを異常終了させる代わりに `0で割ることはできません` と出力してください。
### 期待される結果
```
5
0で割ることはできません
```
---
## 設問2
文字列を1つ受け取り、それを整数に変換したうえで2倍した値を返す処理を実装してください。
次の処理を行う呼び出し元プログラムを作成してください。
1. `"10"` を渡してこの処理を呼び出し、戻り値を出力する
2. `"abc"`(数値に変換できない文字列)を渡してこの処理を呼び出す
3. `""`(空文字列)を渡してこの処理を呼び出す
### 要件
- 数値に変換できない文字列を渡した場合、実行時にエラー(例外的な状況)が発生します。このエラーを捕捉し、`数値に変換できません` と出力してください。
- 空文字列を渡した場合は、変換を試みる前に、自分で意図的に別の種類のエラーを発生させてください。呼び出し元では、このエラーを上記の変換エラーとは区別して捕捉し、`入力が空です` と出力してください。
- 上記いずれにも該当しない場合は、変換した値を2倍にして出力してください。
### 期待される結果
```
20
数値に変換できません
入力が空です
```
---
## 設問3
整数の一覧(配列)と、取得したい位置を表すインデックス(0番目から数える)を受け取り、その位置の値を返す処理を実装してください。
次の要素を持つ整数の一覧を用意してください。
- `10, 20, 30`
次の処理を行う呼び出し元プログラムを作成してください。
1. 上記の一覧と、有効な位置(`1`)を渡してこの処理を呼び出し、戻り値を出力する
2. 上記の一覧と、範囲外の位置(`5`)を渡してこの処理を呼び出す
### 要件
- 範囲外の位置を指定した場合、実行時にエラー(例外的な状況)が発生します。このエラーを捕捉し、`指定した位置にデータがありません` と出力してください。
- エラーが発生した場合・しなかった場合のいずれでも、必ず最後に `処理を終了します` が1回出力されるようにしてください。ただし、この出力は、エラーを捕捉した後の処理として個別に書くのではなく、エラーの有無にかかわらず必ず実行される後始末の処理として実装すること(1・2の呼び出しそれぞれについて、この後始末の処理が実行されます)。
### 期待される結果
```
20
処理を終了します
指定した位置にデータがありません
処理を終了します
```
---
## 設問4
年齢(整数)を受け取り、値をそのまま返す処理を実装してください。ただし、受け取った値が0未満だった場合は、値をそのまま返す代わりに、独自に定義した種類のエラー(以下「不正な年齢エラー」とする)を発生させるようにしてください。「不正な年齢エラー」は、発生時に受け取った不正な値を保持できるようにしてください。
次の処理を行う呼び出し元プログラムを作成してください。
1. `20` を渡してこの処理を呼び出し、戻り値を `年齢は(値)です` の形式で出力する
2. `-5` を渡してこの処理を呼び出す
### 要件
- 2.の呼び出しで発生する「不正な年齢エラー」を捕捉し、そのエラーが保持している不正な値を使って `(値)は不正な年齢です` と出力してください。
### 期待される結果
```
年齢は20です
-5は不正な年齢です
```

View File

@@ -0,0 +1,107 @@
# Question17 - スタックトレースの読解
本資料の練習問題は、複数のプログラミング言語(Java / C# / PHP / Python)で共通して利用できるよう記述されています。静的型付け・動的型付けの違いや文字列の連結ルールなど、言語固有の文法仕様に基づき、問題文の表現をご使用の言語の仕様に適宜読み替えて進めてください。
## この問題のねらい
- 例外が呼び出しの階層をさかのぼって伝播していく様子を、その経路を示す情報(スタックトレース)から読み取り、発生元と原因を特定できるようにする
- 例外の発生元から離れた呼び出し元でも、伝播してきた例外を捕捉できることを理解する
以下の設問はそれぞれ独立したプログラムとして実装してください。
---
## 設問1
次の3段階の呼び出し構造を持つ処理を実装してください(この3つの処理は、以降の要件に沿って修正する際にも変更しないものとします)。
1. 平均点レポート処理(最上位):整数の一覧(配列)を受け取り、2の処理を呼び出して平均点を求めたうえで、「平均点は(平均点)点です」という文字列を出力する。
2. 平均点算出処理(中間):整数の一覧を受け取り、一覧に含まれる値の合計を求めたうえで、3の処理に「合計」と「一覧の要素数」を渡して呼び出し、その結果を返す。
3. 割り算処理(最下位):2つの数値(割られる数・割る数)を受け取り、割り算した結果を返すだけの処理。
上記1〜3のいずれの処理内でも、エラー(例外的な状況)を捕捉する記述は行わないでください。
### 手順・要件
1. まず、次の処理を行う呼び出し元プログラムを作成してください。
- 得点の一覧 `[80, 90, 70]` を渡して1の処理を呼び出す
- 続けて、空の得点の一覧 `[]` を渡して1の処理を呼び出す
2. この状態で実行すると、1回目の呼び出しは正常に完了しますが、2回目の呼び出しでは「合計÷要素数」が「合計÷0」という割り算になり、実行時にエラー(例外的な状況)が発生します。1〜3のどの処理でもこのエラーを捕捉していないため、プログラムはエラーの発生元から順に、そこに至るまでの3→2→1の呼び出し経路をコンソール(標準エラー出力)に表示しながら異常終了します。これを**スタックトレース**と呼びます。
3. 実際にこの状態で一度実行し、表示されたスタックトレースから「1〜3のうちどの処理の中で」「何が原因で」エラーが発生したのかを確認してください。
4. 確認した内容をもとに、呼び出し元プログラムを次のとおり修正してください(1〜3の処理内容自体は変更しないこと)。
- 得点の一覧の要素数が0であることが原因でエラーが発生した場合、プログラムを異常終了させず、代わりに「採点データがないため、平均点を計算できませんでした」と出力すること
- 得点の一覧に要素がある場合は、これまでどおり平均点を出力すること
### 実行例
- 得点の一覧が `[80, 90, 70]` の場合
- 出力: `平均点は80点です`
- 得点の一覧が `[]`(空)の場合
- 出力: `採点データがないため、平均点を計算できませんでした`
---
## 設問2
商品の情報として、名前(文字列)と価格(整数)を保持するデータの入れ物(以下「Product」とする)を作成してください。名前・価格は完全非公開にし、それぞれ値を取得する手段(アクセサ)を用意してください。
次の2段階の呼び出し構造を持つ処理を実装してください(この2つの処理は、以降の要件に沿って修正する際にも変更しないものとします)。
1. 商品検索処理:複数のProductからなる一覧(在庫一覧)と、探したい商品名を受け取り、一覧の中から名前が一致するProductを探して返す。一致するものがなければ、「値が存在しないことを示す特別な値」を返す。
2. 検索結果表示処理:在庫一覧と探したい商品名を受け取り、1の処理を呼び出して検索結果を取得したうえで、その検索結果に対して価格を取得する手段(アクセサ)を呼び出し、「(商品名)の価格は(価格)円です」という文字列を出力する。検索結果が「値が存在しないことを示す特別な値」かどうかは確認せず、そのままアクセサを呼び出す処理として実装してください。
上記1・2のいずれの処理内でも、エラー(例外的な状況)を捕捉する記述は行わないでください。
### 手順・要件
1. まず、次の処理を行う呼び出し元プログラムを作成してください。
- 名前`りんご`・価格`150`、名前`みかん`・価格`100`の2つのProductからなる在庫一覧を作成する
- 商品名`りんご`を指定して2の処理を呼び出す
- 続けて、在庫一覧に存在しない商品名`バナナ`を指定して2の処理を呼び出す
2. この状態で実行すると、1回目の呼び出しは正常に完了しますが、2回目の呼び出しでは、1の処理が「値が存在しないことを示す特別な値」を返し、2の処理がその値に対してそのままアクセサを呼び出そうとするため、実行時にエラー(例外的な状況)が発生します。1・2のどちらの処理でもこのエラーを捕捉していないため、プログラムはエラーの発生元(2の処理の中で、アクセサを呼び出している箇所)から呼び出し元までの経路を示すスタックトレースを表示しながら異常終了します。
3. 実際にこの状態で一度実行し、表示されたスタックトレースから、2つの処理のうち「どちらの処理の中で」エラーが発生しているかを確認してください(設問1と異なり、今回は3段階ではなく1・2の2段階の呼び出しになっている点にも注目してください)。
4. 確認した内容をもとに、**2. 検索結果表示処理**を次のとおり修正してください(1. 商品検索処理・呼び出し元プログラムは変更しないこと)。
- 検索結果が「値が存在しないことを示す特別な値」だった場合、価格を取得する処理を呼び出さずに、代わりに「(商品名)は見つかりませんでした」と出力すること
- 検索結果が見つかった場合は、これまでどおり価格を出力すること
### 実行例
- `りんご`を検索した場合
- 出力: `りんごの価格は150円です`
- `バナナ`を検索した場合
- 出力: `バナナは見つかりませんでした`
---
## 設問3
会員登録の入力値チェックを行う、次の3段階の呼び出し構造を持つ処理を実装してください(この3つの処理は、以降の要件に沿って修正する際にも変更しないものとします)。
1. 会員登録処理(最上位):名前(文字列)と年齢(整数)を受け取り、2の処理を呼び出して入力チェックを行ったうえで、チェックを通過した場合は「(名前)を登録しました」という文字列を出力する。
2. 入力チェック処理(中間):名前と年齢を受け取り、まず3の処理に名前を渡して呼び出す。3の処理が正常に終了した後、年齢が0未満だった場合、エラー(例外的な状況)を意図的に発生させる。
3. 名前チェック処理(最下位):名前を受け取り、値が空文字列だった場合、エラー(例外的な状況)を意図的に発生させる。
- 2の処理が発生させるエラーと、3の処理が発生させるエラーは、呼び出し元でどちらが原因かを区別できるよう、それぞれ異なる種類として定義してください。
- 上記1〜3のいずれの処理内でも、発生させたエラーを捕捉する記述は行わないでください。
### 手順・要件
1. まず、次の処理を行う呼び出し元プログラムを作成してください。
- 名前`花子`・年齢`20`を指定して1の処理を呼び出す
- 名前を空文字列・年齢`20`を指定して1の処理を呼び出す
- 名前`太郎`・年齢`-5`を指定して1の処理を呼び出す
2. この状態で実行すると、1つ目の呼び出しは正常に完了しますが、2つ目の呼び出しでは3の処理の中で、3つ目の呼び出しでは2の処理の中で、それぞれエラーが発生し、プログラムはその都度スタックトレースを表示しながら異常終了します。
3. 実際に2つ目・3つ目の呼び出しの状態で実行し、表示されるスタックトレースの内容(エラーの発生元・エラーの種類)を比較し、両者がそれぞれ何が原因で、どちらの処理から発生しているかを確認してください。
4. 確認した内容をもとに、呼び出し元プログラムを次のとおり修正してください(1〜3の処理内容自体は変更しないこと)。
- 1の処理の呼び出しを、エラーを捕捉できる形に修正し、発生したエラーの種類に応じて次のとおり出力を切り替えること
- 名前が空文字列であることに起因するエラーの場合:`名前を入力してください`
- 年齢が0未満であることに起因するエラーの場合:`年齢は0以上を入力してください`
- エラーが発生しなかった場合は、これまでどおり登録完了のメッセージを出力すること
### 実行例
```
花子を登録しました
名前を入力してください
年齢は0以上を入力してください
```

View File

@@ -0,0 +1,55 @@
GK,クラウディオ・ブラボ,チリ,マンチェスター・C
GK,ジャンルイジ・ブッフォン,イタリア,ユヴェントス
GK,ダビド・デ・ヘア,スペイン,マンチェスター・U
GK,ケイロル・ナバス,コスタリカ,レアル・マドリード
GK,マヌエル・ノイアー,ドイツ,バイエルン
DF,ダヴィド・アラバ,オーストリア,バイエルン
DF,ジョルディ・アルバ ,スペイン,バルセロナ
DF,セルジュ・オーリエ,コートジボワール,パリ・サンジェルマン
DF,エクトル・ベジェリン,スペイン,アーセナル
DF,ジェローム・ボアテング,ドイツ,バイエルン
DF,レオナルド・ボヌッチ,イタリア,ユヴェントス
DF,ダニエル・カルバハル,スペイン,レアル・マドリード
DF,ジョルジョ・キエッリーニ,イタリア,ユヴェントス
DF,ダニエウ・アウヴェス,ブラジル,ユヴェントス
DF,ダヴィド・ルイス,ブラジル,チェルシー
DF,ディエゴ・ゴディン,ウルグアイ,アトレティコ・マドリード
DF,マッツ・フンメルス,ドイツ,バイエルン
DF,フィリップ・ラーム,ドイツ,バイエルン
DF,マルセロ,ブラジル,レアル・マドリード
DF,ハビエル・マスチェラーノ,アルゼンチン,バルセロナ
DF,ペペ,ポルトガル,レアル・マドリード
DF,ジェラール・ピケ,スペイン,バルセロナ
DF,セルヒオ・ラモス,スペイン,レアル・マドリード
DF,チアゴ・シウヴァ,ブラジル,パリ・サンジェルマン
DF,ラファエル・ヴァラン,フランス,レアル・マドリード
MF,シャビ・アロンソ,スペイン,バイエルン
MF,セルヒオ・ブスケツ,スペイン,バルセロナ
MF,ケヴィン・デ・ブライネ,ベルギー,マンチェスター・C
MF,エデン・アザール,ベルギー,チェルシー
MF,アンドレス・イニエスタ,スペイン,バルセロナ
MF,エンゴロ・カンテ,フランス,チェルシー
MF,トニ・クロース,ドイツ,レアル・マドリード
MF,ルカ・モドリッチ,クロアチア,レアル・マドリード
MF,メスト・エジル,ドイツ,アーセナル
MF,ディミトリ・パイェ,フランス,ウェストハム
MF,ポール・ポグバ,フランス,マンチェスター・U
MF,イヴァン・ラキティッチ,クロアチア,バルセロナ
MF,ダビド・シルバ,スペイン,マンチェスター・C
MF,マルコ・ヴェラッティ,イタリア,パリ・サンジェルマン
MF,アルトゥーロ・ビダル,チリ,バイエルン
FW,セルヒオ・アグエロ,アルゼンチン,マンチェスター・C
FW,ギャレス・ベイル,ウェールズ,レアル・マドリード
FW,カリム・ベンゼマ,フランス,レアル・マドリード
FW,クリスティアーノ・ロナウド,ポルトガル,レアル・マドリード
FW,パウロ・ディバラ,アルゼンチン,ユヴェントス
FW,アントワーヌ・グリーズマン,フランス,アトレティコ・マドリード
FW,ゴンサロ・イグアイン,アルゼンチン,ユヴェントス
FW,ズラタン・イブラヒモヴィッチ,スウェーデン,マンチェスター・U
FW,ロベルト・レヴァンドフスキ,ポーランド,バイエルン
FW,リオネル・メッシ,アルゼンチン,バルセロナ
FW,トーマス・ミュラー,ドイツ,バイエルン
FW,ネイマール,ブラジル,バルセロナ
FW,アレクシス・サンチェス,チリ,アーセナル
FW,ルイス・スアレス,ウルグアイ,バルセロナ
FW,ジェイミー・ヴァーディ,イングランド,レスター
1 GK クラウディオ・ブラボ チリ マンチェスター・C
2 GK ジャンルイジ・ブッフォン イタリア ユヴェントス
3 GK ダビド・デ・ヘア スペイン マンチェスター・U
4 GK ケイロル・ナバス コスタリカ レアル・マドリード
5 GK マヌエル・ノイアー ドイツ バイエルン
6 DF ダヴィド・アラバ オーストリア バイエルン
7 DF ジョルディ・アルバ スペイン バルセロナ
8 DF セルジュ・オーリエ コートジボワール パリ・サンジェルマン
9 DF エクトル・ベジェリン スペイン アーセナル
10 DF ジェローム・ボアテング ドイツ バイエルン
11 DF レオナルド・ボヌッチ イタリア ユヴェントス
12 DF ダニエル・カルバハル スペイン レアル・マドリード
13 DF ジョルジョ・キエッリーニ イタリア ユヴェントス
14 DF ダニエウ・アウヴェス ブラジル ユヴェントス
15 DF ダヴィド・ルイス ブラジル チェルシー
16 DF ディエゴ・ゴディン ウルグアイ アトレティコ・マドリード
17 DF マッツ・フンメルス ドイツ バイエルン
18 DF フィリップ・ラーム ドイツ バイエルン
19 DF マルセロ ブラジル レアル・マドリード
20 DF ハビエル・マスチェラーノ アルゼンチン バルセロナ
21 DF ペペ ポルトガル レアル・マドリード
22 DF ジェラール・ピケ スペイン バルセロナ
23 DF セルヒオ・ラモス スペイン レアル・マドリード
24 DF チアゴ・シウヴァ ブラジル パリ・サンジェルマン
25 DF ラファエル・ヴァラン フランス レアル・マドリード
26 MF シャビ・アロンソ スペイン バイエルン
27 MF セルヒオ・ブスケツ スペイン バルセロナ
28 MF ケヴィン・デ・ブライネ ベルギー マンチェスター・C
29 MF エデン・アザール ベルギー チェルシー
30 MF アンドレス・イニエスタ スペイン バルセロナ
31 MF エンゴロ・カンテ フランス チェルシー
32 MF トニ・クロース ドイツ レアル・マドリード
33 MF ルカ・モドリッチ クロアチア レアル・マドリード
34 MF メスト・エジル ドイツ アーセナル
35 MF ディミトリ・パイェ フランス ウェストハム
36 MF ポール・ポグバ フランス マンチェスター・U
37 MF イヴァン・ラキティッチ クロアチア バルセロナ
38 MF ダビド・シルバ スペイン マンチェスター・C
39 MF マルコ・ヴェラッティ イタリア パリ・サンジェルマン
40 MF アルトゥーロ・ビダル チリ バイエルン
41 FW セルヒオ・アグエロ アルゼンチン マンチェスター・C
42 FW ギャレス・ベイル ウェールズ レアル・マドリード
43 FW カリム・ベンゼマ フランス レアル・マドリード
44 FW クリスティアーノ・ロナウド ポルトガル レアル・マドリード
45 FW パウロ・ディバラ アルゼンチン ユヴェントス
46 FW アントワーヌ・グリーズマン フランス アトレティコ・マドリード
47 FW ゴンサロ・イグアイン アルゼンチン ユヴェントス
48 FW ズラタン・イブラヒモヴィッチ スウェーデン マンチェスター・U
49 FW ロベルト・レヴァンドフスキ ポーランド バイエルン
50 FW リオネル・メッシ アルゼンチン バルセロナ
51 FW トーマス・ミュラー ドイツ バイエルン
52 FW ネイマール ブラジル バルセロナ
53 FW アレクシス・サンチェス チリ アーセナル
54 FW ルイス・スアレス ウルグアイ バルセロナ
55 FW ジェイミー・ヴァーディ イングランド レスター

View File

@@ -0,0 +1,8 @@
オムライス,500
焼きそば,450
ハンバーグ,600
ステーキ,800
ナポリタン,600
ミラノ風ドリア,299
フライドチキン,300
カレー,600
1 オムライス 500
2 焼きそば 450
3 ハンバーグ 600
4 ステーキ 800
5 ナポリタン 600
6 ミラノ風ドリア 299
7 フライドチキン 300
8 カレー 600

View File

@@ -0,0 +1,274 @@
# Question18 - 一覧(コレクション)操作
本資料の練習問題は、複数のプログラミング言語(Java / C# / PHP / Python)で共通して利用できるよう記述されています。静的型付け・動的型付けの違いや文字列の連結ルールなど、言語固有の文法仕様に基づき、問題文の表現をご使用の言語の仕様に適宜読み替えて進めてください。
## この問題のねらい
- 一覧(リスト)に要素を追加し、追加した順序を保ったまま全件を取り出して出力できること
- 複数のフィールドを持つデータ(レコード)を定義し、そのデータを一覧に格納して扱えること
- 一覧の要素の中から、条件に合うものだけを取り出す(絞り込む)、または条件に合うものを取り除くことができること
- 与えられたデータ(外部データを読み込んで組み立てた一覧)を対象に、絞り込み・除外・集計といった加工ができること
- 一覧からランダムに複数の要素を重複なく選び出し、その結果をもとに合計・税込み計算・小数点以下の切り捨てといった計算ができること
以下の設問はそれぞれ独立したプログラムとして実装してください。ただし、設問2〜4は共通データ定義「選手データ」を、設問5は共通データ定義「料理データ」を、それぞれ使用します。
---
## 共通データ定義: 選手データ(設問2〜4で使用)
次の4つのフィールドを持つデータを表せるようにしてください。
- ポジション(文字列)
- 名前(文字列)
- 国(文字列)
- 所属チーム(文字列)
このデータを1件の文字列として表現する場合は、「ポジション,名前,国,所属チーム」の順にカンマ区切りで表してください(設問2〜4の出力形式として使用します)。
### 選手データの一覧(設問3・4の入力データ)
次の55件の選手データのインスタンスを、この順序のまま並んだ一覧として用意してください(同じ内容のファイル `file/BestElevenCandidate.csv` を用意しているので、外部データとして読み込んで組み立てる形でも、プログラム内に直接用意する形でも構いません)。
```
GK,クラウディオ・ブラボ,チリ,マンチェスター・C
GK,ジャンルイジ・ブッフォン,イタリア,ユヴェントス
GK,ダビド・デ・ヘア,スペイン,マンチェスター・U
GK,ケイロル・ナバス,コスタリカ,レアル・マドリード
GK,マヌエル・ノイアー,ドイツ,バイエルン
DF,ダヴィド・アラバ,オーストリア,バイエルン
DF,ジョルディ・アルバ ,スペイン,バルセロナ
DF,セルジュ・オーリエ,コートジボワール,パリ・サンジェルマン
DF,エクトル・ベジェリン,スペイン,アーセナル
DF,ジェローム・ボアテング,ドイツ,バイエルン
DF,レオナルド・ボヌッチ,イタリア,ユヴェントス
DF,ダニエル・カルバハル,スペイン,レアル・マドリード
DF,ジョルジョ・キエッリーニ,イタリア,ユヴェントス
DF,ダニエウ・アウヴェス,ブラジル,ユヴェントス
DF,ダヴィド・ルイス,ブラジル,チェルシー
DF,ディエゴ・ゴディン,ウルグアイ,アトレティコ・マドリード
DF,マッツ・フンメルス,ドイツ,バイエルン
DF,フィリップ・ラーム,ドイツ,バイエルン
DF,マルセロ,ブラジル,レアル・マドリード
DF,ハビエル・マスチェラーノ,アルゼンチン,バルセロナ
DF,ペペ,ポルトガル,レアル・マドリード
DF,ジェラール・ピケ,スペイン,バルセロナ
DF,セルヒオ・ラモス,スペイン,レアル・マドリード
DF,チアゴ・シウヴァ,ブラジル,パリ・サンジェルマン
DF,ラファエル・ヴァラン,フランス,レアル・マドリード
MF,シャビ・アロンソ,スペイン,バイエルン
MF,セルヒオ・ブスケツ,スペイン,バルセロナ
MF,ケヴィン・デ・ブライネ,ベルギー,マンチェスター・C
MF,エデン・アザール,ベルギー,チェルシー
MF,アンドレス・イニエスタ,スペイン,バルセロナ
MF,エンゴロ・カンテ,フランス,チェルシー
MF,トニ・クロース,ドイツ,レアル・マドリード
MF,ルカ・モドリッチ,クロアチア,レアル・マドリード
MF,メスト・エジル,ドイツ,アーセナル
MF,ディミトリ・パイェ,フランス,ウェストハム
MF,ポール・ポグバ,フランス,マンチェスター・U
MF,イヴァン・ラキティッチ,クロアチア,バルセロナ
MF,ダビド・シルバ,スペイン,マンチェスター・C
MF,マルコ・ヴェラッティ,イタリア,パリ・サンジェルマン
MF,アルトゥーロ・ビダル,チリ,バイエルン
FW,セルヒオ・アグエロ,アルゼンチン,マンチェスター・C
FW,ギャレス・ベイル,ウェールズ,レアル・マドリード
FW,カリム・ベンゼマ,フランス,レアル・マドリード
FW,クリスティアーノ・ロナウド,ポルトガル,レアル・マドリード
FW,パウロ・ディバラ,アルゼンチン,ユヴェントス
FW,アントワーヌ・グリーズマン,フランス,アトレティコ・マドリード
FW,ゴンサロ・イグアイン,アルゼンチン,ユヴェントス
FW,ズラタン・イブラヒモヴィッチ,スウェーデン,マンチェスター・U
FW,ロベルト・レヴァンドフスキ,ポーランド,バイエルン
FW,リオネル・メッシ,アルゼンチン,バルセロナ
FW,トーマス・ミュラー,ドイツ,バイエルン
FW,ネイマール,ブラジル,バルセロナ
FW,アレクシス・サンチェス,チリ,アーセナル
FW,ルイス・スアレス,ウルグアイ,バルセロナ
FW,ジェイミー・ヴァーディ,イングランド,レスター
```
---
## 設問1
文字列を格納できる一覧を用意し、変数名は `animals` としてください。
`animals` に次の4つの文字列を、この順序で追加してください。
- いぬ
- ねこ
- うさぎ
- たぬき
`animals` に格納されているすべての要素を、追加した順序のまま、1件ずつ出力してください。
- 出力(4行、追加順):
```
いぬ
ねこ
うさぎ
たぬき
```
---
## 設問2
共通データ定義「選手データ」を格納できる一覧を用意し、変数名は `playerList` としてください。
次の3件の選手データのインスタンスを、この順序で作成し、`playerList` に追加してください。
1人目
- ポジション: MF
- 名前: 佐川真司
- 国: 日本
- 所属チーム: ドルトムント
2人目
- ポジション: DF
- 名前: 永元佑都
- 国: 日本
- 所属チーム: インテル
3人目
- ポジション: MF
- 名前: 本田健佑
- 国: 日本
- 所属チーム: ACミラン
`playerList` に格納されているすべての選手データを、追加した順序のまま、共通データ定義の文字列表現で1件ずつ出力してください。
- 出力(3行):
```
MF,佐川真司,日本,ドルトムント
DF,永元佑都,日本,インテル
MF,本田健佑,日本,ACミラン
```
---
## 設問3
※この設問を解く前に、共通データ定義「選手データ」および「選手データの一覧」をよく確認してください。
「選手データの一覧」を取得してください。
取得した一覧の中から、ポジションが `FW` の選手データのみを、元の順序を保ったまま、共通データ定義の文字列表現で出力してください。
- 出力(15件、元データの並び順のまま):
```
FW,セルヒオ・アグエロ,アルゼンチン,マンチェスター・C
FW,ギャレス・ベイル,ウェールズ,レアル・マドリード
FW,カリム・ベンゼマ,フランス,レアル・マドリード
FW,クリスティアーノ・ロナウド,ポルトガル,レアル・マドリード
FW,パウロ・ディバラ,アルゼンチン,ユヴェントス
FW,アントワーヌ・グリーズマン,フランス,アトレティコ・マドリード
FW,ゴンサロ・イグアイン,アルゼンチン,ユヴェントス
FW,ズラタン・イブラヒモヴィッチ,スウェーデン,マンチェスター・U
FW,ロベルト・レヴァンドフスキ,ポーランド,バイエルン
FW,リオネル・メッシ,アルゼンチン,バルセロナ
FW,トーマス・ミュラー,ドイツ,バイエルン
FW,ネイマール,ブラジル,バルセロナ
FW,アレクシス・サンチェス,チリ,アーセナル
FW,ルイス・スアレス,ウルグアイ,バルセロナ
FW,ジェイミー・ヴァーディ,イングランド,レスター
```
---
## 設問4
「選手データの一覧」を取得してください。
取得した一覧から、所属チームが「レアル・マドリード」または「バルセロナ」である選手データを取り除いてください。
残った選手データを、元の順序を保ったまま、共通データ定義の文字列表現ですべて出力してください。
- 期待される結果: 55件の選手データのうち、所属チームがレアル・マドリードの11件とバルセロナの9件(合計20件)が除外され、残り35件が元データの並び順のまま出力される
- 出力(35件、元データの並び順のまま):
```
GK,クラウディオ・ブラボ,チリ,マンチェスター・C
GK,ジャンルイジ・ブッフォン,イタリア,ユヴェントス
GK,ダビド・デ・ヘア,スペイン,マンチェスター・U
GK,マヌエル・ノイアー,ドイツ,バイエルン
DF,ダヴィド・アラバ,オーストリア,バイエルン
DF,セルジュ・オーリエ,コートジボワール,パリ・サンジェルマン
DF,エクトル・ベジェリン,スペイン,アーセナル
DF,ジェローム・ボアテング,ドイツ,バイエルン
DF,レオナルド・ボヌッチ,イタリア,ユヴェントス
DF,ジョルジョ・キエッリーニ,イタリア,ユヴェントス
DF,ダニエウ・アウヴェス,ブラジル,ユヴェントス
DF,ダヴィド・ルイス,ブラジル,チェルシー
DF,ディエゴ・ゴディン,ウルグアイ,アトレティコ・マドリード
DF,マッツ・フンメルス,ドイツ,バイエルン
DF,フィリップ・ラーム,ドイツ,バイエルン
DF,チアゴ・シウヴァ,ブラジル,パリ・サンジェルマン
MF,シャビ・アロンソ,スペイン,バイエルン
MF,ケヴィン・デ・ブライネ,ベルギー,マンチェスター・C
MF,エデン・アザール,ベルギー,チェルシー
MF,エンゴロ・カンテ,フランス,チェルシー
MF,メスト・エジル,ドイツ,アーセナル
MF,ディミトリ・パイェ,フランス,ウェストハム
MF,ポール・ポグバ,フランス,マンチェスター・U
MF,ダビド・シルバ,スペイン,マンチェスター・C
MF,マルコ・ヴェラッティ,イタリア,パリ・サンジェルマン
MF,アルトゥーロ・ビダル,チリ,バイエルン
FW,セルヒオ・アグエロ,アルゼンチン,マンチェスター・C
FW,パウロ・ディバラ,アルゼンチン,ユヴェントス
FW,アントワーヌ・グリーズマン,フランス,アトレティコ・マドリード
FW,ゴンサロ・イグアイン,アルゼンチン,ユヴェントス
FW,ズラタン・イブラヒモヴィッチ,スウェーデン,マンチェスター・U
FW,ロベルト・レヴァンドフスキ,ポーランド,バイエルン
FW,トーマス・ミュラー,ドイツ,バイエルン
FW,アレクシス・サンチェス,チリ,アーセナル
FW,ジェイミー・ヴァーディ,イングランド,レスター
```
- 出力内容は「選手データの一覧」とこの除外条件から一意に定まります(上記の共通データ定義のデータをもとに、除外後の一覧を組み立ててください)
---
## 設問5
共通データ定義: 料理データ(この設問のみで使用)
次の2つのフィールドを持つデータを表せるようにしてください。
- 名前(文字列)
- 値段(整数、単位は円)
料理データの一覧として、次の8件のインスタンスを用意してください(同じ内容のファイル `file/FoodMenu.csv` を用意しているので、外部データとして読み込んで組み立てる形でも、プログラム内に直接用意する形でも構いません)。
```
オムライス,500
焼きそば,450
ハンバーグ,600
ステーキ,800
ナポリタン,600
ミラノ風ドリア,299
フライドチキン,300
カレー,600
```
料理データの一覧を取得し、その中からランダムに3件を選んでください。
- 選んだ3件の料理名を出力してください
- 選んだ3件の値段の合計に対して消費税8%を加算した金額を出力してください(小数点以下は切り捨てて、整数の金額として出力すること)
- 期待される結果の形式(選ばれる料理はランダムなので値は一例):
```
ハンバーグ
カレー
ナポリタン
1944
```
- 補足:
- 同じ料理を2回以上選んではいけません(重複なく3件を選ぶこと)
- 税込み合計金額は「選んだ3件の値段の合計 × 1.08」の小数点以下を切り捨てた整数値とすること

View File

@@ -0,0 +1,86 @@
# Question19 - 一覧に対する絞り込み・変換・並び替え
本資料の練習問題は、複数のプログラミング言語(Java / C# / PHP / Python)で共通して利用できるよう記述されています。静的型付け・動的型付けの違いや文字列の連結ルールなど、言語固有の文法仕様に基づき、問題文の表現をご使用の言語の仕様に適宜読み替えて進めてください。
## この問題のねらい
- 一覧(配列・リストなど)から、条件に合う要素だけを絞り込めること
- 絞り込んだ要素それぞれに、変換(加工)を適用できること
- 一覧の要素を、ある基準(値の大小など)で並び替えられること
- 「繰り返し処理を自分で書いて1件ずつ判定する」のではなく、「絞り込む」「変換する」「並び替える」という操作そのものを一続きの処理として組み立てられること(言語によっては、絞り込み・変換・並び替えのための専用の仕組みが用意されている場合があるので、使える場合はそれを使ってよい)
## 各言語での実現方法について(参考)
この問題は、絞り込み・変換・並び替えを自分で繰り返し処理を書いて実装するのではなく、各言語に用意されている専用の仕組みを使って実装することを想定しています。使用する言語に応じて、次のような仕組みの利用を検討してください。
- **Java**: Stream API(`stream()` / `filter()` / `map()` / `sorted()` / `collect()` など)
- **C#**: LINQ(`Where` / `Select` / `OrderBy` / `OrderByDescending` など)
- **PHP**: 標準の配列関数(`array_filter()` / `array_map()` / `usort()` など)。Laravelのコレクション(`collect()` とその `filter()` / `map()` / `sortByDesc()` など)が利用できる環境であれば、それを使ってもよい
- **Python**: リスト内包表記(`[... for ... in ... if ...]`)や、組み込みの `sorted()` 関数(`key` 引数・`reverse` 引数)、`filter()` / `map()` 関数
上記の仕組みが用意されていない、または使用が難しい場合は、通常の繰り返し処理で同等の結果が得られる方法で代用して構いません。
以下の設問はそれぞれ独立したプログラムとして実装してください。
---
## 設問1
次の文字列の一覧を用意してください。
- `Apple`, `Banana`, `Grape`, `Orange`, `Apricot`
この一覧から、**文字数がちょうど5文字**の要素だけを抜き出し、抜き出した要素をすべて出力してください。
### 期待される結果
- 抜き出される要素:`Apple`、`Grape`(この2件)
- 出力順は元の一覧の並び順のままでよい
---
## 設問2
次の整数の一覧を用意してください。
- `5, 12, 8, 20, 3, 15, 1, 11`
この一覧から、**10より小さい値**だけを抜き出し、抜き出した値をそれぞれ**2倍**したうえで、すべて出力してください。
### 期待される結果
- 元の並び順のまま、次の4件が出力されること:
```
10
16
6
2
```
---
## 設問3
「商品」を表すデータを用意してください。商品は「名前」と「値段」を持ちます。次の5件のインスタンスを用意してください。
| 名前 | 値段 |
|---|---|
| ぶどう | 500 |
| りんご | 200 |
| みかん | 150 |
| メロン | 800 |
| いちご | 600 |
この一覧から、**値段が500以上**の商品だけを抜き出し、**値段が高い順に並び替えて**、次の形式で1件ずつ出力してください。
- 出力形式:`果物:xx 値段:yy`(xxは商品名、yyは値段)
### 期待される結果
次の3件が、この順序で出力されること:
```
果物:メロン 値段:800
果物:いちご 値段:600
果物:ぶどう 値段:500
```

View File

@@ -0,0 +1,106 @@
# Question20 - インスタンスの基本操作
本資料の練習問題は、複数のプログラミング言語(Java / C# / PHP / Python)で共通して利用できるよう記述されています。静的型付け・動的型付けの違いや文字列の連結ルールなど、言語固有の文法仕様に基づき、問題文の表現をご使用の言語の仕様に適宜読み替えて進めてください。
## この問題のねらい
- 変数が保持する値どうしを比較するとき、見た目上の作られ方(新しく作られたものか、既存の値への参照か)に関わらず、「内容が等しいかどうか」を正しく判定できること
- 独自に定義したデータについて、どのような基準を満たせば「等しい」とみなすか(フィールドの値がすべて一致するか等)を、自分で定義できること
- 既存のインスタンスをもとに、独立した複製(コピー)を作成できること。その際、複製先が元のインスタンスとは別の実体になること、および内部に保持している別のデータについても複製の対象に含める必要があること(参照をそのまま使い回すだけでは、本当の意味での複製にはならないこと)を理解していること
以下の設問はそれぞれ独立したプログラムとして実装してください。設問2は共通データ定義「利用者データ」を、設問3は共通データ定義「犬データ」「おもちゃデータ」を使用します。
---
## 設問1
次の3つの変数を用意してください。
- `str`: 文字列 `"Hello"` を保持する変数
- `str2`: `str` とは別に、新たに作成した文字列 `"Hello"` を保持する変数(`str` の値をそのままコピーして使うのではなく、`str` とは独立に、あらためて `"Hello"` という内容の値を作成すること)
- `str3`: `str2` と同じ値を指す変数(`str3` に `str2` を代入する)
次の3組について、それぞれの内容が等しいかどうかを判定し、結果を出力してください。いずれも `true` と表示されることが期待されます。
1. `str` と `str2`
2. `str2` と `str3`
3. `str` と `str3`
- 出力(3行):
```
true
true
true
```
- 補足: 見た目上は同じ内容の値であっても、変数がどのように作られたか(新しく作られたものか、既存の値をそのまま参照しているものか)によっては、実体そのものが同一かどうかを判定する方法では異なる結果になる場合があります。ここでは常に「内容が等しいかどうか」で比較してください。
---
## 共通データ定義: 利用者データ(設問2で使用)
次の3つのフィールドを持つデータを表せるようにしてください(いずれも完全非公開にし、取得・設定用の手段(アクセサ)を用意すること)。
- 名前(文字列)
- メールアドレス(文字列)
- パスワード(文字列)
コンストラクタ(初期化の手段)で、上記3つのフィールドすべてを初期化できるようにしてください。
## 設問2
共通データ定義「利用者データ」のインスタンスを、次の同じ内容で2つ作成してください。
- 名前: 田中太郎
- メールアドレス: tanaka@hoge.com
- パスワード: password01
2つの利用者データのインスタンスを、内容が等しいかどうかで比較すると `true` と表示されるように、「利用者データ」の定義に手を加えてください。
- 具体的には、名前・メールアドレス・パスワードの3つのフィールドの値がすべて一致する場合に、2つの利用者データのインスタンスを「等しい」と判定する仕組みを、利用者データの定義自体に組み込んでください(既定の等価性判定が実体の同一性のみで比較するものである場合、それを上書き・変更する必要があります)
- 出力(1行):
```
true
```
---
## 共通データ定義: 犬データ・おもちゃデータ(設問3で使用)
「おもちゃデータ」として、次のフィールドを持つデータを表せるようにしてください(完全非公開にすること)。
- おもちゃの一覧(文字列の一覧)
コンストラクタで、おもちゃの一覧を初期化できるようにしてください。取得・設定用の手段(アクセサ)も用意してください。
「犬データ」として、次のフィールドを持つデータを表せるようにしてください(いずれも完全非公開にすること)。
- 名前(文字列)
- 年齢(整数)
- おもちゃデータ(1つ)
コンストラクタで、上記3つのフィールドすべてを初期化できるようにしてください。取得・設定用の手段(アクセサ)も用意してください。
## 設問3
「犬データ」のインスタンスを1件、次の内容で用意してください。
- 名前: 太郎
- 年齢: 10
- おもちゃデータ: おもちゃの一覧として「ボール」「フリスビー」「骨」を持つもの
用意したインスタンス(変数 `dog` とする)をもとに、独立した複製を作成する機能を「犬データ」の定義に用意し、それを使って複製(変数 `dog1` とする)を作成してください。
1. `dog` と `dog1` が、実体として同一かどうかを比較すると、`false`(別の実体である)と判定されるようにしてください
2. `dog` が持つ「おもちゃデータ」のインスタンスと、`dog1` が持つ「おもちゃデータ」のインスタンスについても、実体として同一かどうかを比較すると、`false`(別の実体である)と判定されるようにしてください。そのためには、犬データのインスタンスを複製する際に、内部に保持しているおもちゃデータのインスタンスも合わせて複製の対象に含める必要があります(おもちゃデータのインスタンスへの参照をそのままコピーするだけでは、元の犬データのインスタンスと複製後の犬データのインスタンスが同じおもちゃデータのインスタンスを共有してしまい、この判定が `true` になってしまいます)
- 出力(2行):
```
false
false
```
- 補足: 使用する言語に、既存のインスタンスから複製を作成する標準的な仕組み(Javaでいう `Object` クラスの複製機能に相当するもの)があれば、それを使ってください。無ければ、フィールドの値を1つずつ新しいインスタンスにコピーするなど、同等の効果が得られる方法で代用してよい。

View File

@@ -0,0 +1,171 @@
# Question21 - 異なる型に対応するクラス
本資料の練習問題は、複数のプログラミング言語(Java / C# / PHP / Python)で共通して利用できるよう記述されています。静的型付け・動的型付けの違いや文字列の連結ルールなど、言語固有の文法仕様に基づき、問題文の表現をご使用の言語の仕様に適宜読み替えて進めてください。
## この問題のねらい
- 保持するデータの型を1つに固定せず、複数の異なるデータ型に対応できる、汎用的なデータ定義(あるいはそれに相当する仕組み)を扱えること
- 決まった選択肢(種類)の集合として値を表現し、それぞれの選択肢に複数の付随データを持たせられること(列挙型に相当する仕組み)
- 決まった選択肢の一覧全体を順に処理しながら、選択肢ごとに異なる処理を行う分岐を組み合わせて実装できること
- 値が「存在しない」場合を安全に扱う仕組みを用いて、実行時エラーを起こさない入力チェック処理を実装できること
## 各言語での実現方法について(参考)
- **設問1(持ち金の型を1つに固定しない、汎用的なデータ定義)について**
- Java / C#: ジェネリクス(`class User<T>` のような仕組み)
- PHP: ジェネリクスに相当する仕組みはないため、財布データに共通の振る舞い(文字列表現を返す処理など)を持つインターフェースを定義し、「持ち金」はそのインターフェース型(または型指定なし)として受け取る
- Python: 動的型付けのため型を固定する必要はなく、財布データ側に共通の振る舞い(メソッド)さえ用意しておけば、型宣言なしでそのまま渡せる(ダックタイピング)
- **設問2・3(列挙型+付随データ)について**
- Java: コンストラクタ・フィールドを持つ `enum`
- C#: `enum` 自体には各選択肢にフィールドを持たせられないため、選択肢ごとに public static な読み取り専用インスタンスを持つクラス(Enumerationパターン)を自作するか、素の `enum` と付随データを紐づける辞書(Dictionary)を組み合わせる
- PHP: PHP 8.1以降のネイティブ `enum` に `match($this)` を使ったメソッドを定義し、各ケースに応じた付随データを返す(8.1より前のバージョンではクラス定数+付随データを引く静的な連想配列で代用する)
- Python: 標準の `enum` モジュールで、各メンバーの値をタプルにしておき、`__init__` でそのタプルを受け取ってインスタンス属性に展開する
上記が使用できない、または対象言語の標準的な流儀と異なる場合は、同等の効果が得られる他の方法で代用して構いません。
以下の設問はそれぞれ独立したプログラムとして実装してください。ただし、設問3は設問2で定義する「土地の種類」を使用します。
---
## 設問1
次のデータ定義を作成してください。
### 日本円財布データ
次の3つのフィールド(すべて整数)を持つデータを表せるようにしてください(いずれも完全非公開にすること)。
- 一万円札の枚数
- 五千円札の枚数
- 千円札の枚数
コンストラクタで上記3つのフィールドすべてを初期化できるようにし、取得・設定用の手段(アクセサ)も用意してください。
このデータを1つの文字列として表現する場合は、次の形式にしてください(`\t` はタブ区切りを表します)。
```
1万円:{一万円札の枚数}枚\t5千円:{五千円札の枚数}枚\t1千円:{千円札の枚数}枚
```
### 米ドル財布データ
次の6つのフィールド(すべて整数)を持つデータを表せるようにしてください(いずれも完全非公開にすること)。
- 100ドル札の枚数
- 50ドル札の枚数
- 20ドル札の枚数
- 10ドル札の枚数
- 5ドル札の枚数
- 1ドル札の枚数
コンストラクタで上記6つのフィールドすべてを初期化できるようにし、取得・設定用の手段(アクセサ)も用意してください。
このデータを1つの文字列として表現する場合は、次の形式にしてください(`\t` はタブ区切りを表します)。
```
$100:{100ドル札の枚数}枚\t$50:{50ドル札の枚数}枚\t$20:{20ドル札の枚数}枚\t$10:{10ドル札の枚数}枚\t$5:{5ドル札の枚数}枚\t$1:{1ドル札の枚数}枚
```
### 利用者データ
次の3つのフィールドを持つデータを表せるようにしてください(いずれも完全非公開にし、取得・設定用の手段(アクセサ)を用意すること)。
- 名前(文字列)
- 年齢(整数)
- 持ち金(財布データ。ただし型を1つに固定せず、日本円財布データ・米ドル財布データなど、複数の異なる財布データ型に対応できるようにすること)
コンストラクタで、上記3つのフィールドすべてを初期化できるようにしてください。
このデータを1つの文字列として表現する場合は、次の形式にしてください(`\t` はタブ区切りを表します。「持ち金の文字列表現」には、持ち金として渡された財布データ自身の文字列表現を使うこと)。
```
名前:{名前}\t年齢:{年齢}\t持ち金:{持ち金の文字列表現}
```
- 補足: 「利用者データ」は、持ち金の型を後から指定できる、汎用的なデータ定義として作成してください。使用する言語にこのような汎用的な型定義の仕組みがない場合は、財布データに共通の振る舞い(文字列表現を返す、など)を定義しておき、利用者データはその共通の振る舞いを持つものであれば何でも受け取れるようにするなど、同等の効果が得られる方法で代用してよい。
### main処理
1. 任意の枚数を設定した「日本円財布データ」のインスタンスを1つ作成してください
2. 手順1の日本円財布データのインスタンスを持ち金として持つ「利用者データ」のインスタンスを1つ作成してください(名前・年齢は自由に設定してよい)
3. 任意の枚数を設定した「米ドル財布データ」のインスタンスを1つ作成してください
4. 手順3の米ドル財布データのインスタンスを持ち金として持つ「利用者データ」のインスタンスを1つ作成してください(名前・年齢は自由に設定してよい)
5. 手順2と手順4で作成した、2件の利用者データのインスタンスの情報を、それぞれ文字列表現で出力してください
- 出力形式(値は自由に設定してよいため一例):
```
名前:田中太郎 年齢:25 持ち金:1万円:3枚 5千円:2枚 1千円:5枚
名前:鈴木一郎 年齢:30 持ち金:$100:1枚 $50:2枚 $20:3枚 $10:0枚 $5:1枚 $1:4枚
```
---
## 設問2
「土地の種類」として、次の5つの選択肢からなる、決まった値の集合を定義してください(列挙型に相当する仕組み。使用する言語に列挙型が無い場合は、決まった値の集合を表す定数群と、各値に対応する付随データを紐付ける仕組みなど、同等の効果が得られる方法で代用してよい)。
各選択肢には、次の3つの付随データ(いずれも文字列)を持たせてください。
| 選択肢 | 英語表記(大文字) | 英語表記(小文字) | 日本語表記 |
|---|---|---|---|
| 平野 | PLANE | plane | 平野 |
| 山 | MOUNTAIN | mountain | 山 |
| 海 | SEA | sea | 海 |
| 沼 | SWAMP | swamp | 沼 |
| 森 | FOREST | forest | 森 |
それぞれの付随データ(英語表記(大文字)・英語表記(小文字)・日本語表記)を取得する手段を用意してください。
---
## 設問3
※この設問を解く前に、設問2で定義した「土地の種類」をよく確認してください。
「土地の種類」の5つの選択肢すべてを、次の順序で並んだ一覧として扱ってください。
1. 平野
2. 山
3. 海
4. 沼
5. 森
この一覧を先頭から順に処理し、選択肢ごとに次の規則に従って1つの表記を選び、1件ずつ出力してください。
| 選択肢 | 出力する表記 |
|---|---|
| 平野 | 英語表記(大文字) |
| 山 | 英語表記(小文字) |
| 海 | 日本語表記 |
| 沼 | 英語表記(小文字) |
| 森 | 日本語表記 |
- 出力(5行):
```
PLANE
mountain
海
swamp
森
```
---
## 設問4
標準入力から1行分のテキストを受け取り、投稿として受け付けるプログラムを作成してください。プログラムは次の仕様のとおりに動作する必要があります。
1. 次の処理を、有効な入力が得られるまで繰り返してください。
1. メッセージ「いまなにしてる?」を表示する
2. 標準入力から1行分のテキストを読み込む
3. 読み込んだテキストの前後にある空白文字(半角スペース・全角スペースなどを含む)をすべて取り除く
4. 取り除いた後のテキストの長さが0(=何も入力されていない、または空白文字だけが入力された)の場合、メッセージ「何も入力されていません」を表示し、手順1に戻る
5. 取り除いた後のテキストの長さが140文字を超える場合、メッセージ「投稿文が長すぎます」を表示し、手順1に戻る
6. 上記のいずれにも当てはまらない場合、そのテキストを最終的な入力内容として繰り返し処理を終了する
2. 繰り返し処理の終了後、空行を1行出力し、続けてメッセージ「↓↓↓↓↓↓ 投稿されました ↓↓↓↓↓↓」を出力し、最後に手順1で確定した入力内容をそのまま出力する
- 期待される結果: 空文字、半角スペースのみ、全角スペースのみ、および140文字を超える文字列を入力しても、プログラムが実行時エラーで終了することなく、案内メッセージを表示して再度入力を促す動作を続けること
- 補足: 「入力が空かどうか」「文字数が上限を超えているかどうか」の判定結果を、値が存在しない状態(null等)を経由して他の処理に渡す実装にすると、判定結果を使う側で意図しない実行時エラーが発生することがあります。値の有無を安全に表現できる仕組み(Optionalに相当する仕組み)を使う、または値の有無を明示的に判定してから使うなど、そのようなエラーが起きない実装にしてください。

View File

@@ -0,0 +1,55 @@
GK,クラウディオ・ブラボ,チリ,マンチェスター・C
GK,ジャンルイジ・ブッフォン,イタリア,ユヴェントス
GK,ダビド・デ・ヘア,スペイン,マンチェスター・U
GK,ケイロル・ナバス,コスタリカ,レアル・マドリード
GK,マヌエル・ノイアー,ドイツ,バイエルン
DF,ダヴィド・アラバ,オーストリア,バイエルン
DF,ジョルディ・アルバ ,スペイン,バルセロナ
DF,セルジュ・オーリエ,コートジボワール,パリ・サンジェルマン
DF,エクトル・ベジェリン,スペイン,アーセナル
DF,ジェローム・ボアテング,ドイツ,バイエルン
DF,レオナルド・ボヌッチ,イタリア,ユヴェントス
DF,ダニエル・カルバハル,スペイン,レアル・マドリード
DF,ジョルジョ・キエッリーニ,イタリア,ユヴェントス
DF,ダニエウ・アウヴェス,ブラジル,ユヴェントス
DF,ダヴィド・ルイス,ブラジル,チェルシー
DF,ディエゴ・ゴディン,ウルグアイ,アトレティコ・マドリード
DF,マッツ・フンメルス,ドイツ,バイエルン
DF,フィリップ・ラーム,ドイツ,バイエルン
DF,マルセロ,ブラジル,レアル・マドリード
DF,ハビエル・マスチェラーノ,アルゼンチン,バルセロナ
DF,ペペ,ポルトガル,レアル・マドリード
DF,ジェラール・ピケ,スペイン,バルセロナ
DF,セルヒオ・ラモス,スペイン,レアル・マドリード
DF,チアゴ・シウヴァ,ブラジル,パリ・サンジェルマン
DF,ラファエル・ヴァラン,フランス,レアル・マドリード
MF,シャビ・アロンソ,スペイン,バイエルン
MF,セルヒオ・ブスケツ,スペイン,バルセロナ
MF,ケヴィン・デ・ブライネ,ベルギー,マンチェスター・C
MF,エデン・アザール,ベルギー,チェルシー
MF,アンドレス・イニエスタ,スペイン,バルセロナ
MF,エンゴロ・カンテ,フランス,チェルシー
MF,トニ・クロース,ドイツ,レアル・マドリード
MF,ルカ・モドリッチ,クロアチア,レアル・マドリード
MF,メスト・エジル,ドイツ,アーセナル
MF,ディミトリ・パイェ,フランス,ウェストハム
MF,ポール・ポグバ,フランス,マンチェスター・U
MF,イヴァン・ラキティッチ,クロアチア,バルセロナ
MF,ダビド・シルバ,スペイン,マンチェスター・C
MF,マルコ・ヴェラッティ,イタリア,パリ・サンジェルマン
MF,アルトゥーロ・ビダル,チリ,バイエルン
FW,セルヒオ・アグエロ,アルゼンチン,マンチェスター・C
FW,ギャレス・ベイル,ウェールズ,レアル・マドリード
FW,カリム・ベンゼマ,フランス,レアル・マドリード
FW,クリスティアーノ・ロナウド,ポルトガル,レアル・マドリード
FW,パウロ・ディバラ,アルゼンチン,ユヴェントス
FW,アントワーヌ・グリーズマン,フランス,アトレティコ・マドリード
FW,ゴンサロ・イグアイン,アルゼンチン,ユヴェントス
FW,ズラタン・イブラヒモヴィッチ,スウェーデン,マンチェスター・U
FW,ロベルト・レヴァンドフスキ,ポーランド,バイエルン
FW,リオネル・メッシ,アルゼンチン,バルセロナ
FW,トーマス・ミュラー,ドイツ,バイエルン
FW,ネイマール,ブラジル,バルセロナ
FW,アレクシス・サンチェス,チリ,アーセナル
FW,ルイス・スアレス,ウルグアイ,バルセロナ
FW,ジェイミー・ヴァーディ,イングランド,レスター
1 GK クラウディオ・ブラボ チリ マンチェスター・C
2 GK ジャンルイジ・ブッフォン イタリア ユヴェントス
3 GK ダビド・デ・ヘア スペイン マンチェスター・U
4 GK ケイロル・ナバス コスタリカ レアル・マドリード
5 GK マヌエル・ノイアー ドイツ バイエルン
6 DF ダヴィド・アラバ オーストリア バイエルン
7 DF ジョルディ・アルバ スペイン バルセロナ
8 DF セルジュ・オーリエ コートジボワール パリ・サンジェルマン
9 DF エクトル・ベジェリン スペイン アーセナル
10 DF ジェローム・ボアテング ドイツ バイエルン
11 DF レオナルド・ボヌッチ イタリア ユヴェントス
12 DF ダニエル・カルバハル スペイン レアル・マドリード
13 DF ジョルジョ・キエッリーニ イタリア ユヴェントス
14 DF ダニエウ・アウヴェス ブラジル ユヴェントス
15 DF ダヴィド・ルイス ブラジル チェルシー
16 DF ディエゴ・ゴディン ウルグアイ アトレティコ・マドリード
17 DF マッツ・フンメルス ドイツ バイエルン
18 DF フィリップ・ラーム ドイツ バイエルン
19 DF マルセロ ブラジル レアル・マドリード
20 DF ハビエル・マスチェラーノ アルゼンチン バルセロナ
21 DF ペペ ポルトガル レアル・マドリード
22 DF ジェラール・ピケ スペイン バルセロナ
23 DF セルヒオ・ラモス スペイン レアル・マドリード
24 DF チアゴ・シウヴァ ブラジル パリ・サンジェルマン
25 DF ラファエル・ヴァラン フランス レアル・マドリード
26 MF シャビ・アロンソ スペイン バイエルン
27 MF セルヒオ・ブスケツ スペイン バルセロナ
28 MF ケヴィン・デ・ブライネ ベルギー マンチェスター・C
29 MF エデン・アザール ベルギー チェルシー
30 MF アンドレス・イニエスタ スペイン バルセロナ
31 MF エンゴロ・カンテ フランス チェルシー
32 MF トニ・クロース ドイツ レアル・マドリード
33 MF ルカ・モドリッチ クロアチア レアル・マドリード
34 MF メスト・エジル ドイツ アーセナル
35 MF ディミトリ・パイェ フランス ウェストハム
36 MF ポール・ポグバ フランス マンチェスター・U
37 MF イヴァン・ラキティッチ クロアチア バルセロナ
38 MF ダビド・シルバ スペイン マンチェスター・C
39 MF マルコ・ヴェラッティ イタリア パリ・サンジェルマン
40 MF アルトゥーロ・ビダル チリ バイエルン
41 FW セルヒオ・アグエロ アルゼンチン マンチェスター・C
42 FW ギャレス・ベイル ウェールズ レアル・マドリード
43 FW カリム・ベンゼマ フランス レアル・マドリード
44 FW クリスティアーノ・ロナウド ポルトガル レアル・マドリード
45 FW パウロ・ディバラ アルゼンチン ユヴェントス
46 FW アントワーヌ・グリーズマン フランス アトレティコ・マドリード
47 FW ゴンサロ・イグアイン アルゼンチン ユヴェントス
48 FW ズラタン・イブラヒモヴィッチ スウェーデン マンチェスター・U
49 FW ロベルト・レヴァンドフスキ ポーランド バイエルン
50 FW リオネル・メッシ アルゼンチン バルセロナ
51 FW トーマス・ミュラー ドイツ バイエルン
52 FW ネイマール ブラジル バルセロナ
53 FW アレクシス・サンチェス チリ アーセナル
54 FW ルイス・スアレス ウルグアイ バルセロナ
55 FW ジェイミー・ヴァーディ イングランド レスター

View File

@@ -0,0 +1,8 @@
オムライス,500
焼きそば,450
ハンバーグ,600
ステーキ,800
ナポリタン,600
ミラノ風ドリア,299
フライドチキン,300
カレー,600
1 オムライス 500
2 焼きそば 450
3 ハンバーグ 600
4 ステーキ 800
5 ナポリタン 600
6 ミラノ風ドリア 299
7 フライドチキン 300
8 カレー 600

View File

@@ -0,0 +1,227 @@
# Question22 - 処理そのものを値として扱う
本資料の練習問題は、複数のプログラミング言語(Java / C# / PHP / Python)で共通して利用できるよう記述されています。静的型付け・動的型付けの違いや文字列の連結ルールなど、言語固有の文法仕様に基づき、問題文の表現をご使用の言語の仕様に適宜読み替えて進めてください。
## この問題のねらい
- 「一連の処理のかたまり」を、データと同じように変数に代入したり、変数を経由して呼び出したりできること
- 既に名前が付いている処理(既存のメソッド)を、その名前を通じてではなく、変数に代入した「値」として扱えること
- その場限りの、名前を持たない処理のかたまりをその場で定義し、変数に代入して使えること
- 引数の型を特定の1種類に固定せず、様々な種類のデータに対応できる、汎用的な「処理の型(受け取る値の数・型、戻り値の型の組み合わせ)」を定義できること(これは主に、処理を値として扱う際に変数の型を明示的に指定する必要がある言語で意味を持つ達成目標です。型を指定しなくても処理をそのまま値として扱える言語では、この項目を特に意識する必要はありません)
- 一覧(コレクション)に対して、条件による絞り込みなどの一括処理を行えること
以下の設問はそれぞれ独立したプログラムとして実装してください。
## 共通で使用するデータ定義
複数の設問で、以下のデータ定義・補助処理を共有します。各設問の実装言語に合わせて、同等の意味を持つ形で用意してください。
### Userデータ(設問1・設問4で使用)
利用者1件分の情報を保持するデータで、以下の項目を持ちます。
- 名前
- メールアドレス
- パスワード
保持している内容を、次の形式の1行の文字列に変換する処理を持ちます(項目の間はタブ区切り)。
```
名前:<名前> メールアドレス:<メールアドレス> パスワード:<パスワード>
```
### CarデータとDriverデータ(設問2で使用)
**Car(車)データ**は、以下の項目を持ちます。
- 色
- 残りのガソリン量(整数)
- 紐づく運転手データ(Driverデータへの参照)
Carデータは「走行処理」を持ちます。呼び出されるたびに次の動作を行います。
1. 残りのガソリン量を1減らす
2. 減らした結果が0未満になった場合、-1を返して終了する(それ以上走行できないことを表す)
3. 上記に該当しない場合、1〜15の範囲でランダムに決めた距離(整数)を返す
**Driver(運転手)データ**は、以下の項目を持ちます。
- 名前
- 免許番号(桁数の大きい整数を扱える型)
- 年齢
- 住所
Driverデータは、車の色を引数として受け取る「表示処理」を持ちます。呼び出されると、次の2行を画面に出力します(項目名と値の間は全角コロン、住所の項目名の後ろだけ区切り記号を入れない点に注意してください)。
```
<車の色>色の車に乗っています
名前:<名前> 免許番号:<免許番号> 年齢:<年齢> 住所<住所>
```
### 3つの値を合計する処理(設問3・設問5で使用)
3つの整数を受け取り、その合計(整数)を返す処理(`Calc.addition` に相当するもの)を作成してください。この処理は設問3・設問5で共通して使用し、内容は変更しないものとします。
### Player一覧の取得(設問6・設問7で使用)
サッカー選手1件分の情報を表す**Playerデータ**は、以下の項目を持ちます。
- ポジション
- 名前
- 国
- 所属チーム
保持している内容を、次の形式の1行の文字列に変換する処理を持ちます(各項目をカンマ区切りで連結)。
```
<ポジション>,<名前>,<国>,<所属チーム>
```
Player一覧を取得する補助処理(`PlayerUtill.getPlayerList` に相当)を作成してください。この処理は、以下の形式のファイル(`file/BestElevenCandidate.csv`)を1行ずつ読み込み、各行をカンマ区切りで分割して、ポジション・名前・国・所属チームの順にPlayerデータへ変換し、一覧(リスト)として返すものとします。ファイルが見つからない場合は「ファイルが見つかりません」と画面に表示し、空の一覧を返すものとします。
### Food一覧の取得(設問8で使用)
料理1件分の情報を表す**Foodデータ**は、以下の項目を持ちます。
- 料理名
- 値段(整数)
Food一覧を取得する補助処理(`FoodUtill.getFoodList` に相当)を作成してください。この処理は、以下の形式のファイル(`file/FoodMenu.csv`)を1行ずつ読み込み、各行をカンマ区切りで分割して、料理名・値段の順にFoodデータへ変換し、一覧(リスト)として返すものとします。ファイルが見つからない場合は「ファイルが見つかりません」と画面に表示し、空の一覧を返すものとします。
---
## 設問1
3件のUserデータのインスタンスを、この順番で用意してください。
| 名前 | メールアドレス | パスワード |
| --- | --- | --- |
| 田中太郎 | tanaka@hoge,.com | tanaka@0000 |
| 鈴木一郎 | suzuki@hoge,.com | suzuki@1111 |
| 山田二郎 | yamada@hoge,.com | yamada@2222 |
(メールアドレスの表記中に読点のようなカンマが含まれていますが、誤記ではなくそのままの値として扱ってください)
上記3件を保持する一覧を作成したうえで、次の処理を実装してください。
1. 「Userの一覧を受け取り、各Userを前述の文字列表現に変換した文字列の一覧(リスト)を作って返す」という、名前の付いた処理(`createUsersInfo` に相当するもの)をあらかじめ用意する
2. 用意したその処理を、直接名前で呼び出すのではなく、いったん変数に代入する(=処理そのものを値として変数に格納する)
3. その変数を経由して、手順1の処理を実行する(引数として、用意した3件のUser一覧を渡す)
4. 実行結果として得られた文字列の一覧を出力する
- 期待される実行結果: 3件分のUserの文字列表現(前述の形式)が、何らかの形で読み取れるように出力されること(1件ずつ出力しても、一覧としてまとめて出力してもよい)
---
## 設問2
3台のCarデータのインスタンスと、それぞれに対応するDriverデータのインスタンスを、以下の内容で用意してください。
| | 色 | ガソリン量 | 運転手名 | 免許番号 | 年齢 | 住所 |
| --- | --- | --- | --- | --- | --- | --- |
| 1台目 | 赤 | 50 | 田中太郎 | 123456789101 | 28 | 東京都中央区日本橋1-2-3 |
| 2台目 | 黄 | 60 | 佐藤二朗 | 109876543210 | 45 | 東京都豊島区北池袋1-2-3 |
| 3台目 | 青 | 70 | 鈴木三郎 | 101010101010 | 39 | 埼玉県さいたま市大宮区錦町1-2-3 |
目的地までの距離を300と定め、3台のCarを1台ずつ順番に処理してください。各Carについて、以下を実装してください。
1. そのCarの「走行処理」と、対応するDriverの「表示処理」を、それぞれいったん変数に代入する(=処理そのものを値として変数に格納する)
2. 「運転手の情報です。」と出力する
3. 手順1で変数に代入しておいた表示処理を、その変数経由で実行する(引数としてCarの色を渡す)
4. 進んだ距離の合計と、走行処理を実行した回数を、それぞれ0で初期化する(この初期化はCar1台ごとに行うこと)
5. 次の繰り返しを行う
1. 手順1で変数に代入しておいた走行処理を、その変数経由で実行し、戻り値を受け取る
2. 戻り値が-1であれば、「目的地に到達できませんでした」と出力し、この車についての繰り返しを終了する
3. 戻り値が-1でなければ、進んだ距離の合計に戻り値を加算し、実行回数を1増やす
4. 進んだ距離の合計が目的地までの距離(300)以上になっていれば、「目的地にまで<実行回数>時間かかりました。残りのガソリンは、<残りのガソリン量>リットルです」と出力し(末尾に空行を1行入れる)、この車についての繰り返しを終了する
5. 上記のいずれにも該当しなければ、5.のはじめに戻る
- 補足: 走行処理の結果はランダムに決まるため、実際に出力される走行回数・残りガソリン量は実行のたびに変わってよい。ただし上記の手順・条件どおりに処理されていること
- 補足: 3台それぞれについて、上記1〜5を独立して(前の車の状態を引き継がずに)実行すること
---
## 設問3
1から9までの整数を順に並べた一覧を用意してください。まず「計算元の値です」と出力し、続けてこの一覧の値をタブ区切りで出力してください。
次に、0から8までの範囲でランダムな整数を3つ選んでください(3つとも独立に選んでよく、同じ値が選ばれてもよい)。改行してから「ランダムに数値を3つ選び足し算します(選ばれた順に足し算します)」と出力してください。
続けて、以下を実装してください。
1. 「同じ種類の値を3つ受け取り、整数の戻り値を返す」という処理の型(受け取る値の型は特定の1種類に固定せず、後から様々な型に対応できる汎用的なもの)を定義する
2. 手順1で定義した処理の型を使って、共通データ定義に記載した3つの値を合計する処理(`Calc.addition` に相当するもの)を扱えるようにする
3. 手順1・2で用意した処理を使い、先ほど選んだ3つのランダムな整数を、それぞれ一覧の中の何番目の値か(0番目から数えて)を表すインデックスとして扱い、一覧から該当する3つの値を取り出す
4. 取り出した3つの値を、選ばれた順のまま手順1・2の処理に渡して合計を求める
5. 求めた合計値を出力する
- 補足: 手順1は、使用する言語によっては意味を持たない場合があります。このような汎用的な処理の型が標準で用意されている言語では、新たに定義せずその標準の型をそのまま使ってください。型を指定しなくても処理を値として扱える言語では、そもそも処理の型を定義する必要がないため、手順1は省略し、手順2以降の内容から進めてください。
---
## 設問4
設問1と同じ3件のUserデータのインスタンス(表・値は設問1を参照)を用意してください。
設問1の「Userの一覧を受け取り、各Userを文字列表現に変換した一覧を返す」処理と同じ内容の処理を、今回はあらかじめ名前を付けて定義しておくのではなく、その場で(名前を付けずに)処理内容を書き、直接変数に代入してください。
その変数を経由してこの処理を実行し(引数として3件のUser一覧を渡す)、実行結果として得られた文字列の一覧を出力してください。
- 期待される実行結果: 設問1と同じく、3件分のUserの文字列表現が読み取れるように出力されること
---
## 設問5
設問3と同じ準備を行ってください。
1. 1から9までの整数を順に並べた一覧を用意し、「計算元の値です」と出力してから、一覧の値をタブ区切りで出力する
2. 0から8までの範囲でランダムな整数を3つ選ぶ
3. 改行してから「ランダムに数値を3つ選び足し算します(選ばれた順に足し算します)」と出力する
続けて、以下を実装してください。
1. 「3つの値を受け取り、その合計を返す」処理を、名前を付けずにその場で定義し、変数に代入する。既存の`Calc.addition`のような名前付きの処理を呼び出すのではなく、合計を求める処理そのものを、できるだけ簡潔な書き方でその場に書くこと
2. 手順2で選んだ3つのランダムな整数を、一覧の中の何番目の値かを表すインデックス(0番目から数える)として扱い、一覧から該当する3つの値を取り出す
3. 取り出した3つの値を、選ばれた順のまま手順1の処理に渡して合計を求める
4. 求めた合計値を出力する
---
## 設問6
共通データ定義に記載したPlayer一覧の取得処理を使って、選手の一覧を取得してください。
取得した一覧の中から、ポジションが「FW」である選手だけを抽出し、抽出した選手を1件ずつ、前述のPlayerの文字列表現(カンマ区切り)で出力してください。
- 抽出には、一覧に対する条件による絞り込みなど、コレクションへの一括処理の仕組みを使うこと
- 期待される実行結果: `file/BestElevenCandidate.csv` の中でポジションが「FW」である全ての選手(15名)が出力される
---
## 設問7
共通データ定義に記載したPlayer一覧の取得処理を使って、選手の一覧を取得してください。
取得した一覧の中から、次の条件をすべて満たす選手だけを抽出し、抽出した選手を1件ずつ、Playerの文字列表現(カンマ区切り)で出力してください。
- 所属チームが「レアル・マドリード」ではない
- 所属チームが「バルセロナ」ではない
- ポジションが「MF」である
- 抽出には、一覧に対する条件による絞り込みなど、コレクションへの一括処理の仕組みを使うこと
---
## 設問8
共通データ定義に記載したFood一覧の取得処理を使って、料理の一覧を取得してください。
取得した料理一覧の並び順をランダムに入れ替えたうえで、以下を実装してください。
1. 並び替え後の一覧から、重複せずに3品を選ぶ
2. 選んだ3品の料理名と、選んだ3品の値段の合計(消費税8%を加算し、小数点以下は切り捨てたもの)を求める
3. 選んだ3品の料理名と、手順2で求めた合計金額が読み取れる形で出力する
- 抽出・集計には、一覧に対する一括処理の仕組みを使うこと
- 補足: 選ぶ料理はランダムに決まるため、実際に出力される料理名・合計金額は実行のたびに変わってよい。ただし「重複しない3品を選ぶこと」「消費税8%を加算し小数点以下切り捨てで合計金額を求めること」は満たすこと