Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
pract_oop_03.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
973.82 Кб
Скачать

Завдання на практичну роботу

1. Використовуючи рекомендовану літературу та дані методичні вказівки, вивчити основні принципи роботи з адаптерами контейнерів stack та queue.

2. Написати програми, які демонструють можливості відповідних контейнерів згідно індівідувльного завдання(табл.5.3).

4. Створити клас згідно варіанту (табл. 5.4). Клас повинен містити: конструктор по замовчанню, конструктор з параметрами.

5. Оформити звіт (назва і мета роботи, індивідуальне завдання, тексти програм, результати роботи програм, висновки).

6. Відповісти на контрольні запитання.

Таблиця 5.3 – Індивідуальні завдання 1

Завдання

1

2

1

Використати класи stack та queue бібліотеки STL для зберігання чисел типу float, створенних за наступним законом

2

Використати класи stack та queue бібліотеки STL для зберігання чисел типу double, створенних за наступним законом

Продовження табл.5.3

1

2

3

Використати класи stack та queue бібліотеки STL для зберігання чисел типу long int, створенних за наступним законом

4

Використати класи stack та queue бібліотеки STL для зберігання чисел типу float, створенних за наступним законом

5

Використати класи stack та queue бібліотеки STL для зберігання чисел типу double, створенних за наступним законом

6

Використати класи stack та queue бібліотеки STL для зберігання чисел типу long int, створенних за наступним законом

7

Використати класи stack та queue бібліотеки STL для зберігання чисел типу float, створенних за наступним законом

8

Використати класи stack та queue бібліотеки STL для зберігання чисел типу double, створенних за наступним законом

9

Використати класи stack та queue бібліотеки STL для зберігання чисел типу long int, створенних за наступним законом

10

Використати класи stack та queue бібліотеки STL для зберігання чисел типу float, створенних випадково

11

Використати класи stack та queue бібліотеки STL для зберігання чисел типу double, створенних випадково

12

Використати класи stack та queue бібліотеки STL для зберігання чисел типу long int, створенних випадково

13

Використати класи stack та queue бібліотеки STL для зберігання символів типу , які випадково вибрані з латинського алфавіту

14

Використати класи stack та queue бібліотеки STL для зберігання чисел типу double, створенних випадково та які не більше 0.1

15

Використати класи stack та queue бібліотеки STL для зберігання чисел типу long int, створенних випадково та які не більше 150

Таблиця 5.4 – Індивідуальні завдання 2

Завдання

1

2

1

Студент характеризується наступною інформацією: номер залікової книжки, ПІП, рік народження, інститут, факультет, № групи. Використати клас stack бібліотеки STL для зберігання інформації про студентів. Забезпечити операції введення-виведення інформації про студентів, додавання та видалення інформації про студентів.

2

Студент характеризується наступною інформацією: номер залікової книжки, ПІП, рік народження, інститут, факультет, № групи. Використати клас queue бібліотеки STL для зберігання інформації про студентів. Забезпечити операції введення-виведення інформації про студентів, додавання та видалення інформації про студентів.

3

Деталь містить наступну інформацію: назва, вага, ідентифікаційний номер (id), ідентифікатор гідності. Використати клас stack для моделювання конвеєрної лінії виробництва. Забезпечити операції введення-виведення інформації про деталі, додавання та видалення інформації про деталі.

4

Деталь містить наступну інформацію: назва, вага, ідентифікаційний номер (id), ідентифікатор гідності. Використати клас queue для моделювання конвеєрної лінії виробництва. Забезпечити операції введення-виведення інформації про деталі, додавання та видалення інформації про деталі.

5

Компакт-диски містять наступну інформацію: назва, ідентифікаційний номер (id), тривалість, виконавець. Використати клас stack для зберігання інформації про диски. Забезпечити операції введення-виведення інформації про диски, додавання та видалення інформації про диски.

Продовження табл.5.4

1

2

6

Компакт-диски містять наступну інформацію: назва, ідентифікаційний номер (id), тривалість, виконавець. Використати клас queue для зберігання інформації про диски. Забезпечити операції введення-виведення інформації про диски, додавання та видалення інформації про диски.

7

