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

Для понимания темы нужно знать:

  • Массивы
Мои трактовки структуры:

  • Структуры в C++ представляют из себя нечто одно целое, что содержит в себе целый набор разнообразных, определенных пользователем данных.
  • Структуры — это составной тип данных, построенный использованием разнообразных типов.
Можно как угодно пытаться дать определение, но вряд ли любое из определений чётко покажет нужное и поможет разобраться начинающему. (Субъективное мнение)
На заметку:

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

Внутри описанной структуры определено две переменные разных типов (int и char[10]). Переменных внутри структуры может быть разное количество, и каждому элементу может соответствовать нужный тип.
ВНИМАНИЕ!

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

Возвращаемся к основному показанному примеру. Так как внутри структуры описано две переменные (int и char[10]), то будет использовано по два значения для каждого из элементов массива структур (сейчас увидите).
Рассмотрение вами приведённого кода и процесс вникания в смысл структур должны дать вам понять, что теперь изменять элементы или вытаскивать значения элементов можно путём обращения к каждому элементу самой структуры. Поскольку массив сам по себе составной тип данных, то работа с ним обычно предполагает вытаскивание нами внутреннего его элемента. Если массив хранится в структуре как часть структуры, то мы должны вытаскивать сам массив и из вытащенного массива вытаскивать нужный нам элемент.
Прстой пример массива структур:

В листинге #1 в переменные массива присваиваются значения. Обращение к элементам структуры можно прописывать через точку. Чтобы работать с элементами массива, который является массивом структур, нужно транзитом через массив структур обращаться к тем переменным, которые описаны внутри структуры. Использовано два способа присваивания значений. Первый способ — обычное присваивание через знак =. Второй способ — это копирование строки в переменную. Нетрудно заметить, что сначала написано имя объекта, потом индекс массива, и через точку идет обращение к переменной, описанной внутри структуры. Поскольку массив структур самый обычный массив — мы вытаскиваем его элементы по индексу. Это всё достаточно обычно.
Иногда известно, сколько элементов должен содержать массив, и в задачах по программированию можно увидеть такие слова: "Создать массив из N структур" и т. п. В простых вариантах написания кода число индексов массивам задают прямо в исходном коде программы. Но солиднее задавать число N путём приглашения ввода этого самого N в ходе работы программы. Пользователь, запустивший программу, вводит число N, и программа создаёт себе массив под эти самые N элементов. Поскольку массив структур — это что ни на есть обычный массив, то и количество хранимых в нём структур можно задавать точно так же, как задаётся количество элементов в примитивном массиве.

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

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

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

Шаг1. Пишем просто пустую программу. Самую обычную

Шаг2. Добавляем в программу структуру. Называем её каким-нибудь понятным именем.

Заготовка есть. Теперь внутри структуры Shop можно объединить нужные для магазина данные.

Шаг3. Описываем внутренне строение структуры.

В описанной структуре у нас сейчас дата продажи описана как массив из трех целочисленных чисел, остальным переменным соответствуют различные типы, которые подобраны в подходящем для обработки варианте (т. е. если по смыслу число, то численный тип, если строка, строковой и т. п.).
После того, как определились и описали нужную структуру, обязательно создаём переменную, тип которой есть имя структуры. Работая с такой переменной, мы работаем со структурой. Поскольку мы задумали создать массив, то создаём массив, тип которого есть наша структура.

Шаг4. Создаём переменную, тип которой наша структура

Сам по себе такой код большого смысла не имеет, это всего лишь подготовительная часть для работы с массивом структур. Объявив переменную, мы создали место в памяти, куда будут сохранятся наши данные описанного нами типа.
Дальше необходимо обеспечить ввод данных в элементы массива структур. Ввод и вывод данных удобно обеспечивать через отдельные функции. Функции можно описывать как внутри структуры, так и вне структуры, но работа с первыми будет отличаться от работы со вторыми. Я не хочу усложнять тему, показывая оба варианта сразу. Поэтому покажу один.
Структура очень похожа на массив и передается вовнутрь функции почти таким же образом, как и массив. Но массив структур — это массив и передаётся в функции как массив. Т. е. если мы отдаём на обработку функции массив, то лучше всего давать знать функции и число элементов в массиве (если массив структур, то число структур, хранимх в массиве). Это число нужно не столько самой функции, сколько нам. Чтобы обходить массив, чтобы знать, где у него граница.

