演習 - 学生の成績を計算するために入れ子になったループ構造を構築する
この演習では、学生の名前を保持する文字列配列を追加し、外側のループ内の学生名と内部ループの学生スコアを反復処理する入れ子になった foreach 構造を実装します。 まず、 studentNames 配列と、配列要素を反復処理する foreach ループを構築します。 次に、ソフィアの成績を計算するために使用されるコードを、"names" ループのコード ブロックに移動します。 最後に、学生の名前を使用してスコア配列にアクセスし、その平均スコアを計算し、その成績をコンソールに書き込むコード ロジックを実装します。 この演習で完了する詳細なタスクは次のとおりです。
名前配列を作成する: 学生名配列を作成します。
外部ループを作成する: 学生名を反復処理する
foreachループを作成します。外部ループのコード ブロックを開発する: Sophia のスコアを計算して報告するコードを、"名前" ループのコード ブロックに再配置します。
計算とレポートを更新する: 新しいスコア配列を使用して学生スコアの計算を実行するコードを更新します。
重要
この演習を開始する前に、このモジュールの前の演習「配列と foreach ループを作成する」を完了しておく必要があります。
学生名配列と外部 foreach ループを作成する
このタスクでは、学生名配列と、学生名を反復処理する foreach ループを作成します。
Program.cs ファイルが Visual Studio Code エディターで開かれていることを確認します。
コードファイルの一番上までスクロールして、スコア配列の宣言に使用されているコード行を探します。
スコア配列の宣言の下に、空白のコード行を作成します。
空白のコード行は、スコア配列の宣言に使用する行と、
sophiaSumの宣言に使用する行の間に配置する必要があります。学生の名前を保持する
studentNamesという名前の文字列配列を作成するには、次のコードを入力します。// Student names string[] studentNames = new string[] { "Sophia", "Andrew", "Emma", "Logan" };宣言の一部として学生名を指定したことに注意してください。
学生名の反復処理に使用できる
foreachステートメントを作成するには、次のコードを入力します。foreach (string name in studentNames) { }foreachループが想定どおりにstudentNames配列を反復処理していることを確認するには、foreachステートメントのコード ブロックを次のように更新します。foreach (string name in studentNames) { Console.WriteLine($"{name}"); }ここで、作成したコードを確認します。
// Student names string[] studentNames = new string[] { "Sophia", "Andrew", "Emma", "Logan" }; foreach (string name in studentNames) { Console.WriteLine($"{name}"); }コードでは、この
foreachループがアプリケーションの外部ループとして使用されます。 この演習では、アプリケーションに次のロジックを実装します。studentNames配列内の各学生について、アプリケーションでは次の処理が行われます。- 現在の学生を決定する。
- 現在の学生のスコアにアクセスする。
- 現在の学生の成績 (合計と平均) を計算する。
- 現在の学生の成績をコンソールに書き込む。
ただし、ここでは、学生の名前のみをコンソールに書き込みます。
Visual Studio Code [ファイル] メニューの [保存] をクリックします。
Visual Studio Code EXPLORER ビューで、[ スタート] を右クリックし、[ 統合ターミナルで開く] を選択します。
重要
[ターミナル] のコマンド プロンプトには、Program.cs ファイルのフォルダー パスが表示されている必要があります。
[ターミナル] のコマンド プロンプトで「dotnet build」と入力し、Enter キーを押します。
dotnet buildコマンドでは、アプリケーションをビルドするようにコンパイラに指示します。 エラーが検出されると、エラーが報告されます。エラー メッセージまたは警告メッセージが表示された場合は、続行する前に修正する必要があります。
[ターミナル] のコマンド プロンプトで「dotnet run」と入力し、Enter キーを押します。
コードによって次の出力が生成されることを確認します。
Sophia Andrew Emma Logan Student Grade Sophia: 92.2 A- Press the Enter key to continue注
Sophia のスコアレポートの上に生徒名のリストが表示されない場合は、もう一度戻ってコードが正しく入力されたかどうかを確認してください。
[ターミナル] パネルで、実行中のアプリケーションを停止するには、Enter キーを押します。
[ターミナル] パネルを閉じます。
外部名前ループ内で Sophia のスコアを計算する
このタスクでは、Sophia のスコアを計算して報告するコードを、"名前" ループのコード ブロックに再配置します。
Visual Studio Code エディターで、Sophia の成績の計算とレポートに使用するコード行を見つけます。
int sophiaSum = 0; decimal sophiaScore; foreach (int score in sophiaScores) { // add the exam score to the sum sophiaSum += score; } sophiaScore = (decimal)sophiaSum / currentAssignments; Console.WriteLine("Student\t\tGrade\n"); Console.WriteLine("Sophia:\t\t" + sophiaScore + "\tA-");注
次の手順では、このコードを現在の場所から "名前"
foreachループのコード ブロックに移動します。切り取りと貼り付けの操作を使用して、Sophia の成績を計算して報告するコードを "名前"
foreachループのコード ブロックに移動します。Visual Studio Code での切り取りと貼り付けの方法がわからない場合は、次の手順で説明されているアプローチをお試しください。
Sophia の成績を計算して報告するのに使用するコードを選択します。
クリックアンドドラッグでコード行を選択できます。
Visual Studio Code の [編集] メニューで、[切り取り] を選択します。
Visual Studio Code エディターで、次のコードの下にある空白のコード行にカーソルを置きます:
Console.WriteLine($"{name}");。Visual Studio Code の [編集] メニューで、[貼り付け] を選択します。
コードを更新して、適切なコード行インデントを表示します。
ヒント
Visual Studio Code には、コードの書式設定を最新の状態に保つのに使用できる
Format Documentコマンドが用意されています。 Visual Studio Codeには、コードの書式を常に更新するために使用できる [ドキュメントのフォーマット] コマンドがあります。 Windows コンピューターでは、このコマンドのキーボード ショートカットはShift + Alt + Fです。 Linux および macOS コンピューターでは、OS で提供されるショートカットとの競合を回避するために、必要に応じて代替ショートカットが使用されます。更新内容が次のコードと一致していることを確認します。
// Student names string[] studentNames = new string[] { "Sophia", "Andrew", "Emma", "Logan" }; foreach (string name in studentNames) { Console.WriteLine($"{name}"); int sophiaSum = 0; decimal sophiaScore; foreach (int score in sophiaScores) { // add the exam score to the sum sophiaSum += score; } sophiaScore = (decimal)sophiaSum / currentAssignments; Console.WriteLine("Student\t\tGrade\n"); Console.WriteLine("Sophia:\t\t" + sophiaScore + "\tA-"); } Console.WriteLine("Press the Enter key to continue"); Console.ReadLine();この時点で、現在の学生の
nameに関係なく、コードによって Sophia のスコアが計算されて報告されます。 あなたはすぐに対処するでしょう。次のコードを削除します。
Console.WriteLine($"{name}");先ほど作成した空白のコード行に、次のコードを入力します。
if (name == "Sophia") {Sophia の成績をコンソールに書き込むのに使用するコードの後に、空白のコード行を作成します。
ifステートメントのコード ブロックを閉じるには、次のコードを入力します。}コードを更新して、適切なコード行インデントを表示します。
ヒント
Format Documentコマンドを使用して、コードの書式設定を最新の状態に保ちます。 Visual Studio Code エディター パネル内を右クリックし、ポップアップ メニューから [ドキュメントの書式設定] を選択します。ここで、コードを確認します。
コードは次のコードと一致するはずです。
// initialize variables - graded assignments int currentAssignments = 5; int[] sophiaScores = new int[] { 90, 86, 87, 98, 100 }; int[] andrewScores = new int[] { 92, 89, 81, 96, 90 }; int[] emmaScores = new int[] { 90, 85, 87, 98, 68 }; int[] loganScores = new int[] { 90, 95, 87, 88, 96 }; // Student names string[] studentNames = new string[] {"Sophia", "Andrew", "Emma", "Logan"}; foreach (string name in studentNames) { if (name == "Sophia") { int sophiaSum = 0; decimal sophiaScore; foreach (int score in sophiaScores) { // add the exam score to the sum sophiaSum += score; } sophiaScore = (decimal)(sophiaSum) / currentAssignments; Console.WriteLine("Student\t\tGrade\n"); Console.WriteLine("Sophia:\t\t" + sophiaScore + "\tA-"); } } Console.WriteLine("Press the Enter key to continue"); Console.ReadLine();外部
ifコード ブロック内のforeachステートメントによって、成績を計算して報告する対象の学生が制限されます。 この手順は厳密には必要ありませんが、正しい方向に向かっています。Visual Studio Code [ファイル] メニューの [保存] をクリックします。
Visual Studio Code EXPLORER ビューで、[ スタート] を右クリックし、[ 統合ターミナルで開く] を選択します。
重要
[ターミナル] のコマンド プロンプトには、Program.cs ファイルのフォルダー パスが表示されている必要があります。
[ターミナル] のコマンド プロンプトで「dotnet build」と入力し、Enter キーを押します。
dotnet buildコマンドでは、アプリケーションをビルドするようにコンパイラに指示します。 エラーが検出されると、エラーが報告されます。エラー メッセージまたは警告メッセージが表示された場合は、続行する前に修正する必要があります。
[ターミナル] のコマンド プロンプトで「dotnet run」と入力し、Enter キーを押します。
コードによって次の出力が生成されることを確認します。
Student Grade Sophia: 92.2 A-注
Sophia のスコアレポートの上に学生名の一覧がまだ表示される場合は、更新を保存したことを確認してください。
[ターミナル] パネルで、実行中のアプリケーションを停止するには、Enter キーを押します。
[ターミナル] パネルを閉じます。
入れ子になったループを更新してすべての学生スコアを計算する
このタスクでは、新しいスコア配列を使用して学生スコアの計算を実行するコードを更新します。 まず、任意の学生のスコアを保持するのに使用できる studentScores という名前の配列を作成します。 次に、現在の学生の名前を使用してスコア配列を if .. elseif に割り当てる studentScores コンストラクトを作成します。 最後に、学生の成績を計算して報告するコードを更新します。 完了すると、レポートには、すべての学生の名前と数値スコアが含まれます。
studentNames配列の宣言の下に、空白のコード行を作成します。空白行は外部
foreachステートメントの上に配置する必要があります。現在の学生のスコアを保持するのに使用できる整数配列を作成するには、次のコードを入力します。
int[] studentScores = new int[10];この時点では、このコードによって配列に値は割り当てられません。 単に、配列に 10 個の要素を含めることができることを指定します。
外部
foreachコード ブロックの上部に、空白のコード行を作成します。空白行は、
foreachコード ブロック内で、ifが Sophia と等しいかどうかを評価するnameステートメントの上に配置する必要があります。現在の学生の名前を保持するのに使用する文字列変数を作成するには、次のコードを入力します。
string currentStudent = name;注
名前配列を反復処理するときに、引き続き
nameを使用して現在の学生の名前を追跡できますが、currentStudentを使用すると、今後の手順でアプリケーションをビルドするときにコード ロジックを理解しやすくなります。currentStudentが Sophia と等しいかどうかを評価するnameステートメントでifをnameに置き換えるには、コードを次のように更新します。if (currentStudent == "Sophia")Sophia のスコアを計算して報告するコードを、コード ブロックの下の場所に移動します。
コード ブロック内のすべてのコードを、コード ブロックの下の場所に移動します。 これを行う理由は、次のいくつかの手順で明らかになります。
外部
foreachコード ブロック内のコードが次のコードと一致することを確認します。{ string currentStudent = name; if (currentStudent == "Sophia") { } int sophiaSum = 0; decimal sophiaScore; foreach (int score in sophiaScores) { // add the exam score to the sum sophiaSum += score; } sophiaScore = (decimal)sophiaSum / currentAssignments; Console.WriteLine("Student\t\tGrade\n"); Console.WriteLine("Sophia:\t\t" + sophiaScore + "\tA-"); }sophiaScoresの場合にstudentScoresにcurrentStudent == "Sophia"配列を割り当てるには、ifステートメント コードを次のように更新します。if (currentStudent == "Sophia") studentScores = sophiaScores;このコードの更新中に、
ifステートメント コード ブロックから中かっこが削除されました。else ifの場合にandrewScoresにstudentScores配列を割り当てるcurrentStudent == "Andrew"ステートメントを追加するには、次のコードを入力します。else if (currentStudent == "Andrew") studentScores = andrewScores;else ifの場合にemmaScoresにstudentScores配列を割り当てるもう 1 つのcurrentStudent == "Emma"ステートメントを作成します。else ifの場合にloganScoresにstudentScores配列を割り当てるcurrentStudent == "Logan"ステートメントを作成します。foreachコード ブロックが次のコードと一致することを確認します。foreach (string name in studentNames) { string currentStudent = name; if (currentStudent == "Sophia") studentScores = sophiaScores; else if (currentStudent == "Andrew") studentScores = andrewScores; else if (currentStudent == "Emma") studentScores = emmaScores; else if (currentStudent == "Logan") studentScores = loganScores; int sophiaSum = 0; decimal sophiaScore; foreach (int score in sophiaScores) { // add the exam score to the sum sophiaSum += score; } sophiaScore = (decimal)sophiaSum / currentAssignments; Console.WriteLine("Student\t\tGrade\n"); Console.WriteLine("Sophia:\t\t" + sophiaScore + "\tA-"); }次に、
foreachを使用するように内部studentScoresループを更新し、計算で使用する変数を "非パーソナル化" する必要があります。スコア配列を反復処理する
studentScoresループでsophiaScoresをforeachに置き換えるには、次のようにコードを更新します。foreach (int score in studentScores)Sophia 固有の変数宣言をより一般的な名に置き換えるには、次のようにコードを更新します。
int sumAssignmentScores = 0; decimal currentStudentGrade = 0;これら 2 つの変数宣言は、次の Sophia 固有の変数宣言を置き換えることを目的としています。
int sophiaSum = 0; decimal sophiaScore;学生スコアの合計に使用する数式に新しい変数名を適用するには、内部
foreachコード ブロックを次のように更新します。foreach (int score in studentScores) { // add the exam score to the sum sumAssignmentScores += score; }平均スコアの計算に使用する数式に新しい変数名を適用するには、次のようにコードを更新します。
currentStudentGrade = (decimal)(sumAssignmentScores) / currentAssignments;ここで、コードを確認します。
int[] studentScores = new int[10]; foreach (string name in studentNames) { string currentStudent = name; if (currentStudent == "Sophia") studentScores = sophiaScores; else if (currentStudent == "Andrew") studentScores = andrewScores; else if (currentStudent == "Emma") studentScores = emmaScores; else if (currentStudent == "Logan") studentScores = loganScores; // initialize/reset the sum of scored assignments int sumAssignmentScores = 0; // initialize/reset the calculated average of exam + extra credit scores decimal currentStudentGrade = 0; foreach (int score in studentScores) { // add the exam score to the sum sumAssignmentScores += score; } currentStudentGrade = (decimal)(sumAssignmentScores) / currentAssignments; Console.WriteLine("Student\t\tGrade\n"); Console.WriteLine("Sophia:\t\t" + sophiaScore + "\tA-"); }入れ子になった
foreachループにより、学生名が反復処理され、学生のスコアを使用して成績が計算されますが、スコア レポートの生成に使用するコードを更新する必要があります。学生名と計算済みスコアをコンソールに出力するには、2 番目
Console.WriteLineステートメントを次のように更新します。Console.WriteLine($"{currentStudent}\t\t{currentStudentGrade}\t?");このコードでは、学業成績ドの割り当てが"? "に置き換えられていることに注意してください。 次の演習では、レター グレードの割り当てを自動化する作業を行います。
スコア レポートの列ラベルを書き込むのに使用する
Console.WriteLineステートメントを、外部foreachループのすぐ上の場所に移動します。各学生スコアの列ヘッダーを繰り返さないように、このコードを外部
foreachループの上のポイントに移動します。Visual Studio Code [ファイル] メニューの [保存] をクリックします。
ここで、アプリケーション コードを確認します。
これで、アプリケーション全体が次のコードと一致するはずです。
// initialize variables - graded assignments int currentAssignments = 5; int[] sophiaScores = new int[] { 90, 86, 87, 98, 100 }; int[] andrewScores = new int[] { 92, 89, 81, 96, 90 }; int[] emmaScores = new int[] { 90, 85, 87, 98, 68 }; int[] loganScores = new int[] { 90, 95, 87, 88, 96 }; // Student names string[] studentNames = new string[] { "Sophia", "Andrew", "Emma", "Logan" }; int[] studentScores = new int[10]; // Write the Report Header to the console Console.WriteLine("Student\t\tGrade\n"); foreach (string name in studentNames) { string currentStudent = name; if (currentStudent == "Sophia") studentScores = sophiaScores; else if (currentStudent == "Andrew") studentScores = andrewScores; else if (currentStudent == "Emma") studentScores = emmaScores; else if (currentStudent == "Logan") studentScores = loganScores; // initialize/reset the sum of scored assignments int sumAssignmentScores = 0; // initialize/reset the calculated average of exam + extra credit scores decimal currentStudentGrade = 0; foreach (int score in studentScores) { // add the exam score to the sum sumAssignmentScores += score; } currentStudentGrade = (decimal)(sumAssignmentScores) / currentAssignments; Console.WriteLine($"{currentStudent}\t\t{currentStudentGrade}\t?"); }学生のスコア レポートを生成するコードが更新されたので、作業を確認する準備ができました。
作業を確認
このタスクでは、アプリケーションを実行して、コード ロジックが想定どおりに動作していることを確認します。
Program.cs ファイルに変更内容を確実に保存します。
Visual Studio Code EXPLORER ビューで、[ スタート] を右クリックし、[ 統合ターミナルで開く] を選択します。
[ターミナル] のコマンド プロンプトで「dotnet build」と入力し、Enter キーを押します。
エラー メッセージまたは警告メッセージが表示された場合は、続行する前に修正する必要があります。
[ターミナル] のコマンド プロンプトで「dotnet run」と入力し、Enter キーを押します。
コードによって次の出力が生成されることを確認します。
Student Grade Sophia 92.2 ? Andrew 89.6 ? Emma 85.6 ? Logan 91.2 ? Press the Enter key to continue[ターミナル] パネルで、実行中のアプリケーションを停止するには、Enter キーを押します。
[ターミナル] パネルを閉じます。
お疲れさまです。アプリケーションは、作業を開始した場所から長い道のりを行っています。配列と foreach イテレーションを効率的に使用し、コードが正しいスコア配列を選択できるようにする if ステートメントを統合しました。