演習 - 学生の成績を計算するために入れ子になったループ構造を構築する

完了

この演習では、学生の名前を保持する文字列配列を追加し、外側のループ内の学生名と内部ループの学生スコアを反復処理する入れ子になった foreach 構造を実装します。 まず、 studentNames 配列と、配列要素を反復処理する foreach ループを構築します。 次に、ソフィアの成績を計算するために使用されるコードを、"names" ループのコード ブロックに移動します。 最後に、学生の名前を使用してスコア配列にアクセスし、その平均スコアを計算し、その成績をコンソールに書き込むコード ロジックを実装します。 この演習で完了する詳細なタスクは次のとおりです。

  1. 名前配列を作成する: 学生名配列を作成します。

  2. 外部ループを作成する: 学生名を反復処理する foreach ループを作成します。

  3. 外部ループのコード ブロックを開発する: Sophia のスコアを計算して報告するコードを、"名前" ループのコード ブロックに再配置します。

  4. 計算とレポートを更新する: 新しいスコア配列を使用して学生スコアの計算を実行するコードを更新します。

重要

この演習を開始する前に、このモジュールの前の演習「配列と foreach ループを作成する」を完了しておく必要があります。

学生名配列と外部 foreach ループを作成する

このタスクでは、学生名配列と、学生名を反復処理する foreach ループを作成します。

  1. Program.cs ファイルが Visual Studio Code エディターで開かれていることを確認します。

  2. コードファイルの一番上までスクロールして、スコア配列の宣言に使用されているコード行を探します。

  3. スコア配列の宣言の下に、空白のコード行を作成します。

    空白のコード行は、スコア配列の宣言に使用する行と、sophiaSum の宣言に使用する行の間に配置する必要があります。

  4. 学生の名前を保持する studentNames という名前の文字列配列を作成するには、次のコードを入力します。

    // Student names
    string[] studentNames = new string[] { "Sophia", "Andrew", "Emma", "Logan" };
    

    宣言の一部として学生名を指定したことに注意してください。

  5. 学生名の反復処理に使用できる foreach ステートメントを作成するには、次のコードを入力します。

    foreach (string name in studentNames)
    {
    }
    
  6. foreach ループが想定どおりに studentNames 配列を反復処理していることを確認するには、foreach ステートメントのコード ブロックを次のように更新します。

    foreach (string name in studentNames)
    {
        Console.WriteLine($"{name}");
    
    }
    
  7. ここで、作成したコードを確認します。

    // Student names
    string[] studentNames = new string[] { "Sophia", "Andrew", "Emma", "Logan" };
    
    foreach (string name in studentNames)
    {
        Console.WriteLine($"{name}");
    
    }
    

    コードでは、この foreach ループがアプリケーションの外部ループとして使用されます。 この演習では、アプリケーションに次のロジックを実装します。

    studentNames 配列内の各学生について、アプリケーションでは次の処理が行われます。

    • 現在の学生を決定する。
    • 現在の学生のスコアにアクセスする。
    • 現在の学生の成績 (合計と平均) を計算する。
    • 現在の学生の成績をコンソールに書き込む。

    ただし、ここでは、学生の名前のみをコンソールに書き込みます。

  8. Visual Studio Code [ファイル] メニューの [保存] をクリックします。

  9. Visual Studio Code EXPLORER ビューで、[ スタート] を右クリックし、[ 統合ターミナルで開く] を選択します。

    重要

    [ターミナル] のコマンド プロンプトには、Program.cs ファイルのフォルダー パスが表示されている必要があります。

  10. [ターミナル] のコマンド プロンプトで「dotnet build」と入力し、Enter キーを押します。

    dotnet build コマンドでは、アプリケーションをビルドするようにコンパイラに指示します。 エラーが検出されると、エラーが報告されます。

  11. エラー メッセージまたは警告メッセージが表示された場合は、続行する前に修正する必要があります。

  12. [ターミナル] のコマンド プロンプトで「dotnet run」と入力し、Enter キーを押します。

  13. コードによって次の出力が生成されることを確認します。

    Sophia
    Andrew
    Emma
    Logan
    Student         Grade
    
    Sophia:         92.2    A-
    Press the Enter key to continue
    

    Sophia のスコアレポートの上に生徒名のリストが表示されない場合は、もう一度戻ってコードが正しく入力されたかどうかを確認してください。

  14. [ターミナル] パネルで、実行中のアプリケーションを停止するには、Enter キーを押します。

  15. [ターミナル] パネルを閉じます。

外部名前ループ内で Sophia のスコアを計算する

