Write a program that does the following for 15 students:
Reads in 3 marks for each student, however, you need to make provision that the user
might be typing invalid values – when an invalid mark is entered, the user should be prompted to re-enter a valid mark. This should happen continuously until you have three valid marks for each student (valid marks are marks between 0 and 100; 0 and 100 included). Your prompt message to the user should indicate which number is being requested
Calculates and displays the highest mark for each student.
Finds and displays the highest mark in the class.
Adapt your code to also read in the name of each student, and add the name to the display
of the highest mark for each student
When displaying the overall highest mark, the name of the relevant student should also be
displayed.
Update your solution to make use of the getMark method. In this updated version, your prompt messages does
not have to indicate which mark is being requested.
using System;
using System.Linq;
namespace ConsoleApp4
{
class Program
{
static void Main()
{
Student[] students = new Student[2];
for (int i = 0; i < students.Length; i++)
students[i] = EnterStudent();
Console.WriteLine(string.Join("\n", students.Select(x => x.ToString())));
students = students.OrderByDescending(s => s.GetMark()).ToArray();
Console.WriteLine($"The overall highest mark: {students.First().GetMark()}, Student name: {students.First().Name}");
}
static Student EnterStudent()
{
Console.Write("Enter student name: ");
string name = Console.ReadLine();
int[] marks = EnterMarks();
return new Student(name, marks);
}
static int[] EnterMarks()
{
while (true)
{
Console.Write("Enter 3 marks separated by a space: ");
string input = Console.ReadLine();
var splitted = input.Split(' ');
if (splitted.Length != 3)
{
Console.WriteLine("Enter only 3 values separated by a space.");
continue;
}
int[] values = splitted.Select(x => int.TryParse(x, out int mark) ? mark : -1).ToArray();
if (values.Any(x => x < 0 || x > 100))
{
Console.WriteLine("Some of the values are incorrect, enter only valid marks from 0 to 100");
continue;
}
return values;
}
}
}
class Student
{
public string Name { get; private set; }
private int[] marks = new int[3];
public Student(string name, int[] marks)
{
Name = name;
this.marks = marks;
}
public int GetMark()
{
return marks?.Max() ?? 0;
}
public override string ToString()
{
return $"Name: {Name}, Marks: {string.Join(" ", marks)}, Highest mark: {GetMark()}";
}
}
}
Comments
Leave a comment