Елемент зупинка містить наступну інформацію: назва, час прибуття, час відправлення, начальник станції. Використати клас stack для формування інформації про маршрут. Забезпечити операції введення-виведення інформації про зупинки, додавання та видалення інформації про зупинки.

8

Елемент зупинка містить наступну інформацію: назва, час прибуття, час відправлення, начальник станції. Використати клас queue для формування інформації про маршрут. Забезпечити операції введення-виведення інформації про зупинки, додавання та видалення інформації про зупинки.

9

На телефоній станції картотека абонентів містить наступну інформацію: П.І.Б. абонента, номер телефона, адреса, час розмови в хвилинах, розмір оплати за хвилину. Використати клас stack для формування інформації про абонентів. Забезпечити операції введення-виведення інформації про абонентів, додавання та видалення інформації про абонентів.

10

На телефоній станції картотека абонентів містить наступну інформацію: П.І.Б. абонента, номер телефона, адреса, час розмови в хвилинах, розмір оплати за хвилину. Використати клас queue для формування інформації про абонентів. Забезпечити операції введення-виведення інформації про абонентів, додавання та видалення інформації про абонентів.

11

Створити клас Person. Змінна типу Person повинна вміщувати наступну інформацію про деяку людину: прізвище, ім’я та по–батькові; адреса; рік народження; телефон; зріст, вага, стать. Використати клас queue для формування інформації про деяку групу людей. Передбачити функції для виконання наступних операцій: консольне введення і виведення значень типу Person; ініціалізація.

Продовження табл.5.4

1

2

12

Створити клас Person. Змінна типу Person повинна вміщувати наступну інформацію про деяку людину: прізвище, ім’я та по–батькові; адреса; рік народження; телефон; зріст, вага, стать. Використати клас stack для формування інформації про деяку групу людей. Передбачити функції для виконання наступних операцій: консольне введення і виведення значень типу Person; ініціалізація.

13

Створити клас Organization. Змінна типу Organization повинна вміщувати наступну інформацію: назва; адреса; директор; телефон. Передбачити функції для виконання наступних операцій: консольне введення і виведення значень типу Organization; ініціалізація. Створити каталог організацій міста, використовуючи клас stack.

14

Створити клас Organization. Змінна типу Organization повинна вміщувати наступну інформацію: назва; адреса; директор; телефон. Передбачити функції для виконання наступних операцій: консольне введення і виведення значень типу Organization; ініціалізація. Створити каталог організацій міста, використовуючи клас queue.

15

Створити клас Film. Зміна типу Film повинна містити наступні поля: назва; рік створення; режисер; кількість акторів; актори. Передбачити функції для виконання наступних операцій: ініціалізація інформації, додавання акторів, консольне введення/виведення інформації про стрічку. Створити каталог стрічок, використовуючи клас stack.

Контрольні запитання

1. Що таке стек?

2. Що таке черга?

3. Представлення в пам’яті стеків та черг.

4. Які основні операції виконуються над такими структурами даних як стек та черга?

5. Переваги та недоліки різного представлення в пам’яті структур даних стек та черга.

6. Опис та методи контейнера stack.

7. Опис та методи контейнера queue.

Практична робота №6 Алгоритми бібліотеки STL

Мета роботи

Навчитись використовувати алгоритми бібліотеки STL при розробці програм.

Основні теоретичні відомості

Алгоритми обробляють зміст контейнеру. Багато алгоритмів працює з діапазоном елементів контейнеру. Алгоритми це частина STL, що більш всього нагадує традиційну бібліотеку функцій. Але головна їх різниця в тому, що вони – шаблоні функції.

За рідким виключенням, ці шаблоні функції використовують аргументи-ітератори для маніпулювання послідовностями.

Для використання алгоритмів необхідно додати в програму заголовок <algorithm>. Розглянемо алгоритми, визначені бібліотекою STL (табл.6.1)

Таблиця 6.1 – Основні алгоритми бібліотеки STL

Шаблон функції

Призначення

1

2

Операції, що не модифікують послідовності

template <class InputIterator,

class Function>

Function for_each (InputIterator first, InputIterator last,

Function f);

Алгоритм застосовує функцію f до діапазону елементів, що заданий параметрами first та last. Алгоритм повертає функцію f.

template <class InputIterator,

