C#. Використання масивів у структурах. Масиви структур. Вкладені структури. Копіювання структур




Використання масивів у структурах. Масиви структур. Вкладені структури. Копіювання структур


Зміст


Пошук на інших ресурсах:

1. Як оголосити одновимірний масив структур? Приклад

Нижче наводиться програмний код, що виконує такі дії:

  • оголошує структуру типу Point, яка описує координати точки на площині. Структура містить внутрішні поля (змінні x, y), метод доступу до змінних, властивості запису в структуру і читання даних зі структури;
  • оголошує масив MP з 10 екземплярів (об’єктів) структур типу Point;
  • демонструє використання масиву MP в деякому методі.

Оголошення структури типу Point:

// структура, що описує точку на координатній площині
struct Point
{
    int x, y;

    public void SetXY(int nx, int ny)
    {
        x = nx;
        y = ny;
    }

    // властивість X
    public int X
    {
        get { return x; }
        set { x = value; }
    }

    // властивість Y
    public int Y
    {
        get { return y; }
        set { y = value; }
    }
}

Оголошення масиву MP та його використання в програмному коді деякого обробника події (додаток типу Windows Forms).

// одновимірний масив структур типу Point
Point[] MP; // оголошення змінної типу "масив Point"

// виділити пам'ять для 10 структур типу Point
MP = new Point[10];

// Занулити значення усіх точок масиву MP
for (int i = 0; i < 10; i++)
    MP[i].SetXY(0, 0); // використати метод SetXY структури

// Записати деякі значення в масив точок Point
for (int i = 0; i < 10; i++)
{
    // використати властивості X та Y
    MP[i].X = i * 2;
    MP[i].Y = i + 1;
}

 

2. Як оголосити двовимірний масив структур? Приклад

Нижче наведено приклад оголошення та використання двовимірного масиву типу Point (див. попередній пункт).

// Оголошення та використання двовимірного масиву структур
// розміром 10*20

// 1. Виділити пам'ять для 10 рядків
Point[][] MP2 = new Point[10][];

// 2. В кожному рядку виділити пам'ять для 20 екземплярів структур
for (int i=0; i<10; i++)
    MP2[i] = new Point[20];

// 3. Заповнити поля структур довільними значеннями
for (int i = 0; i < 10; i++)
    for (int j = 0; j < 20; j++)
    {
        MP2[i][j].X = i + j * 3;
        MP2[i][j].Y = j - i * 2;
    }

 

3. Приклад копіювання (присвоєння) однієї структури іншій

Нехай задано оголошення структури Date, яка визначає дату.

struct Date
{
    public int day; // число
    public int month; // місяць
    public int year; // рік

    public Date(int nday, int nmonth, int nyear)
    {
        day = nday;
        month = nmonth;
        year = nyear;
    }
}

У коді нижче продемонстровано копіювання однієї структури іншій.

// копіювання однієї структури іншій
Date St1;
Date St2;

St1.day = 14;
St1.month = 1;
St1.year = 1972;

// копіювання структур, структури розміщуються в різних ділянках пам'яті
St2 = St1;

int d, m, y;

d = St2.day;   // d = 14
m = St2.month; // m = 1
y = St2.year;  // y = 1972
St1.month = 5; // St1.month = 5; St2.month = 1;

Як видно з прикладу, екземпляри структур розміщуються в різних ділянках пам’яті.

 

4. Приклад структури, що реалізує методи інтерфейсу

Як відомо, у структурах можна реалізовувати методи інтерфейсу. У прикладі нижче наведено використання інтерфейсних методів у структурах.



Нехай дано інтерфейс IPoint та структуру типу Point, які мають таке оголошення

// інтерфейс, що буде використаний в структурі Point
interface IPoint
{
    // методи інтерфейсу
    bool IsPointOnPoint(int x1, int y1, int x2, int y2);
}

// структура Point успадковує інтерфейс
struct Point : IPoint
{
    public int x, y;

    // явно заданий конструктор
    public Point(int nx, int ny)
    {
        x = nx;
        y = ny;
    }

