Часто, при написанні програм, що містять різноманітні дані, виникає потреба угруповання даних за деяким критерієм. У мові C# при цьому використовуються структури.
Наприклад, структура, яка містить таку інформацію про людину: прізвище (рядковий тип), рік народження (ціле число), стать (символ).
Оголосити структуру – це фактично оголосити новий тип даних.
При оголошенні структури використовується ключове слово struct.
Загальна форма оголошення структури:
struct Ім'я_структури
{
оголошення членів
}
|
Ім'я структури має починатися з великої літери.
Члени структури: поля, методи, конструктори та ін.
При описі стандартних полів (якщо не писати модифікатора доступу) використовується модифікатор private. У прикладі ми використовуємо модифікатор public, щоб мати доступ до полів.
public struct Student // Опис структури "Студент"
{
// Поля структури
public string LastName; // Прізвище студента
public int BirthYear; // Рік народження
public char Gender; // Стать ('м' - чоловік, 'ж' - жінка)
// Конструктор
public Student(string lastName, int birthYear, char gender)
{
LastName = lastName;
BirthYear = birthYear;
Gender = char.ToLower(gender); // Приводимо до нижнього регістру
}
// Метод для отримання інформації
public string GetInfo()
{
return $"{LastName} {BirthYear} {Gender}";
}
}
Метод – це функція, яка може мати параметри (може і не мати) та повертати (або не повертати) одне або кілька значень. Ця функція може використовувати поля структури та може мати власні змінні. У прикладі метод Vivod без параметрів повертає рядок, який містить значення полів структури.
public override string ToString()
{
return $"{LastName} {BirthYear} {Gender}";
}
Структура може бути описана поза класом, але всередині простору імен. Тоді вона буде доступна із усіх класів. Приклад нижче:
namespace StudentManagement
{
///
/// Структура, що представляє студента
///
public struct Student
{
///
/// Прізвище студента
///
public string LastName { get; }
///
/// Рік народження
///
public int BirthYear { get; }
///
/// Стать ('ч' - чоловіча, 'ж' - жіноча)
///
public char Gender { get; }
///
/// Ініціалізує новий екземпляр структури Student
///
public Student(string lastName, int birthYear, char gender)
{
LastName = lastName;
BirthYear = birthYear;
Gender = char.ToLower(gender);
}
///
/// Повертає рядкове представлення об'єкта Student
///
public override string ToString()
{
return $"{LastName} {BirthYear} {Gender}";
}
}
}
Структура може бути описана всередині класу, але поза методами. Тоді вона буде доступна лише у цьому класі. У прикладі нижче структура описана всередині класу Program.
using System;
namespace StudentRecords
{
class Program
{
// Student structure definition
public struct Student
{
// Fields with proper naming
public string LastName; // Student's last name
public int BirthYear; // Year of birth
public char Gender; // Gender ('m' for male, 'f' for female)
// Method to display student information
public string DisplayInfo()
{
return $"{LastName} {BirthYear} {Gender}";
}
}
static void Main(string[] args)
{
// Example usage
Student student1 = new Student();
student1.LastName = "Ivanov";
student1.BirthYear = 2000;
student1.Gender = 'm';
Console.WriteLine(student1.DisplayInfo());
}
}
}
Коли ми оголосили структуру, ми фактично створили власний тип даних. Для описаної вище структури створимо змінну цього типу.
x.f="Коваль"; x.gr = 2000; x.p='м'; |
Lud z = new Lud ("Коваль", 2000, 'м');
|
В описаній вище структурі є метод Vivod. Для застосування методу до змінної, яка має тип структури, також використовується конструкція з точкою. Результатом застосування у цьому прикладі буде рядок. Цей рядок можна, наприклад, вивести на екран:
Console.WriteLine(x.Vivod()); |
Потрібно сформувати список (List) студентів групи, вивести його на екран і знайти наймолодшу дівчину у цій групі. Якщо у групі всі юнаки, вивести повідомлення.
Структура Lud:
Програма:
class Program
{
struct Student // Student structure
{
// Fields
public string LastName; // Last name
public int BirthYear; // Year of birth
public char Gender; // Gender (w/m)
// Method to display student info
public string GetInfo()
{
return $"{LastName} {BirthYear} {Gender}";
}
}
static void Main(string[] args)
{
// Student list
List<Student> students = new List<Student>();
Student currentStudent;
Student youngestFemale = new Student();
const int studentCount = 4;
// Input student data
Console.WriteLine("Enter student data (Last name, birth year, gender):");
for (int i = 0; i < studentCount; i++)
{
currentStudent.LastName = Console.ReadLine();
currentStudent.BirthYear = Convert.ToInt32(Console.ReadLine());
currentStudent.Gender = Convert.ToChar(Console.ReadLine());
students.Add(currentStudent);
}
// Display all students
Console.WriteLine("\nStudent list:");
foreach (var student in students)
{
Console.WriteLine(student.GetInfo());
}
// Find youngest female student
foreach (var student in students)
{
if (student.Gender == 'w' &&
(youngestFemale.BirthYear == 0 || student.BirthYear > youngestFemale.BirthYear))
{
youngestFemale = student;
}
}
// Display result
if (youngestFemale.BirthYear != 0)
Console.WriteLine($"\nYoungest female student: {youngestFemale.GetInfo()}");
else
Console.WriteLine("\nNo female students found");
}
}| № | Тестовий сценарій | Вхідні дані | Очікуваний результат | Статус | Примітки |
|---|---|---|---|---|---|
| 1 | Нормальні дані (2 дівчини) | Іванова 2000 w Петров 1999 m Сидорова 2001 w Козлов 1998 m | Student list: Іванова 2000 w Петров 1999 m Сидорова 2001 w Козлов 1998 m Youngest female student: Сидорова 2001 w | Успішно | Коректно знаходить наймолодшу студентку |
| 2 | Відсутність дівчат | Іванов 2000 m Петров 1999 m Сидоров 2001 m Козлов 1998 m | Student list: Іванов 2000 m Петров 1999 m Сидоров 2001 m Козлов 1998 m No female students found | Успішно | Коректно обробляє відсутність дівчат |
| 3 | Одна дівчина | Іванова 2000 w Петров 1999 m Сидоров 2001 m Козлов 1998 m | Student list: Іванова 2000 w Петров 1999 m Сидоров 2001 m Козлов 1998 m Youngest female student: Іванова 2000 w | Успішно | Коректно працює з однією дівчиною |
| 4 | Всі дівчата | Іванова 2000 w Петрова 1999 w Сидорова 2001 w Козлова 1998 w | Student list: Іванова 2000 w Петрова 1999 w Сидорова 2001 w Козлова 1998 w Youngest female student: Сидорова 2001 w | Успішно | Коректно працює зі списком лише дівчат |
| 5 | Помилки вводу | Іванова дві тисячі w (некоректний рік) | FormatException | Помилка | Не обробляє нечислові значення року |
| 6 | Пусті значення | (пусто) 2000 w | Приймає пусту фамілію | Попередження | Не перевіряє коректність фамілії |