Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лабы / лаба 15 и 16 прога

.docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
129.37 Кб
Скачать

Ф ЕДЕРАЛЬНОЕ АГЕНСТВО ВОЗДУШНОГО ТРАНСПОРТА

(РОСАВИАЦИЯ)

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ГРАЖДАНСКОЙ АВИАЦИИ» (МГТУ ГА)

Кафедра вычислительных машин, комплексов, систем и сетей.

Лабораторная работа защищена с оценкой ____________________

____________________

(подпись преподавателя, дата)

ЛАБОРАТОРНАЯ РАБОТА №15 и 16

по дисциплине «Программирование».

Вариант №17

Тема: «Демонстрация использования алгоритмов STL для обработки элементов контейнерных классов, встроенных и пользовательский тип.»

Выполнила студентка группы ИС 1-1

Магальник Екатерина Борисовна

Руководитель: Белозуб Юлия Валерьевна

МОСКВА – 2023

Цель

Освоить технологию обобщенного программирования с использованием библиотеки стандартных шаблонов (STL) языка C++.

ЛР 15

Программа № 1 - Контейнеры

1. Создать объект-контейнер в соответствии с вариантом задания и заполнить его данными, тип которых определяется вариантом задания.

2. Просмотреть контейнер.

3. Изменить контейнер, удалив из него одни элементы и заменив другие.

4.Просмотреть контейнер, используя для доступа к его элементам итераторы.

5. Создать второй контейнер этого же класса и заполнить его данными того же типа, что и первый контейнер.

6. Изменить первый контейнер, удалив из него n элементов после заданного и добавив затем в него все элементы из второго контейнера.

7. Просмотреть первый и второй контейнеры.

ЛР 16

Программа № 2

Выполнить то же самое, но для данных пользовательского типа.

Программа № 3

1. Создать контейнер, содержащий объекты пользовательского типа. Тип контейнера выбирается в соответствии с вариантом задания.

2. Отсортировать его по убыванию элементов.

3. Просмотреть контейнер.

4. Используя подходящий алгоритм, найти в контейнере элемент, удовлетворяющий заданному условию.

5. Переместить элементы, удовлетворяющие заданному условию в другой (предварительно пустой) контейнер. Тип второго контейнера определяется вариантом задания.

6. Просмотреть второй контейнер.

7. Отсортировать первый и второй контейнеры по возрастанию элементов.

8. Просмотреть их.

9. Получить третий контейнер путем слияния первых двух.

10. Просмотреть третий контейнер.

11.Подсчитать, сколько элементов, удовлетворяющих заданному условию, содержит третий контейнер.

12.Определить, есть ли в третьем контейнере элемент, удовлетворяющий заданному условию.

Текст программы:

#include <iostream>

#include <fstream>

#include <algorithm>

#include <map>

#include <queue>

#include <vector>

using namespace std;

class F {

public:

char c;

F() {

c = 'a';

}

F(char cc) {

c = cc;

}

~F() {};

char getchar() const { return c; }

friend std::istream& operator >>(std::istream& in, F& f);

};

map <int, char> res;

void printMap(map <int, char> m) {

for (auto& p : m) {

cout << p.first << ":" << p.second << ";" << endl;

}

cout << endl;

}

void printMyMap(map <int, F> m) {

for (auto& p : m) {

cout << p.first << ":" << p.second.getchar() << ";" << endl;

}

cout << endl;

}

void printQueue(queue <char> q) {

while (!q.empty()) {

cout << q.front() << ";" << endl;

q.pop();

}

cout << endl;

}

void printMyQueue(queue <F> q) {

while (!q.empty()) {

cout << q.front().getchar() << ";" << endl;

q.pop();

}

cout << endl;

}

map <int, char>& operator +(map<int, char> a, map<int, char> b) {

map <int, char> ::iterator it = b.begin();

for (it != b.end();; it++) {

a.insert({ it->first, it->second });

}

return a;

}

map <int, char>& operator +(map<int, char> a, queue<char> b) {

res = a;

for (int i = 10; !b.empty(); i++) {

res.insert({ i, b.front() });

b.pop();

}

return res;

}

map <int, F> res3;

map <int, F>& operator +(map<int, F> a, queue<F> b) {

res3 = a;

for (int i = 10; !b.empty(); i++) {

res.insert({ i, b.front().getchar()});

b.pop();

}

return res3;

}

std::istream& operator>> (std::istream& in, F& f) {

in >> f.c;

return in;

}

void Insert(queue <F> qu, F key) {

if (qu.empty() || key.c > (qu.front()).c) {

qu.push(key);

return;

}

F k = qu.front();

qu.pop();

Insert(qu, key);

qu.push(k);

}

void sortqueue(queue <F> qu) {

if (qu.empty()) {

return;

}

F t = qu.front();

qu.pop();

sortqueue(qu);

Insert(qu, t);

}

bool cmp(pair <int, F> a, pair <int, F> b) {

return a.second.getchar() < b.second.getchar();

}

void sortMyMap(map <int, F> m) {

vector<pair<int, F>> A;

for (auto& it : m) {

A.push_back(it);

}

sort(A.begin(), A.end(), cmp);

for (auto& it : A) {

cout << it.first << ":" << it.second.getchar() << endl;

}

}

