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

ФГБОУ ВО

«Уфимский университет науки и технологий»

Кафедра ТК

ОТЧЕТ

по лабораторной работе № 3

по дисциплине «Современные методы программирования»

Тема: «Дружественные функции»

Вариант № 16

Выполнил: студент гр. ИВТ-327Б

.

Проверил: доцент каф. ТК

Хасанов А.Ю.

Уфа 2024

Содержание

Задание

Спроектировать структуру MARSCH, содержащую поля: наименование тура, цена одного дня, количество дней, стоимость проезда.

Спроектировать структуру TUR, содержащую поле типа MARSCH и дополнительно поля: фамилия, имя, отчество клиента, стоимость поездки.

Файл содержит информацию о проданных туристических поездках. Требуется спроектировать классы, позволяющие обрабатывать эти данные. В классах должно быть предусмотрено, как минимум, выполнение следующих видов обработки:

  1. Загрузка из файла;

  1. Сохранение результатов обработки в файлах;

  1. Добавление записи;

  1. Удаление записи;

  1. Вывод на экран дисплея данных и результатов обработки;

  1. Сортировка по Ф.И.О. клиента;

  1. Алфавитная сортировка по наименованию тура;

  1. Числовая сортировка по количеству дней.

  1. Перечень наименований тура с указанием количества дней (результат отсортирован по количеству дней);

  1. Перечень наименований тура с указанием количества дней (результат отсортирован по наименованию тура);

  1. Поиск по стоимости поездки (результат отсортирован по наименованию тура);

  1. Поиск по стоимости поездки (результат отсортирован по длительности тура).

Выполнение задания:

Разметка таблицы

Фамилия и инициалы

Стоимость

Название тура

Цена 1-го дня

Кол-во дней

Цена проезда

Код программы:

#include <Windows.h> //для русского языка

#include <conio.h> //для очистки экрана

#include <fstream> //для работы с файлами

#include <iomanip> //для setw

#include <iostream>

#include <string>

using namespace std;

struct marsch

{

string name;

int priceDay, cnt, priceTransit;

};

struct tur {

marsch dr;

string nameFIO;

int price;

};

struct namePerech {

string name;

int ng;

};

//перегр. операция ввода

istream& operator>>(istream& in, tur& f) //дружественная операная функция ввода

{

string iniz;

cout << " Ф.И.О.: ";

cin >> f.nameFIO >> iniz;

f.nameFIO = f.nameFIO + " " + iniz;

cout << "Стоимость: ";

cin >> f.price;

cout << " Название тура: ";

cin >> f.dr.name;

cout << " Цена одного дня: ";

cin >> f.dr.priceDay;

cout << " Количество дней: ";

cin >> f.dr.cnt;

cout << " Стоимость проезда: ";

cin >> f.dr.priceTransit;

return in;

}

//перег. опервции вывода структур

ostream& operator<<(ostream& out, namePerech& z) {

out << "|" << setw(10) << z.name << "|"

<< setw(8) << z.ng << "| \n";

return out;

}

ostream& operator<<(ostream& out, tur& z)

{

out << " | " << setw(20) << z.nameFIO << " | " << setw(10)

<< z.price << " | " << setw(10) << z.dr.name << " | " << setw(10) << z.dr.priceDay

<< " | " << setw(4) << z.dr.cnt << " | " << setw(6) << z.dr.priceTransit << " | \n";

return out;

}

int operator>(marsch v, marsch w)

{

if (v.cnt > w.cnt) return 1;

if ((v.cnt == w.cnt) && (v.priceDay > w.priceDay)) return 1;

return 0;

}

class masB;//чтоб не ругался

class masC;

class masA {

private:

tur* px;

int n;

public:

masA() :px(NULL), n(0) {};

masA(masA& Z);

~masA() { if (px != NULL) delete[]px; }//деструктор

masA& operator=(masA& z);//прототип перегруженного оператора присваивания

void inputFile();

void addTur();

void deleteTur();

void output();

void outputFile();

void sortName();

void sortNameTur();

void sortCnt();

friend istream& operator>>(istream& in, tur& f);

friend ostream& operator<<(ostream& out, masA& z);

friend void makePerech(masA& v, masB& w);

friend void findPrice(masA& v, masC& w);

};

//класс для перечня и перегрузка оператора присваивания

