Можно создать массив структур
BestProg
Использование массивов в структурах. Массивы структур. Вложенные структуры. Копирование структур
Содержание
Поиск на других ресурсах:
1. Как объявить одномерный массив структур? Пример
Ниже приведен программный код, выполняющий следующие действия:
Объявление структуры типа Point :
Объявление массива MP и его использование в программном коде некоторого обработчика события (приложение типа Windows Forms ).
⇑
2. Как объявить двумерный массив структур? Пример
Ниже приведен пример объявления и использования двумерного массива типа Point (см. предшествующий пункт).
⇑
3. Пример копирования (присвоения) одной структуры другой
В следующем коде продемонстрировано копирование одной структуры другой.
Как видно из примера, экземпляры структур размещаются в разных участках памяти.
⇑
4. Пример структуры, реализующей методы интерфейса
Как известно, в структурах можно реализовывать методы интерфейса. В примере ниже приведено использование интерфейсных методов в структурах.
⇑
5. Какие особенности использования массивов в структурах? Пример использования массивов в структуре
В нижеследующем программном коде демонстрируется использование массивов в структуре
⇑
6. Пример использования вложенных структур в программах
Использование структуры Worker в другом программном коде
Документация
Массивы структур
Когда у вас есть данные, которые вы хотите организовать по наименованию, можно использовать структуры, чтобы сохранить их. Структуры хранят данные в названных полях контейнеров, к которым можно затем получить доступ именами, которые вы задаете. Используйте запись через точку, чтобы создать, присвоить, и получить доступ к данным в полях структуры. Если значение, сохраненное в поле, является массивом, то можно использовать индексацию массива, чтобы получить доступ к элементам массива. Когда вы храните несколько структур как массив структур, можно использовать индексацию массива и запись через точку, чтобы получить доступ к отдельным структурам и их полям.
Создайте скалярную структуру
Доступ к значениям в полях
После того, как вы создаете поле, можно продолжить использовать запись через точку, чтобы получить доступ и изменить значение, которое она хранит.
Индексируйте в нескалярный массив структур
Массивы структур могут быть нескалярными. Можно создать массив структур, имеющий любой размер, пока каждая структура в массиве имеет те же поля.
В результате patient 1 2 массив структур с содержимым, показанным в схеме.
Массив структур имеет следующие свойства:
Все структуры в массиве имеют то же количество полей.
Все структуры имеют те же имена полей.
Поля того же имени в отличных структурах могут содержать различные типы или размеры данных.
Если вы добавляете новую структуру в массив, не задавая все его поля, то незаданные поля содержат пустые массивы.
Чтобы индексировать в массив структур, используйте индексацию массива. Например, patient(2) возвращает вторую структуру.
Чтобы получить доступ к полю, используйте индексацию массива и запись через точку. Например, возвратите значение billing поле для второго пациента.
Примечание
Массив структур
Можно как угодно пытаться дать определение, но вряд ли любое из определений четко покажет и поможет разобраться начинающему.
Структуры очень похожи на массивы.
Если массивы по определению могут содержать внутри себя множество однотипных элементов.
То внутри структур можно описать разное количество разнотипных элементов. А сами по себе структуры являются пользовательским типом данных.
===========================
int A [ 10 ]; // Десять элементов и все элементы типа int
struct MyStruct
<
int A ;
char C [ 10 ];
>;
MyStruct obj1 [ 10 ]; //Десять элементов типа MyStruct
Иногда известно сколько элементов должен содержать массив и в задачах по программированию можно увидеть такие слова: “Создать массив из N структур” и т.п. В простых задачах ничего сложного нет. Часто студенты предлагают ввести N с клавиатуры и при вводе этого N создают массив структур из N элементов.
==================
MyStruct * obj1 ; //obj1 есть указатель на MyStruct;
int N ; //N есть число элементов массива
cin >> N ; //Присваивание в N значения
obj1 =new MyStruct [ N ]; //Динамическое выделение памяти под массив структур из N элементов
//Некоторый код
delete [] obj1 ; //Освобождение памяти
==================
Когда массив структур состоит из некоторого множества элементов, то для работы как и с обычным массивом используют циклы. Думаю имеет смысл разбивать ввод данных и вывод данных в отдельные функции. В приведенном ниже примере будет создана простая структура, которая представляет собой тип данных Продуктовый магазин.
Продуктовый магазин представляет из себя одно целое. В магазине могут продавать разные продукты. У каждого продукта есть название, есть цена. В магазине есть разные продавцы, которые продают товар. К каждому продавцу подходит покупатель, который покупает товар. Можно долго и много расписывать что происходит на самом деле., но я остановлюсь на том что написал.
Чтобы объяснить компилятору что нам нужно, стоит навести некоторый порядок в вышеизложенном.
Я разобью на поэтапное изложение кода, чтобы большинство трудных читателей попробовали понять суть.
Всё что есть в магазине можно объединить под названием нужные данные.
==================
struct Shop
<
char name [ 20 ]; //Название продукта
float cena ; //Цена продукта
char prodav [ 30 ]; //Продавец
char pokup [ 30 ]; //Покупатель
int Date [ 3 ]; //Дата продажи
>;
==================
Дата продажи описана как массив из трех целочисленных чисел. Остальным переменным соответствуют различные типы, удобные для обработки переменных
После того как определились и описали нужную структуру обязательно создается переменная, тип которой есть имя структуры. Вводятся данные в элементы структуры. Нижеприведенный код это всё то что написано чуть выше.
=================
#include
/*ОПИСЫВАЕМАЯ СТРУКТУРА*/
struct Shop
<
char name [ 20 ];
int cena ;
char prodav [ 30 ];
char pokup [ 30 ];
int date [ 3 ];
>;
/*ГЛАВНАЯ ФУНКЦИЯ*/
int main ()
<
int N ;
cout “Введи N: “ ;
cin >> N ;
Shop * M1 =new Shop [ 10 ]; //Выделение памяти под массив структур из 10 элементов
Дальше необходимо обеспечить ввод данных в элементы массива структур. Ввод и вывод данных удобно обеспечивать через отдельные функции, т.к. нередко создаются пользовательские меню с возможностью выбора обработки структур. Структура очень похожа на массив и передается вовнутрь функции таким же образом. Можно использовать указатель и нужно сделать так, чтоб функция знала размер массива структур. Размер массива структур функции нужно знать для того, чтобы циклы обработки массива структур знали конечную точку своего выполнения.
//Второй параметр – размерность массива
Ниже написан полноценный код, который содержит три функции. Главная функция и две функции, которые обрабатывают данные. В качестве обрабатываемых данных выступает массив структур. Одна функция обеспечивает ввод данных в массив структур. Вторая функция выводит массив структур на экран.
Приведенный пример вывода структур удобен в одних случаях и неудобен в других. Лично мне предпочтительнее смотреть на данные структуры как на таблицу данных. Маленькое окошко Dos слишком красивую таблицу создать не даст, но небольшую таблицу в виде таблицы создать несложно. Легко можно создать подсказку сверху, в которой по очереди прописать названия колонок. И легко вывести на экран небольшую таблицу
Динамический массив структур C++
Динамический массив структур мы разберем на примере. Нам предстоит решить следующую задачу: пользователь вводит данные о спонсорах какого-то проекта. А именно – фамилию, имя и сумму пожертвования. После каждого ввода данных программа задает вопрос: продолжить ввод или нет.
Каждый раз, когда пользователь выбирает “продолжить” – надо выделить участок памяти еще под одну структуру. Таким образом динамический массив структур будет расти, пока пользователь не приостановит ввод. После завершения ввода, вывести таблицу с данными о спонсорах на экран.
Чтобы создать динамический массив структур, надо, как и для создания обычного динамического массива, объявить указатель. Только вместо встроенного типа указать дескриптор структуры – строка 20. Этот указатель пока ни на что не указывает. Можно было бы выделить память под массив структур сразу. Например:
Но мы организуем более гибкое выделение памяти под этот динамический массив структур – она будет выделяться по необходимости. Есть один спонсор – выделится память под одну структуру. Есть 3 спонсора – память выделится сначала под одну структуру, потом под вторую и далее под третью. Все будет зависеть от того – решит ли пользователь продолжить ввод.
В строках 21 – 22, объявлены переменные sponsorAmount – счетчик количества спонсоров и YesOrNot – выбор пользователя (продолжить или прервать ввод).
Надо помнить, что указатель OurSponsors уже ссылается на участок памяти с записанными данными. Поэтому не получится просто перевыделить память. Сначала необходимо позаботиться о сохранении данных. Посмотрите на блок else строки 48 – 59. В строке 50 создаем временный указатель. Под него выделяем память для amount + 1 структур (т.е. на одну структуру больше, чем приняла функция). Далее копируем данные из принятого объекта.
Последний объект массива структур tempObj останется незаполненным. Когда данные скопированы, освобождаем память Obj – строка 57 и записываем в этот указатель новый адрес. Теперь он будет указывать на память, в которой есть сохраненные данные и дополнительный выделенный участок памяти для заполнения новыми данными.
Когда пользователь решит больше не вводить данные – он нажимает ноль. После этого сработает функция showData() и на экране отобразится таблица с данными со всех структур динамического массива. В самом конце программы не забываем освободить память, которую занимает динамический массив структур.
Массив структур. Указатель на структуру
Точно так же, как мы можем создавать массивы любых встроенных типов данных (int, char…), можно создавать массивы структур. Рассмотрим это на примере со структурой WonderfulWoman знакомой нам из первой и второй частей статьи о структурах C++.
Надо внести данные о 7-ми моделях. Данные показать на экран в виде таблицы, чтобы было легче их сравнить. Схематично так:
Чтобы это реализовать – набирайте код:
Массив объектов структуры WonderfulWoman объявлен в строке 29 и в этой же строке все элементы объектов в этом массиве инициализированы нулями. Как видите – кроме того, что вместо встроенного типа мы написали дескриптор структуры, больше ничего нового в этом объявлении для нас нет. Дали имя массиву, указали количество элементов (объектов), инициализировали нулями – всё. Таким образом мы создали массив объектов структуры.
Как обратиться к элементу конкретного объекта структуры? Обычное обращение через точку уже не подойдет:
Конечно, ведь непонятно в какой именно объект из 7 надо внести данные. Так как каждый объект теперь является ячейкой массива структур, чтобы обратиться к его элементам надо сначала указать индекс объекта в квадратных скобках. Только потом точку и имя элемента:
Результат – заполняем структуры данными :
После ввода данных всех моделей, экран очистится (за что отвечает system(“cls”); ) и мы увидим таблицу:
В этой статье поговорим ещё об указателях на структуры. Если, например, надо написать функцию, в которой будут записываться данные в элементы структуры, то необходимо передать эту структуру по указателю. Иначе изменения не сохранятся. Рассмотрим пример со структурой Size из предыдущего листинга. Надо написать функцию, в которой пользователь вносит данные в элементы структуры.










