Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗадачникПоТПиРнаЭВМ.doc
Скачиваний:
29
Добавлен:
11.03.2016
Размер:
1 Mб
Скачать

Глава 10. Структуры

Из базовых типов и типов, определенных программистом, можно формировать производные типы, к которым относятся указатели, массивы, структуры, объединения и функции. Базовые типы (int, float, …) считаются скалярными типами. Массивы и структуры являются агрегирующими типами, так как состоят из набора элементов. Массив состоит из однотипных элементов, а структуры могут содержать разнотипные элементы [24].

Структура – это объединение в единое целое множества поименованных элементов (компонентов) данных. В отличие от массива, в котором компоненты имеют один и тот же тип, компоненты структуры могут иметь различные типы.

Формат объявления структурного типа:

struct имя_структурного_типа {

Определение_компонентов_структуры

};

Здесь struct – спецификатор структурного типа;

имя_структурного_типа – произвольно выбираемый идентификатор;

Определение_компонентов_структуры ­– совокупность одного или более описаний объектов, каждый из которых служит прототипом для элементов структур вводимого структурного типа.

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

typedef struct {

Определение_компонентов_структуры

} имя_структурного_типа_1;

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

typedef struct имя_структурного_типа {

Определение_компонентов_структуры

} имя_структурного_типа_1;

В этом случае объекты можно вводить, используя как имя_структурного_типа, так и имя_структурного_типа_1.

Структура используется для определения типов вводимых объектов также как и int, double и так далее, то есть под описание структуры память не выделяется. Выделение памяти происходит при объявлении объектов типа структура. Введение объектов происходит следующим образом:

имя_структурного_типа список_имен_объектов;

В качестве примера иллюстрации выделения памяти рассмотрим структуру вида [24]:

struct goods{

char* name; //Название

long price; //Цена

float percent; //Процент скидки

char date[9]; //Дата в символьном формате

};

Введем объект типа struct goods:

struct goods coat;

В табл. 10.1 приведено распределение памяти, выделяемой под объект coat.

Таблица 10.1

Выделение памяти под объект coat

Название

полей

name

price

percent

date

Тип

char*

long

float

char[9]

Байты

4

4

4

9

Инициализация объектов типа структуры может быть осуществлена при объявлении объектов. Например,

struct goods cit={“Апельсины”, 56, 2.5, ”15.06.13”};

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

float x[5], y[5]={1.0, 5.7, 4.0, -6.2, 7.1};

for(int i=0; i<sizeof(x) / zizeof(x[0]); i++)

x[i]=y[i];

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

goods frut;

то при выполнении операции присваивания

frut = cit;

полям объекта frut будут присвоены значения полей объекта cit.

Следует отметить, что поле name будет указывать на один и тот же адрес памяти. Доступ к полям структуры обеспечивается с помощью уточненных имен:

Имя_объекта.имя_поля

Листинг 10.1. В файле с именем "input.txt" задано количество студентов, список студентов с указанием фамилии и номера группы (рис. 10.1).