class masB {

private:

namePerech* py;

int k;

public:

masB() :py(NULL), k(0) {};

masB(masB& z);

~masB() { if (py != NULL) delete[] py; }

masB& operator=(masB& z);

void sortName();

void sortCnt();

void outputFile();

friend ostream& operator<<(ostream& out, masB& z);

friend void makePerech(masA& v, masB& w);

friend void findPrice(masA& v, masC& w);

};

masA::masA(masA& z)//перегруженная операция присваивания

{

int i;

n = z.n;

if (n == 0) px = NULL;

else {

px = new tur[n];

if (px == NULL) {

cout << "нет памяти.\n";

cout << "Конструктор копирования.\n";

_getch(); exit(1);

}

for (i = 0; i < n; i++)

px[i] = z.px[i];

}

} // конец конструктора копирования

masB::masB(masB& z)//перегруженная операция присваивания

{

int i;

k = z.k;

if (k == 0) py = NULL;

else {

py = new namePerech[k];

if (py == NULL) {

cout << "нет памяти.\n";

cout << "Конструктор копирования.\n";

_getch(); exit(1);

}

for (i = 0; i < k; i++)

py[i] = z.py[i];

}

} // конец конструктора копирования

masB& masB :: operator = (masB& z)

{

int i;

if (this == &z) return *this;

if (py != NULL) delete[]py;

k = z.k;

if (z.py == NULL) py = NULL;

else {

py = new namePerech[k];

if (py == NULL) {

cout << "нет памяти.\n";

cout << "операция присваивания.\n";

_getch(); return z;

}

for (i = 0; i < k; i++) py[i] = z.py[i];

}

return *this;

}

//класс для поиска и перегрузка оператора присваивания

class masC

{

private:

tur* pz;

int l;

public:

masC() :pz(NULL), l(0) {};

masC(masC& z);

~masC() { if (pz != NULL) delete[] pz; }

masC& operator=(masC& z);

friend ostream& operator<<(ostream& out, masC& z);

friend void findPrice(masA& v, masC& w);

void sortName();

void sortCnt();

void outputFile();

};

masC::masC(masC& z)//перегруженная операция присваивания

{

int i;

l = z.l;

if (l == 0) pz = NULL;

else {

pz = new tur[l];

if (pz == NULL) {

cout << "нет памяти.\n";

cout << "Конструктор копирования.\n";

_getch(); exit(1);

}

for (i = 0; i < l; i++)

pz[i] = z.pz[i];

}

}

masC& masC :: operator = (masC& z)

{

int i;

if (this == &z) return *this;

if (pz != NULL) delete[]pz;

l = z.l;

if (z.pz == NULL) pz = NULL;

else {

pz = new tur[l];

if (pz == NULL) {

cout << "нет памяти.\n";

cout << "операция присваивания.\n";

_getch(); return z;

}

for (i = 0; i < l; i++) pz[i] = z.pz[i];

}

return *this;

}

