Загрузка данных
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Serialization;
using System.IO;
using System.Xml.Linq;
namespace FileWorkPractice
{
[Serializable]
public class Person
{
public string Name { get; set; }
public int[] Grades { get; set; } = new int[5];
public double AverageGrade => Grades.Average();
public Person() { }
public Person(string name, params int[] grades)
{
Name = name;
if (grades.Length == 5)
Array.Copy(grades, Grades, 5);
}
}
class Program
{
static List<Person> LoadPeopleFromXml(string path)
{
try
{
var serializer = new XmlSerializer(typeof(List<Person>));
using (var reader = new StreamReader(path))
{
return (List<Person>)serializer.Deserialize(reader);
}
}
catch
{
try
{
XDocument doc = XDocument.Load(path);
var people = new List<Person>();
foreach (var el in doc.Descendants("Person"))
{
var person = new Person(
el.Element("Name")?.Value ?? "Без имени",
Convert.ToInt32(el.Element("Grades")?.Element("G1")?.Value ?? "0"),
Convert.ToInt32(el.Element("Grades")?.Element("G2")?.Value ?? "0"),
Convert.ToInt32(el.Element("Grades")?.Element("G3")?.Value ?? "0"),
Convert.ToInt32(el.Element("Grades")?.Element("G4")?.Value ?? "0"),
Convert.ToInt32(el.Element("Grades")?.Element("G5")?.Value ?? "0")
);
people.Add(person);
}
return people;
}
catch (Exception ex)
{
Console.WriteLine($"Ошибка загрузки данных: {ex.Message}");
return new List<Person>();
}
}
}
static void Main(string[] args)
{
const string filePath = "people.xml";
if (!File.Exists(filePath))
{
Console.WriteLine($"Файл '{filePath}' не найден.");
return;
}
var students = LoadPeopleFromXml(filePath);
if (students.Count == 0)
{
Console.WriteLine("Список учеников пуст.");
return;
}
while (true)
{
Console.Clear();
Console.WriteLine("=== Работа с файлом последовательного доступа ===");
Console.WriteLine("Выберите действие:");
Console.WriteLine("1. Показать самого лучшего ученика");
Console.WriteLine("2. Показать самого худшего ученика");
Console.WriteLine("3. Показать весь список");
Console.WriteLine("4. Показать учеников со средним баллом больше...");
Console.WriteLine("0. Выход");
switch (Console.ReadKey(true).KeyChar)
{
case '1':
ShowBestStudent(students);
break;
case '2':
ShowWorstStudent(students);
break;
case '3':
ShowAllStudents(students);
break;
case '4':
FilterByAverage(students);
break;
case '0':
return;
}
Console.WriteLine("\nНажмите любую клавишу для продолжения...");
Console.ReadKey();
}
}
private static void ShowBestStudent(List<Person> list)
{
var best = list.OrderByDescending(p => p.AverageGrade).FirstOrDefault();
if (best != null)
{
PrintPersonDetails(best, "Самый лучший ученик:");
}
}
private static void ShowWorstStudent(List<Person> list)
{
var worst = list.OrderBy(p => p.AverageGrade).FirstOrDefault();
if (worst != null)
{
PrintPersonDetails(worst, "Самый худший ученик:");
}
}
private static void ShowAllStudents(List<Person> list)
{
Console.WriteLine("\nВесь список учеников:");
Console.WriteLine("{0,-20} | {1,-6} | Оценки", "Имя", "Ср.балл");
Console.WriteLine(new string('-', 45));
foreach (var s in list.OrderByDescending(p => p.AverageGrade))
{
Console.WriteLine("{0,-20} | {1,6:F2} | {2}", s.Name, s.AverageGrade,
string.Join(", ", s.Grades));
}
}
private static void FilterByAverage(List<Person> list)
{
Console.Write("Введите минимальный средний балл: ");
if (double.TryParse(Console.ReadLine(), out double threshold))
{
var filtered = list.Where(p => p.AverageGrade > threshold)
.OrderByDescending(p => p.AverageGrade)
.ToList();
Console.WriteLine($"\nУченики со средним баллом выше {threshold}:");
if (filtered.Any())
{
ShowAllStudents(filtered);
}
else
{
Console.WriteLine("Таких учеников не найдено.");
}
}
else
{
Console.WriteLine("Некорректный ввод числа.");
}
}
private static void PrintPersonDetails(Person p, string title)
{
Console.WriteLine($"\n{title}");
Console.WriteLine($"Имя: {p.Name}");
Console.WriteLine($"Оценки: {string.Join(", ", p.Grades)}");
Console.WriteLine($"Средний балл: {p.AverageGrade:F2}");
}
}
}