Лабораторна робота № 5 Робота з|із| абстрактними типами даних(АТД|): struct, union, enum
Мета. Отримати тримати практичні навички навички побудови та застосування абстрактних типів даних на С++
Короткі теоретичні відомості
Структура використовується для об'єднання різнотипних даних в одиночну іменовану змінну. Компоненти структури мають індивідуальні імена.
Загальний|спільний| синтаксис визначення структурного типу даних (шаблону АТД|):
struct таг _ структури
{
список членів структури, які можуть мати будь-який стандартний або абстрактний тип даних
};
В описі обов'язковий оператор «;» після|потім| «}». Далі як тип виступає|вирушає| таг_структури, тобто, щоб оголосити змінну, яка має організацію даних як шаблон структури, необхідно написати:
таг_структури ідентифікатор;
або таг_структури* ідентифікатор;
, якщо змінна повинна містити|утримувати| адресу змінної структурного типа.
Звернення до членів структури відбувається|походить| по імені, яке складається з імені змінно структурного типа і імені члена з|із| шаблону структури.
Приклад. Задати масив структур, кожна з яких містить|утримує| поля: ім’я_клієнта і сума_виплат.
# include < iostream. h>
void main ()
{ struct client {
char name [15];
int sum;
} ; //визначенняструктурного типу client
client mas [10]; //виділення пам’яті під 10 елементів типу client
int i, num; // кількість осіб
cin >> num;
for (i = 0; i < num; i++)
{ cout << ¢¢ \ n введіть і’мя ¢¢
cin >> mas [i].name; //звернення до поля name
cout << “ сумму виплат”;
cin >> mas [i].sum; //звернення до поля sum
} }
З|із| прикладу|зразка| видно|показно|, що для звернення до члена структури використовується оператор ¢¢.¢¢ (прямого доступу до членів абстрактного типу даних).
Якщо змінна є|з'являється,являється| покажчиком на структуру (містить|утримує| адресу структури), то до члена структури можна звернутися|обернутися| за допомогою оператора непрямого доступу до члена структури
Покажчик_на_структуру –> ім’я_члена_структури
або за допомогою оператора прямого доступу з використанням оператора переходу за адресою «*»:
|(*Покажчик_на_структуру). ім’я_члена_структури
Організація даних у формі списку дозволяє зберігати елементи списку в різних|перебувають| ділянках пам'яті, які, на відміну від масивів, не |поруч| знаходяться поряд. Для створення|створіння| елементу списку використовується структурний тип даних. При цьому одним з членів структури є|з'являється,являється| покажчик на створений структурний тип. Фактично цей покажчик містить|утримує| адресу |наступного| або попереднього елементу списку.
Приклад.Написати програму створення|створіння|, перегляду|проглядання| і видалення|віддалення| елементів списку, організованого за принципом LIFO(«last input, first output» – «останній прийшов,- перший пішов»).
#include <iostream.h>
#include <process.h>
#include <conio.h>
//визначення перелічуваного типукористувача boolean
enum boolean{true, false};
//визначення шаблону елемента списку за допомогою типу struct
struct stack{
char s;
stack* p;
};
//оператор typedef дозволяє створити тип користувача Stk, який є
//аналогом стандартного типу stack*
typedef stack* Stk;
Stk stk;
//функція reset() повертає порожній покажчик(адресу) вершини стеку,
//тобто відбувається “скидання” стеку
Stk reset()
{
return NULL;
}
//функція push(char c, Stk top) заносить символ с, що введено, на вершину //стеку, утворюючі новий елемент списку типу stack и повертає його //адресу як адресу першого елементу в списку
Stk push(char c, Stk top)
{ stk=new stack;
if(stk==NULL){ cout<<"\n Помилка при розподілі пам’яті";
exit(1);}
stk->s=c;
if(top!=NULL) stk->p=top;
return stk;
}
/*функція pop( Stk top) виштовхує елемент вершини, видає символ , що зберігається в вершині, на екран, замінює адресу попередньої вершини адресою вершини, що йде за нею, а місце, що було розподілене під попередню вершину звільняється (повертається до “купи” вільної пам’яті)*/
Stk pop( Stk top)
{ cout<<top->s;
stk=top;
top=top->p;
delete stk;
return top->p;
}
//функція empty( const Stk top) перевіряє, чи є стек порожнім, повертає
// константу false, якщо це так
boolean empty( const Stk top)
{ return (boolean)(top==NULL);
}
void main()
{ clrscr();
Stk top;
char str[]="fghg hfgt dtdt dtyd dtyf";
int i=0;
cout<<str<<endl;
top=reset();
while(str[i])
top=push(str[i++],top);
while(!empty(top))
top=pop(top);
getch();
}
Об'єднання (union) – це похідний тип від типу struct. Синтаксис визначення об’єднання такий же, як і у|в,біля| структур, за винятком того, що ключове|джерельне| слово union замінюється struct. Ці типи відмінні|розрізняти| за способом зберігання членів АТД|. Члени об'єднання сумісно| використовують пам'ять, тобто їх значення перекриваються. При цьому під об'єднання виділяється об'єм|обсяг| пам'яті, достатній для зберігання найбільшого члена об'єднання. Члени структур зберігаються подібно до масивів (послідовно у вигляді лінійної структури відповідно до їх оголошення усередині шаблону структури).
Ключове|джерельне| слово| enum використовується для оголошення особливого типу з|із| набором іменованих цілих констант, званих константами перелічуваного типу, або константами переліку|перерахування| (enumerators). Перелічуваний тип даних, має структуру оголошення таку ж, як struct, або union. Перелічувані константи за умовчанням нумеруються значеннями, починаючи|розпочинаючи,зачинаючи| з|із| нуля. Допускається явне призначення|присвоєння| цілого значення в перелічуваному наборі|перерахування| у вигляді|виді|:
перелічувана_константа=значення.