Использование массивов в структурах. Массивы структур. Вложенные структуры. Копирование структур
Содержание
- Вопрос/Ответ
- 1. Как объявить одномерный массив структур? Пример
- 2. Как объявить двумерный массив структур? Пример
- 3. Пример копирования (присвоения) одной структуры другой
- 4. Пример структуры, реализующей методы интерфейса
- 5. Какие особенности использования массивов в структурах? Пример использования массивов в структуре
- 6. Пример использования вложенных структур в программах
- Связанные темы
Поиск на других ресурсах:
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); }
⇑
Связанные темы
- Структуры. Общие понятия. Тип структуры. Структурная переменная. Модификаторы доступа к структурной переменной. Примеры использования структур в программе
- Структуры и методы. Инициализация структур. Конструкторы в структурах. Свойства в структурах
- Понятие класса. Описание класса. Объект класса. Конструктор класса. Деструктор. Сборка «мусора». Ключевое слово this