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

ФГБОУ ВО

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

Кафедра ТК

ОТЧЕТ

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

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

Тема: «Исключение встроенных типов»

Вариант № 16

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

.

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

Хасанов А.Ю.

Уфа 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 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;