Тут всё стандартно: один параметр — непосредственно массив, второй параметр — число его элементов.
Ниже написан более полноценный код. В том коде описано три функции: главная и две для обработки данных. В качестве обрабатываемых данных выступает массив структур. Одна функция обеспечивает ввод данных в массив структур. Вторая функция выводит массив структур на экран. Вам нужно будет немного исправить начало, но я верю, что это в ваших силах. Я иногда использую коды старых компиляторов. (При необходимости нужно только-лишь исправить название заголовочного файла и дописать using namespace std; , сделайте собственными силами)

Обратите внимание на cin.ignore(). Если убрать это отовсюду, то можно увидеть не очень приятную ситуацию. Когда мы смешиваем ввод строковых данных и чисел, то в число может попадать символ переноса строки. Когда мы жмём клавишу Enter, ведь в память попадает символ, вот именно этот символ мы игнорируем принудительно. Если его не проигнорировать в нашем случае, то программа засбоит. Как вы можете видеть, в коде cin.ignore() приписана после каждого ввода численного типа.
Приведенный пример вывода структур удобен в одних случаях и неудобен в других. Лично мне предпочтительнее смотреть на данные структуры как на таблицу данных.
При умении немного расчитывать и определённом упорстве можно выводить на экран красивые таблицы. В некоторых консольных окошках иногда работает автоперенос выводимого текста на экран (если, например, длина текста больше ширины окна), в таком случае нужно в свойствах консоли увеличить ширину окна. Обычно доступ к свойствам консоли происходит правым кликом по заголовку и выбором пункта меню "Свойства -> Расположение", там только не перепутайте ширину буффера и ширину окна.
Выводим массив структур в табличном виде:


В этом примере я задействовал манипуляторы вывода:
setw — для установки пробелов в определённом количестве
width — для установки ширины числа
setprecision, fixed — для установки числа цифр после дробной точки
И программно расчитывал, сколько нужно добавлять пробелов для достижения границы очередной колонки. На самом деле мой пример далёк от идеала, но что смог, то смог. Некоторые вещи я убирать не стал, чтобы вы могли пронаблюдать общий вид расчётов.
Это почти тот же код, что и вышеприведённый, но с некоторыми изменениями. Я подменил тип для хранения даты (сделал под строку, перед этим использовался массив из трех int), так мне удобнее просчитывать необходимые отступы. Я мог бы оставить как есть, но пришлось бы дописывать своеобразный конвертер моего способа представления даты (массива из трех элементов) в строку. Я просто не пожелал усложнять вам и сделал как сделал. Основной же модификации подверглась вся функция вывода данных на экран, именно в ней выполняются основные расчёты для определения ширины колонок. Заголовок может быть длиннее самой длиной строки колонки и наоборот, поэтому я проверял, какая из ширин приоритетнее, и выставлял наиболее выгодный вариант. Так у меня получилось сделать автоподгон ширины колонки.
В ОС MS-DOS (при использовании таких компиляторов как Borland C++ 3.1) многое зависит от ширины эрана и большие таблицы там создавать не получится, так что всей красотой вывода массива структур насладиться не удастся. Но маленьких таблиц в красивом виде, используя применённый мной подход, вполне возможно добиться.

Возможно, кому-то это понадобиться, поэтому я решил, что правильно будет показать
Что я смог, то сделал. Разумеется, можно лучше. Но пока это мой предел. В качестве небольшого упражнения можете добавить ещё одну колонку: единица измерения.

19 комментариев на «“Массив структур”»

  1. Богдан:

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

  2. Слава:

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


    Shop.Cena = 3.62;

  3. Gen:

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

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

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

  4. Mimim:

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

  5. Mimim:

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

  6. Maggie:

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

  7. Лилия:

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

  8. Ваня:

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

  9. Гриша:

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

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

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

  10. Илья:

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

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

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

  11. Снежана:

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

  12. Аноним:

    sooqa slozna

  13. Макс:

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

    2
    3
  14. Аноним:

    Как сохранить это в файл?

    • Не знаю, что имеется в виду под "это", поэтому просто показываю на маленьком коде в виде записи в текстовый файл (но лучше если уметь записывать в бинарный).

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Поиск

 
     

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

https://www.litres.ru/evgeniy-kornilov-2/programmirovanie-shahmat-i-drugih-logicheskih-igr/?lfrom=15589587
Яндекс.Метрика