Массив структур

  • Структуры в C++ представляют из себя нечто одно целое, что содержит в себе целый набор разнообразных, определенных пользователем данных.
  • Структуры — это составной тип данных, построенный с использованием разнообразных типов.

Можно как угодно пытаться дать определение, но вряд ли любое из определений четко покажет и поможет разобраться начинающему.

—> Структуры очень похожи на массивы.
—>Если массивы по определению могут содержать внутри себя множество однотипных элементов, то внутри структур можно описать разное количество разнотипных элементов. А сами по себе структуры являются пользовательским типом данных.

  Внутри описанной структуры определено две переменные разных типов (int и char). Переменных внутри структуры может быть разное количество, и каждому элементу может соответствовать нужный тип.
Важно— В структуре весь интерес не в названии структуры, а в названии объекта, т.е. после описания структуры обязательно создается минимум одна переменная, тип которой есть имя структуры.
В приведенном примере такая переменная — obj1. Такие переменные называются объектами. Вот и выходит, что obj1 есть переменная типа MyStruct. При этом, в приведенном коде переменная obj1 объявлена как массив переменных из десяти элементов. Каждый из этих десяти элементов имеет тип MyStruct и, значит, каждый элемент массива состоит из тех элементов, которые описаны внутри структуры.
Возможно кому-то это поможет, а кто-то сочтет за запутанное и многословное пустословие. Не важно.

Так как внутри структуры описано две переменные, то будет использовано по два значения для каждого из элементов массива структур (сейчас увидите)

  Рассматривая приведенный код и вникая в смысл структур, нужно понять, что теперь при изменении элементов или для вытаскивания элементов из структуры для каждого отдельного элемента массива, нужно обращаться к каждому из элементов самой структуры.

  В этом коде в переменные массива присваиваются значения. Обращение к элементам структуры можно прописывать через точку. Чтобы работать с элементами массива, который является массивом структур, нужно транзитом через массив структур обращаться к тем переменным, которые описаны внутри структуры. Использовано два способа присваивания значений. Первый способ — обычное присваивание через знак равно. Второй способ — это копирование строки в переменную. Нетрудно заметить, что сначала написано имя объекта, потом индекс массива и через точку идет обращение к переменной описанной внутри структуры.

  Иногда известно сколько элементов должен содержать массив и в задачах по программированию можно увидеть такие слова: «Создать массив из N структур» и т.п. В простых задачах ничего сложного нет. Часто студенты предлагают ввести N с клавиатуры и при вводе этого N создают массив структур из N элементов.

  Когда массив структур состоит из некоторого множества элементов, то для работы как и с обычным массивом используют циклы. Думаю имеет смысл разбивать ввод данных и вывод данных в отдельные функции. В приведенном ниже примере будет создана простая структура, которая представляет собой тип данных Продуктовый магазин.

  Продуктовый магазин представляет из себя одно целое. В магазине могут продавать разные продукты. У каждого продукта есть название, есть цена. В магазине есть разные продавцы, которые продают товар. К каждому продавцу подходит покупатель, который покупает товар. Можно долго и много расписывать что происходит на самом деле., но я остановлюсь на том что написал.
Чтобы объяснить компилятору что нам нужно, стоит навести некоторый порядок в вышеизложенном.
  Я разобью на поэтапное изложение кода, чтобы большинство трудных читателей попробовали понять суть.

Продуктовый магазин

  Определились с обобщенным названием нашей структуры.

Всё что есть в магазине можно объединить под названием нужные данные.

Дата продажи описана как массив из трех целочисленных чисел. Остальным переменным соответствуют различные типы, удобные для обработки переменных

 

  После того как определились и описали нужную структуру обязательно создается переменная, тип которой есть имя структуры. Вводятся данные в элементы структуры. Нижеприведенный код это всё то что написано чуть выше.

  Сам по себе такой код большого смысла не имеет, это всего лишь подготовительная часть для работы с массивом структур.

  Дальше необходимо обеспечить ввод данных в элементы массива структур. Ввод и вывод данных удобно обеспечивать через отдельные функции, т.к. нередко создаются пользовательские меню с возможностью выбора обработки структур. Структура очень похожа на массив и передается вовнутрь функции таким же образом. Можно использовать указатель и нужно сделать так, чтоб функция знала размер массива структур. Размер массива структур функции нужно знать для того, чтобы циклы обработки массива структур знали конечную точку своего выполнения.

void GetData(Shop *M,int N)
{
}

