Использование массивов в структурах. Массивы структур. Вложенные структуры. Копирование структур

Использование массивов в структурах. Массивы структур. Вложенные структуры. Копирование структур


Содержание


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) == 1) ? 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);
}

 


Связанные темы