Назад Вперед Зміст

Структури

Для чого потрібна структура

Часто, при написанні програм, що містять різноманітні дані, виникає потреба угруповання даних за деяким критерієм. У мові 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());
        }
    }
}

Створення змінної типу структура та її ініціалізація

Коли ми оголосили структуру, ми фактично створили власний тип даних. Для описаної вище структури створимо змінну цього типу.

  1. Це можна зробити так: Lud x;
    Якщо в цьому випадку поля мають модифікатор public, то полям структури можна присвоїти значення (за допомогою оператора присвоювання або оператора введення). І тому використовується конструкція з точкою (ім'я змінної типу структура, точка, ім'я поля). У прикладі:
    x.f="Коваль"; x.gr = 2000; x.p='м';
    
    Якщо поля структури мають модифікатор privat (за замовчуванням), то необхідно в структурі використовувати властивості (ми цього поки що робити не будемо)
  2. А можна так: Lud y = new Lud();
    У цьому випадку викликається конструктор за замовчуванням, який незалежно від модифікатора доступу полів, ініціалізує поля так: нулями – числові, порожніми рядками – рядкові.
  3. Якщо у структурі створити конструктор з параметрами, то можливе таке:
    Lud z = new Lud ("Коваль", 2000, 'м');
    
    У цьому випадку значення параметрів буде надано полям структури. Конструктор з параметрами поки що описувати не будемо.

Застосування методу структури

В описаній вище структурі є метод Vivod. Для застосування методу до змінної, яка має тип структури, також використовується конструкція з точкою. Результатом застосування у цьому прикладі буде рядок. Цей рядок можна, наприклад, вивести на екран:
  Console.WriteLine(x.Vivod());

Приклад

Потрібно сформувати список (List) студентів групи, вивести його на екран і знайти наймолодшу дівчину у цій групі. Якщо у групі всі юнаки, вивести повідомлення.

Структура Lud:

  1. Поля:
    • Прізвище (string)
    • Рік народження (int)
    • Пол (char)
  2. Метод, який повертає рядок із значеннями полів

Програма:

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 Приймає пусту фамілію Попередження Не перевіряє коректність фамілії

Висновки:

Назад Вперед Зміст