
Structtypes.H
#ifndef _STRUCT_TYPES_ // «стражи» для предотвращения повторного включения
#define _STRUCT_TYPES_
#include <string>
#include <iostream>
#include <iomanip>
using namespace std;
struct marsch {
std::string name;
int priceDay, cnt, priceTransit;
};
struct tur {
marsch dr;
std::string nameFIO;
int price;
};
struct namePerech {
std::string name;
int ng;
};
inline 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;
}
//перег. опервции вывода структур
inline ostream& operator << (ostream& out, namePerech& z) {
out << "|" << setw(10) << z.name << "|"
<< setw(8) << z.ng << "| \n";
return out;
}
inline 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;
}
inline 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;
}
#endif // _STRUCT_TYPES_
#pragma once
MASB.H
#ifndef MASB_H
#define MASB_H
#include "Err.h"
#include "StructTypes.h"
#include "masA.h"
#include <iostream>
#include <string>
#include <stdexcept>
#include <new>
#include <conio.h>
using namespace std;
class masB :public masA {
protected:
namePerech* py;
int k;
public:
masB() :py(NULL), k(0) {};
masB(masB& z);
~masB() { if (py != NULL) delete[] py; }
masB& operator=(masB& z);
masB& operator=(masA& z) override;
void sortName();
virtual void sortCnt();
virtual void output();
virtual void outputFile();
void makePerech();
friend ostream& operator<<(ostream& out, masB& z);
};
#endif
#pragma once
Masb.Cpp
#include <conio.h>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <string>
#include <cstring>
#include <exception>
#include "StructTypes.h"
#include "Err.h"
#include "masB.h"
#include "masB.h"
using namespace std;
masB::masB(masB& z)
try : masA(z) {
{
int i;
k = z.k;
if (z.py == NULL) py = NULL;
else {
try {
py = new namePerech[k];
//throw bad_alloc();
}
catch (bad_alloc)
{
throw ErrMem("Нет памяти", "перечня (py)",
"masB(masB &z)");
}
for (i = 0; i < k; i++)
py[i] = z.py[i];
}
}
}
catch (ErrMem& ex) {
throw ErrMem(ex.getMes(), ex.getMes1(),
"masB(masB &z)");
}
masB& masB::operator = (masB& z) {
int i;
if (this == &z) return *this;
try { masA :: operator= (z); }
catch (ErrMem& ex) {
throw ErrMem(ex.getMes(), ex.getMes1(),
" masB::operator=( masB &z)");
}
if (py != NULL) delete[]py;
k = z.k;
if (z.py == NULL) py = NULL;
else {
try {
py = new namePerech[k];
// throw bad_alloc();
}
catch (bad_alloc)
{
throw ErrMem("Нет памяти", "перечня (py)",
"masB::operator=(masB &z))");
}
for (i = 0; i < k; i++) py[i] = z.py[i];
}
return *this;
}// для _getch()
masB& masB::operator = (masA& z) {//определение перегруженной операции masB
{
int i; masB r;
if (this == &z) return *this;
masA::operator=(z);
r = (masB&)z;
if (py != NULL) delete[]py;
k = r.k;
if (r.py == NULL) py = NULL;
else {
try {
py = new namePerech[k];
//throw bad_alloc();
}
catch (bad_alloc)
{
throw ErrMem("нет памяти", "массива (py)", "masB::operator==(masB &z)");
}
for (i = 0; i < k; i++)
py[i] = r.py[i];
}
return *this;
}
}
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 << "|___|__________|________| \n";
_getch();
return out;
}
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 masB::makePerech()
{
int i, j, fl;
namePerech* y;
try {
y = new namePerech[n];
//throw bad_alloc();
}
catch (bad_alloc) // Обработчик без передачи данных
{
throw ErrMem("нет памяти", "рабочего массива (перечня)",
"makePerech()");
}
k = 0;
if (py != NULL) delete[] py;
for (i = 0; i < n; i++)
{
fl = 0;
for (j = 0; j < k; j++)
if (px[i].dr.name == y[j].name) { fl = 1; y[j].ng++; }
if (fl == 0) { y[k].name = px[i].dr.name; y[k].ng = 1; k++; }
}
try {
py = new namePerech[k];
//throw bad_alloc();
}
catch (bad_alloc) // Обработчик без передачи данных
{
py == NULL;
k = 0;
delete[] py;
throw ErrMem("нет памяти", " перечня(py)", "makePerech()");
}
for (j = 0; j < k; j++) py[j] = y[j];
delete[] y;
cout << "Перечень сформирован.\n";
_getch();
}
void masB::output()
{
int i;
if (py == NULL) { cout << "\n Данных нет.\n Массив пуст.\n"; _getch(); }
else {
cout << "_________________________\n";
cout << "| No| Тур | Кол-во | \n";
cout << "|___|________ _|________| \n";
for (i = 0; i < k; i++)
cout << "| " << setw(2) << i + 1 << py[i];
cout << "|___|__________|________| \n";
_getch();
}
}
void masB::outputFile()
{
ofstream fout;
string file; int i;
cout << "Имя выходного файла: ";
cin >> file;
fout.open(file.c_str());
// Защита от неправ-го ввода имени файла
if (fout.fail()) throw ErrFile("не создается файл", file, "masВ::outputFile");
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();
}
Скриншоты работы программы
Загрузка из файла:
а) В качестве пункта меню введено не число:
б) Введен несуществующий пункт меню:
в) Введен несуществующий файл:
г) Введен правильный файл:
д) Проверка выделения памяти
2. Вывод информации на экран
Добавление записи
А)Добавление записи
Б) Проверка выделения памяти
4. Удаление записи
a) В качестве номера строки введено не число
б) Введена несуществующая строка:
в) Дан неверный ответ на подтверждение удаления:
г) Удаление отменено:
д)
Удаление:
Е) Проверка выделения памяти
5. Алфавитная сортировка по Ф.И.О.
6. Сортировка по наименованию туров.
7. Числовая сортировка по количеству дней
8. Сохранение результатов обработки в файлах
9. Формирование перечня:
a) Формирование перечня:
Б) Проверка выделения памяти
10. Сортировка перечня по количеству дней
11. Сортировка перечня по наименованию тура.
12. Поиск по стоимости поездки (результат отсортирован по наименованию тура):
13. Поиск по стоимости поездки (результат отсортирован по длительности тура):
14. Вывод результата поиска в файл.
15. Проверка конструктора конструктора копирования класса masA.
16. Проверка операции присваивания класса masA
17) Проверка выделения память для поиска
18) Проверка виртуальной операции присваивания для masC
19) Проверка выделения памяти для виртуальной функции присваивания masc.