int main() {

SetConsoleCP(1251);

SetConsoleOutputCP(1251);

masA a;

masB b;

masC c;

int j;

while (1) {

system("cls");

cout << "------------------------------------------------------------\n";

cout << "\t\t\tМЕНЮ\n";

cout << "------------------------------------------------------------\n";

cout << "1. Ввод исходного массива из файла.\n";

cout << "2. Вывод исходного массива на экран.\n";

cout << "3. Сохранение результатов обработки в файл.\n";

cout << "4. Добавление записи в базу данных.\n";

cout << "5. Удаление записи в базе данных.\n";

cout << "6. Сортировка по Ф.И.О.\n";

cout << "7. Сортировка строкового поля.\n";

cout << "8. Сортировка по количеству дней.\n";

cout << "9. Формирование перечня групп.\n";

cout << "10. Вывод перечня групп на экран.\n";

cout << "11. Вывод перечня групп в текстовый файл.\n";

cout << "12. Сортировка перечня по количеству дней.\n";

cout << "13. Сортировка перечня по наименованию тура.\n";

cout << "14. Поиск по стоимости поездки (результат отсортирован по наименованию тура).\n";

cout << "15. Поиск по стоимости поездки (результат отсортирован по длительности тура)\n";

cout << "16. Вывод результата поиска на экран.\n";

cout << "17. Вывод результата поиска в файл.\n";

cout << "18. Проверка конструктора копирования класса masA.\n";

cout << "19. Проверка конструктора копирования класса masB.\n";

cout << "20. Проверка конструктора копирования класса masC.\n";

cout << "21. Проверка операции присваивания класса masА\n";

cout << "22. Проверка операции присваивания класса masА\n";

cout << "23. Проверка операции присваивания класса masА\n";

cout << "24. Выход из программы.\n";

cout << "------------------------------------------------------------\n";

cout << "\nВаш выбор: ";

cin >> j;

if (cin.fail())

{

string s;

cin.clear();

cin >> s;

cout << "Это не пункт меню\n";

_getch();

continue;

}

switch (j) {

case 1: a.inputFile(); break;

case 2: cout<<a; break;

case 3: a.outputFile(); break;

case 4: a.addTur(); break;

case 5: a.deleteTur(); break;

case 6: a.sortName(); break;

case 7: a.sortNameTur(); break;

case 8: a.sortCnt(); break;

case 9:makePerech(a, b); break;

case 10:cout << b; break;

case 11: b.outputFile(); break;

case 12: b.sortCnt(); break;

case 13:b.sortName(); break;

case 14:findPrice(a, c); c.sortName(); break;

case 15:findPrice(a, c); c.sortCnt(); break;

case 16: cout << c; break;

case 17:c.outputFile(); break;

case 18: { masA d(a); cout << d << a; } break;

case 19: { masB d(b); cout << d << b; } break;

case 20: { masC d(c); cout << d << c; } break;

case 21: { masA f, d; f = d = a; cout << f << d << a; } break;

case 22: { masB f, d; f = d = b; cout << f << d << b; } break;

case 23: { masC f, d; f = d = c; cout << f << d << c; } break;

case 24: cout << "Конец работы.\n";

_getch(); return 0;

default: cout << "Нет такого пункта в меню\n";

_getch();

}

}

}

masA& masA :: operator=(masA& z)

{

int i;

if (this == &z) return *this;

if (px != NULL) delete[]px;

n = z.n;

if (z.px == NULL) px = NULL;

else {

px = new tur[n];

if (px == NULL) {

cout << "нет памяти.\n";

cout << "операция присваивания.\n";

_getch(); return z;

}

for (i = 0; i < n; i++)

px[i] = z.px[i];

}

return *this;

}

void masA::inputFile()

{

ifstream fin;

string file;

string iniz;

tur t;

cout << "Имя входного файла:";

cin >> file;

fin.open(file.c_str());

if (fin.fail()) {

cout << file << " не открывается\n";

_getch(); return;

}

n = 0;

if (px != NULL) { delete[] px; px = NULL; }

while (1)

{

fin >> t.nameFIO >> iniz >> t.price >> t.dr.name >> t.dr.priceDay >> t.dr.cnt >> t.dr.priceTransit;

if (fin.fail()) break;

n++;

}

fin.close();

fin.open(file.c_str());

if (fin.fail()) {

cout << file << "повторно не открывается\n";

_getch(); n = 0; return;

}

px = new tur[n];

if (px == NULL) {

cout << "Нет памяти.\n"; fin.close();

cout << "Ввести фаил не удается.\n";

_getch(); n = 0; return;

}

for (int i = 0; i < n; i++)

{

fin >> px[i].nameFIO >> iniz >> px[i].price >> px[i].dr.name >> px[i].dr.priceDay >> px[i].dr.cnt >> px[i].dr.priceTransit;

px[i].nameFIO = px[i].nameFIO + " " + iniz;

}

fin.close();

cout << "Файл введен " << endl;

_getch();

}

void masA::output()

{

int i;

if (px == NULL) { cout << "\n Данных нет.\n Массив пуст.\n"; _getch(); }

else {

cout << "____________________________________________________________________________________\n";

cout << "| | | | | | | \n";

cout << "| No | Фамилия и инициалы | Cтоимость | Название | Цена |Кол-во| Цена \n";

cout << "| | | | тура | 1-го дня | дней | проезда \n";

cout << "|____|______________________|____________|____________|____________|______|_________\n";

int i;

for (i = 0; i < n; i++)

cout << "| " << setw(2) << i + 1 << px[i];

cout << "|____|______________________|____________|____________|____________|______|_________\n";

_getch();

}

}

ostream& operator<<(ostream& out, masA& z)//перегруженная операция вывода на экран для объекта masA

