
ФГБОУ ВО
«Уфимский университет науки и технологий»
Кафедра ТК
ОТЧЕТ
по лабораторной работе № 8
по дисциплине «Современные методы программирования»
Тема: «Исключение встроенных типов»
Вариант № 16
Выполнил: студент гр. ИВТ-427Б
.
Проверил: доцент каф. ТК
Хасанов А.Ю.
Уфа 2024
Содержание
Задание
Спроектировать структуру MARSCH, содержащую поля: наименование тура, цена одного дня, количество дней, стоимость проезда.
Спроектировать структуру TUR, содержащую поле типа MARSCH и дополнительно поля: фамилия, имя, отчество клиента, стоимость поездки.
Файл содержит информацию о проданных туристических поездках. Требуется спроектировать классы, позволяющие обрабатывать эти данные. В классах должно быть предусмотрено, как минимум, выполнение следующих видов обработки:
Загрузка из файла;
Сохранение результатов обработки в файлах;
Добавление записи;
Удаление записи;
Вывод на экран дисплея данных и результатов обработки;
Сортировка по Ф.И.О. клиента;
Алфавитная сортировка по наименованию тура;
Числовая сортировка по количеству дней.
Перечень наименований тура с указанием количества дней (результат отсортирован по количеству дней);
Перечень наименований тура с указанием количества дней (результат отсортирован по наименованию тура);
Поиск по стоимости поездки (результат отсортирован по наименованию тура);
Поиск по стоимости поездки (результат отсортирован по длительности тура).
Выполнение задания: Разметка таблицы
№ |
Фамилия и инициалы |
Стоимость |
Название тура |
Цена 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 ErrFile
{
private:
string mes;
string mes1;
string mes2;
public:
ErrFile(string mes0, string mes10, string mes20)
: mes(mes0), mes1(mes10), mes2(mes20) {}
void ErrOutput();
};
void ErrFile::ErrOutput()
{
cout << "Ошибка: " << mes << endl;
cout << "При работе с файлом: " << mes1 << endl;
cout << "Произошла в методе: " << mes2 << endl;
_getch();
}
class Err
{
private:
string mes; // Что за ошибка
string mes2; // в каком методе произошла
public:
// Идентифицирующий конструктор
Err(string mes0, string mes20) : mes(mes0), mes2(mes20) {}
void ErrOutput();
};
void Err::ErrOutput()
{
cout << "Ошибка: " << mes;
cout << " в функции/методе " << mes2 << endl;
_getch();
}
class ErrMem
{
private:
string mes; // Что за ошибка
string mes1; // при выделении памяти для какого
// динамического массива
string mes2; // в каком методе произошла
public:
// Идентифицирующий конструктор
ErrMem(string mes0, string mes10, string mes20)
: mes(mes0), mes1(mes10), mes2(mes20) {}
void ErrOutput();
};
void ErrMem::ErrOutput()
{
cout << "Ошибка: " << mes;
cout << " при выделении памяти для " << mes1;
cout << " в методе " << mes2 << endl;
_getch();
}
class masB;
class masC;
class masA {
protected:
tur* px;
int n;
public:
masA() :px(NULL), n(0) {};
masA(masA& Z) { //конструктор копирования
int i;
n = Z.n;
if (n == 0) px = NULL;
else {
px = new tur[n];
if (px == NULL) {
cout << "Нет памяти.";
_getch();
exit(1);
}
for (i = 0; i < n; i++)
px[i] = Z.px[i];
}
}
~masA() { if (px != NULL) delete[]px; }//деструктор
masA& operator=(masA& z);//прототип перегруженного оператора присваивания
void inputFile();
void addTur();
void deleteTur();
virtual void output();
virtual void outputFile();
void sortName();
void sortNameTur();
virtual void sortCnt();
friend ostream& operator<<(ostream& out, masA& z);
};
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;
} // конец перегруженной операции присваивания
//класс для перечня и перегрузка оператора присваивания
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);
void sortName();
virtual void sortCnt();
virtual void output();
virtual void outputFile();
void makePerech();
friend ostream& operator<<(ostream& out, masB& z);
};
masB::masB(masB& z) :masA(z) {
int i;
k = z.k;
if (k == 0) {
py = NULL;
}
else {
py = new namePerech[k];
if (py == NULL) {
std::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;
}
masA::operator=(z);
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 :public masB
{
protected:
tur* pz;
int l;
public:
masC() :pz(NULL), l(0) {};
masC(masC& z);
~masC() { if (pz != NULL) delete[] pz; }
masC& operator=(masC& z);
void findPrice();
void sortName();
virtual void sortCnt();
virtual void output();
virtual void outputFile();
friend ostream& operator<<(ostream& out, masC& z);
};
masC& masC::operator = (masC& z) {
int i;
if (this == &z) {
return *this;
}
masB::operator=(z);
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;
}
masC::masC(masC& z) :masB(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];
}
}
}
void print(masA& z);
void printFile(masA* p);
void print(masA& z)
{
z.output();
}
void printFile(masA* p)
{
p->outputFile();
}
int main() {
masC c;
int j;
while (1) {
try {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
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. Проверка операции копирования класса masА\n";
cout << "19. Проверка операции присваивания класса masА\n";
cout << "20. Выход из программы.\n";
cout << "------------------------------------------------------------\n";
cout << "\nВаш выбор: ";
try {
cin >> j;