int main() {

/*part 1*/

/*task 1*/

map <int, char> mp;

map <int, char> ::iterator it;

mp.insert({ 0,'b' });

mp.insert({ 1,'d' });

mp.insert({ 2,'f' });

mp.insert({ 3,'h' });

mp.insert({ 4,'j' });

cout << "mp:" << endl;

printMap(mp);

cout << endl;

mp.erase({ 2 });

mp.insert({ 5,'l' });

cout << "mp:" << endl;

printMap(mp);

cout << endl;

/*task 2*/

queue <char> qu;

qu.push('a');

qu.push('m');

qu.push('c');

qu.push('d');

qu.push('e');

cout << "qu:" << endl;

printQueue(qu);

cout << endl;

qu.pop();

cout << "qu:" << endl;

printQueue(qu);

cout << endl;

/*task 3*/

int n, ii;

cout << "Enten the number of elements you want to delete from map and index from where start deliting";

cin >> n >> ii;

auto it1 = mp.begin();

while (ii > 0 && it1 != mp.end())

{

it1++;

ii--;

}

while (n > 0 && it1 != mp.end()) {

it1 = mp.erase(it1);

n--;

}

cout << "mp:" << endl;

printMap(mp);

cout << endl;

map<int, char> res2 = mp + qu;

cout << "res2:" << endl;

printMap(res2);

cout << endl;

/*part 2: то же самое, только с пользовательским типом*/

cout << "PART 2" << endl;

/*task 1: сортировка по убыванию*/

/*map <int, F, greater<int>> mp2(res2.begin(), res2.end());

for (const auto& elem : mp2) {

cout << elem.first << ":" << elem.second.getchar() << ";" << endl;

}*/

/*std::ifstream in;

map <int, F> mp2;

F temp;

int temp2;

in.open("C:\\laba16.txt");

while (!in.eof()) {

in >> temp2 >> temp;

}*/

/*task 1: сортировка по убыванию*/

map <int, F> mp2;

mp2.insert({ 1,'c' });

mp2.insert({ 6,'d' });

mp2.insert({ 3,'h' });

mp2.insert({ 2,'t' });

mp2.insert({ 5,'k' });

mp2.insert({ 4,'a' });

mp2.insert({ 7,'n' });

mp2.insert({ 10,'e' });

mp2.insert({ 9,'j' });

mp2.insert({ 8,'s' });

cout << "mp2" << endl;

sortMyMap(mp2);

cout << endl;

/*task 2: Используя подходящий алгоритм, найти в контейнере элемент, удовлетворяющий заданному условию*/

map <int, F> buf;

auto it2 = mp2.begin();

int key;

cout << "Enter the key of searching" << endl;

cin >> key;

int j = 0;

while (it2 != mp2.end()) {

if (it2->first > key) {

buf.insert({ it2->first, it2->second });

j++;

}

it2++;

}

if (j == 0) {

cout << "Elements were not found" << endl;

}

auto it3 = buf.begin();

cout << "buf:" << endl;

while (it3 != buf.end()) {

cout << it3->first << ": " << it3->second.getchar() << ";" << endl;

it3++;

}

cout << endl;

/*task 3: Переместить элементы, удовлетворяющие заданному условию в другой (предварительно пустой) контейнер.

Тип второго контейнера определяется вариантом задания. Вывести элементы второго контейнера*/

queue <F> qu2;

auto it4 = buf.begin();

while (it4 != buf.end()) {

qu2.push(it4->second);

it4++;

}

cout << "qu2:" << endl;

printMyQueue(qu2);

cout << endl;

/*task 4: отсортировать оба контейнера*/

sortMyMap(buf);

cout << endl;

sortqueue(qu2);

cout << "qu2:" << endl;

printMyQueue(qu2);

/*task 5: Создать третий контейнер путем слияния первых двух*/

map<int, F> rs3 = buf + qu2;

cout << "rs3:" << endl;

printMyMap(rs3);

cout << endl;

/*task 6: Вывести, количество элементов третьего контейнера, удовлетворяющих заданному условию. Вывести и сами элементы.*/

map <int, F> mp6;

auto it6 = rs3.begin();

int key1;

cout << "Enter the key of searching" << endl;

cin >> key1;

int jj = 0, temp3 = 0;

while (it6 != rs3.end()) {

if (it6->first > key1) {

mp6.insert({ it6->first, it6->second });

jj++;

temp3++;

}

it6++;

}

if (jj == 0) {

cout << "Elements were not found" << endl;

}

auto it7 = mp6.begin();

cout << "mp6:" << endl;

cout << temp3 << " elements were found" << endl;

while (it7 != mp6.end()) {

cout << it7->first << ": " << it7->second.getchar() << ";" << endl;

it7++;

}

cout << endl;

/*task 7: Определить, есть ли в третьем контейнере элемент, удовлетворяющий заданному условию*/

map <int, F> mp8;

auto it8 = rs3.begin();

int key2;

cout << "Enter the key of searching" << endl;

cin >> key2;

int jjj = 0;

while (it8 != rs3.end()) {

if (it8->first == key2) {

mp8.insert({ it8->first, it8->second });

jjj++;

}

it8++;

}

if (jjj == 0) {

cout << "Elements were not found" << endl;

}

auto it9 = mp8.begin();

cout << "mp8: " << endl;

printMyMap(mp8);

}

Вывод: