# Guided project Develop foreach and if-elseif-else structures to process array data in C# Gain experience developing a console app that implements arrays, foreach loops, and if statements to achieve app specifications. ## Introduction Creating a code branch and iterating through a code block are essential capabilities for a developer. In C#, the `if` statement can be used to evaluate an expression and branch the execution path. The code block of a `foreach` statement can be used to iterate through each element of an array. Powerful and extensible applications can be created by combining the ability to iterate through an array with the ability to branch the execution path. Suppose you're a teacher's assistant at a school. You've been working with a teacher to create an application that automates the grading process. Your C# programming skills have increased since you completed the initial version of your application. The teacher has asked you to update your application. The updates focus on using arrays, `foreach` statements, and `if` statements. The teacher also wants you to include extra credit assignments in your calculations of the final grades. In this module, you'll be guided through the process of updating your Student Grading application. You'll use arrays to store student names and the scores of graded assignments, and you'll use `foreach` statements to iterate through array values. Each student's final grade will be calculated inside a `foreach` code block. You'll use an if statement to assign a final letter grade. Your completed application will output student grades using the teacher's score report specification. By the end of this module, you'll have experience developing applications that use arrays, `foreach` statements, and `if` statements. You'll also be comfortable creating applications that efficiently process data using nested iteration and selection statements. > Note > This is a guided project module where you’ll complete an end-to-end project by following step-by-step instructions. ### Prepare In this guided project, you'll use Visual Studio Code to develop a C# application. The application will use arrays, `foreach` statements, and `if` statements to implement a list of design parameters. You'll begin by creating the array variables that contain your application data. To complete the project, you'll develop `foreach` and `if` statements that implement the application design goals. > Important > This module includes coding activities that require Visual Studio Code. You 'll need access to a development environment that has Visual Studio Code installed and configured for C# application development. #### Project overview You're developing a Student Grading application that automates the calculation of grades for each student in a class. The parameters for your application are: - Create a C# console application. - Start with four students. Each student has five exam scores. - Each exam score is an integer value, 0-100, where 100 represents 100% correct. - A student's overall exam score is the average of their five exam scores. - Criteria for extra credit assignments: - Include extra credit assignment scores in the student's scores array. - Extra credit assignments are worth 10% of an exam score (when calculating the final numeric grade). - Add extra credit assignment scores to the student's total exam score before calculating the final numeric grade. - Your application needs to automatically assign letter grades based on the calculated final score for each student. - Your application needs to output/display each student’s name and formatted grade. - Your application needs to support adding other students and scores with minimal impact to the code. You've already completed an initial version of the application. The Starter code project for this Guided project module includes a Program.cs file that provides the following code features: - The code declares variables used to define student names and individual exam scores for each student. - The code includes the variables and algorithms used to sum the exam scores and calculate the average exam score for each student. - The code includes a hard coded letter grade that the developer must apply manually. - The code includes Console.WriteLine() statements to display the student grading report. Your goal is to update the existing code to include the following features: - Use arrays to store student names and assignment scores. - Use a `foreach` statement to iterate through the student names as an outer program loop. - Use an `if` statement within the outer loop to identify the current student name and access that student's assignment scores. - Use a `foreach` statement within the outer loop to iterate through the assignment scores array and sum the values. - Use an updated algorithm within the outer loop to calculate the average exam score for each student. - Use an `if-elseif-else` construct within the outer loop to evaluate the average exam score and assign a letter grade automatically. - Integrate extra credit scores when calculating the student's final score and letter grade as follows: - Your code must detect extra credit assignments based on the number of elements in the student's scores array. - Your code must apply the 10% weighting factor to extra credit assignments before adding extra credit scores to the sum of exam scores. The following list shows the letter grade that corresponds to numeric scores: ```txt 97 - 100 A+ 93 - 96 A 90 - 92 A- 87 - 89 B+ 83 - 86 B 80 - 82 B- 77 - 79 C+ 73 - 76 C 70 - 72 C- 67 - 69 D+ 63 - 66 D 60 - 62 D- 0 - 59 F ``` The update application needs to produce a formatted student grading report that appears as follows: ```txt Student Grade Sophia: 92.2 A- Andrew: 89.6 B+ Emma: 85.6 B Logan: 91.2 A- ``` ### Setup Use the following steps to prepare for the Guided project exercises. 1. To download a zip file containing the Starter project code, select the following link: [Lab Files](https://github.com/MicrosoftLearning/Guided-project-foreach-if-array-CSharp/archive/refs/heads/main.zip). 2. Unzip the download files. --- ## Exercise ### Create arrays and foreach loops In this exercise, you'll review the Starter project code and then begin updating the application. Your first coding task will be creating the arrays that hold student exam scores. Once your application data is available in arrays, you'll begin working on a `foreach` loop that can be used to sum student grades. The detailed tasks that you'll complete during this exercise are: 1. Code review: review the contents of the Program.cs file. 2. Arrays: Create the arrays that store each student's assignment scores. 3. Iteration: Create a foreach loop that can be used to sum Sophia's assignment grades. 4. Calculate and display Sophia's average assignment grade. 5. Verification test: perform a verification test for the code that you've developed in this exercise. > Important > You need to have completed the Setup instructions in the previous unit, Prepare, before you begin this Exercise. ### Review the contents of the Program.cs file In this task, you'll review the code that's provided as a Starter project for this module. The Program.cs file contains the initial version of the student grading application that you'll be updating. Ensure that you have the GuidedProject folder open. Take a few minutes to review the code in the Program.cs file. Notice that the top portion of your code begins with a Using statement and a list of variable declarations. ```cs // initialize variables - graded assignments int currentAssignments = 5; int sophia1 = 90; int sophia2 = 86; int sophia3 = 87; int sophia4 = 98; int sophia5 = 100; int andrew1 = 92; int andrew2 = 89; int andrew3 = 81; int andrew4 = 96; int andrew5 = 90; int emma1 = 90; int emma2 = 85; int emma3 = 87; int emma4 = 98; int emma5 = 68; int logan1 = 90; int logan2 = 95; int logan3 = 87; int logan4 = 88; int logan5 = 96; ``` The `using` statement enables you to write code that implements members of the `System` namespace without requiring you to specify `System`. For example, your code can use the `Console.WriteLine()` method without having to specify `System.Console.WriteLine()`. Among other things, the using statement makes your code easier to read. Next, you see a comment line followed by a list of variables that are used to hold the scores of graded assignments for each student. Your first variable, `currentAssignments` is used to hold the number of exams that have been scored. The assignment score variables represent a great opportunity to create and use arrays! Scroll down and review the two groups of variable declaration code lines. ```cs int sophiaSum = 0; int andrewSum = 0; int emmaSum = 0; int loganSum = 0; decimal sophiaScore; decimal andrewScore; decimal emmaScore; decimal loganScore; ``` The first group of variables are integers that are being used to hold the sum of the exam scores. The second group of variables are decimals that are used to hold the calculated average score. The code uses decimals here because an integer calculation rounds off the fractional portion of the calculated value. Notice that you were using a unique variable for each student. This may provide another opportunity to slim down the number of code lines in your updated application. It looks like the starter code begins score calculations next. Scroll down a bit further and take a minute to review the following code: ```cs sophiaSum = sophia1 + sophia2 + sophia3 + sophia4 + sophia5; andrewSum = andrew1 + andrew2 + andrew3 + andrew4 + andrew5; emmaSum = emma1 + emma2 + emma3 + emma4 + emma5; loganSum = logan1 + logan2 + logan3 + logan4 + logan5; sophiaScore = (decimal)sophiaSum / currentAssignments; andrewScore = (decimal)andrewSum / currentAssignments; emmaScore = (decimal)emmaSum / currentAssignments; loganScore = (decimal)loganSum / currentAssignments; ``` The first group of equations is used to calculate the sum of the assignment scores for each student. The second group of equations calculates the average score. Notice that the numerator is cast as a decimal to ensure the division retains the fractional component. Take a minute to review the final code section: ```cs Console.WriteLine("Student\t\tGrade\n"); Console.WriteLine("Sophia:\t\t" + sophiaScore + "\tA-"); Console.WriteLine("Andrew:\t\t" + andrewScore + "\tB+"); Console.WriteLine("Emma:\t\t" + emmaScore + "\tB"); Console.WriteLine("Logan:\t\t" + loganScore + "\tA-"); Console.WriteLine("Press the Enter key to continue"); Console.ReadLine(); ``` This section prints the formatted output in accordance with the teacher's guidelines. The first line is a header line with column titles, followed by the names and scores for each student. The `Console.ReadLine()` statement will pause the application so that the application user can review the output. You will be using the TERMINAL panel to run .NET Command Line Interface (CLI) commands, such as dotnet build and dotnet run. The dotnet build command will compile your code and display error and warning messages related to your code syntax. > Important > Ensure that terminal command prompt is open to the root of your project workspace. In this case, the root of your project workspace is the Starter folder, where your Starter.csproj and Program.cs files are located. When you run .NET CLI commands in the terminal, the commands will try to perform actions using the current folder location. If you try to run the `dotnet build` or `dotnet run` commands from a folder location that does not contain your files, the commands will generate error messages. At the TERMINAL command prompt, to build your project code, enter the following command: `dotnet build` After a couple seconds, you should see a message telling you that your build succeeded and that you have 0 Warning(s) and 0 Error(s). ```txt Determining projects to restore... All projects are up-to-date for restore. Starter -> C:\Users\someuser\Desktop\GuidedProject\Starter\bin\Debug\net7.0\Starter.dll Build succeeded. 0 Warning(s) 0 Error(s) ``` Using .NET CLI commands is an easy way to build and run your applications. At the Terminal command prompt, type `dotnet run` and then press Enter. The `dotnet run` command will instruct the compiler to build your application and then, as long as there were no build errors, it will run your compiled code. > Important > The Starter project targets .NET 8 (in the Starter.csproj file). If you don 't have .NET 8 installed, the `dotnet run` command will generate an error. You can either install the .NET 8 SDK (recommended), or you can change the target framework in the Starter.csproj file to align with the version of .NET that you have installed in your environment. Verify that your application produced the following output: ```txt Student Grade Sophia: 92.2 A- Andrew: 89.6 B+ Emma: 85.6 B Logan: 91.2 A- Press the Enter key to continue ``` In the TERMINAL panel, press the Enter key. Your application was essentially paused after writing "Press the Enter key to continue" to the console. This behavior is caused by the `Console.ReadLine()` statement, which is used to collect user input in a console application. Your application will stop running once you press Enter. That completes your code review. This application looks like the perfect opportunity to apply arrays, iterations, and selection statements. It's time to get started on your updates! ### Create the assignment score arrays In this task, you'll replace the variables that hold the individual scores with arrays that hold the graded assignment scores for each student. In the Visual Studio Code Editor, scroll to the top of the Program.cs file. Create a blank code line below the line used to declare the `currentAssignments` variable. On the new code line, to create an integer array that will be used for Sophia's assignment scores, enter the following code: ```cs int[] sophiaScores = new int[5]; ``` Notice that this code uses the `new` operator to specify that you're creating a new instance of an array. The set of square brackets in `int[]` tells the compiler that sophiaScores will be an integer array, while the set of square brackets in `int[5]` is used to specify the number of elements in the array. You may recall that you have the option to assign array values as part of the declaration. > Note > In situations where you know the values of array elements ahead of time and when the values are unlikely to change, it makes sense to assign the array values when the array is declared. A good example would be an array that's used to hold the days of the week. Obviously, if the array values are unknown, you can't specify them when the array is declared, and you'll use the syntax that you entered above to declare your array. To specify Sophia's assignment scores within the declaration, update the declaration for `sophiaScores` as follows: ```cs int[] sophiaScores = new int[] { 90, 86, 87, 98, 100 }; ``` Notice that the `5` that was used to specify the number of elements has been removed, and instead, you've included the scores of the five graded assignments. Verify that the scores listed inside the `{}` match the individual scores for Sophia's assignments. The five variables that are used to hold individual scores are as follows: ```cs int sophia1 = 90; int sophia2 = 86; int sophia3 = 87; int sophia4 = 98; int sophia5 = 100; ``` Delete the code lines that declare the variables holding Sophia's individual scores. Since you will be using the `sophiaScores` array to access Sophia's scores going forward, these variables are no longer needed. To create an integer array that will be used for Andrew's assignment scores, enter the following code: ```cs int[] andrewScores = new int[] {92, 89, 81, 96, 90}; ``` Create the array declarations for the other students. Be sure to name the arrays using the student's name, and then copy the values of their individual scores into `{}` on the array declaration line. Verify that you've copied the individual scores into the array declarations accurately, and then delete the variables used to hold the individual scores for Andrew, Emma, and Logan. The code at the top of your Program.cs file should now be similar to the following: ```cs // 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 }; int sophiaSum = 0; ``` Good job, the scores arrays are declared and ready to use. ### Create a foreach iteration to calculate Sophia's grade In this task, you'll replace the existing code that's used to perform calculations with a `foreach` statement that iterates through Sophia's assignment scores. You will use the code block of the `foreach` loop to calculate the sum of Sophia's scores, and then calculate and display Sophia's grade. Locate the code lines that are used to declare variables and perform calculations for the sum and average score values. The code should look similar to the following: ```cs int sophiaSum = 0; int andrewSum = 0; int emmaSum = 0; int loganSum = 0; decimal sophiaScore; decimal andrewScore; decimal emmaScore; decimal loganScore; sophiaSum = sophia1 + sophia2 + sophia3 + sophia4 + sophia5; andrewSum = andrew1 + andrew2 + andrew3 + andrew4 + andrew5; emmaSum = emma1 + emma2 + emma3 + emma4 + emma5; loganSum = logan1 + logan2 + logan3 + logan4 + logan5; sophiaScore = (decimal)sophiaSum / currentAssignments; andrewScore = (decimal)andrewSum / currentAssignments; emmaScore = (decimal)emmaSum / currentAssignments; loganScore = (decimal)loganSum / currentAssignments; ``` Delete the code lines that are used to perform the sum calculations. You'll be writing the code to calculate the sum inside a `foreach` loop once you're finished cleaning up. Delete the code lines that declare int and decimal variables for Andrew, Emma, and Logan. > Note > Leave the code lines that declare variables for Sophia. Delete the code lines that are used to calculate the average score for Andrew, Emma, and Logan. > Note > Leave the code line containing the average score calculation for Sophia. Scroll down to the bottom of your code, and then delete the code lines used to report grades for Andrew, Emma, and Logan. Verify that your updated Program.cs file contains the following code: > Note > Add or remove blank code lines so that your code matches the code shown below. ```cs // 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 }; int sophiaSum = 0; decimal sophiaScore; 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(); ``` Create a blank code line after the line used to declare `sophiaScore`. To create a `foreach` statement that you will use to iterate through Sophia's scores, enter the following code: ```cs foreach (int score in sophiaScores){ } ``` Notice that this code instantiates an integer variable named `score` as part of the `foreach` statement. You will be using `score` inside the code block of your `foreach` to access the values of the `sophiaScores` array. To create the equation that sums Sophia's score, update the `foreach` code block as follows: ```cs foreach (int score in sophiaScores){ // add the exam score to the sum sophiaSum += score; } ``` Notice that this code is using the `+=` operator to add the value of `score` to `sophiaSum` inside your `foreach` loop. Developers often use `+=` as a shortcut when calculating a sum. This equation is equivalent to the following: ```cs sophiaSum = sophiaSum + score; ``` Once your `foreach` loop has iterated through all of the values in the `sophiaScores` array, `sophiaSum` will contain the sum of her scores. Take a minute to review your code. Your code should now look similar to the following: ```cs // 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 }; 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(); ``` At this point, you've created the scores arrays for all students and you're calculating the sum of Sophia's score inside a `foreach` loop that iterates through her scores. You still have a long way to go to complete all of the planned updates, but this is a good point to check your progress. ### Check your work In this task, you'll run the application to verify that your code logic is working as expected. 1. Ensure that you've saved your changes to the Program.cs file. 2. In the Visual Studio Code EXPLORER panel, right-click Starter, and then select Open in Integrated Terminal. 3. You will be using the Terminal panel to enter .NET CLI commands that build and run your applications. 4. Verify that the Terminal command prompt lists the Starter folder as the current folder location. At the TERMINAL command prompt, to build your project code, enter the following command: `dotnet build` After a couple seconds, you should see a message telling you that your build succeeded and that you have 0 Warning(s) and 0 Error(s). ```txt Determining projects to restore... All projects are up-to-date for restore. Starter -> C:\Users\someuser\Desktop\GuidedProject\Starter\bin\Debug\net6.0\Starter.dll Build succeeded. 0 Warning(s) 0 Error(s) ``` If you see Error or Warning messages, you need to fix them before continuing. Error and Warning messages list the code line where the issue can be found. The following is an example of a `Build FAILED` error message: `C:\Users\someuser\Desktop\GuidedProject\Starter\Program.cs(53,18): error CS1002: ; expected [C:\Users\someuser\Desktop\GuidedProject\Starter\Starter.csproj]` This message tells you the type of error that was detected and where to find it. In this case, the message tells you that the Program.cs file contains an error - `error CS1002: ; expected`. The `; expected` suggests that the developer forgot to include a `;` at the end of a statement. The `Program.cs(53,18)` portion of the message tells you that the error is located on code line 53, at a position 18 characters in from the left. A syntax error like this prevents the Build task from succeeding (Build FAILED). Some Build messages provide a "Warning" instead of an "Error", which means there is something to be concerned with, but you can try running the program anyway (Build succeeded). Once you have fixed the issues and saved your updates, you can run the `dotnet build` command again. Continue updating and saving your code until you have 0 Warning(s) and 0 Error(s). > Note > If you have trouble resolving an issue on your own, you can examine the Program.cs code in the Final folder that's included as part of the download that you completed during Setup. The Program.cs code in the Final folder represents the conclusion of all exercises in this module, so it will include code that you have not created yet. It may look considerably different than the Program.cs code that you have developed at this point in the Guided project. However, you can try examining the Program.cs code in Final to help you isolate and fix an issue in your code if you need to. Try not to use the code in the Final folder as a guide if you can avoid it. Remember that you learn from your mistakes and that every developer spends time finding and fixing errors. At the Terminal command prompt, type `dotnet run` and then press Enter. The `dotnet run` command instructs the compiler to build your application and then, as long as no errors were detected, will run the compiled code. Verify that your code produced the following output: ```txt Student Grade Sophia: 92.2 A- Press the Enter key to continue ``` Congratulations, you've built an application that uses a `foreach` loop to iterate through the elements of an array and perform calculations based on the contents of the array. You're making great progress on the required app updates! --- ## Exercise ### Construct a nested loop structure for student grade calculations In this exercise, you'll add a string array to hold the student names, and then implement a nested `foreach` structure that iterates through the student names in an outer loop and student scores in the inner loop. You'll begin by constructing the `studentNames` array and a `foreach` loop that iterates through the array elements. Next, you'll move the code that's used to calculate Sophia 's grades into the code block of the "names" loop. Finally, you'll implement the code logic that uses the student's name to access their scores array, calculate their average score, and write their grade to the console. The detailed tasks that you'll complete during this exercise are: Create names array: Create a student names array. Create outer loop: Create a `foreach` loop that iterates through the student names. Develop outer loop code block: Relocate the code that calculates and reports Sophia's score, placing it in the code block of the "names" loop. Update calculations and reporting: Update the code that performs student score calculations using a new scores array. > Important > You need to have completed this module's previous Exercise, "Create arrays and foreach loops", before you begin this Exercise. ### Create a student names array and outer foreach loop In this task, you'll create a student names array and a `foreach` loop that iterates through the student names. Scroll to the top of your code file, and then locate the code lines that are used to declare the scores arrays. Create a blank code line below the declaration of the scores arrays. Your blank code line should be located between the lines used to declare the scores arrays and the line used to declare `sophiaSum`. To create a string array named `studentNames` that holds the names of the students, enter the following code: ```cs // Student names string[] studentNames = new string[] { "Sophia", "Andrew", "Emma", "Logan" }; ``` Notice that you've specified the student names as part of the declaration. To create a `foreach` statement that you can use to iterate through the student names, enter the following code: ```cs foreach (string name in studentNames){ } ``` To verify that your `foreach` loop is iterating through the `studentNames` array as intended, update the code block of the foreach statement as follows: ```cs foreach (string name in studentNames){ Console.WriteLine($"{name}"); } ``` Take a minute to review the code that you've created. ```cs // Student names string[] studentNames = new string[] { "Sophia", "Andrew", "Emma", "Logan" }; foreach (string name in studentNames){ Console.WriteLine($"{name}"); } ``` Your code will use this `foreach` loop as the outer loop of your application. During this exercise, you'll implement the following logic in your application: For each of the students in the `studentNames` array, your application will: - determine the current student. - access the current student's scores. - calculate the current student's grade (sum and average). - write the current student's grade to the console. For now, however, you'll just write the names of the students to the console. At the Terminal command prompt, type `dotnet build` and then press Enter. The `dotnet build` command instructs the compiler to build the application. If any errors are detected, they will be reported. If you see Error or Warning messages, you need to fix them before continuing. At the Terminal command prompt, type dotnet run and then press Enter. Verify that your code produced the following output: ```txt Sophia Andrew Emma Logan Student Grade Sophia: 92.2 A- Press the Enter key to continue ``` > Note > If you don't see the list of student names above Sophia's score report, go back and verify that you entered your code correctly. ### Calculate Sophia's score inside the outer names loop In this task, you'll relocate the code that calculates and reports Sophia's score, placing it in the code block of the "names" loop. Locate the code lines that are used to calculate and report Sophia's grade. ```cs 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-"); ``` > Note > Your next step will be to move this code from its current location to the code block of the "names" `foreach` loop. Use a cut-and-paste operation to move the code that calculates and reports Sophia's grade to the code block of the "names" `foreach` loop. If you're unsure how to cut-and-paste in Visual Studio Code, try the approach described in the following steps: Select the code that's used to calculate and report Sophia's grade. Position the cursor on the blank code line below the following code: `Console.WriteLine($"{name}");` Update your code to display proper code line indentation. Ensure that your updates match the following code: ```cs // 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(); ``` Notice that at this point, your code will calculate and report Sophia's score regardless of the `name` of the current student. You will address that shortly. Delete the following code: ```cs Console.WriteLine($"{name}"); ``` On the blank code line that you just created, enter the following code: ```cs if (name == "Sophia"){ ``` Create a blank code line after the code that's used to write Sophia's grade to the console. To close the code block of the `if` statement, enter the following code: ```cs } ``` Update your code to display proper code line indentation. > Tip > Use the `Format Document` command to keep your code formatting updated. Right-click inside the Visual Studio Code Editor panel, and then select **Format Document** from the popup menu. Take a minute to review your code. Your code should match the following code: ```cs // 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(); ``` Notice that the `if` statement inside your outer `foreach` code block limits which student's grade is calculated and reported. This isn't exactly what you need, but it's a step in the right direction. > Important > The Terminal command prompt must be displaying the folder path for your Program.cs file. At the Terminal command prompt, type `dotnet build` and then press Enter. The `dotnet build` command instructs the compiler to build the application. If any errors are detected, they will be reported. If you see Error or Warning messages, you need to fix them before continuing. At the Terminal command prompt, type **dotnet run** and then press Enter. Verify that your code produced the following output: ```txt Student Grade Sophia: 92.2 A- ``` > Note > If you still see the list of student names displayed above Sophia's score report, make sure that you saved your updates. ### Update the nested loop to calculate all student scores In this task, you'll update the code that performs student score calculations using a new scores array. You'll begin by creating an array named `studentScores` that can be used to hold the scores of any student. Next, you'll create an `if .. elseif` construct that uses the current student's name to assign their scores array to `studentScores`. Finally, you'll update the code that calculates and reports the student's grades. When you're done, the report should include the name and numeric score for all students. Create a blank code line below the declaration of the `studentNames` array. The blank line should be above the outer `foreach` statement. To create an integer array that you can use to hold the scores of the current student, enter the following code: ```cs int[] studentScores = new int[10]; ``` Notice that this code doesn't assign any values to the array at this point. You simply specify that the array can contain 10 elements. Create a blank code line at the top of the outer `foreach` code block. The blank line should be inside the `foreach` code block and above the `if` statement that evaluates whether name is equal to Sophia. To create a string variable that will be used to hold the name of the current student, enter the following code: ```cs string currentStudent = name; ``` > Note > You could continue to use name to track the name of the current student as you iterate through the names array, but using currentName will make it easier to understand your code logic as you build out your application in the upcoming steps. To substitute `currentStudent` for `name` in the `if` statement that evaluates whether `name` is equal to Sophia, update your code as follows: ```cs if (currentStudent == "Sophia") ``` Move the code that calculates and reports Sophia's score to a location below the code block. You're moving all of the code that's in the code block to a location below the code block. The reason for doing this will become apparent during the next few steps. Verify that the code in your outer `foreach` code block matches the following code: ```cs ... 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-"); } ``` To assign the `sophiaScores` array to `studentScores` when `currentStudent == "Sophia"`, update your if statement code as follows: ```cs if (currentStudent == "Sophia") studentScores = sophiaScores; ``` Notice that you've removed the curly braces from the `if` statement code block during this code update. To add an `else if` statement that assigns the `andrewScores` array to `studentScores` when currentStudent == "Andrew", enter the following code: ```cs else if (currentStudent == "Andrew") studentScores = andrewScores; ``` Create another `else if` statement to assign the `emmaScores` array to `studentScores` when `currentStudent == "Emma"`. Create an `else if` statement to assign the `loganScores` array to `studentScores` when `currentStudent == "Logan"`. Ensure that your `foreach` code block matches the following code: ```cs 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-"); } ``` Next, you need to update the inner `foreach` loop to use `studentScores` and "depersonalize" the variables that you use in your calculations. To substitute `studentScores` for `sophiaScores` in the `foreach` loop that iterates through the scores array, update your code as follows: ```cs foreach (int score in studentScores) ``` To replace the Sophia-specific variable declarations with more generic names, update your code as follows:  ```cs int sumAssignmentScores = 0; decimal currentStudentGrade = 0; ``` These two variable declarations are intended to replace the following Sophia -specific variable declarations: ```cs int sophiaSum = 0; decimal sophiaScore; ``` To apply the new variable name to the equation used to sum student scores, update your inner `foreach` code block as follows: ```cs foreach (int score in studentScores){ // add the exam score to the sum sumAssignmentScores += score; } ``` To apply the new variable name to the equation used to calculate the average score, update your code as follows: ```cs currentStudentGrade = (decimal)(sumAssignmentScores) / currentAssignments; ``` Take a minute to review your code. ```cs 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-"); } ``` Your nested `foreach` loops will now iterate through the student names and use the student's scores to calculate their grades, but you still need to update the code used to generate the score report. To print the student name and calculated score to the console, update the second `Console.WriteLine` statement as follows: ```cs Console.WriteLine($"{currentStudent}\t\t{currentStudentGrade}\t?"); ``` Notice that this code has replaced the letter grade assignment with a "?". You will work on automating the assignment of letter grades in the next exercise. Move the `Console.WriteLine` statement that's used to write the column labels of your score report to the location just above the outer `foreach` loop. You don't want to repeat the column headers for each student score, so you move this code to a point above the outer `foreach` loop. Take a minute to review your application code. Your full application should now match the following code: ```cs // 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?"); } ``` With the code that generates the student's score report updated; it appears that you're ready to check your work. ### Check your work In this task, you'll run the application to verify that your code logic is working as expected. Ensure that you've saved your changes to the Program.cs file. At the Terminal command prompt, type `dotnet build` and then press Enter. If you see Error or Warning messages, you need to fix them before continuing. At the Terminal command prompt, type `dotnet run` and then press Enter. Verify that your code produced the following output: ```txt Student Grade Sophia 92.2 ? Andrew 89.6 ? Emma 85.6 ? Logan 91.2 ? Press the Enter key to continue ``` Congratulations, your application has come a long way from where you started out. You are making efficient use of arrays and `foreach` iterations, and you've integrated an `if` statement that enables your code to select the correct scores array.