class T>

InputIterator find ( InputIterator first, InputIterator last, const T& value );

Алгоритм в діапазоні, що заданий параметрами first та last, виконує пошук значення, заданого параметром value. Алгоритм повертає ітератор для першого входження елемента або для кінця діапазону (last), якщо в заданій послідовності іскоме значення не виявлено.

Продовження табл.6.1

1

2

template <class ForwardIterator>

ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last );

Алгоритм виконує пошук співпадаючих суміжних елементів усередині послідовності, що задана параметрами first та last, і повертає ітератор для першого елемента. Якщо ні однієї суміжної пари не виявлено, повертається значення last. Перша версія призначена для пошуку еквівалентних елементів.

template <class InputIterator,

class T> typename iterator_traits <InputIterator>::difference_type

count ( ForwardIterator first,

ForwardIterator last, const T& value);

Алгоритм повертає кількість елементів зі значенням value в послідовності, межи якої задані параметрами first та last.

template <class InputIterator1, class InputIterator2>

pair<InputIterator1, InputIterator2>

mismatch (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2 );

Алгоритм виконує пошук першого неспівпадіння елементів у двох послідовностях та повертає ітератори для цих двох елементів. Якщо неспівпадіння не виявлено, повертаються ітератори last1 та first2+( last1-start1).

template <class ForwardIterator1, class ForwardIterator2> ForwardIterator1 search (ForwardIterator1 first1, ForwardIterator1 last1,

ForwardIterator2 first2, ForwardIterator2 last2 );

Алгоритм виконує пошук однієї послідовності усередині іншої. Послідовність, усередині якої виконується пошук, задається параметрами first1 та last1,а іскома послідовність – параметрами first2 та last2. Якщо іскома послідовність знайдена, повертається ітератор, що вказує на її початок. У протилежному випадку повертається ітератор last1.

Продовження табл.6.1

1

2

template <class ForwardIterator, class Size, class T>

ForwardIterator search_n (ForwardIterator first, ForwardIterator last, Size count, const T& value );

Алгоритм усередині послідовності виконує пошук іншої послідовності, що складається з count елементів, рівних значенню value. Послідовність, усередині якої виконується пошук, задається параметрами first та last. У протилежному випадку повертається ітератор last.

Операції, що модифікують послідовності

template <class InputIterator, class OutputIterator>

OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result);

Алгоритм копіює послідовність, межи якої задані параметрами first та last, і поміщує результат в послідовність, адресуєму параметром result. Алгоритм повертає ітератор, відповідний закінченню результуючої послідовності. Діапазон послідовності, що копіюється, не повинен перекривати діапазон послідовності, заданої параметром result.

template <class BidirectionalIterator1, class BidirectionalIterator2>

BidirectionalIterator2 copy_backward (BidirectionalIterator1 first,

BidirectionalIterator1 last,

BidirectionalIterator2 result );

Алгоритм аналогічний алгоритму copy ( ), за винятком того, що копіювання проходить в зворотньому порядку, тобто спочатку переміщуються елементи, що знаходяться в кінці послідовності.

template <class ForwardIterator, class T >

void fill (ForwardIterator first, ForwardIterator last, const T& value);

template < class OutputIterator, class Size, class T >

void fill_n (OutputIterator first, Size n, const T& value);

Алгоритми заповнюють діапазон значенням, заданим параметром value. Для версії fill ( ) діапазон задається параметрами first та last. Для версії fill_n ( ) початок діапазону задається параметром first, після чого в операції заповнення беруть участь n елементів.

template <class T>

void swap ( T& a, T& b );

Алгоритм міняє місцями значення, що задані посиланнями a та b.

Продовження табл.6.1

1

2

template < class ForwardIterator1, class ForwardIterator2 >

ForwardIterator2 swap_ranges (ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2 );

Алгоритм виконує обмін елементів у діапазоні, що заданий параметрами first1 та last1, і елементів послідовності, початок якої задається параметром first2. Алгоритм повертає покажчик на кінець послідовності, що задана параметром first2

template < class InputIterator, class OutputIterator, class UnaryOperator >

OutputIterator transform (InputIterator first1, InputIterator last1,OutputIterator result, UnaryOperator op );

Алгоритм застосовує функцію до діапазону елементів та зберігає результат в послідовності, що задана параметром result. У першій формі діапазон задається параметрами first1 та last1. Застосована функція задається параметром op. Вона приймає значення елемента в якості параметра і повинна повернути перетворене значення.

Сортування

template <class RandomAccessIterator>

void sort (RandomAccessIterator first, RandomAccessIterator last );

Алгоритм сортує діапазон, що задан параметрами first та last в порядку зростання

template <class RandomAccessIterator>

void partial_sort (RandomAccessIterator first, RandomAccessIterator middle,

RandomAccessIterator last );

Алгоритм сортує діапазон, що задан параметрами first та last. Однак після виконання алгоритму відсортованими будуть тільки елементи з діапазону, що визначений параметрами first та middle.

template <class RandomAccessIterator>

void stable_sort (RandomAccessIterator first, RandomAccessIterator last );

Алгоритм виконує стійке сортування діапазону, що заданий параметрами first та last. Стійке сортування означає, що рівні елементи не переміщуються.

Продовження табл.6.1

1

2

Операції для впорядкованих послідовностей

template <class InputIterator1, class InputIterator2, class OutputIterator>

OutputIterator merge (InputIterator1 first1, InputIterator1 last1,

InputIterator2 first2, InputIterator2 last2, OutputIterator result);

Алгоритм об’єднує дві впорядковані послідовності, поміщуя результат в третю послідовність. Об`єднані послідовності задаються параметрами first1, last1 та first2, last2. Результат поміщується у послідовність, що адресована параметром result. Повертається ітератор, що вказує на кінець результуючої послідовності.

Пошук мінімального, максимального елементів

template <class T> const T& max (const T& a, const T& b);

Алгоритм повертає найбільше з двох значень.

template <class ForwardIterator>

ForwardIterator max_element (ForwardIterator first, ForwardIterator last );

Алгоритм повертає ітератор для найбільшого елемента усередині діапазону, заданого параметрами first та last.

template <class T> const T& min (const T& a, const T& b);

Алгоритм повертає найменше з двох значень.

template <class ForwardIterator>

ForwardIterator min_element (ForwardIterator first, ForwardIterator last );

Алгоритм повертає ітератор для найменшого елемента усередині діапазону, заданого параметрами first та last.

Приклад 1. В наступній програмі наведений приклад реалізації алгоритму for_each.

#include <iostream>

#include <algorithm>

#include <vector>

using namespace std;

void myfunction (int i) { cout << " " << i; }

// створення структури myclass

struct myclass {

void operator() (int i) {cout << " " << i;}

} myobject;

int main () {

vector<int> myvector;

myvector.push_back(10); //занесення елементу

myvector.push_back(20);

myvector.push_back(30);

cout << "myvector contains:";

// використання алгоритму for_each

for_each (myvector.begin(), myvector.end(), myfunction);

cout << "\nmyvector contains:";

for_each (myvector.begin(), myvector.end(), myobject);

cout << endl;

return 0;

}

Приклад 2. В наступній програмі наведений приклад реалізації алгоритму find.

#include <iostream>

#include <algorithm>

#include <vector>

using namespace std;

int main () {

int myints[] = { 10, 20, 30 ,40 };

int * p;

// покажчик на масив елементів

p = find(myints,myints+4,30);

++p;

cout << "The element following 30 is " << *p << endl;

vector<int> myvector (myints,myints+4);

vector<int>::iterator it; // ітератор на елемент вектор

// використання алгоритму find

it = find (myvector.begin(), myvector.end(), 30);

++it;

cout << "The element following 30 is " << *it << endl;

return 0;

}

Приклад 3. В наступній програмі наведений приклад реалізації алгоритму copy.

#include <iostream>

#include <algorithm>

#include <vector>

using namespace std;

int main () {

int myints[]={10,20,30,40,50,60,70};

vector<int> myvector;

vector<int>::iterator it;

myvector.resize(7); // виділення розміру для 7 елементів

// використання алгоритму copy

copy ( myints, myints+7, myvector.begin() );

cout << "myvector contains:";

for (it=myvector.begin(); it!=myvector.end(); ++it)

cout << " " << *it;

cout << endl;

return 0;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]