このタスクでは、Sophia のスコアを計算して報告するコードを、"名前" ループのコード ブロックに再配置します。

  1. 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 ループのコード ブロックに移動します。

  2. 切り取りと貼り付けの操作を使用して、Sophia の成績を計算して報告するコードを "名前" foreach ループのコード ブロックに移動します。

    Visual Studio Code での切り取りと貼り付けの方法がわからない場合は、次の手順で説明されているアプローチをお試しください。

    1. Sophia の成績を計算して報告するのに使用するコードを選択します。

      クリックアンドドラッグでコード行を選択できます。

    2. Visual Studio Code の [編集] メニューで、[切り取り] を選択します。

    3. Visual Studio Code エディターで、次のコードの下にある空白のコード行にカーソルを置きます: Console.WriteLine($"{name}");

    4. Visual Studio Code の [編集] メニューで、[貼り付け] を選択します。

  3. コードを更新して、適切なコード行インデントを表示します。

    ヒント

    Visual Studio Code には、コードの書式設定を最新の状態に保つのに使用できる Format Document コマンドが用意されています。 Visual Studio Codeには、コードの書式を常に更新するために使用できる [ドキュメントのフォーマット] コマンドがあります。 Windows コンピューターでは、このコマンドのキーボード ショートカットは Shift + Alt + F です。 Linux および macOS コンピューターでは、OS で提供されるショートカットとの競合を回避するために、必要に応じて代替ショートカットが使用されます。

  4. 更新内容が次のコードと一致していることを確認します。

    // 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 のスコアが計算されて報告されます。 あなたはすぐに対処するでしょう。

  5. 次のコードを削除します。

    Console.WriteLine($"{name}");
    
  6. 先ほど作成した空白のコード行に、次のコードを入力します。

    if (name == "Sophia")
    {    
    
  7. Sophia の成績をコンソールに書き込むのに使用するコードの後に、空白のコード行を作成します。

  8. if ステートメントのコード ブロックを閉じるには、次のコードを入力します。

    }    
    
  9. コードを更新して、適切なコード行インデントを表示します。

    ヒント

    Format Document コマンドを使用して、コードの書式設定を最新の状態に保ちます。 Visual Studio Code エディター パネル内を右クリックし、ポップアップ メニューから [ドキュメントの書式設定] を選択します。

  10. ここで、コードを確認します。

    コードは次のコードと一致するはずです。

    // 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 ステートメントによって、成績を計算して報告する対象の学生が制限されます。 この手順は厳密には必要ありませんが、正しい方向に向かっています。

  11. Visual Studio Code [ファイル] メニューの [保存] をクリックします。

  12. Visual Studio Code EXPLORER ビューで、[ スタート] を右クリックし、[ 統合ターミナルで開く] を選択します。

    重要

    [ターミナル] のコマンド プロンプトには、Program.cs ファイルのフォルダー パスが表示されている必要があります。

  13. [ターミナル] のコマンド プロンプトで「dotnet build」と入力し、Enter キーを押します。

    dotnet build コマンドでは、アプリケーションをビルドするようにコンパイラに指示します。 エラーが検出されると、エラーが報告されます。

  14. エラー メッセージまたは警告メッセージが表示された場合は、続行する前に修正する必要があります。

  15. [ターミナル] のコマンド プロンプトで「dotnet run」と入力し、Enter キーを押します。

  16. コードによって次の出力が生成されることを確認します。

    Student         Grade
    
    Sophia:         92.2    A-
    

    Sophia のスコアレポートの上に学生名の一覧がまだ表示される場合は、更新を保存したことを確認してください。

  17. [ターミナル] パネルで、実行中のアプリケーションを停止するには、Enter キーを押します。

  18. [ターミナル] パネルを閉じます。

入れ子になったループを更新してすべての学生スコアを計算する

このタスクでは、新しいスコア配列を使用して学生スコアの計算を実行するコードを更新します。 まず、任意の学生のスコアを保持するのに使用できる studentScores という名前の配列を作成します。 次に、現在の学生の名前を使用してスコア配列を if .. elseif に割り当てる studentScores コンストラクトを作成します。 最後に、学生の成績を計算して報告するコードを更新します。 完了すると、レポートには、すべての学生の名前と数値スコアが含まれます。

  1. studentNames 配列の宣言の下に、空白のコード行を作成します。

    空白行は外部 foreach ステートメントの上に配置する必要があります。

  2. 現在の学生のスコアを保持するのに使用できる整数配列を作成するには、次のコードを入力します。

    int[] studentScores = new int[10];
    
    

    この時点では、このコードによって配列に値は割り当てられません。 単に、配列に 10 個の要素を含めることができることを指定します。

  3. 外部 foreach コード ブロックの上部に、空白のコード行を作成します。

    空白行は、foreach コード ブロック内で、if が Sophia と等しいかどうかを評価する name ステートメントの上に配置する必要があります。

  4. 現在の学生の名前を保持するのに使用する文字列変数を作成するには、次のコードを入力します。

    string currentStudent = name;
    
    

    名前配列を反復処理するときに、引き続き name を使用して現在の学生の名前を追跡できますが、currentStudent を使用すると、今後の手順でアプリケーションをビルドするときにコード ロジックを理解しやすくなります。

  5. currentStudent が Sophia と等しいかどうかを評価する name ステートメントで ifname に置き換えるには、コードを次のように更新します。

    if (currentStudent == "Sophia")
    
  6. Sophia のスコアを計算して報告するコードを、コード ブロックの下の場所に移動します。

    コード ブロック内のすべてのコードを、コード ブロックの下の場所に移動します。 これを行う理由は、次のいくつかの手順で明らかになります。

  7. 外部 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-");
    
    }
    
  8. sophiaScores の場合に studentScorescurrentStudent == "Sophia" 配列を割り当てるには、if ステートメント コードを次のように更新します。

    if (currentStudent == "Sophia")
        studentScores = sophiaScores;
    
    

    このコードの更新中に、if ステートメント コード ブロックから中かっこが削除されました。

  9. else if の場合に andrewScoresstudentScores 配列を割り当てる currentStudent == "Andrew" ステートメントを追加するには、次のコードを入力します。

    else if (currentStudent == "Andrew")
        studentScores = andrewScores;
    
    
  10. else if の場合に emmaScoresstudentScores 配列を割り当てるもう 1 つの currentStudent == "Emma" ステートメントを作成します。

  11. else if の場合に loganScoresstudentScores 配列を割り当てる currentStudent == "Logan" ステートメントを作成します。

  12. 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 ループを更新し、計算で使用する変数を "非パーソナル化" する必要があります。

  13. スコア配列を反復処理する studentScores ループで sophiaScoresforeach に置き換えるには、次のようにコードを更新します。

    foreach (int score in studentScores)
    
  14. Sophia 固有の変数宣言をより一般的な名に置き換えるには、次のようにコードを更新します。

    int sumAssignmentScores = 0;
    
    decimal currentStudentGrade = 0;
    

    これら 2 つの変数宣言は、次の Sophia 固有の変数宣言を置き換えることを目的としています。

    int sophiaSum = 0;
    
    decimal sophiaScore;
    
  15. 学生スコアの合計に使用する数式に新しい変数名を適用するには、内部 foreach コード ブロックを次のように更新します。

    foreach (int score in studentScores)
    {
        // add the exam score to the sum
        sumAssignmentScores += score;
    }
    
  16. 平均スコアの計算に使用する数式に新しい変数名を適用するには、次のようにコードを更新します。

    currentStudentGrade = (decimal)(sumAssignmentScores) / currentAssignments;
    
  17. ここで、コードを確認します。

    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 ループにより、学生名が反復処理され、学生のスコアを使用して成績が計算されますが、スコア レポートの生成に使用するコードを更新する必要があります。

  18. 学生名と計算済みスコアをコンソールに出力するには、2 番目 Console.WriteLine ステートメントを次のように更新します。

    Console.WriteLine($"{currentStudent}\t\t{currentStudentGrade}\t?");
    

    このコードでは、学業成績ドの割り当てが"? "に置き換えられていることに注意してください。 次の演習では、レター グレードの割り当てを自動化する作業を行います。

  19. スコア レポートの列ラベルを書き込むのに使用する Console.WriteLine ステートメントを、外部 foreach ループのすぐ上の場所に移動します。

    各学生スコアの列ヘッダーを繰り返さないように、このコードを外部 foreach ループの上のポイントに移動します。

  20. Visual Studio Code [ファイル] メニューの [保存] をクリックします。

  21. ここで、アプリケーション コードを確認します。

    これで、アプリケーション全体が次のコードと一致するはずです。

    // 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?");
    }
    

    学生のスコア レポートを生成するコードが更新されたので、作業を確認する準備ができました。

作業を確認

このタスクでは、アプリケーションを実行して、コード ロジックが想定どおりに動作していることを確認します。

  1. Program.cs ファイルに変更内容を確実に保存します。

  2. Visual Studio Code EXPLORER ビューで、[ スタート] を右クリックし、[ 統合ターミナルで開く] を選択します。

  3. [ターミナル] のコマンド プロンプトで「dotnet build」と入力し、Enter キーを押します。

  4. エラー メッセージまたは警告メッセージが表示された場合は、続行する前に修正する必要があります。

  5. [ターミナル] のコマンド プロンプトで「dotnet run」と入力し、Enter キーを押します。

  6. コードによって次の出力が生成されることを確認します。

    Student         Grade
    
    Sophia          92.2    ?
    Andrew          89.6    ?
    Emma            85.6    ?
    Logan           91.2    ?
    Press the Enter key to continue
    
  7. [ターミナル] パネルで、実行中のアプリケーションを停止するには、Enter キーを押します。

  8. [ターミナル] パネルを閉じます。

お疲れさまです。アプリケーションは、作業を開始した場所から長い道のりを行っています。配列と foreach イテレーションを効率的に使用し、コードが正しいスコア配列を選択できるようにする if ステートメントを統合しました。