ЗАПИСИ
Запис, або структура, – це об'єднання одного або більш об'єктів (змінних, масивів, покажчиків, інших записів і т.п.). Як і масив, вона є сукупністю даних, але відрізняється від нього тим, що до її компонентів (елементам) необхідно звертатися на ім'я і її різні елементи не обов'язково повинні належати одному типу.
Записи зручно використовувати там, де різноманітні дані, що відносяться до одного і того ж об'єкту, необхідно об'єднувати. Наприклад, учня середньої школи характеризують такі дані: прізвище; ім'я; дата народження; клас; вік.
Оголошення запису здійснюється за допомогою ключового слова struct, за яким йдуть її тип і список елементів, укладених у фігурні дужки. Її можна уявити в такому загальному вигляді:
struct тип{ тип елементу 1 ім'я елементу 1;
………………………………………………….
тип елементу n ім'я елементу n;};
Ім'ям елементу може бути будь-який ідентифікатор. Як і вище, в одному рядку можна записувати через кому декілька ідентифікаторів одного типу. Наприклад:
struct ДАТА { int ДЕНЬ;
int МІСЯЦЬ;
int РІК; };
Нагадаємо, що російські букви використані в ідентифікаторах для кращого сприйняття запису (у мові цього робити не можна).
За фігурною дужкою, що закінчує список елементів, можуть записуватися змінні даного типу, наприклад: struct date{ ...} а, b, с; (при цьому виділяється відповідна пам'ять). При описі без подальшого списку ніякої пам'яті не виділяється, просто задається форма запису. Введене ім'я типу пізніше можна використовувати для оголошення запису, наприклад: struct date day; Тепер змінна day має тип date. При необхідності записи можна ініціалізувати, якщо помістити за оголошенням список початкових значень елементів.
Дозволяється вкладати записи один в інший. Наприклад:
struct УЧЕНЬ { char ПРІЗВИЩЕ [15], ІМ'Я [15];
struct ДАТА ДАТА_НАРОДЖЕННЯ;
Int клас, вік; } ;
Визначений вище тип ДАТА включає три елементи: ДЕНЬ, MECЯЦ, РІК, що містять цілі значення (int). Запис УЧЕНЬ включає елемент ПРІЗВИЩЕ [15], ІМ'Я [15], ДАТА_НАРОДЖЕННЯ, КЛАС, ВІК, ПРІЗВИЩЕ[15] і ІМ'Я[ 15] – це символьні масиви з 15 компонентів кожен (передбачається, що число букв в прізвищі і імені окремо не перевищує 14; при необхідності це число можна легко збільшити). Змінна ДАТА_НАРОДЖЕННЯ представлена складовим елементом (вкладеним записом) ДАТА (кожній даті народження відповідають день місяця, місяць і рік). Елементи КЛАС і ВІК містять значення цілого типу (int). Після введення типів ДАТА і УЧЕНЬ можна оголосити змінні, значення яких належать цим типам. Наприклад:
struct УЧЕНЬ УЧНІ [50];
Тут визначений масив УЧНІ, що складається з 50 елементів УЧЕНЬ.
У мові СІ дозволено використовувати масиви записів; записи можуть складатися з масивів і інших записів,
Щоб звернутися до окремого компоненту запису, необхідно вказати її ім'я, поставити крапку і відразу за нею написати ім'я потрібного елементу (сформоване таким чином ім'я іноді називають складовим). Наприклад:
УЧНІ [I]. КЛАСС=3;
УЧНІ [I]. ДАТА_НАРОДЖЕННЯ . ДЕНЬ=5;
УЧНІ [I]. ДАТА_ НАРОДЖЕННЯ . МІСЯЦЬ=4;
УЧНІ [I]. ДАТА_ НАРОДЖЕННЯ . РІК= 1989;
Тут перший рядок указує, що І-й учень вчиться в третьому класі, а подальші рядки – його дату народження: 5.04.89. При роботі із записами необхідно пам'ятати, що тип елементу визначається відповідним рядком оголошення у фігурних дужках. Наприклад, масив УЧНІ має тип УЧЕНЬ, РІК є цілим числом і т.д. Оскільки кожен елемент запису відноситься до певного типу, його складове ім'я може з'являтися скрізь, де дозволено використовувати значення цього типу.
Розглянемо приклади програм, що показують, як використовувати записи.
У першій програмі оголошуються запис computer і змінна pibm типу computer. Всі описи і визначення дані перед рядком main( ). Далі буде показано, що в цьому випадку змінна pibm є глобальною. Рядки pibm.model, pibm.mem, pibm.sp викликають звернення до відповідних елементів запису pibm типа computer, яким раніше були привласнені певні значення.
/* Демонстрація запису */
# include <stdio.b>
struct computer { int mem;
int sp;
char model[20];}; /* оголошення запису типу computer, що
складається з трьох елементів: mеm, sp, model */
struct computer pibm= { 512, 1,"ПЭВМ ЕС1840.05”};
/* оголошення і ініціалізація змінної pibm типу computer */
main ()
{
printf(“персональна ЕОМ %s\n\n",pibm.model);
printf(“об'єм оперативної пам'яті-%d К байтів\n”, pibm.mem);
printf("продуктивність-%d млн.операцій в секунду\n”, pibm.sp);
/* виведення на екран значення елементів запису */
}
Результати роботи програми мають вигляд:
персональна ЕОМ ПЕВМ ЕС1840.05
об'єм оперативної пам'яті – 5 12 К байт
продуктивність – 1 млн. операцій в секунду
Друга програма показує використання вкладених записів:
/* Демонстрація вкладених записів */
#include <stdio.h>
struct date { int day;
int month;
int year; };
/* оголошення запису типу date */
struct person { cbar fam[20];
char im[20];
char ot[20];
struct date fl; };
/* оголошення запису типу person; одним з елементів
записи person є запис fl типу date */
main()
{ struct person indl; /*оголошення змінної indl типу person */
printf("вкажіть прізвище, ім'я, по батькові, день,\nмісяць і рік
народження громадянина indl\n”);
scanf(“%s%s%s%d%d%d ", indl.fam, indl.im, indl.ot,
&ind1.f1.day, &indl.f1.month, &indl.f1.year);
/* введення відомостей про громадянина indl*/
printf("\nВідомості про громадянина ind1\n");
printf(“Прізвище, ім'я, по батькові: %s %s %s\n",