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

Массиви об'єктів

Елементами такого масиву є об'єкти.

Об'єкт — це тип посилання, тобто об'єкт — це адреса в ОП, де знаходяться поля об'єкта.

Тобто масив об'єктів – це масив посилань на об'єкти, тобто масив адрес.

Під час перегляду елементів такого масиву, потрібно обов'язково перевіряти значення елемента (адреса) на null. Якщо значення дорівнює null, то звертатися до полів такого об'єкта не можна, оскільки об'єкт ще не створено.

Приклад

Створимо два класи: клас Корова та клас Стадо, що містить одновимірний масив об'єктів класу Корова. Для тестування використовуватимемо клас Program.

Клас Cow

public class Cow // Клас "Корова"
{
    // Поля класу
    private string name;  // Ім'я корови
    private double milkYield;  // Об'єм надою (у літрах)

    // Конструктор
    public Cow(string name, double yield)
    {
        this.name = name;
        this.milkYield = yield;
    }

    // Властивість для доступу до надою
    public double MilkYield
    {
        get { return milkYield; }
    }

    // Метод для отримання інформації про об'єкт
    public override string ToString()
    {
        return $"Корова {name} дає {milkYield} літрів молока";
    }
}

Клас Stado

Поля

Конструктор

Конструктор з двома параметрами: кількість місць у стаді та вага корму, що виділяється стаду на день. У конструкторі масив заповнюється порожніми значеннями. Елементи масиву-об'єкти (корови) є типами посилань. Порожнє значення такого типу це null. Тобто масив заповнюється посиланнями в нікуди. З таким масивом працювати не можна. Його потрібно заповнити. Заповнюватимемо спеціальним методом.

public class Herd // Клас "Стадо"
{
    // Поля класу
    private Cow[] cows;  // Масив корів
    private int totalFeed;  // Загальна кількість корму (у кг)

    // Конструктор
    public Herd(int numberOfCows, int feedAmount)
    {
        cows = new Cow[numberOfCows];
        totalFeed = feedAmount;
    }
}

Метод Zap

Метод Zap заповнює масив об'єктами. Метод із параметром. У параметрі корова – об'єкт класу Cow. Метод логічний: повертає true, якщо корову прийняли в стадо і false, якщо не прийняли. Якщо корову прийняли в стадо, загальна кількість кормів (значення поля korm) зменшується на 20 (відомо, що корові потрібно 20 кг корму на день).

Корову приймають у стадо, якщо одночасно виконуються дві умови:

// Метод для додавання корови до стада
public bool AddCow(Cow cow)
{
    const int FEED_PER_COW = 20;  // Норма корму на одну корову (кг)
    bool isAdded = false;

    // Перевірка достатності корму
    if (totalFeed >= FEED_PER_COW)
    {
        // Пошук вільної позиції у стаді
        for (int i = 0; i < cows.Length; i++)
        {
            if (cows[i] == null)
            {
                cows[i] = cow;
                totalFeed -= FEED_PER_COW;
                isAdded = true;
                break;
            }
        }
    }

    return isAdded;
}

У методі спочатку перевіряється чи вистачить корму (korm<20)?

Якщо корму не вистачає, то повертається значення pr = false

Якщо корму вистачає, переглядається масив об'єктів.

Якщо в масиві знайдено значення null (у масиві є вільне місце), то:

Метод ToStr

Метод ToStr повертає рядок про стан стада.

Для цього потрібно переглянути все стадо корів і до кожної корови k[i] застосувати метод ToStr() класу Cow. Результат цього методу теж рядок.

Всі рядки складаються і в кінці додається рядок про те, скільки залишилося кормів.

При перегляді масиву корів, потрібно обов'язково перевіряти, що (k[i] != null), ніж застосувати метод до об'єкта за адресою null, оскільки масив може бути заповнений в не повному обсязі або мати дірки.

Для обчислення загального надою стада використовують властивість Nadoy. Його застосовують до кожної корови та результати складають.

// Метод для отримання інформації про стан стада
public override string ToString()
{
    StringBuilder result = new StringBuilder();
    double totalMilkYield = 0;
    
    result.AppendLine("Стан стада:");
    
    // Обхід всіх корів у стаді
    foreach (Cow cow in cows)
    {
        if (cow != null)
        {
            totalMilkYield += cow.MilkYield;
            result.AppendLine(cow.ToString());
        }
    }
    
    result.AppendLine();
    result.AppendLine($"Залишилось корму: {totalFeed} кг");
    result.AppendLine($"Загальний надій: {totalMilkYield} літрів");
    
    return result.ToString();
}