//Первый параметр — указатель на тип Shop
//Второй параметр — размерность массива

  Ниже написан полноценный код, который содержит три функции. Главная функция и две функции, которые обрабатывают данные. В качестве обрабатываемых данных выступает массив структур. Одна функция обеспечивает ввод данных в массив структур. Вторая функция выводит массив структур на экран.

  Стоит обратить внимание на cin.ignore(). Если убрать этот кусочек кода отовсюду, то можно увидеть не очень приятную ситуацию. Внутри потока может оставаться символ переноса строки и это служит нехорошую службу. Чтобы избежать некоторых проблем использован cin.ignore(); Отмечу что эта инструкция в приведенном коде прописана после ввода каждого не символьного типа данных.

  Приведенный пример вывода структур удобен в одних случаях и неудобен в других. Лично мне предпочтительнее смотреть на данные структуры, как на таблицу данных. Маленькое окошко Dos слишком красивую таблицу создать не даст, но небольшую таблицу в виде таблицы создать несложно. Легко можно создать подсказку сверху, в которой по очереди прописать названия колонок. И легко вывести на экран небольшую таблицу

  Почти такой же код как и вышеприведенный с некоторыми изменениями. Изменилась вся функция вывода данных на экран. Конечно можно было просто описать одну функцию, но кому-то такое описание сэкономит время.
cout<<«r33[50C»;
  Должен появится вопрос. Что это вообще такое. Это такой способ перемещения курсора внутри консоли.
r — Переносит курсор в начало строки
33[50C — Перенос курсора вправо на 50 позиций. (http://www.cyberforum.ru/cpp-linux/thread325690.html)

  Такой способ помогает создавать небольшие таблицы в очень удобоваримом варианте. Да и сама по себе любая таблица больше отображает смысл использования массива структур

  Хоть borland c++3.1 и консоль вещи разные, эта фишка в нем работает, а в Visual Studio фиг его знает как делать, у меня не получалось

Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

17 комментариев: Массив структур

  • Богдан говорит:

    Лучший сайт, среди всех, где описываются структуры! Спасибо огромное за урок! :mrgreen:

  • Слава говорит:

    можно так:
    struct Shop_str
    {
    char Name[30];
    int Cena;
    char Prodav[30];
    char Pokup[30];
    int Date[3];
    }Shop, *PShop;


    Shop.Cena = 3.62;

    Автор сайта отвечает:
    У вас не массив структур, а указатель на структуру. Чтобы из этого сделать массив структур, нужно будет выделять память вручную, и, соответственно, очищать тоже вручную.

  • Gen говорит:

    Огромное спасибо за урок.Все стало понятно.Но в CODE::DLOCK эта фишка cout<<"r�33[70C"; не работает.Если переписать

    и добавить хедер

    работает. В Visual Studio тоже должно бы работать. Может быть и не все так красиво,но это же пример.

  • Mimim говорит:

    Большое человеческое спасибо за предоставленную информацию по массивам (лучше и подробней описано даже, чем в учебнике) :mrgreen:

  • Mimim говорит:

    Извиняюсь, опечатался, по структурам*

  • Maggie говорит:

    Спасибо, наиболее понятные примеры и объяснения по массивам структур.

  • Аноним говорит:

    😡 😡

  • Лилия говорит:

    ребят помогите пожалуйста. нужно, описать и протестировать структуру, в вести массив элементов этой структуры размером n для слудующих элементов: номер груза, наименование груза, объем груза, цена груза

  • sanek говорит:

    СУКПЗДЦ!!!

  • Ваня говорит:

    Огромное спасибо за пример!!!! очень помог)

  • Гриша говорит:

    С указнием размера массива структур все понятно. А вот, если не знаешь его размер, т.е. сколько нужно будет вводить элементов — здесь проблема. Если речь идет об обычных типах данных, то можно организовать заполнения массива со строки или сразу с помощью вектора, но как впихнуть элементы структуры в вектор, я пока не знаю.

    • admin говорит:

      А что прямо-так в вектор надо? Можно и без вектора.
      Я вопрос вообще не понял.
      Если это вопрос про как создавать массив структур если не знаешь заранее количество элементов в структуре, то

      Ну а с языком сами разбирайтесь.

  • Илья говорит:

    Создать структуру товар(для усложнения использовать динамические поля для строк).
    Каждый товар должен иметь не менее 8 полей.Заполнить массив десятью товарами.
    Реализовать поиск в массиве по названию, по вхождению слов в описание и по диапазону цены товара.

    Помогите Пожайлуста Разобратся Немогу На языке C++  Решыте очень буду Благодарна!!!!

    Автор сайта отвечает:
    Я Вам не верю. Вы вообще разбираться не пробовали.

  • Снежана говорит:

    помогите пожалуйста написать программу, которая определяет самый дорогой диск

  • Аноним говорит:

    sooqa slozna

  • Макс говорит:

    Автор красава, разжевал больше некуда))) Если кому не доходит, значит бросайте это дело — не ваше ОНО!!!

  • Аноним говорит:

    харош

Добавить комментарий

Ваш e-mail не будет опубликован.

Поиск

 
     

Случайная книга в электронном формате

Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

- Алло! Скажите, почему ваш антивирус так долго проверяет фильм? - А как вы хотели? Он его смотрит!

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок