Массив структур на Си
Массив – это объединение ряда объектов одного типа. Например:
- Фамилии учеников 11«А» класса (массив строк);
- Температура воздуха каждый день в июле (массив целых чисел) и т.п.
Структура же содержит переменные разных типов. В этом смысле она похожа на классы и интерфейсы.
Массивы и структуры можно комбинировать вместе для образования сложных объектов. Внутри массива могут быть структуры, или наоборот, массив быть частью структуры. Рассмотрим эти комбинации.
Создаём массив структур
Для объявления массива структур необходимо сперва определить структуру, а затем объявить переменную массива этого типа. Например, для хранения адресов 100 членов совета нужно создать массив. Теперь, чтобы объявить 100-элементный массив структур типа addr, мы напишем:
addr mem_addr [100];
Получилось 100 наборов переменных, которые организованы, как определено в структуре addr. Чтобы получить доступ к определенной структуре, вычислите её индекс. К примеру, чтобы вывести номер дома структуры 8, напишите:
cout << mem_add[7].houseno ;
Массив структур может содержать вложенные структуры. Например, можно создать массив с типом структур emp, который представляет собой вложенную структуру:
emp sales_emp[100] ;
Приведенное объявление создает массив sales_emp для хранения 100 структур типа emp.
Пример с комментариями
#include <iostream.h>
#include <windows.h>
#include <iomanip.h> //setw, setprecission
#include <string.h> //strlen
#include <conio.h> //clrscr/*ОПИСЫВАЕМАЯ СТРУКТУРА*/
struct Shop
{
char Name[70];
float Cena;
int count;
char Prodav[50];
char Pokup[50];
char Date[11];
};/*ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ, ИЩУТ МАКСИМАЛЬНЫЕ СТРОКИ ДЛЯ КАЖДОЙ КОЛОНКИ*/
int get_max_caption(Shop* M, int N){
int maximum = strlen(M[0].Name);int temp;
for (int i=1; i<N; i++){
temp = strlen(M[i].Name);
if (temp > maximum) maximum = temp;
}
return maximum;
}int get_max_prodav(Shop* M, int N){
int maximum = strlen(M[0].Prodav);int temp;
for (int i=1; i<N; i++){
temp = strlen(M[i].Prodav);
if (temp > maximum) maximum = temp;
}
return maximum;
}int get_max_pokup(Shop* M, int N){
int maximum = strlen(M[0].Pokup);int temp;
for (int i=1; i<N; i++){
temp = strlen(M[i].Pokup);
if (temp > maximum) maximum = temp;
}
return maximum;
}
/*КОНЕЦ ВСПОМОГАТЕЛЬНЫХ ФУНКЦИЙ*//*ФУНКЦИЯ ОБЕСПЕЧИВАЕТ ВЫВОД ДАННЫХ НА ЭКРАН*/
void ShowData(Shop *M, int N)
{
cout << «\n\n»;
cout << «INFORMATION\n»;struct ColumnWidth{ //Вспомогательная структура поможет обрабатывать промежуточные данные
int Name;
int Prodav;
int Pokup;
} ColumnWidth;
int temp; //Переменная для хранения подходящей ширины/*ПОДСЧЁТ НУЖНОЙ ШИРИНЫ КОЛОНКАМ*/
ColumnWidth.Name = strlen(«НАЗВАНИЕ») + 1;
temp = get_max_caption(M,N) + 1;
if (ColumnWidth.Name < temp) ColumnWidth.Name = temp;ColumnWidth.Prodav = strlen(«ПРОДАВЕЦ») + 1;
temp = get_max_prodav(M,N) + 1;
if (ColumnWidth.Prodav < temp) ColumnWidth.Prodav = temp;ColumnWidth.Pokup = strlen(«ПОКУПАТЕЛЬ») + 1;
temp = get_max_pokup(M,N) + 1;
if (ColumnWidth.Pokup < temp) ColumnWidth.Pokup = temp;
/*КОНЕЦ РАСЧЁТА*//*ЯЧЕЙКИ-ЗАГОЛОВКИ*/
cout << «НАЗВАНИЕ» << setw(ColumnWidth.Name — strlen(«НАЗВАНИЕ»)) << ‘|’;
cout << setw(10) << «ЦЕНА» << ‘|’;
cout << «КОЛИЧЕСТВО» << setw(10 — strlen(«КОЛИЧЕСТВО»)) << ‘|’;
cout << setw(ColumnWidth.Prodav) << «ПРОДАВЕЦ» << ‘|’;
cout << setw(ColumnWidth.Pokup) << «ПОКУПАТЕЛЬ» << ‘|’;
cout << setw(15) << «ДАТА» << ‘|’;
/*КОНЕЦ ЯЧЕЕК-ЗАГОЛОВКОВ*/
cout << ‘\n’;/*ВЫВОДИМ МАССИВ СТРУКТУР ПОСТРОЧНО*/
for (int i=0; i<N; i++){
cout << M[i].Name << setw(ColumnWidth.Name — strlen(M[i].Name) ) << ‘|’;cout.width(10);
(cout << setprecision(2) << M[i].Cena << ‘|’).width(10);
(cout << setprecision(2) << M[i].count << ‘|’).width(10);cout << setw(ColumnWidth.Prodav) << M[i].Prodav << ‘|’;
cout << setw(ColumnWidth.Pokup) << M[i].Pokup << ‘|’;cout << setw(15) << M[i].Date << ‘|’;
cout << ‘\n’;
}
/*КОНЕЦ ПОСТРОЧНОГО ВЫВОДА*/cout << ‘\n’;
}
/*ФУНКЦИЯ ЗАНОСИТ ДАННЫЕ В СТРУКТУРУ*/
void GetData(Shop *M,int N)
{
for (int i=0;i<N;i++)
{
cout << «\n»;
cout << «НАЗВАНИЕ: «;
cin.getline(M[i].Name,sizeof(M[i].Name));cout << «ЦЕНА: «;
cin >> M[i].Cena;
cin.ignore();cout << «Количество: «;
cin >> M[i].count;
cin.ignore();cout << «ПРОДАВЕЦ: «;
cin.getline(M[i].Prodav,sizeof(M[i].Prodav));cout << «ПОКУПАТЕЛЬ: «;
cin.getline(M[i].Pokup,sizeof(M[i].Pokup));cout << «ДАТА «;
cin >> M[i].Date; cin.ignore();
}
}/*ГЛАВНАЯ ФУНКЦИЯ*/
int main()
{clrscr();
int N;cout << «Введите N: «;
(cin >> N).ignore();Shop *M = new Shop[N];
GetData(M,N); //Ввод данных в массив структур
ShowData(M,N); //Вывод массива структур на экран
delete []M;getch();
}