{

int i;

cout << "____________________________________________________________________________________\n";

cout << "| | | | | | | \n";

cout << "| No | Фамилия и инициалы | Cтоимость | Название | Цена |Кол-во| Цена \n";

cout << "| | | | тура | 1-го дня | дней | проезда \n";

cout << "|____|______________________|____________|____________|____________|______|_________\n";

for (i = 0; i < z.n; i++)

out << "| " << setw(2) << i + 1 << z.px[i];

cout << "|____|______________________|____________|____________|____________|______|_________\n";

_getch();

return out;

}

ostream& operator<<(ostream& out, masB& z)

{

int i;

// Вывод заголовка таблицы (перечня групп)

out << "_________________________\n";

out << "| No| Тур | Кол-во | \n";

out << "|___|________ _|________| \n";

// Вывод строк таблицы

for (i = 0; i < z.k; i++)

out << "| " << setw(2) << i + 1 << z.py[i];

// out<<py[i] - перегруженная операция вывода на экран структуры

out << "|___|__________|________| \n";

_getch();

return out;

}

ostream& operator<<(ostream& out, masC& z)//перегруженная операция вывода на экран для объекта masA

{

int i;

cout << "____________________________________________________________________________________\n";

cout << "| | | | | | | \n";

cout << "| No | Фамилия и инициалы | Cтоимость | Название | Цена |Кол-во| Цена \n";

cout << "| | | | тура | 1-го дня | дней | проезда \n";

cout << "|____|______________________|____________|____________|____________|______|_________\n";

for (i = 0; i < z.l; i++)

out << "| " << setw(2) << i + 1 << z.pz[i];

cout << "|____|______________________|____________|____________|____________|______|_________\n";

_getch();

return out;

}

void masA::outputFile()

{

ofstream fout;

string file;

int i;

cout << "Имя выходного файла:"; cin >> file;

fout.open(file.c_str());

if (fout.fail()) {

cout << "\n " << file << "не создается.\n";

_getch(); return;

}

fout << "____________________________________________________________________________________\n";

fout << "| | | | | | | | \n";

fout << "| No | Фамилия и инициалы | Cтоимость | Название | Цена |Кол-во| Цена | \n";

fout << "| | | | тура | 1-го дня | дней | проезда | \n";

fout << "|____|______________________|____________|____________|____________|______|_________|\n";

for (i = 0; i < n; i++)

fout << "| " << setw(2) << i + 1 << " | " << setw(20) << px[i].nameFIO << " | " << setw(10)

<< px[i].price << " | " << setw(10) << px[i].dr.name << " | " << setw(10) << px[i].dr.priceDay

<< " | " << setw(4) << px[i].dr.cnt << " | " << setw(6) << px[i].dr.priceTransit << " | \n";

fout << "|____|______________________|____________|____________|____________|______|_________\n";

fout.close();

cout << "Массив структур сохранен в файл.\n";

_getch();

}

void masA::addTur() {

int i;

tur f, * p; string iniz;

p = new tur[n + 1];

if (p == NULL) {

cout << " Нет памяти.\n";

cout << " Добавить не удается.\n";

_getch(); return;

}

cout << "Фамилия и инициалы: ";

cin >> f.nameFIO >> iniz;

f.nameFIO = f.nameFIO + " " + iniz;

cout << "Стоимость: ";

cin >> f.price;

cout << "Название тура: ";

cin >> f.dr.name;

cout << "Цена 1-го дня: ";

cin >> f.dr.priceDay;

cout << "Кол-во дней: ";

cin >> f.dr.cnt;

cout << "Цена проезда: ";

cin >> f.dr.priceTransit;

for (i = 0; i < n; i++) p[i] = px[i];

p[n] = f;

n++;

delete[] px;

px = p;

cout << "Запись добавлена.\n";

_getch();

}

void masA::deleteTur()

{

int j, i;

tur* p;

char ch;

output();

cout << "Номер строки, которую вы хотите удалить: ";

cin >> j;

if (cin.fail())

{

cin.clear();

string s;

cin >> s;

cout << " Это не номер строки.\n";

_getch();

return;

}

if (j<1 || j>n) {

cout << "Ошибка: нет такой строки.\n";

_getch(); return;

}

j--;

cout << " " << j + 1 << "-я строка:\n";

cout << px[j].nameFIO << " " << px[j].price << " " << px[j].dr.name << " " << px[j].dr.priceDay << " " << px[j].dr.cnt << " " << px[j].dr.priceTransit << " \n";

cout << "Удалить?(y/n):"; cin >> ch;

if (ch == 'n') return;

if (ch != 'y') {

cout << "Ошибка ответа на вопрос. \n";

_getch(); return;

}

if (n == 1) { delete[] px; px = NULL; n = 0; }

else {

p = new tur[n - 1];

if (p == NULL) {

cout << "Нет памяти.\n ";

cout << "Удалить не удается.\n";

_getch(); return;

}

for (i = 0; i < j; i++)

p[i] = px[i];

for (i = j + 1; i < n; i++)

p[i - 1] = px[i];

delete[] px;

px = p;

n--;

}

cout << "Запись удалена.\n"; _getch();

}

