Загрузка данных


using System;

namespace Lab5_Structs
{
    struct Student
    {
        public int Number;          // Номер в списке группы
        public string Surname;      // Фамилия
        public string Initials;     // Инициалы
        public int BirthYear;       // Год рождения
        public string Dormitory;    // "с/о" или "б/о"
        public int[] Grades;        // 4 оценки за сессию

        public double AverageGrade()
        {
            if (Grades == null || Grades.Length == 0)
                return 0;

            double sum = 0;
            for (int i = 0; i < Grades.Length; i++)
                sum += Grades[i];

            return sum / Grades.Length;
        }

        public string GradesToString()
        {
            if (Grades == null || Grades.Length == 0)
                return "-";

            return string.Join(" ", Grades);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Student[] students = new Student[]
            {
                new Student { Number = 1, Surname = "Иванов",   Initials = "И.И.", BirthYear = 2003, Dormitory = "с/о", Grades = new int[] { 4, 5, 4, 5 } },
                new Student { Number = 2, Surname = "Петров",   Initials = "П.П.", BirthYear = 2002, Dormitory = "б/о", Grades = new int[] { 3, 4, 4, 4 } },
                new Student { Number = 3, Surname = "Сидоров",  Initials = "С.С.", BirthYear = 2004, Dormitory = "с/о", Grades = new int[] { 5, 5, 4, 5 } },
                new Student { Number = 4, Surname = "Кузнецов", Initials = "К.К.", BirthYear = 2003, Dormitory = "б/о", Grades = new int[] { 3, 3, 4, 4 } },
                new Student { Number = 5, Surname = "Смирнов",  Initials = "А.А.", BirthYear = 2002, Dormitory = "с/о", Grades = new int[] { 5, 4, 5, 5 } },
                new Student { Number = 6, Surname = "Попов",    Initials = "В.В.", BirthYear = 2004, Dormitory = "б/о", Grades = new int[] { 4, 4, 3, 4 } },
                new Student { Number = 7, Surname = "Васильев", Initials = "Д.Д.", BirthYear = 2003, Dormitory = "с/о", Grades = new int[] { 5, 4, 4, 5 } }
            };

            while (true)
            {
                Console.Clear();
                Console.WriteLine("ЛР 5. Применение структур в C#");
                Console.WriteLine("----------------------------------------");
                Console.WriteLine("1. Вывод информации о всех студентах");
                Console.WriteLine("2. Добавление нового студента");
                Console.WriteLine("3. Вывод информации о студенте по фамилии");
                Console.WriteLine("4. Вывод студентов \"с/о\" со средним баллом выше среднего по группе");
                Console.WriteLine("5. Удаление студента по фамилии");
                Console.WriteLine("0. Выход");
                Console.WriteLine("----------------------------------------");
                Console.Write("Выберите пункт меню: ");

                string choice = Console.ReadLine();
                Console.WriteLine();

                switch (choice)
                {
                    case "1":
                        ShowAllStudents(students);
                        break;
                    case "2":
                        AddStudent(ref students);
                        break;
                    case "3":
                        FindStudentBySurname(students);
                        break;
                    case "4":
                        ShowDormitoryStudentsWithHighAverage(students);
                        break;
                    case "5":
                        DeleteStudentBySurname(ref students);
                        break;
                    case "0":
                        return;
                    default:
                        Console.WriteLine("Ошибка: выбран неверный пункт меню.");
                        break;
                }

                Console.WriteLine();
                Console.WriteLine("Нажмите любую клавишу для продолжения...");
                Console.ReadKey();
            }
        }

        static void ShowAllStudents(Student[] students)
        {
            if (students.Length == 0)
            {
                Console.WriteLine("Список студентов пуст.");
                return;
            }

            PrintHeader();
            for (int i = 0; i < students.Length; i++)
                PrintStudent(students[i]);
        }

        static void AddStudent(ref Student[] students)
        {
            Student newStudent = new Student();

            newStudent.Number = students.Length + 1;

            Console.Write("Введите фамилию: ");
            newStudent.Surname = Console.ReadLine();

            Console.Write("Введите инициалы: ");
            newStudent.Initials = Console.ReadLine();

            newStudent.BirthYear = ReadInt("Введите год рождения: ");

            newStudent.Dormitory = ReadDormitoryStatus();

            newStudent.Grades = new int[4];
            Console.WriteLine("Введите 4 оценки за последнюю сессию:");
            for (int i = 0; i < 4; i++)
            {
                newStudent.Grades[i] = ReadGrade("Оценка " + (i + 1) + ": ");
            }

            Array.Resize(ref students, students.Length + 1);
            students[students.Length - 1] = newStudent;

            Console.WriteLine();
            Console.WriteLine("Новый студент успешно добавлен.");
        }

