- •Неоднородные типы данных. Записи (структуры)
- •В современных языках программирования логическое
- •Предположим, что нужно написать программу для деканата факультета. Эта программа должна обрабатывать информацию
- •В языке С можно так переписать приведенный выше фрагмент:
- •Объявление переменных для обработки данных одного студента, не используя новый тип
- •То, что поля структур сами могут быть структурами, позволяет целостным образом описывать достаточно
- •Техника Apple Нетбуки Доступные цены
- •Расписание авиарейсов
- •Описание структуры в программе состоит из двух этапов:
- •Примеры описания шаблона структуры:
- •Вложенные структуры
- •Пример описания вложенной структуры
- •Доступ к отдельным полям структурной переменной
- •Совмещение описания шаблона структуры и структурной переменной
- •Совмещение описания шаблона, описания структурных переменных и инициализации полей в
- •Определение объема памяти, выделяемой под структурную переменную
- •Копирование структур-переменных
- •Структурные переменные и указатели
- •Массивы структурных переменных
- •Примеры программ работы со структурами
- •Продолжение примера 1
- •Продолжение примера 1
- •Вид экрана после выполнения программы:
- •Пример 2. Поиск в массиве структур, вводимых с клавиатуры
- •Начало
- •/* Фамилии сотрудников, имеющих оклад выше среднего */
- •//Продолжение примера 2
- •//Продолжение примера 2 //Вывод списка сотрудников
- •//Продолжение примера 2
- •Какие изменения надо внести в алгоритм и программу последнего примера,
Вложенные структуры
Определение структуры вводит новый пользовательский тип в программу, который может быть использован так же, как любой встроенный
тип.
Структура называется вложенной, если хотя бы одно из ее полей является структурой.
Описание вложенной структуры состоит из двух этапов:
1.Описание вкладываемой структуры, т.е. создание нового типа данных.
2. Описание вложенной структуры.
Пример описания вложенной структуры
struct date //Вкладываемая структура
//используется для описания поля birth структуры student
{ |
|
|
int |
day; |
// День |
int |
month; |
// Месяц |
int |
year; |
// Год |
}; |
|
|
struct student |
//Вложенная структура |
|
{ |
|
//Одно из ее полей (birth) является структурой |
|
|
|
char fam[30]; |
//Фамилия |
|
char address[150]; |
// Домашний адрес |
|
struct date birth; |
// Дата рождения |
|
char |
phone[10]; |
// Телефон |
int |
oc[4]; |
// Оценки |
float |
sr; |
// Средний балл |
}; |
|
|
Доступ к отдельным полям структурной переменной
Обработка переменной, являющейся структурой, т.е. структурной переменной, сводится к обработке ее полей. При этом поле и сама переменная связываются с помощью составного имени, имеющего следующий синтаксис:
<имя_структурной_переменной>•<имя_поля>
Здесь • - операция выбора или ссылки на поле (обычная точка).
Примеры обращения к полям структуры
Обращение к полю структуры |
Комментарий |
S1.fam |
Фамилия студента S1 4 |
S1.oc[0] |
Первая оценка студента S1 |
S1.аdress |
Адрес студента S1 |
S1.oc[i] |
i-ая оценка студента S1 |
S1. birth. day |
День рождения студента S1 |
S[3].oc[2] |
3-ья оценка 4-го студента |
S[57]. birth. year |
Год рождения 58-го студента |
Совмещение описания шаблона структуры и структурной переменной
Синтаксис описания:
<шаблон структуры><имя переменной или список имен переменных>;
Пример. |
|
|
struct date |
//Описание шаблона структуры |
|
{ |
|
|
int |
day; |
|
int |
month; |
|
int |
year; |
|
} d1,d2; |
// Список имен переменных |
Совмещение описания шаблона, описания структурных переменных и инициализации полей в
одном предложении
Пример 1.
struct date
{
int |
day; |
// День |
int |
month; |
// Месяц |
int |
year; |
// Год |
} d1, d2={2,3,1987};
Здесь описаны две переменные-структуры (d1 и d2).
При этом сразу определены значения полей переменной d2:
d2. day=2;
d2. month=3;
d2. year=1987;
Т.о., дата d2 - это 2 марта 1987 года
|
Пример2 |
|
struct student |
|
|
{ |
|
|
char |
fam[30]; |
//Фамилия |
char |
address[150]; |
// Домашний адрес |
struct date birth; |
// Дата рождения |
|
char |
phone[14]; |
// Телефон |
int |
oc[4]; |
// Оценки |
float |
sr; |
// Средний балл |
} |
|
|
S1={ "Петров",
"г. Жлобин, ул. Строителей, д.2,
кв.4",
{8,12,2009},
"+3750232483580",
{9,8,5,7},
0
};
Определение объема памяти, выделяемой под структурную переменную
Число байтов, выделенное под структурную переменную, не всегда равно сумме длин отдельных ее полей из-за некоторых особенностей работы процессора с данными с фиксированной и
плавающей точкой, что приводит к так называемому "выравниванию", размещению элементов с четного адреса. Выделение памяти осуществляется по шаблону в последовательности объявления ее полей.
Для определения объема памяти, выделяемой под структурную переменную, используется стандартная функция sizeof:
sizeof ( struct <имя_шалона> );
Примеры:
sizeof ( struct date ); sizeof ( struct student );
Копирование структур-переменных
С помощью оператора присваивания можно копировать значения одной структуры-переменной в другую при условии, что обе структуры- переменные имеют один и тот же тип. Например, пусть переменные a1,
a2 описаны следующим образом:
struct complex
{
float |
re; // Действительная составляющая комплексного числа |
float |
im; //Мнимая составляющая комплексного числа |
} a1, a2; |
|
Пусть a1.re=3.5; a1.im=0.34; (a1=3.5+0.34i)
После выполнения оператора a2=a1 окажется, что a2.re равно 3.5, a2.im равно 0.34 (a2=3.5+0.34i)
Примечание. При копировании структур-переменных оператор присваивания выполняет поверхностное копирование, суть которого состоит в следующем. Происходит копирование бит за битом значений полей переменной-источника (a1) и перенесение их в соответствующие поля переменной-цели (a2). При этом может возникнуть проблемы с такими полями данных, как указатели. Поэтому использовать поверхностное копирование структур надо осторожно.
Структурные переменные и указатели
Предположим, что в программе сделано описание:
struct vec
{
double x, y;
};
vec v1, *v2;
Здесь v1 структура типа vec, v2 – указатель на структуру типа vec, *v2 – сама запись.
Конструкции для выбора полей x, y :
(*v2).x, (*v2).y
Или с использованием специальной операции -> (минус больше):
v2->x, v2->y
Массивы структурных переменных
Описание массива структур не отличается от описания массива обычных переменных.
Пример:
Struct Man
{
char |
fio[31]; |
// ФИО |
int |
year; |
// Год рождения |
float |
pay; |
// Оклад |
}; |
|
|
Man d[100], *p=d;
//d - массив структур из 100 элементов
//p - указатель, инициализированный адресом
//первого элемента массива d
Примеры обращения к полям:
d[i].year, (*(d+i)).year, (d+i)->year, ( p+i)-> year