- •Методичні вказівки
- •Практична робота №1 Шаблонні функції Мета роботи
- •Основні теоретичні відомості
- •Завдання на практичну роботу
- •Завдання на практичну роботу
- •Завдання на практичну роботу
- •Завдання на практичну роботу
- •Завдання на практичну роботу
- •Завдання на практичну роботу
- •Контрольні запитання
- •Література
- •Додаток а Титульний аркуш
Завдання на практичну роботу
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;
}