        static void FindStudentBySurname(Student[] students)
        {
            if (students.Length == 0)
            {
                Console.WriteLine("Список студентов пуст.");
                return;
            }

            Console.Write("Введите фамилию для поиска: ");
            string surname = Console.ReadLine();

            bool found = false;
            for (int i = 0; i < students.Length; i++)
            {
                if (string.Equals(students[i].Surname, surname, StringComparison.OrdinalIgnoreCase))
                {
                    if (!found)
                        PrintHeader();

                    PrintStudent(students[i]);
                    found = true;
                }
            }

            if (!found)
                Console.WriteLine("Студент с такой фамилией не найден.");
        }

        static void ShowDormitoryStudentsWithHighAverage(Student[] students)
        {
            if (students.Length == 0)
            {
                Console.WriteLine("Список студентов пуст.");
                return;
            }

            double groupAverage = GetGroupAverage(students);
            bool found = false;

            Console.WriteLine("Средний балл по группе: {0:F2}", groupAverage);
            Console.WriteLine();

            for (int i = 0; i < students.Length; i++)
            {
                if (students[i].Dormitory == "с/о" && students[i].AverageGrade() > groupAverage)
                {
                    if (!found)
                        PrintHeader();

                    PrintStudent(students[i]);
                    found = true;
                }
            }

            if (!found)
                Console.WriteLine("Таких студентов нет.");
        }

        static void DeleteStudentBySurname(ref Student[] students)
        {
            if (students.Length == 0)
            {
                Console.WriteLine("Список студентов пуст.");
                return;
            }

            Console.Write("Введите фамилию студента для удаления: ");
            string surname = Console.ReadLine();

            int index = -1;
            for (int i = 0; i < students.Length; i++)
            {
                if (string.Equals(students[i].Surname, surname, StringComparison.OrdinalIgnoreCase))
                {
                    index = i;
                    break;
                }
            }

            if (index == -1)
            {
                Console.WriteLine("Студент с такой фамилией не найден.");
                return;
            }

            for (int i = index; i < students.Length - 1; i++)
                students[i] = students[i + 1];

            Array.Resize(ref students, students.Length - 1);

            RenumberStudents(students);

            Console.WriteLine("Студент \"{0}\" удален. Остальные записи сдвинуты вверх.", surname);
        }

        static double GetGroupAverage(Student[] students)
        {
            if (students.Length == 0)
                return 0;

            double sum = 0;
            for (int i = 0; i < students.Length; i++)
                sum += students[i].AverageGrade();

            return sum / students.Length;
        }

        static void RenumberStudents(Student[] students)
        {
            for (int i = 0; i < students.Length; i++)
                students[i].Number = i + 1;
        }

        static void PrintHeader()
        {
            Console.WriteLine("------------------------------------------------------------------------------------------------");
            Console.WriteLine("{0,-5} {1,-15} {2,-10} {3,-12} {4,-8} {5,-15} {6,-10}",
                "№", "Фамилия", "Инициалы", "Год рожд.", "Общ.", "Оценки", "Средний");
            Console.WriteLine("------------------------------------------------------------------------------------------------");
        }

        static void PrintStudent(Student student)
        {
            Console.WriteLine("{0,-5} {1,-15} {2,-10} {3,-12} {4,-8} {5,-15} {6,-10:F2}",
                student.Number,
                student.Surname,
                student.Initials,
                student.BirthYear,
                student.Dormitory,
                student.GradesToString(),
                student.AverageGrade());
        }

        static int ReadInt(string message)
        {
            int value;
            while (true)
            {
                Console.Write(message);
                if (int.TryParse(Console.ReadLine(), out value))
                    return value;

                Console.WriteLine("Ошибка ввода. Повторите попытку.");
            }
        }

        static int ReadGrade(string message)
        {
            int grade;
            while (true)
            {
                Console.Write(message);
                if (int.TryParse(Console.ReadLine(), out grade) && grade >= 2 && grade <= 5)
                    return grade;

                Console.WriteLine("Оценка должна быть числом от 2 до 5.");
            }
        }

        static string ReadDormitoryStatus()
        {
            while (true)
            {
                Console.Write("Нуждается ли студент в общежитии? (с/о или б/о): ");
                string value = Console.ReadLine();

                if (value == "с/о" || value == "б/о")
                    return value;

                Console.WriteLine("Введите только \"с/о\" или \"б/о\".");
            }
        }
    }
}