Загрузка данных
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("Введите только \"с/о\" или \"б/о\".");
}
}
}
}