The C Sharp Grade Book Application is a designed to allow instructors to create gradebooks, add students to those grade books, add grades to those students, and calculate statics such as GPA.
-- Gif of working Application
- "Create
Name of GradebookIs this Gradebook Weighted (true/false)" : Creates a new gradebook with the provided name - "Help" : gives you a list of all valid commands within the given context
- "Load
Name of GradeBook" - "Quit" : Closes the application
- "Add
Name of StudentType of StudentType of Enrollment" : Adds a new student to the open gradebook - "Remove
Name of Student" : Removes a student with the provided name from the gradebook. (if a student with that name exists in the gradebook) - "List" : Lists all students in the open gradebook
- "AddGrade
Name of StudentScore" : Adds to the given value to provided student's grades. - "RemoveGrade
Name of StudentScore" : Removes the given value from the provided student's grade. (if that value exists in the stundent's grades) - "Statistics all" : Provides statistical output for all students in the open gradebook
- "Statistics
Name of Student" : Provides statistical out put for the provided student. (if that student exists) - "Help" : Gives you a list of all valid commands within the given context
- "Save" : Saves the currently open gradebook
- "Close" : Closes the gradebook
If you want to use Visual Studio (highly recommended for Windows users) follow the following steps:
- If you already have Visual Studio installed make sure you have .Net Core installed by running the "Visual Studio Installer" and making sure ".NET Core cross-platform development" is checked
- If you need to install visual studio download it at https://www.microsoft.com/net/core#windowsvs2017 On the workloads screen make sure ".NET Core cross-platform development" is checked
- To run the application simply press the Start Debug button (green arrow) or press F5
- To run the tests go to "Test" and select "Run All Tests" (you might need to goto "Test" > "Windows" > "Test Explorer" to display the results if you closed the test explorer.)
If you would rather use something other than Visual Studio
- Install the .Net Core SDK from https://www.microsoft.com/net/download/core once that installation completes you're ready to roll!
- To run the application go into the GradeBook project folder and type
dotnet run - To run the tests go into the GradeBookTests project folder and type
dotnet test /verbosity:quiet(for OSX users usedotnet test --verbosity:quietinstead)
- Add support for Ranked Grading
- Add support for Weighted GPAs
Note: this isn't the only way to accomplish this, however; this is what the project's tests are expecting. Implimenting this in a different way will likely result in being marked as incomplete / incorrect.
-
Add support for Ranked Grading
-
Creating The
GradeBookTypeEnum- Create a new Enum
GradeBookType.- This should be located in the
Enumsdirectory. - This should use the
GradeBooks.Enumsnamespace. - This should use the
publicaccess modifier. - This should contain the values
Standard,Ranked,ESNU,OneToFour, andSixPoint.
- This should be located in the
- Create a new Enum
-
Add
Typeproperty- Add a new property
TypetoBaseGradeBook- This should use the name
Type. - This should be of type
GradeBookType. - This should use the
publicaccess modifier.
- This should use the name
- Add a new property
-
Creating the
StandardGradeBookclass- Create a class
StandardGradeBook(Once this change is made code will not compile until completion of the next task)- This should be located in the
GradeBooksdirectory. - This should use the
GradeBook.GradeBooksnamespace. - This should inherit the
BaseGradeBookclass.
- This should be located in the
- Create a constructor for
StandardGradeBook- This should accept a parameter
nameof typestring. - This should set
TypetoGradeBookType.Standard. - This should call the
BaseGradeBookconstructor by putting: base(name)after the constructor declaration (this was not covered in the course, it calls the constructor of the inheritted class.)_
- This should accept a parameter
- Create a class
-
Creating the
RankedGradeBookclass- Create a class
RankedGradeBook_(Once this change is made code will not compile until completion of the next task)- This should be located in the
GradeBooksdirectory. - This should use the
GradeBook.GradeBooksnamespace. - This should inherit the
BaseGradeBookclass.
- This should be located in the
- Create a constructor for
RankedGradeBook- This should accept a parameter
nameof typestring. - This should set
TypetoGradeBookType.Ranked. - This should call the
BaseGradeBookconstructor by putting: base(name)after the constructor declaration (this was not covered in the course, it calls the constructor of the inheritted class.)
- This should accept a parameter
- Create a class
-
Add Multiple GradeBookType support to
BaseGradeBook- Update
BaseGradeBook'sLoadmethod (All code for this take will be written in place of theLoadmethod's return statement)- This should get the GradeBookType using
Enum.Parse(typeof(GradeBookType), jobject.GetValue("Type").ToString(), true);(this was not covered in the course, it will take the saved file and attempt to get the type of the gradebook from it) - If the GradeBookType is
GradeBookType.Standardcreate the gradebook usingJsonConvert.DeserializeObject<StandardGradeBook>(json);(this was also not covered in the course, it will take the saved file and create aStandardGradeBookobject based on that file) - If the GradeBookType is
GradeBookType.Rankedcreate the gradebook usingJsonConvert.DeserializeObject<RankedGradeBook>(json);(this was also not covered in the course, it will take the saved file and create a RankedGradeBook object based on that file) - If the GradeBookType is not yet handled throw an
InvalidOperationExceptionwith message of "The gradebook you've attempted to load is not in a supported type of gradebook."; - return the created gradebook.
- This should get the GradeBookType using
- Update
-
Override
RankedGradeBook'sGetLetterGrademethod- Provide the appropriate grades based on where input grade compares to other students.
(One way to solve this is to figure out how many students make up 20%, then loop through all the grades and check how many were more than the input average, every N students where N is that 20% value drop a letter grade.)
- If there are less than 5 students throw an
InvalidOperationException. - return A if the input grade is in the top 20% of the class.
- return B if the input grade is between the top 20 and 40% of the class.
- return C if the input grade is between the top 40 and 60% of the class.
- return D if the input grade is between the top 60 and 80% of the class.
- return F if the grade is below the top 80% of the class.
- If there are less than 5 students throw an
- Provide the appropriate grades based on where input grade compares to other students.
(One way to solve this is to figure out how many students make up 20%, then loop through all the grades and check how many were more than the input average, every N students where N is that 20% value drop a letter grade.)
-
Override
RankedGradeBook'sCalculateStatisticsmethod- Short circuit the method if there are less than 5 students.
- If there are less than 5 students write "Ranked grading requires at least 5 students." to the Console.
- If there are 5 or more students call the base class's
CalculateStatisticsmethod using 'base.CalculateStatistics'.
- Short circuit the method if there are less than 5 students.
-
Override
RankedGradeBook'sCalculateStudentStatisticsmethod- Short circuit the method if there are less than 5 students.
- If there are less than 5 students write "Ranked grading requires at least 5 students." to the Console.
- If there are 5 or more students call the base class's
CalculateStudentStatisticsmethod using 'base.CalculateStudentStatistics'.
- Short circuit the method if there are less than 5 students.
-
Update
StartingUserInterface'sCreateCommandmethod- Update
CreateCommand's Conditions- When checking the
parts.Lengthit should check thatparts.Lengthis not 3. - If
parts.Lengthis not 3 write "Command not valid, Create requires a name and type of gradebook." to Console.
- When checking the
- return a new GradeBook based on the provided type
- If the value of
parts[2]is "standard" return a newly instantiatedStandardGradeBookusing thenamevariable. - If the value of
parts[2]is "ranked" return a newly instantiatedRankedGradeBookusing thenamevariable. - If the value of
parts[2]doesn't match the above write the value ofparts[2]followed by " is not a supported type of gradebook, please try again" to console, then escape the method.
- If the value of
- Update
-
Update
StartingUserInterfaces'sHelpCommandmethod- Change where
HelpCommandoutlines the "create" command to write "Create 'Name' 'Type' - Creates a new gradebook where 'Name' is the name of the gradebook and 'Type' is what type of grading it should use." to console.
- Change where
-
Make the
BaseGradeBookclass abstract- Add the
abstractkeyword to theBaseGradeBookdeclarition.
- Add the
-
-
Add support for weighted GPAs
-
Add
IsWeightedproperty toBaseGradeBook- Create a new
boolproperty namedIsWeightedinBaseGradeBook- This should use the public access modifier.
- This should be of type
bool. - This should be named
IsWeighted.
- Create a new
-
Refactor constructor of
BaseGradeBookNote, once this group of tasks is begun the code will compile until the entire group of tasks is complete.- Add a
boolto theBaseGradeBookconstructor- This should be of type
bool. - This should be the second parameter.
- This should be of type
- Set
IsWeightin theBaseGradeBookconstructor- Set the
IsWeightedproperty using theboolparameter.
- Set the
- Add a
boolto theStandardGradeBookconstructor- This should be of type
bool. - This should be the second parameter.
- This will require the bool to be added to the call to the base constructor.
- This should be of type
- Add a
boolto theRankedGradeBookconstructor- This should be of type
bool. - This should be the second parameter.
- This will require the bool to be added to the call to the base constructor.
- This should be of type
- Update
StartingUserInterface.CreateCommandcondition- Change the condition checking if
partsis not equal to 3 to be is not equal to 4.
- Change the condition checking if
- Update
StartingUserInterface.CreateCommandto acceptIsWeighted- This should use
parts[3]for the last parameter where the gradebooks are instantiated. - Update the message provided by this condition to write to console "Command not valid, Create requires a name, type of gradebook, if it's weighted (true / false).".
- This should use
- Add a
-
Update
BaseGradeBook.GetGPA- Add 1 point to GPA when student is
HonorsorDualEnrolled.
- Add 1 point to GPA when student is
-
Update
HelpCommand- Change where the
HelpCommandoutlines the "create" command to say "Create 'Name' 'Type' 'Weighted' - Creates a new gradebook where 'Name' is the name of the gradebook, 'Type' is what type of grading it should use, and 'Weighted' is whether or not grades should be weighted (true or false).".
- Change where the
-
You've compeleted the tasks of this project, if you want to continue working on this project some next steps would be to add support for some of the other grading formats, set Save to run with Add/Removing students and grades, etc.
Otherwise now is a good time to continue on the C# path to expand your understanding of the C# programming language or start looking into the User Interface options of C# whether that's ASP.NET (web), XAML (applications), DirectX (Graphically intense applications), etc