Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Подбельский Фомин_Программирование на языке СИ_...doc
Скачиваний:
356
Добавлен:
10.08.2019
Размер:
53.81 Mб
Скачать

Доступ к элементам структур.

Доступ к элементам структур. Наиболее наглядно и естественно доступ к элементам структур обеспечивается с помощью уточненных имен. Конструкция

имя_структуры. имя_элемепта

играет роль названия (имени) объекта того типа, к которому отнесен элемент в соответствии с определением структурного типа. В нашем Примере с инициализацией структуры типа struct goods:

coat.name - указатель типа char* на строку "пиджак черный";

coat.price - переменная типа long со значением 400000;

coat.percent - переменная типа float со значением 7.5;

coat.vol - переменная типа int со значением 220;

coat.date - массив типа char [9], содержащий "12.01.97".

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

Уточненное имя - это выражение с двумя операндами и операцией "точка" между ними. Операция "точка" называется операцией доступа к элементу структуры (или объединения). У нее самый высокий ранг наряду со скобками (и операцией "стрелка" для доступа к элементам структуры через адресующий ее указатель, см. табл. 1.4).

Уточненное имя используется для выбора правого операнда операции "точка" из структуры (или объединения), задаваемой левым операндом. Левый операнд должен иметь структурный тип, а правый операнд должен быть именем компонента (элемента) этой структуры. Тип результата операции "точка", т.е. тип уточненного имени, - это тип именуемого ею компонента (элемента) структуры. Именно такие типы указаны в приведенных выше примерах, т.е. coat.vol - объект типа int и т.д.

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

Пример программы с инициализацией структуры и выводом значений ее элементов:

Результат выполнения программы:

Уточненные имена элементов структур обладают всеми правами объектов соответствующих типов. Их можно использовать в выражениях, их значения можно вводить с клавиатуры и т.д. Например, с помощью следующих операторов можно изменить торговую наценку (элемент coat.price) и вычислить розничную цену на определенный в программе товар (пиджак черный):

Обратите внимание, что в качестве фактического параметра функции scanf( ) используется адрес элемента percent структуры coat. Для этого операция получения адреса & применяется к уточненному имени coat.percent. При вычислении розничной цены товара приходится вводить явное приведение типов (long), так как результат умножения элемента coat.price на вещественное выражение 1.0+coat.percent/!00 имеет по умолчанию тип double.

Следующая программа выполняет сложение комплексных чисел, для представления которых использован структурный тип, имя которого вводит спецификатор typedef:

Возможный результат выполнения программы:

6.2. Структуры, массивы и указатели Массивы и структуры в качестве элементов структур.

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

• значение массы (double);

• массив координат (float [3]).

Проиллюстрируем основные особенности работы с такими структурами. Введя величину и координаты точечной массы, вычислим ее удаление от начала координат (модуль радиус-вектора).

Результат выполнения программы:

Для структуры point структурный тип введен как безымянный. Структура point получает значения своих элементов в результате инициализации. В списке начальных значений использовано вложение инициализаторов, так как элементом структуры является массив. Можно обратить внимание на индексирование при обращении к элементу внутреннего массива coord[3]. Индексы записываются после имени массива-элемента, а не после имени структуры.

Так как элементами структур могут быть данные любых типов, то естественным образом допускается вложение структур, т.е. элементом структуры может быть другая (и только другая, не та же самая!) структура. В качестве примера еще раз рассмотрим структурный тип для представления сведений о студенте. Дополнительно к тем элементам, которые уже были (имя, фамилия, курс), введем в качестве элемента структуру с именем (названием) структурного типа struct birth. В ней будут сохраняться сведения о рождении - место рождения и дата рождения. В свою очередь, дату рождения представим структурой (типа date) с элементами число, месяц, год.

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

Результаты выполнения программы:

Конкретная структура-объект stud типа struct student получает значение элементов при инициализации. Затем с помощью scanf( ) изменяется элемент stud.year (Иванов Павел перешел уже на 3-й курс!). Содержимое структуры выводится на дисплей, причем для доступа к элементам вложенных структур используются уточненные имена с нужным количеством "точек".