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

If (cin.Fail()) throw (const char*)"Это не пункт меню";

}

catch (const char* ex)

{

cin.clear();

string s;

cin >> s;

throw;

}

switch (j) {

case 1: c.inputFile(); break;

case 2: {masA a(c); print(a); }break;

case 3: {masA a(c); printFile(&a); } break;

case 4: c.addTur(); break;

case 5: { masA a(c); print(a); c.deleteTur(); } break;

case 6: c.masA::sortName(); break;

case 7: c.masA::sortNameTur(); break;

case 8: c.masA::sortCnt(); break;

case 9:c.makePerech(); break;

case 10: {masB b(c); print(b); } break;

case 11: {masB b(c); printFile(&b); } break;

case 12: c.masB::sortCnt(); break;

case 13:c.masB::sortName(); break;

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

case 15: {c.findPrice(); c.masC::sortCnt(); } break;

case 16: print(c); break;

case 17:printFile(&c); break;

case 18: { masC d(c);

d.masA::output(); c.masA::output();

d.masB::output(); c.masB::output();

d.output(); c.output(); } break;

case 19: { masC f, d;

f = d = c;

f.masA::output(); d.masA::output(); c.masA::output();

f.masB::output(); d.masB::output(); c.masB::output();

f.output(); d.output(); c.output(); } break;

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

_getch(); return 0;

default: throw " Нет такого пункта в меню ";

}

}

catch (const char* ex)

{

cout << "Ошибка: " << ex << " в main()\n"; _getch();

}

catch (string& ex)

{

cout << "Ошибка: " << ex << " в методе deleteTur()\n"; _getch();

}

catch (ErrFile& ex)

{

ex.ErrOutput();

}

catch (...)

{

cout << "Непредусмотренное исключение\n"; _getch(); return 0;

}

}

}

void masA::inputFile()

{

ifstream fin;

string file;

string iniz;

tur t;

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

cin >> file;

fin.open(file.c_str());

if (fin.fail()) throw ErrFile("не открывается", file, "inputFile()");

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.clear();

fin.seekg(0, ios::beg);

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)

{

int i;

out << "____________________________________________________________________________________\n";

out << "| | | | | | | \n";

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

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

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

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

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

_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 << "|___|__________|________| \n";

_getch();

return out;

}

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

{

int i;

out << "____________________________________________________________________________________\n";

out << "| | | | | | | \n";

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

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

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

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

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

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

_getch();

return out;

}

void masA::outputFile()

{

ofstream fout;

string file;

int i;

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

fout.open(file.c_str());

if (fout.fail()) throw ErrFile("не создается файл", file, "masA::outputFile");

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

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;

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

// Защита от неправильного ввода номера строки

try {

cin >> j;

if (cin.fail()) throw string("Это не номер строки");

}

catch (string ex)

{

cin.clear();

string s;

cin >> s;

throw; // повторная генерация исключения (3)

}

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') throw string("Отказано в удалении");

if (ch != 'y') throw string("Ответ неоднозначен");

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 masB::makePerech()

{

int i, j, fl;

namePerech* y;

y = new namePerech[n];

if (y == NULL) {

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

_getch(); return;

}

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++; }

}

py = new namePerech[k];

if (py == NULL) {

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

_getch();

k = 0;

delete[] y;

return;

}

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();

}

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 masC::findPrice()

{

int i, j, cnt;

tur* y;

y = new tur[n];

if (y == NULL) {

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

_getch(); return;

}

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

cin >> cnt;

l = 0;

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

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

y[l] = px[i];

l++;

}

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

pz = new tur[l];

if (pz == NULL) {

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

_getch(); l = 0; delete[]y; return;

}

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

pz[j] = y[j];

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()) throw ErrFile("не создается файл", file, "masС::outputFile");

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();

}

void masC::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 < l; i++)

cout << "| " << 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";

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

_getch();

}

}

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

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

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

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

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

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

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

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

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

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

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

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

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