МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
Національний університет “Львівська політехніка”
Кафедра САП
Звіт
до лабораторної роботи № 3
СТРУКТУРИ ТА ОБ’ЄДНАННЯ В МОВІ ПРОГРАМУВАННЯ С
з курсу “Проблемно-орієнтоване програмування”
для студентів спеціальності "Комп’ютерні системи проектування"
Львів 2013
ТЕОРЕТИЧНІ ВІДОМОСТІ
Структури
Структура - це набір з однієї або більше змінних, можливо різних типів, згрупованих під одним ім'ям для зручності обробки. (У деяких мовах, наприклад Паскаль, структури називаються “записами”).
Розглянемо приклад. Уявіть собі, що на календарі сьогодні 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.
Операція вказівника на член структури "." зв'язує ім'я структури та ім'я члена.
Доступ до компонентів структури
Доступ до полів структури здійснюється за допомогою оператора "." при безпосередній роботі зі структурою або "->" - при використанні вказівників на структуру. Ці оператори (. і ->) називаються селекторами членів класу. Загальний синтаксис для доступу до компонентів структури наступний:
Вказівник на елемент структури має всі властивості звичайної змінної. Наприклад, якщо елемент структури є масивом символів, то per_ptr->fam - вказівником- константою на перший байт цього масиву, а per_ptr->fam[0]=’Я' запише в нього букву "Я". Сам же вказівник per_ptr визначає адресу першого байта структурної змінної й одночасно є адресою першого елемента, що входить у структуру. У нашому випадку - адресою fam[0]. Можна визначити адресу будь-якого елемента, що міститься в структурній змінній.
Ініціалізація структур
При визначенні структурних змінних можна ініціалізувати їхні поля. Ця можливість подібна ініціалізації масиву й слідує тим же правилам:
ім'я_шаблона ім'я_змінної_структури = {значення1., значення2, . . .};
ім'я_змінної_структури . член_даних ;
ім'я_вказівника -> ім'я_поля;
(*ім'я_вказівника) . ім'я_поля;
Компілятор присвоює значення1 першій змінній в структурі, значення2 - другій змінній й т.д., і тут необхідно додержуватися деяких правил:
1. значення, що присвоюються, повинні співпадати по типу з відповідними полями структури;
2. можна оголошувати кількість значень, що присвоюються, меншу, ніж кілкість полів. Компілятор присвоїть нулі іншим полям структури;
3. список ініціалізації послідовно присвоює значення полям структури, вкладених структур і масивів.
Об'єднання
Об’єднання подібне структурі, але в кожен момент часу може використовуватись (або є активним) тільки один з його компонентів. Тип об’єднання може задаватися записом виду
union МІТКА {
опис компонента а1;
опис компонента а2;
…………………….
опис компонента аn;
};
Для кожного з цих компонентів виділяється одна і та ж область пам’яті, тобто вони перекриваються. Хоча доступ до цієї області пам’яті можливий через використання будь-якого з компонентів. Компонент для цієї мети повинен вибиратися так, щоб отриманий результат не був беззмістовним.
Як вже зазначалось, об’єднання подібні структурам. Доступ до компонент об’єднання відбувається тим самим способом, що і для структур.
Об’єднання застосовуються:
для мінімізації об’єму пам’яті, що використовується, якщо в кожний момент часу тільки один об’єкт з багатьох є активним;
для інтерпретації основного представлення об’єкта одного типу, так ніби цьому об’єкту був присвоєний другий тип.
Роль об’єднання аналогічна ролі опису еквівалентності (equivalence) в Фортрані. Компоненти в об’єднанні взаємозв’язані точно так, як два об’єкта, зв’язані відношенням еквівалентності в Фортрані.
ЗАВДАННЯ ДО ЛАБОРАТОРНОЇ РОБОТИ(1 варіант)
Задано 4 складні математичні вирази. Перевірити чи правильно записані дужки. Якщо якоїсь дужки не вистачає видати повідомлення про некоректність виразу.
КОД ПРОГРАМИ
#include <stdio.h>
#include <conio.h>
struct TElem {
char symbol;
TElem *next;
} *stack = NULL;
void Push(char c)
{
TElem *tmp = new TElem;
tmp->next = stack;
tmp->symbol = c;
stack = tmp;
}
char Pop()
{
if (!stack) return 0;
TElem *tmp = stack->next;
char res = stack->symbol;
delete stack;
stack = tmp;
return res;
}
void FreeStack()
{
while (Pop()) {}
}
bool isBracketTrue (char *str)
{
for (int i = 0; str[i]; i++) {
if (str[i] == '(') Push('(');
else if (str[i] == ')')
if (!Pop()) {
FreeStack();
return false;
}
}
if (stack) {
FreeStack();
return false;
}
return true;
}
int main()
{
char d[4][30];
printf("Enter 4 arif vuraz\n");
for (int i = 0; i < 4; i++)
scanf("%s",d[i]);
for ( i = 0; i < 4; i++)
if (isBracketTrue(d[i])) printf("%d vuraz All OK\n",i);
else printf("%d vuraz All bad\n",i);
getch();
}
РЕЗУЛЬТАТ ВИКОНАННЯ
ВИСНОВОК
На даній лабораторній роботі я навчитися використовувати структури та об’єднання для програмування на мові С.