Лабораторна робота № 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. Перелічувані константи за умовчанням нумеруються значеннями, починаючи|розпочинаючи,зачинаючи| з|із| нуля. Допускається явне призначення|присвоєння| цілого значення в перелічуваному наборі|перерахування| у вигляді|виді|:
перелічувана_константа=значення.

Наши рекомендации