void masA::sortName()

{

int i, fl, nn;

tur t;

nn = n;

do {

fl = 0; nn--;

for (i = 0; i < nn; i++)

if (px[i].nameFIO > px[i + 1].nameFIO)

{

fl = 1; t = px[i];

px[i] = px[i + 1];

px[i + 1] = t;

}

} while (fl == 1);

cout << "Массив структур упорядочен по ФИО в алфавитном порядке\n";

_getch();

}

void masA::sortNameTur()

{

int i, fl, nn;

tur t;

nn = n;

do {

fl = 0; nn--;

for (i = 0; i < nn; i++)

if (px[i].dr.name > px[i + 1].dr.name)

{

fl = 1; t = px[i];

px[i] = px[i + 1];

px[i + 1] = t;

}

} while (fl == 1);

cout << "Массив структур упорядочен по наименованию тура в алфавитном порядке\n";

_getch();

}

void masA::sortCnt()

{

int i, fl, nn;

tur t;

nn = n; // вводим копию размера массива

do {

fl = 0; nn--;

for (i = 0; i < nn; i++)

if (px[i].dr > px[i + 1].dr)

{

fl = 1; t = px[i];

px[i] = px[i + 1];

px[i + 1] = t;

}

} while (fl == 1);

cout << "Массив структур упорядочен по количеству дней\n";

_getch();

}

void makePerech(masA& v, masB& w) {

int i, j, fl, n, k;

namePerech* y;

n = v.n;

y = new namePerech[n];

if (y == NULL) {

std::cout << "Нет памяти.\n";

_getch(); return;

}

k = 0;

if (w.py != NULL) delete[] w.py;

for (i = 0; i < n; i++)

{

fl = 0;

for (j = 0; j < k; j++)

if (v.px[i].dr.name == y[j].name) { fl = 1; y[j].ng++; }

if (fl == 0) { y[k].name = v.px[i].dr.name; y[k].ng = 1; k++; }

}

w.py = new namePerech[k];

if (w.py == NULL) {

std::cout << "Нет памяти для перечня.\n";

_getch();

w.k = 0;

delete[] y;

return;

}

for (j = 0; j < k; j++) w.py[j] = y[j];

w.k = k;

delete[] y;

std::cout << "Перечень сформирован.\n";

_getch();

}

void masB::outputFile()

{

ofstream fout;

string file; int i;

cout << "Имя выходного файла: ";

cin >> file;

fout.open(file.c_str());

// Защита от неправ-го ввода имени файла

if (fout.fail()) {

cout << file << "не создается.\n";

_getch(); return;

}

// Вывод заголовка

fout << "__________________________\n";

fout << "| No| Тур | Кол-во | \n";

fout << "|___|___________|________| \n";

// Вывод строк таблицы

for (i = 0; i < k; i++)

fout << "| " << setw(2) << i + 1 << "|" << setw(10) <<py[i].name << " | "

<< setw(6) << py[i].ng << " | \n";

fout << "|___|__________|________| \n";

fout.close();

cout << "Перечень сохранен в файле.\n";

_getch();

}

void masB::sortCnt()

{

int i, fl, nn;

namePerech t;

nn = k;

do {

fl = 0; nn--;

for (i = 0; i < nn; i++)

if (py[i].ng > py[i + 1].ng)

{

fl = 1; t = py[i];

py[i] = py[i + 1];

py[i + 1] = t;

}

} while (fl == 1);

cout << "Перечень упорядочен по количеству дней. \n"; _getch();

}

void masB::sortName() // по количеству результатов в группе

{

int i, fl, nn;

namePerech t;

nn = k; // вводим копию размера массива

do {

fl = 0; nn--;

for (i = 0; i < nn; i++)

if (py[i].name > py[i + 1].name)

{

fl = 1; t = py[i];

py[i] = py[i + 1];

py[i + 1] = t;

}

} while (fl == 1);

cout << "Перечень упорядочен по названию туров. \n"; _getch();

}

