1333 lines
42 KiB
Markdown
1333 lines
42 KiB
Markdown
|
# 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.
|