    // Реалізація методу інтерфейсу в структурі
    public bool IsPointOnPoint(int x1, int y1, int x2, int y2)
    {
        bool f;
        f = false;
        if ((x1 == x2) && (y1 == y2))
            f = true;
        return f;
    }
}

В інтерфейсі описується метод IsPointOnPoint(), який має бути реалізований в структурі Point. Структура Point успадковує інтерфейс IPoint. Метод IsPointOnPoint() визначає, чи дві точки лежать одна на одній (мають однакові координати x, y).

Нижченаведений програмний код демонструє використання структури типу Point та виклик інтерфейсного методу IsPointOnPoint().

// Використання структури, що успадковує інтерфейс
Point P;
bool res;

P.x = P.y = 0;

// виклик інтерфейсного методу IsPointOnPoint(), що реалізований в структурі Point
res = P.IsPointOnPoint(3, 5, 6, 6); // res = false
res = P.IsPointOnPoint(3, 7, 3, 7); // res = true

 

5. Які особливості використання масивів у структурах? Приклад використання масивів у структурі

Якщо в структурі оголошено масив, то для нього обов’язково має виділятись пам’ять з допомогою оператора new.

Приклад. Нехай задано структуру Cars, що описує парк автомобілів. У структурі оголошується декілька масивів, що визначають характеристики автомобілів.

// структура, що описує автомобільний парк
struct Cars
{
    public int n; // кількість автомобілів
    public string[] model; // марка автомобіля
    public int[] year; // рік випуску
    public float[] engine; // потужність двигуна
    public string[] country; // країна виготовлення
    public bool[] on_the_run; // true - автомобіль на ходу
}

У нижченаведеному програмному коді демонструється використання масивів у структурі

// використання масивів у структурах
Cars C; // оголошення структурної змінної

// формування масиву з 10 автомобілів
C.n = 10;

// виділення пам'яті для масивів у структурах - обов'язково
C.model = new string[C.n];
C.year = new int[C.n];
C.engine = new float[C.n];
C.country = new string[C.n];
C.on_the_run = new bool[C.n];

// заповнення масивів довільними значеннями
for (int i = 0; i < C.n; i++)
{
    C.model[i] = "Model - " + (i + 1).ToString();
    C.year[i] = 2000 + i;
    C.engine[i] = 1.2f + 0.1f * i;
    C.country[i] = "Country - " + (i + 1).ToString();
    C.on_the_run[i] = ((i % 2) == 0) ? true : false; // true - парне; false - непарне
}

 

6. Приклад використання вкладених структур у програмах

У прикладі оголошено три структури з іменами Date, WorkerName, Worker. Структура Worker описує інформацію про працівника і містить дві вкладені структури Date і WorkerName. Також структура Worker містить масив чисел типу float.

// вкладені структури
// структура, що описує дату
struct Date
{
    public int day; // день
    public int month; // місяць
    public int year; // рік
}

// структура, що описує ім'я працівника
struct WorkerName
{
    public string name; // прізвище
    public string surname; // ім'я
    public string patronymic; // по-батькові
}

// структура, що описує інформацію про працівника
struct Worker
{
    public WorkerName Name; // прізвище та ім'я
    public Date BirthDate; // дата народження
    public string code; // ідентифікаційний код
    public int rank; // розряд працівника
    public float[] salary; // нарахована зарплата по місяцях за рік
}

Використання структури Worker в іншому програмному коді

// масив з 5 структур типу Worker
Worker[] W = new Worker[5];

// виділення пам'яті для поля salary, яке є масивом - обов'язково!
for (int i=0; i<5; i++)
    W[i].salary = new float[12];

// заповнення масиву W
for (int i = 0; i < 5; i++)
{
    W[i].Name.name = "Name of worker - " + i.ToString();
    W[i].Name.surname = "Surname of worker - " + i.ToString();
    W[i].Name.patronymic = "Patronymic of worker - " + i.ToString();
    W[i].BirthDate.day = 1;
    W[i].BirthDate.month = 1;
    W[i].BirthDate.year = 1972;
    W[i].code = "1234567890";
    W[i].rank = i + 2;
    for (int j = 0; j < 12; j++)
        W[i].salary[j] = (float)(i * 500 + 220.00);
}

 


Зв’язані теми