void findPrice(masA& v, masC& w) {

int i, j, l, n,cnt;

tur* y;

n = v.n;

y = new tur[n];

if (y == NULL) {

cout << "Нет памяти.\n";

_getch();

return;

}

cout << "Стоимость поездки: ";

cin >> cnt;

l = 0;

for (i = 1; i < n; i++)

if (v.px[i].price == cnt) {

y[l] = v.px[i];

l++;

}

if (l==0) {

cout << "Не найдено.\n";

_getch();

delete[] y;

return;

}

if (w.pz != NULL) delete[]w.pz;

w.pz = new tur[l];

if (w.pz == NULL) {

cout << "Нет памяти.\n";

_getch();

w.l = 0;

delete[] y;

return;

}

for (j = 0; j < l; j++) w.pz[j] = y[j];

w.l = l;

if (w.pz == NULL) "Не найдено.\n";

delete[] y;

cout << "Массив групп сформирован.\n";

_getch();

}

void masC::sortName()

{

int i, fl, nn;

tur t;

nn = l;

do {

fl = 0; nn--;

for (i = 0; i < nn; i++)

if (pz[i].dr.name > pz[i + 1].dr.name)

{

fl = 1; t = pz[i];

pz[i] = pz[i + 1];

pz[i + 1] = t;

}

} while (fl == 1);

_getch();

}

void masC::sortCnt()

{

int fl, i, nn;

tur t;

nn = l;

int a;

do {

fl = 0; nn--;

for (i = 0; i < nn; i++)

if (pz[i].dr.cnt > pz[i + 1].dr.cnt)

{

fl = 1; t = pz[i];

pz[i] = pz[i + 1];

pz[i + 1] = t;

}

} while (fl == 1);

_getch();

}

void masC::outputFile()

{

ofstream fout;

string file;

int i;

cout << "Имя выходного файла:"; cin >> file;

fout.open(file.c_str());

if (fout.fail()) {

cout << "\n " << file << "не создается.\n";

_getch(); return;

}

fout << "____________________________________________________________________________________\n";

fout << "| | | | | | | | \n";

fout << "| No | Фамилия и инициалы | Cтоимость | Название | Цена |Кол-во| Цена | \n";

fout << "| | | | тура | 1-го дня | дней | проезда | \n";

fout << "|____|______________________|____________|____________|____________|______|_________|\n";

for (i = 0; i < l; i++)

fout << "| " << setw(2) << i + 1 << " | " << setw(20) << pz[i].nameFIO << " | " << setw(10)

<< pz[i].price << " | " << setw(10) << pz[i].dr.name << " | " << setw(10) << pz[i].dr.priceDay

<< " | " << setw(4) << pz[i].dr.cnt << " | " << setw(6) << pz[i].dr.priceTransit << " | \n";

fout << "|____|______________________|____________|____________|____________|______|_________\n";

fout.close();

cout << "Массив структур сохранен в файл.\n";

_getch();

}

Скриншоты работы программы

  1. Загрузка из файла:

а) В качестве пункта меню введено не число:

б) Введен несуществующий пункт меню:

в) Введен несуществующий файл:

г) Введен правильный файл:

2. Вывод информации на экран

3. Добавление записи

4. Удаление записи

a) В качестве номера строки введено не число

б) Введена несуществующая строка:

в) Дан неверный ответ на подтверждение удаления:

г) Удаление отменено:

д) Удаление:

5. Алфавитная сортировка по Ф.И.О.

6. Сортировка по наименованию туров.

7. Числовая сортировка по количеству дней

8. Сохранение результатов обработки в файлах

9. Формирование перечня:

10. Сортировка перечня по количеству дней

11. Сортировка перечня по наименованию тура.

12. Поиск по стоимости поездки (результат отсортирован по наименованию тура):

13. Поиск по стоимости поездки (результат отсортирован по длительности тура):

14. Вывод результата поиска в файл.

15. Проверка конструктора конструктора копирования класса masA.

16. Проверка конструктора конструктора копирования класса masB.

17. Проверка конструктора конструктора копирования класса masC.

18. Проверка операции присваивания класса masA

19. Проверка операции присваивания класса masB

20. Проверка операции присваивания класса masC

41