МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Кафедра САПР
Звіт
до лабораторної роботи №10
на тему «СТРУКТУРИ ТА ОБ’ЄДНАННЯ В МОВІ ПРОГРАМУВАННЯ С»
з курсу «Проблемно-орієнтовані мови програмування»
ЛЬВІВ 2011
Мета роботи
Навчитися використовувати структури та об’єднання для програмування на мові С.
Теоретичні відомості
Структури
Структура - це набір з однієї або більше змінних, можливо різних типів, згрупованих під одним ім'ям для зручності обробки. (У деяких мовах, наприклад Паскаль, структури називаються “записами”).
Розглянемо приклад. Уявіть собі, що на календарі сьогодні 1 січня 2009 року. Дата складається з складових таких, як день, рік та назва місяця. Ці три змінні можна об’єднати в одну структуру вигляду:
struct DATE {
int day;
int year;
char mon_name[4];
};
Опис структури, що складається з взятого в фігурні дужки списку полів, починається з ключового слова struct. Після слова struct пишеться ім'я, так звана Мітка структури (тут це DATE). Ім’я може бути відсутнє. Така мітка іменує структури цього виду і може використовуватися надалі як скорочений запис детального опису. Елементи або змінні, згадані в структурі, називаються членами (полями, компонентами). Мітки і члени структур можуть мати такі ж імена, що і звичайні змінні (тобто ті, що не є членами структур), оскільки їх імена завжди можна розрізнити по контексту. Звичайно однакові імена присвоюють тільки тісно пов'язаним об'єктам.
Точно так само, як у разі будь-якого іншого базового типу, за правою фігурною дужкою, що закриває список членів, може записуватись список змінних.
Оператор
struct { } x, y, z; // описує struct { }
синтаксично аналогічний
int x, y, z; // описує int
в тому сенсі, що кожен з операторів описує x, y та z в якості змінних відповідних типів і приводить до виділення для них пам’яті.
Опис структури, за яким не має списку змінних, не приводить до виділення пам'яті (немає змінної); він тільки визначає шаблон або форму структури. Але, якщо в такому опису є мітка, то ця мітка може бути використана пізніше при визначенні фактичних примірників структур. Наприклад, якщо дано приведений вище опис Date, то struct DATE d; визначає змінну d як структура типу Date.
Ініціалізація структур
При визначенні структурних змінних можна ініціалізувати їхні поля. Ця можливість подібна ініціалізації масиву й слідує тим же правилам:
ім'я_шаблона ім'я_змінної_структури = {значення1., значення2, . . .};
Компілятор присвоює значення1 першій змінній в структурі, значення2 - другій змінній й т.д., і тут необхідно додержуватися деяких правил:
1. значення, що присвоюються, повинні співпадати по типу з відповідними полями структури;
2. можна оголошувати кількість значень, що присвоюються, меншу, ніж кілкість полів. Компілятор присвоїть нулі іншим полям структури;
3. список ініціалізації послідовно присвоює значення полям структури, вкладених структур і масивів.
Наприклад:
struct date
{ іnt day, month, year;
} d[5] = { {1, 3, 1980),
{5, 1, 1990},
{1, 1, 1983}
};
/* Проініціалізовані перші три елементи масиву */
struct person bguіr[20]={
{"Бурба","Дмитро", "Леонідович", 75., 185, 15, 1, 1980},
{"Таболич", "Юрій", "Олександрович", 70., 180, 25, 8, 1983}};
/* Проініціалізовані 2 елементи масиву структур */
Об'єднання
Об’єднання подібне структурі, але в кожен момент часу може використовуватись (або є активним) тільки один з його компонентів. Тип об’єднання може задаватися записом виду
union МІТКА {
опис компонента а1;
опис компонента а2;
…………………….
опис компонента аn;
};
Для кожного з цих компонентів виділяється одна і та ж область пам’яті, тобто вони перекриваються. Хоча доступ до цієї області пам’яті можливий через використання будь-якого з компонентів. Компонент для цієї мети повинен вибиратися так, щоб отриманий результат не був беззмістовним.
Як вже зазначалось, об’єднання подібні структурам. Доступ до компонент об’єднання відбувається тим самим способом, що і для структур.
Об’єднання застосовуються:
для мінімізації об’єму пам’яті, що використовується, якщо в кожний момент часу тільки один об’єкт з багатьох є активним;
для інтерпретації основного представлення об’єкта одного типу, так ніби цьому об’єкту був присвоєний другий тип.
Роль об’єднання аналогічна ролі опису еквівалентності (equivalence) в Фортрані. Компоненти в об’єднанні взаємозв’язані точно так, як два об’єкта, зв’язані відношенням еквівалентності в Фортрані.
В якості прикладу визначення об’єкта типу union розглянемо об’єднання shape, яке визначається наступним чином:
struct position {
int x; // 2 байти
int y; // 2 байти
};
union {
float radius; // коло 4 байти
float a[2]; // прямокутник 4*2=8 байт
int b[3]; // трикутник 2*3=6 байт
struct position p; // координата точки 2+2=4 байти
} shape;
Розмір об’єднання shape дорівнює не суммі всіх байтів, як у випадку структури, а розміру найбільшого поля (компоненти), тобто 8 байт.
В цьому прикладі є сенс використовувати тільки той компонент, який отримав останнім своє значення.
Індивідуальне завдання
Знайти найхолодніший і найтепліший день квітня. В метеорологічній інформації міститься: день місяця, температура, опади.
Текст програми
#include <stdio.h>
#include <math.h>
struct temp{
int day;
float temper;
};
int main()
{
struct temp d[3];
float max,min;
int i;
printf("Meteorological information for April:\n");
printf("Enter day and temperature:\n");
for(i=0;i<3;i++)
scanf("%d%f",&d[i].day,&d[i].temper);
max=d[0].temper;
min=d[0].temper;
for(i=0;i<3;i++)
if (max<d[i].temper) max=d[i].temper;
for(i=0;i<3;i++)
if (min>d[i].temper) min=d[i].temper;
printf("Meteorological information for April:\n");
printf("Day Temperature\n");
for(i=0;i<3;i++)
printf("%d %2.2f\n",d[i].day,d[i].temper);
printf("Max temperature=%2.2f\n",max);
printf("Min temperature=%2.2f\n",min);
return 0;
}
Результати обчислень
Висновок: Я навчився використовувати структури та об’єднання для програмування на мові С.