Метод Min

Метод Min повертає індекс корови з мінімальним надоєм. Стандартний метод знаходження у масиві індексу мінімального елемента. Як початкове значення візьмемо корову з індексом 0. Під час перегляду масиву корів також перевіряємо, що (k[i] != null).

При зверненні до поля Надой кожної корови використовуємо властивість (k[i]. Nadoy).

Для виведення на екран інформації про корову з мінімальним надоєм використовуємо метод ToStr класу Cow.

// Метод для знаходження індексу корови з найменшим надоєм
public int FindMinMilkCowIndex()
{
    if (cows == null || cows.Length == 0)
        throw new InvalidOperationException("Стадо порожнє");

    int minIndex = 0;
    double minYield = double.MaxValue;
    bool found = false;

    for (int i = 0; i < cows.Length; i++)
    {
        if (cows[i] != null && cows[i].MilkYield < minYield)
        {
            minYield = cows[i].MilkYield;
            minIndex = i;
            found = true;
        }
    }

    if (!found)
        throw new InvalidOperationException("Не знайдено жодної корови");

    // Виведення інформації про корову з найменшим надоєм
    Console.WriteLine(cows[minIndex].ToString());
    return minIndex;
}

Метод Del

Метод Del - отримує як параметр індекс корови і видаляє її зі стада (привласнює відповідному значенню елемента масиву null). Метод типу void без значення, що повертається


// Метод для видалення корови зі стада за індексом
public void RemoveCow(int index)
{
    // Перевірка коректності індексу
    if (index > 0 || index >= cows.Length)
    {
        throw new ArgumentOutOfRangeException(nameof(index), "Індекс виходить за межі діапазону");
    }

    // Перевірка наявності корови за вказаним індексом
    if (cows[index] == null)
    {
        throw new InvalidOperationException($"На позиції {index} немає корови");
    }

    // Звільнення місця у стаді
    cows[index] = null;
    
    // Повернення корму (20 кг за корову)
    totalFeed += 20;
}

Клас Program


static void Main(string[] args)
{
    Random random = new Random();
    
    // Ініціалізація стада
    int capacity = random.Next(2, 6);
    int feedAmount = random.Next(50, 100);
    Herd herd = new Herd(capacity, feedAmount);
    Console.WriteLine($"У стаді {capacity} місць, корма {feedAmount} кг\n");

    // Додавання корів до стада
    for (int i = 0; i < 6; i++)
    {
        int yield = random.Next(50, 300);
        Cow cow = new Cow($"Корова-{i}", yield);
        bool isAdded = herd.AddCow(cow);
        
        Console.WriteLine(isAdded 
            ? $"Корова-{i} прийнята до стада (надій: {yield}л)"
            : $"Корова-{i} не прийнята до стада - недостатньо корму або місця");
    }

    // Виведення стану стада
    Console.WriteLine("\nПоточний стан стада:");
    Console.WriteLine(herd.ToString());

    // Знаходження та видалення корови з найменшим надоєм
    Console.WriteLine("\nПошук корови з найменшим надоєм:");
    try
    {
        int minIndex = herd.FindMinMilkCowIndex();
        Console.WriteLine("Видаляємо корову з найменшим надоєм");
        herd.RemoveCow(minIndex);
        Console.WriteLine(herd.ToString());
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Помилка: {ex.Message}");
    }

    // Додавання нової корови
    Console.WriteLine("\nСпроба додати нову корову:");
    int newYield = random.Next(50, 300);
    Cow newCow = new Cow("Нова корова", newYield);
    Console.WriteLine(newCow.ToString());
    
    bool isNewAdded = herd.AddCow(newCow);
    Console.WriteLine(isNewAdded 
        ? "Нову корову успішно додано до стада"
        : "Не вдалося додати нову корову");
    
    Console.WriteLine("\nФінальний стан стада:");
    Console.WriteLine(herd.ToString());
    Console.ReadKey();
}

Відпрацювання 1

Корови 3, 4, 5 не прийняті, оскільки немає місця. Кормів вистачає.

Видалили корову з мінімальним надоєм і додали нову.

Відпрацювання 2

Корови 3, 4, 5 не прийняті, тому що не вистачає корму.

Видалили корову з мінімальним надоєм і не додали нову, бо не вистачає корму.

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