
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();
}
}
Скриншоты работы программы
Загрузка из файла:
а) В качестве пункта меню введено не число:
б) Введен несуществующий пункт меню:
в) Введен несуществующий файл:
г) Введен правильный файл:
2. Вывод информации на экран
Добавление записи
4. Удаление записи
a) В качестве номера строки введено не число
б) Введена несуществующая строка:
в) Дан неверный ответ на подтверждение удаления:
г) Удаление отменено: