- •Методичні вказівки
- •Практична робота №1 Шаблонні функції Мета роботи
- •Основні теоретичні відомості
- •Завдання на практичну роботу
- •Завдання на практичну роботу
- •Завдання на практичну роботу
- •Завдання на практичну роботу
- •Завдання на практичну роботу
- •Завдання на практичну роботу
- •Контрольні запитання
- •Література
- •Додаток а Титульний аркуш
Завдання на практичну роботу
1. Використовуючи рекомендовану літературу та дані методичні вказівки, вивчити основні принципи роботи з послідовними контейнерами vector та list, асоціативним контейнером map.
2. Написати програми, які демонструють можливості відповідних контейнерів згідно індівідувльного завдання(табл.4.5-4.6).
4. Створити класи згідно варіанту (табл. 4.7-4.8). Клас повинен містити: конструктор по замовчанню, конструктор з параметрами.
5. Оформити звіт (назва і мета роботи, індивідуальне завдання, тексти програм, результати роботи програм, висновки).
6. Відповісти на контрольні запитання.
Таблиця 4.5 – Індивідуальні завдання 1
№ |
Завдання |
1 |
2 |
1 |
Використати клас vector бібліотеки STL для зберігання массиву чисел типу double. Створити шаблонну функцію, що обчислює суму елементів масиву. |
2 |
Використати клас vector бібліотеки STL для зберігання массиву чисел типу float. Створити шаблонну функцію, що обчислює суму квадратів елементів. |
3 |
Використати клас vector бібліотеки STL для зберігання массиву чисел типу long int. Створити шаблонну функцію, що знаходить мінімальне значення елемента. |
Продовження табл.4.5
1 |
2 |
4 |
Використати клас vector бібліотеки STL для зберігання массиву чисел типу long int. Створити шаблонну функцію, що знаходить максимальне значення елемента. |
5 |
Використати клас vector бібліотеки STL для зберігання массиву чисел типу long int. Створити шаблонну функцію, що обчислює добуток елементів масиву,що більше 5. |
6 |
Використати клас vector бібліотеки STL для зберігання массиву чисел типу double. Створити шаблонну функцію, що обчислює добуток елементів масиву. |
7 |
Використати клас vector бібліотеки STL для зберігання массиву чисел типу double. Створити шаблонну функцію, що обчислює суму від’ємних елементів масиву. |
8 |
Використати клас vector бібліотеки STL для зберігання массиву чисел типу float. Створити шаблонну функцію, що обчислює суму додатних елементів. |
9 |
Використати клас vector бібліотеки STL для зберігання массиву чисел типу long int. Створити шаблонну функцію, що знаходить суму кубів елементів. |
10 |
Використати клас vector бібліотеки STL для зберігання массиву чисел типу float. Створити шаблонну функцію, що повертає кількість додатних елементів. |
11 |
Використати клас vector бібліотеки STL для зберігання массиву чисел типу long int. Створити шаблонну функцію, що повертає кількість від’ємних елементів. |
12 |
Використати клас vector бібліотеки STL для зберігання массиву чисел типу double. Створити шаблонну функцію, що обчислює середнє арифметичне елементів. |
13 |
Використати клас vector бібліотеки STL для зберігання массиву чисел типу float. Створити шаблонну функцію, що повертає індекс мінімального елемента |
14 |
Використати клас vector бібліотеки STL для зберігання массиву чисел типу long int. Створити шаблонну функцію, що повертає індекс максимального елемента |
15 |
Використати клас vector бібліотеки STL для зберігання массиву чисел типу double. Створити шаблонну функцію, що обчислює добуток від’ємних елементів масиву. |
Таблиця 4.6 – Індивідуальні завдання 2
№ |
Завдання |
1 |
2 |
1 |
Використати
клас list бібліотеки
STL для зберігання списку чисел типу
float, створенних
за наступним законом
|
2 |
Використати
клас list бібліотеки
STL для зберігання списку чисел типу
double,
створенних за наступним законом
|
3 |
Використати
клас list бібліотеки
STL для зберігання списку чисел типу
long int, створенних
за наступним законом
|
4 |
Використати
клас list бібліотеки
STL для зберігання списку чисел типу
float, створенних
за наступним законом
|
5 |
Використати
клас list бібліотеки
STL для зберігання списку чисел типу
double,
створенних за наступним законом
|
6 |
Використати
клас list бібліотеки
STL для зберігання списку чисел типу
long int, створенних
за наступним законом
|
7 |
Використати
клас list бібліотеки
STL для зберігання списку чисел типу
float, створенних
за наступним законом
|
8 |
Використати
клас list бібліотеки
STL для зберігання списку чисел типу
double,
створенних за наступним законом
|
9 |
Використати
клас list бібліотеки
STL для зберігання списку чисел типу
long int, створенних
за наступним законом
|
10 |
Використати клас list бібліотеки STL для зберігання списку чисел типу float, створенних випадково |
11 |
Використати клас list бібліотеки STL для зберігання списку чисел типу double, створенних випадково |
12 |
Використати клас list бібліотеки STL для зберігання списку чисел типу long int, створенних випадково |
13 |
Використати
клас list бібліотеки
STL для зберігання списку символів типу
|
Продовження табл.4.6
1 |
2 |
14 |
Використати клас list бібліотеки STL для зберігання списку чисел типу double, створенних випадково та які не більше 0.1 |
15 |
Використати клас list бібліотеки STL для зберігання списку чисел типу long int, створенних випадково та які не більше 150 |
Таблиця 4.7 – Індивідуальні завдання 3
№ |
Завдання |
1 |
2 |
1 |
Студент характеризується наступною інформацією: номер залікової книжки, ПІП, рік народження, інститут, факультет, № групи. Використати клас vector бібліотеки STL для зберігання інформації про студентів. Забезпечити операції введення-виведення інформації про студентів, додавання та видалення інформації про студентів. |
2 |
Студент характеризується наступною інформацією: номер залікової книжки, ПІП, рік народження, інститут, факультет, № групи. Використати клас list бібліотеки STL для зберігання інформації про студентів. Забезпечити операції введення-виведення інформації про студентів, додавання та видалення інформації про студентів. |
3 |
Деталь містить наступну інформацію: назва, вага, ідентифікаційний номер (id), ідентифікатор гідності. Використати клас vector для моделювання конвеєрної лінії виробництва. Забезпечити операції введення-виведення інформації про деталі, додавання та видалення інформації про деталі. |
4 |
Деталь містить наступну інформацію: назва, вага, ідентифікаційний номер (id), ідентифікатор гідності. Використати клас list для моделювання конвеєрної лінії виробництва. Забезпечити операції введення-виведення інформації про деталі, додавання та видалення інформації про деталі. |
Продовження табл.4.7
1 |
2 |
5 |
Компакт-диски містять наступну інформацію: назва, ідентифікаційний номер (id), тривалість, виконавець. Використати клас vector для зберігання інформації про диски. Забезпечити операції введення-виведення інформації про диски, додавання та видалення інформації про диски. |
6 |
Компакт-диски містять наступну інформацію: назва, ідентифікаційний номер (id), тривалість, виконавець. Використати клас list для зберігання інформації про диски. Забезпечити операції введення-виведення інформації про диски, додавання та видалення інформації про диски. |
7 |
Елемент зупинка містить наступну інформацію: назва, час прибуття, час відправлення, начальник станції. Використати клас vector для формування інформації про маршрут. Забезпечити операції введення-виведення інформації про зупинки, додавання та видалення інформації про зупинки. |
8 |
Елемент зупинка містить наступну інформацію: назва, час прибуття, час відправлення, начальник станції. Використати клас list для формування інформації про маршрут. Забезпечити операції введення-виведення інформації про зупинки, додавання та видалення інформації про зупинки. |
9 |
На телефоній станції картотека абонентів містить наступну інформацію: П.І.Б. абонента, номер телефона, адреса, час розмови в хвилинах, розмір оплати за хвилину. Використати клас list для формування інформації про абонентів. Забезпечити операції введення-виведення інформації про абонентів, додавання та видалення інформації про абонентів. |
10 |
На телефоній станції картотека абонентів містить наступну інформацію: П.І.Б. абонента, номер телефона, адреса, час розмови в хвилинах, розмір оплати за хвилину. Використати клас vector для формування інформації про абонентів. Забезпечити операції введення-виведення інформації про абонентів, додавання та видалення інформації про абонентів. |
Продовження табл.4.7
1 |
2 |
11 |
Створити клас Person. Змінна типу Person повинна вміщувати наступну інформацію про деяку людину: прізвище, ім’я та по–батькові; адреса; рік народження; телефон; зріст, вага, стать. Використати клас vector для формування інформації про деяку групу людей. Передбачити функції для виконання наступних операцій: консольне введення і виведення значень типу Person; ініціалізація. |
12 |
Створити клас Person. Змінна типу Person повинна вміщувати наступну інформацію про деяку людину: прізвище, ім’я та по–батькові; адреса; рік народження; телефон; зріст, вага, стать. Використати клас list для формування інформації про деяку групу людей. Передбачити функції для виконання наступних операцій: консольне введення і виведення значень типу Person; ініціалізація. |
13 |
Створити клас Organization. Змінна типу Organization повинна вміщувати наступну інформацію: назва; адреса; директор; телефон. Передбачити функції для виконання наступних операцій: консольне введення і виведення значень типу Organization; ініціалізація. Створити каталог організацій міста, використовуючи клас list. |
14 |
Створити клас Organization. Змінна типу Organization повинна вміщувати наступну інформацію: назва; адреса; директор; телефон. Передбачити функції для виконання наступних операцій: консольне введення і виведення значень типу Organization; ініціалізація. Створити каталог організацій міста, використовуючи клас vector. |
15 |
Створити клас Film. Зміна типу Film повинна містити наступні поля: назва; рік створення; режисер; кількість акторів; актори. Передбачити функції для виконання наступних операцій: ініціалізація інформації, додавання акторів, консольне введення/виведення інформації про стрічку. Створити каталог стрічок, використовуючи клас list. |
Таблиця 4.8 – Індивідуальні завдання 4
№ |
Завдання |
1 |
На телефоній станції картотека абонентів містить наступну інформацію: П.І.Б. абонента, номер телефона, адреса, час розмови в хвилинах, розмір оплати за хвилину. Використати клас map для формування інформації про абонентів. Забезпечити операції введення-виведення інформації про абонентів, додавання та видалення інформації про абонентів. |
2 |
Створити клас Date, який містить наступну інформацію: дата, визначні події. Використати клас map для формування інформації про календар подій. Забезпечити операції введення-виведення інформації, додавання та видалення інформації про визначні події. |
3 |
Створити клас City, який містить наступну інформацію: назва міста, дата створення, загальна інформація. Використати клас map для формування списку великих міст України. Забезпечити операції введення-виведення, додавання та видалення інформації. |
4 |
Створити клас Записна книжка, який містить наступну інформацію: П.І.Б. людини, номер телефона, ICQ, поштову адресу. Використати клас map для формування списку людей. Забезпечити операції введення-виведення, додавання та видалення інформації. |
5 |
Створити клас Співробітник, який містить наступну інформацію: П.І.Б. людини, імена та дати нарождення дітей. Використати клас map для формування списку людей. Забезпечити операції введення-виведення, додавання та видалення інформації. |
Контрольні запитання
1. Поняття контейнеру, ітератора.
2. Які існують види контейнерів?
3. Опис та методи контейнера vector.
4. Опис та методи контейнера list.
5. Опис та методи контейнера map.
Практична робота №5 Адаптери контейнерів stack, queue бібліотеки STL
Мета роботи
Навчитись використовувати адаптери контейнерів stack, queue бібліотеки STL при розробці програм.
Основні теоретичні відомості
В STL є три адаптери контейнерів stack, queue і priority_queue.
Адаптери не є первинними контейнерами, тому що вони не передбачають дійсної реалізації структури даних, у якій можуть зберігатися елементи, а також тому, що вони не підтримують ітераторів. Перевага адаптерного класу в тому, що програміст може вибрати для нього найбільш відповідну базову структуру даних. У всіх трьох класах адаптерів передбачені елемент-функції push і pop, які відповідним чином вставляють елемент у структуру даних кожного адаптера й видаляють елемент із його структури даних.
Клас stack (стек) допускає вставку й видалення елементів у базовій структурі даних тільки з одного кінця (стек).
Стек – це частковий випадок односпрямованого списку, додавання елементів в який та виборка з якого виконуються з одного кінця, називаємого вершиною стека. Взяти елемент можна тільки з вершини стека, додати елемент можна тільки до вершини стека. При виборці елемент видаляється з стеку. Стек реалізує принцип обслуговування LIFO (last in – first out, останнім прийшов – першим пішов). Основні операції над стеком: занести елемент у стек; вибрати елемент зі стеку; перевірка на порожність стеку; підрахувати кількість значень, що знаходяться у стеку.
Стек може бути реалізований на основі будь-якого контейнера послідовності vector, list або deque. За замовчуванням стек реалізується як deque. Для використання класу підключають файл #include <stack>. Клас stack описують шаблоном
template <class T, class Container = deque<T> > class stack ;
Клас stack реалізує стек та має наступні можливості (табл. 5.1).
template <class T, class Container = deque<T>>
class stack {
public:
typedef Container::value_type value_type;
typedef Container::size_type size_type;
protected:
Container c;
public:
bool empty () const;
size_type size () const;
value_type& top ();
const value_type& top () const;
void push (const value_type& x);
void pop ();
};
template <class T, class Container = deque<T>>
bool operator== (const stack<Container>& x, const stack<Container>& y);
template <class T, class Container = deque<T>>
bool operator< (const stack<Container>& x, const stack<Container>& y);
Таблиця 5.1 – Методи контейнеру stack
Член-функція |
Призначення |
bool empty () const; |
перевірка на порожність стеку |
void pop(); |
видалення елемента з вершини стеку |
void push(const value_type& x); |
вставка елемента на вершину стека |
value_type& top(); |
посилання на верхній елемент стеку |
size_type size(); |
кількість елементів у стеці |
Приклад 1. В наступній програмі демонструється декілька функцій класу stack. В якості даних класу використовується простий тип int, контейнерний класс vector<int>, контейнерний класс list<int>.
#include <iostream>
#include <stack>
#include <vector>
#include <list>
using namespace std;
template <class T>
void show_el(T &s);
void main()
{
stack<int> s1;
stack<int,vector<int>> s2;
stack<int,list<int>> s3;
for (unsigned int i=0; i<10; ++i)
{ s1.push(i); s2.push(i*i); s3.push(i*i*i); }
cout<<"Show elements type int"<<endl; show_el(s1);
cout<<"Show elements type vector <int>"<<endl; show_el(s2);
cout<<"Show elements type list <int>"<<endl; show_el(s3);
}
template <class T>
void show_el(T &s)
{
if (s.empty()) { cout << "No elements!!!" << endl; return; }
while(!s.empty()){ cout<<s.top()<<' '; s.pop(); }
cout<<endl;
}
Приклад 2. Книжки характеризуються наступною інформацією: назва та автор. Використати клас stack бібліотеки STL для зберігання каталогу книжок. Забезпечити операції введення-виведення інформації про книжки, додавання книжки в каталог.
#include <iostream>
#include <string>
#include <stack>
using namespace std;
class book
{
char name[30];
char author[20];
public:
book() {strcpy(name,"");strcpy(author,"");}
book(char* name1,char* author1) {strcpy(name,name1);strcpy(author,author1);}
friend ostream &operator<<(ostream &stream, book obj);
friend void show_books(stack<book> &books);
friend book input_book();
};
ostream &operator<<(ostream &stream, book obj)
{
stream<<"Book name: "<<obj.name<<" Author: "<<obj.author<<endl;
return stream;
}
book input_book()
{
book tmp;
cout<<"Book name: "; cin>>tmp.name;
cout<<"Author: "; cin>>tmp.author;
return tmp;
}
void show_books(stack<book> &s_books)
{
if (s_books.empty())
{ cout << "No books!!!" << endl; return; }
cout<<"Show catalog book"<<endl;
while(!s_books.empty())
{ cout<<s_books.top(); s_books.pop(); }
}
void main()
{
stack <book> books;
unsigned int i,n;
cout<<"Input number book"<<endl;
cin>>n;
for (i=0;i<n;i++) books.push(input_book());
show_books(books);
}
Клас queue (черга) допускає вставку елементів у кінець базової структури даних і видалення елементів з її початку (черга).
Черга – це частковий випадок односпрямованого списку, додавання елементів в який виконується в один кінець, а виборка – з другого кінця. Розмістити елемент можна тільки в кінець черги, а взяти елемент тільки з її початку. При виборці елемент видаляється з черги. Черга реалізує принцип обслуговування FIFO (first in – first out, першим прийшов – першим пішов). Основні операції над чергою аналогічні операціям зі стеком (з урахуванням особливостей структури). Черга може бути реалізована структурою даних STL list або deque.
Для використання класу підключають файл #include < queue >. Клас queue описують шаблоном
template <class T, class Container = deque<T> > class queue;
Клас queue реалізує чергу та має наступні можливості (табл. 5.2).
template <class T, class Container = deque<T>>
class queue {
public:
typedef typename Container::value_type value_type;
typedef typename Container::size_type size_type;
protected:
Container c;
public:
bool empty () const { return c.empty; }
size_type size () const { return c.size; }
value_type& front () { return c.front; }
const value_type& front () const { return c.front(); }
value_type& back () { return c.back; }
const value_type& back () const { return c.back(); }
void push (const value_type& x) { c.push_back(x); }
void pop () { c.pop_back(); }
};
template <class T, class Container>
bool operator== (const queue<T, Container>& x,
const queue<T Container>& y)
{ return x.c == y.c; }
template <class T, class Container>
bool operator< (const queue<T, Container>& x,
const queue<T, Container>& y)
{ return x.c < y.c; }
Таблиця 5.2 – Методи класу класу queue
Член-функція |
Призначення |
empty() |
визначення того, чи порожня черга |
front() |
одержання посилання на перший елемент черги |
pop() |
видалення елемента з з початку черги |
push(const value_type& x) |
вставка елемента в кінець черги |
back () |
одержання посилання на останній елемент черги |
size() |
кількість елементів у черзі |
Для stack та queue перевантажені операції =,[],==,!=,<,>,<=,>=.
Приклад 3. В наступній програмі демонструється декілька функцій класу queue. В якості даних класу використовується простий тип double та контейнерний класс list<double>.
#include <iostream>
#include <queue>
#include <list>
using namespace std;
template <class T>
void show_el(T &q);
void main()
{
queue<double> q1;
queue<double,list<double>> q2;
for (unsigned int i=0; i<10; ++i)
{ q1.push(i*3.2+i); q2.push(i*i+9.8); }
cout<<"Show elements type double"<<endl;
show_el(q1);
cout<<"Show elements type list <double>"<<endl;
show_el(q2);
}
template <class T>
void show_el(T &q)
{
if (q.empty()) { cout << "No elements!!!" << endl; return; }
while(!q.empty()) { cout<<q.front()<<' '; q.pop(); }
cout<<endl;
}
Приклад 4. Книжки характеризуються наступною інформацією: назва та автор. Використати клас queue бібліотеки STL для зберігання каталогу книжок. Забезпечити операції введення-виведення інформації про книжки, додавання книжки в каталог.
#include <iostream>
#include <string>
#include <queue>
using namespace std;
class book
{
char name[30];
char author[20];
public:
book() {strcpy(name,"");strcpy(author,"");}
book(char* name1,char* author1) {strcpy(name,name1);strcpy(author,author1);}
friend ostream &operator<<(ostream &stream, book obj);
friend void show_books(queue<book> &books);
friend book input_book();
};
ostream &operator<<(ostream &stream, book obj)
{
stream<<"Book name: "<<obj.name<<" Author: "<<obj.author<<endl;
return stream;
}
book input_book()
{
book tmp;
cout<<"Book name: "; cin>>tmp.name;
cout<<"Author: "; cin>>tmp.author;
return tmp;
}
void show_books(queue<book> &q_books)
{
if (q_books.empty()) { cout << "No books!!!" << endl; return; }
cout<<"Show catalog book"<<endl;
while(!q_books.empty()) { cout<<q_books.front(); q_books.pop(); }
}
void main()
{
queue<book> books;
unsigned int i,n;
cout<<"Input number book"<<endl; cin>>n;
for (i=0;i<n;i++) books.push(input_book());
show_books(books);
getch();
}
