Масив структур - з для початківців

Структури в C ++ вдають із себе щось одне ціле, що містить в собі цілий набір різноманітних, визначених користувачем даних.
Структури - це складовою тип даних, побудований з використанням різноманітних типів.

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

Структури дуже схожі на масиви.
Якщо масиви за визначенням можуть містити в собі безліч однотипних елементів.
Те всередині структур можна описати різна кількість різнотипних елементів. А самі по собі структури є призначеним для користувача типом даних.

// При цьому кожен з цих десяти елементів складається з двох елементів певних всередині структури

===========================
Усередині описаної структури визначено дві змінні різних типів (int і char). Змінних всередині структури може бути різна кількість і кожному елементу може відповідати потрібний тип.
Важливо-В структурі весь інтерес не в назві структури, а в назві об'єкта. Тобто після опису структури обов'язково створюється мінімум одна змінна тип якої є ім'я структури.
У наведеному прикладі така змінна - obj1. Такі змінні називаються об'єктами. Ось і виходить, що obj1 є змінна типу MyStruct. При цьому в наведеному коді змінна obj1 оголошена як масив змінних з десяти елементів. Кожен з цих десяти елементів має тип MyStruct і означає кожен елемент масиву складається з тих елементів, які описані всередині структури.
Можливо комусь це допоможе, а хтось вважатиме за заплутане і багатослівне марнослів'я. Неважливо.
MyStruct obj1 [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 елементів

delete [] M1; // Звільнення пам'яті
cin. get (); // Очікування натискання клавіші
return 0;
>
=================
Сам по собі такий код великого сенсу не має, це всього лише підготовча частина для роботи з масивом структур.

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

// Перший параметр - покажчик на тип Shop

// Другий параметр - розмірність масиву

Нижче написаний повноцінний код, який містить три функції. Головна функція і дві функції, які обробляють дані. Як оброблюваних даних виступає масив структур. Одна функція забезпечує введення даних в масив структур. Друга функція виводить масив структур на екран.

/ * Визначає структуру * /
struct Shop
char Name [30];
int Cena;
char Prodav [30];
char Pokup [30];
int Date [3];
>;


/ * ФУНКЦІЯ ЗАБЕЗПЕЧУЄ ВИСНОВОК ДАНИХ НА ЕКРАН * /
void ShowData (Shop * M, int N)
for (int i = 0; i cout <cout<cout<cout<cout<>
>
/ * ФУНКЦІЯ заносяться дані до СТРУКТУРУ * /
void GetData (Shop * M, int N)
cin. ignore ();
for (int i = 0; i cout <<“\n” ;
cout <<“НАЗВАНИЕ: “ ; cin. getline ( M [ i ]. Name. 30 );

cout <<“ЦЕНА: “ ; cin>> M [i]. Cena;
cin. ignore ();

cout <<“ПРОДАВЕЦ: “ ; cin. getline ( M [ i ]. Prodav. 30 );
cout <<“ПОКУПАТЕЛЬ: “ ; cin. getline ( M [ i ]. Pokup. 30 );

cout <<“ДАТА “;
cin >> M [i]. Date [0]; cin. ignore ();
cin >> M [i]. Date [1]; cin. ignore ();
cin >> M [i]. Date [2]; cin. ignore ();
>
>

/ * ГОЛОВНА ФУНКЦІЯ * /
void main ()
system ( "CLS");
int N; cout <<“Введите N: “ ; cin>> N;
Shop * M = new Shop [N];
GetData (M. N); // Введення даних в масив структур
ShowData (M. N); // Висновок масиву структур на екран
delete [] M;
system ( "PAUSE");
>
========================
Варто звернути увагу на cin. ignore (). Якщо прибрати цей шматочок коду звідусіль, то можна побачити не дуже приємну ситуацію. Усередині потоку може залишатися символ розриву рядків і це служить недобру службу. Щоб уникнути деяких проблем використаний cin .ignore (); Зазначу що ця інструкція в наведеному коді прописана після введення кожного не символьного типу даних.

Наведений приклад виведення структур зручний в одних випадках і незручний в інших. Особисто мені краще дивитися на дані структури як на таблицю даних. Маленьке віконце Dos занадто красиву таблицю створити не дасть, але невелику таблицю у вигляді таблиці створити нескладно. Легко можна створити підказку зверху, в якій по черзі прописати назви колонок. І легко вивести на екран невелику таблицю

============================
#include
#include
/ * Визначає структуру * /
struct Shop
char Name [30];
int Cena;
char Prodav [30];
char Pokup [30];
int Date [3];
>;


/ * ФУНКЦІЯ ЗАБЕЗПЕЧУЄ ВИСНОВОК ДАНИХ НА ЕКРАН * /
void ShowData (Shop * M, int N)
system ( "CLS");
cout <<“НАЗВАНИЕ ЦЕНА ПРОДАВЕЦ ПОКУПАТЕЛЬ ДАТА ПРОДАЖИ” <<“\n\n” ;
for (int i = 0; i cout < cout <<“\r33[20C” ;
cout < cout <<“\r33[30C” ;
cout < cout <<“\r33[50C” ;
cout < cout <<“\r33[70C” ;
cout <>
cout <<“\n” ;
>


/ * ФУНКЦІЯ заносяться дані до СТРУКТУРУ * /
void GetData (Shop * M, int N)

cin. ignore ();
for (int i = 0; i cout <<“\n” ;
cout <<“НАЗВАНИЕ: “ ; cin. getline ( M [ i ]. Name. 30 );

cout <<“ЦЕНА: “ ; cin>> M [i]. Cena;
cin. ignore ();

cout <<“ПРОДАВЕЦ: “ ; cin. getline ( M [ i ]. Prodav. 30 );
cout <<“ПОКУПАТЕЛЬ: “ ; cin. getline ( M [ i ]. Pokup. 30 );

cout <<“ДАТА “ ;
cin >> M [i]. Date [0]; cin. ignore ();
cin >> M [i]. Date [1]; cin. ignore ();
cin >> M [i]. Date [2]; cin. ignore ();
>
>