Структуры


Рассмотрим новый тип данных — структуру. Он не только гибок для представления разнообразных данных, но и позволяет создавать новые типы данных. 
Пример использования — создание каталога книг. Каждая книга имеет следующие атрибуты: шифр, название, автора, издательство, год издания, число страниц, тираж, цену. Это несколько массивов. Очень сложно организовать одновременную работу с каталогом, если нужно их упорядочить по названиям, авторам, цене и так далее. Лучше иметь один массив, в котором каждый элемент содержит всю информацию о книге.
Структура – это объект, состоящий из последовательностей поименнованных элементов. Каждый элемент имеет свой тип.
Для определения нового типа данных нужно его описать:
struct book {
char title [81];
char author[30];
float value;
};
book – это имя нового типа данных.
Сруктурный шаблон является основной схемой, описывающей, как образуется новый тип. struct — ключевое слово, имя типа структуры book — необязателен, если сразу определить имя переменной, то его можно не вводить.
struct book { …………
…………
…………
}libry;
Каждый элемент структуры определяется своим собственным описани-ем. Это переменные и массивы стандартных типов данных. Если шаблон внутри функции он доступен в этой функции, если вне, то в любой другой функции можно определить структурную переменную.
Шаблон является схемой без содержания. Он сообщает компилятору, как сделать что-то, но ничего не делает в программе, а вот создание структурной переменной, это и есть смысл слова «структура». Согласно шаблону под эту переменную выделяется память, равная сумме всех элементов (81).
struct book играет ту же роль, что и int, float перед именем пере-менной.
struct book doyle, panshin;
Для доступа к элементам структурной переменной используется операция точка. Имя переменной, точка, имя элемента структуры.
void main(void) {struct book libry; //описание перем-й типа book
puts(«В. название книги»);
gets(libry.title);
puts(«В. фамилия автора»);
gets(libry.author);
puts(«В. цену книги»);
scanf(«%f»,&libry.value);
printf(«%s, %s, %p.2f»,libry.title,libry.author,libry.value);
}
Структурную переменную можно инициализировать:
struct book libry={«Руслан и Людмила»,
«А.С.Пушкин»,
1.50};

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

Если переменных типа структура много, то определяется массив структур.
void main(void){
struct book libry[100];
int i;
for(i=0; i<100; i++){
puts(«В. название книги»);
gets(libry[i].title);
puts(«В. автор книги»);
gets(libry[i], author);
puts(«В. цену книги»);
scanf(«%f»,&libry[i].value);
}
}
Индекс применяется к имени массива структур libry[i].
Если libry[2].title[3] — 4-й элемент в title в 3-й структуре типа
book.

Вложенные структуры

Если одна структура содержится или «вложена» в другую, то говорят, что это вложенные структуры.
struct names{ char name[20];
char fio[20];};
struct worker{ struct names people;
char job[20];
float money;};
void main(void){
struct worker driver = {{«Иван», «Иванов»},
«водитель»,
1234.1};
Для обращения к элементу вложенной структуры применяется две опе-рации «точка».
puts(fellow.people.name);

Указатели на структуры

Указателями на структуры легче пользоваться, чем самими структурами. Структура не может передаваться в качестве аргумента функции, а указатель на структуру может.
struct worker *pdrv;
pdrv = &driver;
struct worker driver[2]; //массив структур
а) pdrv = driver; // pdrv ? &driver[0];
pdrv+1 ? &driver[1].
Доступ к элементу структуры осуществляется через операцию ->.
pdrv->job ? driver[0].job ?(*prdv).job
б) pdrv->people.name

Операции над структурами

1) Операция получения элемента.
driver.money=1234;
2) Операция косвенного получения элемента.
pdrv->money=3456;

Загрузка...