演習 - すべてのAnimals 配列データを表示するコードを記述する
この演習では、ourAnimals配列の情報を表示するために使用される入れ子構造のループと選択コードブロックを記述します。 この演習で完了する詳細なタスクは次のとおりです。
- 外側のループ: ourAnimals 配列内の動物を反復処理する外側のループを構築します。
- データ チェック: 既存のペット データをチェックし、ペットのデータが存在する場合はペット ID を表示するコードを記述します。
- 内部ループ: データが割り当てられているペットのすべてのペット特性を表示する内部ループを構築します。
- 検証テスト: この演習で開発したコードの検証テストを行います。
重要
この演習を開始する前に、このモジュールの前の演習を完了する必要があります。
ループを構築して ourAnimals 配列を反復処理する
このタスクでは、for配列内の動物を反復処理するために使用される外側のourAnimals ループを作成します。 配列の次元と for ループのパラメーターの関係を調べます。 また、多次元配列を使用する場合は、 for ステートメントと foreach ステートメントの使用の違いについても考慮します。
Visual Studio Code が開き、Program.cs ファイルがエディターに表示されていることを確認します。
switch(menuSelection)selection ステートメントのコード ブロック内で、次のコード行を見つけます。case "1": // List all of our current pet information Console.WriteLine("this app feature is coming soon - please check back to see progress."); Console.WriteLine("Press the Enter key to continue."); readResult = Console.ReadLine(); break;"近日公開予定" メッセージを表示するために使用する
Console.WriteLine()ステートメントを削除し、// List all of our current pet informationコード コメント行の下に空白のコード行を残します。ourAnimals配列の内容を表示するため、フィードバック メッセージは必要ありません。 他のメニュー選択に対応するコードを開発すると、それらのフィードバック メッセージも更新されます。というメッセージを残す
Press the Enter key to continue.作成した空白のコード行から、次のように
forステートメントを開始します。for () { }この
forステートメントで何を達成する必要があるかを検討してください。forステートメントには、反復処理の実装方法を制御する 3 つの部分 (for 初期化子、for 条件、および for 反復子) があることを思い出してください。 for 初期化子、条件、反復子に割り当てられる値は、forステートメントで達成する必要がある内容に基づいています。この場合、
forループを使用して、ourAnimals配列を反復処理します。 配列のインデックスが 0 であることがわかります。つまり、n要素を持つ配列は、0からn-1にインデックスが作成されます。 初期化 子、 条件、および配列の次元に一致する 反復子 が必要です。 この場合は、forループを0から開始し、1ずつインクリメントし、maxPets-1で終了します。ourAnimals配列は次のように宣言されます:string[,] ourAnimals = new string[maxPets, 6];。maxPetsに割り当てられた値が8。 この宣言では、maxPets配列内の要素を参照するために使用する 0 から始まるインデックス番号ではなく、配列の最初の次元の要素数を指定します。 したがって、maxPets = 8が、配列インデックス番号は0から7までの範囲です。forループの制御値を指定するには、次のようにコードを更新します。for (int i = 0; i < maxPets; i++) { }ご覧のように、 for 初期化子 を
int i = 0;に設定すると、0 から始まる配列インデックスに合わせて調整されます。 同様に、 for 条件 をi < maxPets;に設定すると、配列の最初の次元に合わせて調整されます。 最後に、 for 反復子 をi++に設定すると、反復処理ごとに1してループ 制御値がインクリメントされます。ourAnimals 配列を反復処理する際に、
forステートメントとforeachステートメントのどちらを使用するかをじっくり考えてください。目標は、ourAnimals 配列内の各動物を一度に 1 つずつ反復処理することです。 では、
foreachループを使用してみませんか? 結局のところ、foreachステートメントは、項目の配列内の各項目を反復処理する場合のために設計されていることを知っています。この状況で
foreachループを使用しない理由は、ourAnimals配列が多次元配列であるためです。ourAnimalsは多次元文字列配列であるため、ourAnimalsに含まれる各要素は文字列型の個別の項目です。foreachループを使用してourAnimalsを反復処理した場合、foreachは各文字列を 48 個の文字列項目 (8 x 6 = 48) のリスト内の個別の項目として認識します。foreachステートメントでは、2 つの配列ディメンションを個別に処理しません。 つまり、foreachループでは、文字列要素の行8認識されません。各行には6項目の列が含まれます。 一度に 1 つの動物を操作し、1 回の反復中に 6 つの動物の特性をすべて処理する必要があるため、foreachステートメントは適切な選択ではありません。ただし、
ourAnimals配列が文字列配列の配列として構成されたジャグ配列である場合は、foreachステートメントを使用できます。 この場合は、外側のループのforeachを作成し、内部ループの 2 番目のforeachを作成します。 外側のループは、ジャグ配列内の "文字列配列" 要素を反復処理します。 文字列配列は、2 次元配列の "行" です。 内部ループは、文字列配列に含まれる "string" 要素を反復処理します。 文字列配列の文字列要素は、2 次元配列の "列" です。次のコード サンプルは、ジャグ配列のアプローチを示しています。
string[][] jaggedArray = new string[][] { new string[] { "one1", "two1", "three1", "four1", "five1", "six1" }, new string[] { "one2", "two2", "three2", "four2", "five2", "six2" }, new string[] { "one3", "two3", "three3", "four3", "five3", "six3" }, new string[] { "one4", "two4", "three4", "four4", "five4", "six4" }, new string[] { "one5", "two5", "three5", "four5", "five5", "six5" }, new string[] { "one6", "two6", "three6", "four6", "five6", "six6" }, new string[] { "one7", "two7", "three7", "four7", "five7", "six7" }, new string[] { "one8", "two8", "three8", "four8", "five8", "six8" } }; foreach (string[] array in jaggedArray) { foreach (string value in array) { Console.WriteLine(value); } Console.WriteLine(); }Contoso Pets アプリケーションでは、多次元の文字列配列と入れ子になった
forループを使用する方が、ジャグ配列と入れ子になったforeachループを使用するよりも簡単そうです。 各オプションの動作を確認したら、将来のコーディング プロジェクトで独自の選択を行うことができます。[Visual Studio Code ファイル ] メニューの [ 保存] を選択します。
Visual Studio Code で [統合ターミナル] パネルを開き、コマンドを入力してプログラムをビルドします。
エクスプローラー ビューから統合ターミナルを開くには、[ スタート] を右クリックし、[ 統合ターミナルで開く] を選択します。 [ 表示 ] メニューまたは [ターミナル ] メニューを使用して、[統合ターミナル] パネルを開くこともできます。
プログラムをビルドするには、ターミナル コマンド プロンプトから
dotnet buildコマンドを入力します。続行する前に報告されたビルド エラーまたは警告を修正します。
ビルドエラーと警告メッセージには、問題の内容と見つかる場所が示されていることに注意してください。 問題を解決する場合は、コードの先頭付近で発生する問題から始めて、作業を停止することをお勧めします。
[ターミナル] パネルを閉じます。
既存のペット データを確認し、結果を表示する
このタスクでは、 if ステートメントを使用して、ペットの特性データが割り当てられている ourAnimals 配列内の各ペットを検索します。 データが割り当てられているペットが見つかった場合は、petID を表示します。 データが割り当てられていない場合、何も表示されません。 コードを実行して、 for ステートメントと if ステートメントが正しく動作していることを確認します。
次のように、
forステートメント コード ブロック内に空白のコード行を作成します。for (int i = 0; i < maxPets; i++) { }ペット ID データをチェックする
ifステートメントを作成するには、次のようにコードを更新します。for (int i = 0; i < maxPets; i++) { if (ourAnimals[i, 0] != "ID #: ") { } }この
ifステートメントが何を評価しているのか、その理由を少し考えてみましょう。まず、式の左側 (
ourAnimals[i, 0]) について考えます。 ループ 制御変数iを使用して、検査対象の動物を指定していることに注意してください。 思い出したように、0の[i, 0]はpetID特性に対応しています。 配列の最初の次元は動物の "数値" に対応するため、式のこの側では、配列内の各動物に対してpetIDに割り当てられた値がコードによって確実にチェックされます。次に、比較演算子の選択を検討します。 等しくない演算子 (
!=) が使用されていることに注意してください。 式は、petID に割り当てられた値 (true) が式の右側にリストされている値と等しくない場合に、ourAnimals[i, 0]として評価されます。3 つ目は、数式の右側の値を考慮します。
"ID #: "の静的文字列値が使用されていることに注意してください。 これは、サンプル データの生成時にpetIDに割り当てられる既定値です。 動物に特性が割り当てられると、petIDの値が更新され、既定値と等しくなくなります。これにより、現在の動物に特性が定義されている場合、
ifステートメントのコード ブロックが実行されることを示します。注
これは、
!=を使用する必要がある場合の良い例です。 既定値でない限り、petIDに割り当てられる値は気にしません。Console.WriteLine()ステートメントのコード ブロック内にpetIDを表示するifメソッドを作成するには、次のようにコードを更新します。for (int i = 0; i < maxPets; i++) { if (ourAnimals[i, 0] != "ID #: ") { Console.WriteLine(ourAnimals[i, 0]); } }WriteLine()メソッドを呼び出すときに、配列要素を引数として使用できることに注意してください。[Visual Studio Code ファイル ] メニューの [ 保存] を選択します。
統合ターミナル パネルを開き、コマンドを入力してプログラムをビルドします。
続行する前に報告されたビルド エラーまたは警告を修正します。
ターミナルのコマンド プロンプトで、プログラムを実行するコマンドを入力します。
ターミナル コマンド プロンプトで
dotnet runコマンドを入力して、プログラム コードを実行します。コードでランタイム エラーが生成された場合は、エラーを修正し、更新プログラムを保存して、アプリケーションを再起動します。
ターミナル コマンド プロンプトで、新しいコード ロジックが想定どおりに動作していることを確認するには、「1」と入力します。
次の
petID値が表示されます。ID #: d1 ID #: d2 ID #: c3 ID #: c4 Press the Enter key to continue.これらの ID は、データが割り当てられているペットに対応します。
メニュー オプション 1 を選択したときにコードに異なる出力が表示される場合は、コードを確認して更新します。 更新後は、Program.cs ファイルを保存する必要があります。
アプリケーションを終了し、ターミナル パネルを閉じます。
データが割り当てられているペットのすべてのペットの特性を表示する
このタスクでは、現在のペットのすべての特性を表示するために使用される for ステートメント コード ブロック内にif ループを作成します。
コード エディターで、Program.cs ファイル内の次のコード行を見つけます。
for (int i = 0; i < maxPets; i++) { if (ourAnimals[i, 0] != "ID #: ") { Console.WriteLine(ourAnimals[i, 0]); } }各ペットの特性を反復処理する
forループを作成するには、次のようにコードを更新します。for (int i = 0; i < maxPets; i++) { if (ourAnimals[i, 0] != "ID #: ") { Console.WriteLine(ourAnimals[i, 0]); for (int j = 0; j < 6; j++) { } } }2 つ目の
forループが、最初のforループのコード ブロック内に "入れ子になった" ことに注意してください。 ご存知のように、外側のループはourAnimals配列内の動物を反復処理します。 意図は、内部ループが各動物の特性を反復処理することです。 動物データは多次元配列に格納されるため、動物の特性に簡単にアクセスできます。入力した
forステートメントを確認するには、少し時間がかかります。ループ コントロール変数の名前は
jであることに注意してください。forループを入れ子にするときによく使われる方法の 1 つは、外側のループではiを、内側のループではjを使うことです。 このような規則に従うと、他のユーザーがコードを読みやすくなります。動物ごとに 6 つの特性が格納されるため、初期化子は
int j = 0;であり、条件指定文はj < 6;。 初期化子と条件のこの組み合わせは、必要な配列インデックス範囲と一致します(0-5)。ペットの各特性を個別の行に表示するには、次のようにコードを更新します。
for (int i = 0; i < maxPets; i++) { if (ourAnimals[i, 0] != "ID #: ") { Console.WriteLine(ourAnimals[i, 0]); for (int j = 0; j < 6; j++) { Console.WriteLine(ourAnimals[i, j]); } } }作成した入れ子になった構造と、コードによって生成される表示される出力について、少し時間を取って検討してください。
コンソールに書き込まれた値 (
ourAnimals[i, j]) は、外側と内側の両方のforループのループ制御変数を使用していることに注意してください。次の各項目を把握しています。
ourAnimals配列の最初の次元は、異なるペットに対応します。ourAnimals配列の 2 番目の次元は、各ペットの特性に対応します。ifステートメントを使用すると、現在のペットにペット データが割り当てられていないときに内部ループが実行されなくなります。- 内部ループは、外部ループの各イテレーションごとにすべてのイテレーションを完了します。
したがって、各動物の特性が意図したとおりに表示されることを知っています。
petID メッセージを空白の
WriteLine()に置き換えるには、次のようにコードを更新します。for (int i = 0; i < maxPets; i++) { if (ourAnimals[i, 0] != "ID #: ") { Console.WriteLine(); for (int j = 0; j < 6; j++) { Console.WriteLine(ourAnimals[i, j]); } } }この最終更新プログラムにより、出力がコンソールに表示されるときに、ペット間の分離を簡単に確認できます。
[Visual Studio Code ファイル ] メニューの [ 保存] を選択します。
ターミナル ウィンドウを開き、プログラムをビルドします。
続行する前に報告されたビルド エラーまたは警告を修正します。
作業を確認する
このタスクでは、統合ターミナルからアプリケーションを実行し、 for ステートメントと if ステートメントの入れ子になった組み合わせによって期待される結果が生成されることを確認します。
必要に応じて、Visual Studio Code の統合ターミナル パネルを開きます。
ターミナルのコマンド プロンプトで、「dotnet run」と入力します。
ターミナルのコマンド プロンプトで、「1」と入力します。
データが割り当てられている 4 つのペットのペット データが表示されていることを確認します。
ID #: d1 Species: dog Age: 2 Nickname: lola Physical description: medium sized cream colored female golden retriever weighing about 65 pounds. housebroken. Personality: loves to have her belly rubbed and likes to chase her tail. gives lots of kisses. ID #: d2 Species: dog Age: 9 Nickname: loki Physical description: large reddish-brown male golden retriever weighing about 85 pounds. housebroken. Personality: loves to have his ears rubbed when he greets you at the door, or at any time! loves to lean-in and give doggy hugs. ID #: c3 Species: cat Age: 1 Nickname: Puss Physical description: small white female weighing about 8 pounds. litter box trained. Personality: friendly ID #: c4 Species: cat Age: ? Nickname: Physical description: Personality: Press the Enter key to continue.注
予想される結果が表示されない場合は、更新したProgram.cs ファイルを保存したことを確認してください。 予想される結果が表示されず、問題を特定できない場合は、Final フォルダーのProgram.csコードを調べることができます。 Final フォルダーは、セットアップ中に完了したダウンロードの一部として含まれます。 Final フォルダー内のProgram.cs ファイルを確認する前に、コード内の構文とロジックの問題を特定して修正するために時間を費やすことをお勧めします。
アプリケーションを終了し、ターミナル パネルを閉じます。