Лаб. 7 ООП (Вариант 1)
.docx
#include <iostream>
#include <string>
#include <list>
#include <fstream>
#include <algorithm>
#include <iomanip>
#define N 999
#define L 20
using namespace std;
class fio {
string fam;
string name;
string patron;
public:
fio();
fio(string fam, string name, string patron);
//fio(fio& other);
friend ostream& operator<< (ostream& os, const fio& f);
string get_fam(){
return fam;
}
string get_name(){
return name;
}
string get_patron(){
return patron;
}
//friend class bank;
};
class bank {
fio clientt;
int account;
double sum;
public:
bank();
bank(string fam, string name, string patron, int account, double sum);
//bank(bank& other, fio& other_fio);
bank operator+(double sum_dop) {
sum += sum_dop;
return *this;
}
friend ostream& operator<< (ostream& os, const bank& b);
fio get_clientt(){
return clientt;
}
int get_account() {
return account;
}
double get_sum(){
return sum;
}
//friend class fio;
};
fio::fio() {
fam = " ";
name = " ";
patron = " ";
}
fio::fio(string fam, string name, string patron) {
this->fam = fam;
this->name = name;
this->patron = patron;
}
/*
fio::fio(fio& other) {
fam = other.fam;
name = other.name;
patron = other.patron;
}
*/
bank::bank() {
clientt = fio();
account = 0;
sum = 0;
}
//конструктор для инициализации
bank::bank(string fam, string name, string patron, int account, double sum) {
this->account = account;
this->sum = sum;
this->clientt = fio(fam, name, patron);
}
/*
bank::bank(bank& other, fio& other_fio) {
account = other.account;
sum = other.sum;
clientt = fio(other_fio);
}
*/
ostream& operator<<(ostream& os, const fio& f) {
os << setw(L) << f.fam << setw(L) << f.name << setw(L) << f.patron << "|";
return os;
}
ostream& operator<<(ostream& os, const bank& b) {
os << setw(4) << b.account << "|" << b.clientt << setw(7) << b.sum << "|";
return os;
}
int menu() {
cout << "\n";
int x;
printf("Выберите команду, введя её номер:\n");
printf("1. Добавить новый счет в конец списка.\n");
printf("2. Добавить новый счет на заданную позицию.\n");
printf("3. Найти счет по номеру.\n");
printf("4. Удалить первый счет из списка.\n");
printf("5. Отсортировать счета по убыванию суммы на счете.\n");
printf("6. Вывести все счета.\n");
printf("7. Выход из программы\n-> ");
cin >> x;
cout << "\n";
return x;
}
void add_account(list<bank>& accounts) {
int number;
double balance;
while (true) {
cout << "Введите номер счета: ";
cin >> number;
if (find_if(accounts.begin(), accounts.end(),
[number](bank& client) { return client.get_account() == number; })
== accounts.end()) {
break;
}
cout << "Счет с таким номером уже существует. Попробуйте ввести другой номер." << endl;
}
string fam;
cout << "Введите фамилию клиента: ";
//getchar();
//fgets(fam, L, stdin);
cin >> setw(L) >> fam;
int flag_fam = 0;
for (int i = 0; i < fam.length(); i++) {
if (((fam[i] >= 'a') && (fam[i] <= 'z')) || ((fam[i] >= 'A') && (fam[i] <= 'Z')) || ((fam[i] >= 'а') && (fam[i] <= 'я')) || ((fam[i] >= 'А') && (fam[i] <= 'Я'))) {
flag_fam += 1;
}
}
if (flag_fam != fam.length()) {
throw 0;
}
string name;
cout << "Введите имя клиента: ";
//getchar();
//fgets(name, L, stdin);
cin >> setw(L) >> name;
int flag_name = 0;
for (int i = 0; i < name.length(); i++) {
if (((name[i] >= 'a') && (name[i] <= 'z')) || ((name[i] >= 'A') && (name[i] <= 'Z')) || ((name[i] >= 'а') && (name[i] <= 'я')) || ((name[i] >= 'А') && (name[i] <= 'Я'))) {
flag_name += 1;
}
}
if (flag_name != name.length()) {
throw 0;
}
string patron;
cout << "Введите отчество клиента: ";
//getchar();
//fgets(name, L, stdin);
cin >> setw(L) >> patron;
int flag_patron = 0;
for (int i = 0; i < patron.length(); i++) {
if (((patron[i] >= 'a') && (patron[i] <= 'z')) || ((patron[i] >= 'A') && (patron[i] <= 'Z')) || ((patron[i] >= 'а') && (patron[i] <= 'я')) || ((patron[i] >= 'А') && (patron[i] <= 'Я'))) {
flag_patron += 1;
}
}
if (flag_patron != patron.length()) {
throw 0;
}
cout << "Введите сумму на счете: ";
cin >> balance;
accounts.push_back(bank(fam, name, patron, number, balance));
cout << "Счет успешно добавлен в конец списка." << endl;
}
void insert_account(list<bank>& accounts) {
int number;
double balance;
while (true) {
cout << "Введите номер счета: ";
cin >> number;
if (find_if(accounts.begin(), accounts.end(),
[number](bank& client) { return client.get_account() == number; })
== accounts.end()) {
break;
}
cout << "Счет с таким номером уже существует. Попробуйте ввести другой номер." << endl;
}
string fam;
cout << "Введите фамилию клиента: ";
//getchar();
//fgets(fam, L, stdin);
cin >> setw(L) >> fam;
int flag_fam = 0;
for (int i = 0; i < fam.length(); i++) {
if (((fam[i] >= 'a') && (fam[i] <= 'z')) || ((fam[i] >= 'A') && (fam[i] <= 'Z')) || ((fam[i] >= 'а') && (fam[i] <= 'я')) || ((fam[i] >= 'А') && (fam[i] <= 'Я'))) {
flag_fam += 1;
}
}
if (flag_fam != fam.length()) {
throw 0;
}
string name;
cout << "Введите имя клиента: ";
//getchar();
//fgets(name, L, stdin);
cin >> setw(L) >> name;
int flag_name = 0;
for (int i = 0; i < name.length(); i++) {
if (((name[i] >= 'a') && (name[i] <= 'z')) || ((name[i] >= 'A') && (name[i] <= 'Z')) || ((name[i] >= 'а') && (name[i] <= 'я')) || ((name[i] >= 'А') && (name[i] <= 'Я'))) {
flag_name += 1;
}
}
if (flag_name != name.length()) {
throw 0;
}
string patron;
cout << "Введите отчество клиента: ";
//getchar();
//fgets(name, L, stdin);
cin >> setw(L) >> patron;
int flag_patron = 0;
for (int i = 0; i < patron.length(); i++) {
if (((patron[i] >= 'a') && (patron[i] <= 'z')) || ((patron[i] >= 'A') && (patron[i] <= 'Z')) || ((patron[i] >= 'а') && (patron[i] <= 'я')) || ((patron[i] >= 'А') && (patron[i] <= 'Я'))) {
flag_patron += 1;
}
}
if (flag_patron != patron.length()) {
throw 0;
}
cout << "Введите сумму на счете: ";
cin >> balance;
int position;
cout << "Введите позицию, на которую нужно вставить счет: ";
cin >> position;
if (position < 1 || position > accounts.size() + 1) {
cout << "Номер позиции должен быть в диапазоне от 1 до " << accounts.size() + 1 << endl;
return;
}
auto it = accounts.begin();
advance(it, position - 1);
accounts.insert(it, bank(fam, name, patron, number, balance));
cout << "Счет успешно добавлен на позицию " << position << " в списке." << endl;
}
void find_account( list<bank>& accounts) {
if (accounts.empty()) {
cout << "Список счетов пуст. Нет счетов для поиска." << endl;
return;
}
int number;
cout << "Введите номер счета для поиска: ";
cin >> number;
auto it = find_if(accounts.begin(), accounts.end(),
[number](bank& b) { return b.get_account() == number; });
if (it == accounts.end()) {
cout << "Счет с номером " << number << " не найден." << endl;
}
else {
printf(" № | Фамилия Имя Отчество| Сумма |\n");
for (int i = 0; i < 73; i++) printf("_"); printf("\n");
cout << *it << endl;
for (int i = 0; i < 73; i++) printf("_"); printf("\n");
}
}
void remove_account(list<bank>& accounts) {
if (accounts.empty()) {
cout << "Список счетов пуст. Нет счетов для удаления." << endl;
return;
}
accounts.pop_front();
cout << "Первый счет успешно удален из списка." << endl;
}
void print_accounts(list<bank>& accounts) {
if (accounts.empty()) {
cout << "Список счетов пуст. Нет счетов для вывода." << endl;
return;
}
printf(" № | Фамилия Имя Отчество| Сумма |\n");
for (int i = 0; i < 73; i++) printf("_"); printf("\n");
for (const auto& account : accounts) {
cout << account << endl;
for (int i = 0; i < 73; i++) printf("_"); printf("\n");
}
}
void sort_accounts(list<bank>& accounts) {
//fio clientt;
list<bank> sorted_accounts(accounts); // создаем временную копию списка
sorted_accounts.sort([](bank& a, bank& b) { return a.get_sum() > b.get_sum(); });
//cout << "Счета успешно отсортированы по убыванию суммы на счете." << endl;
print_accounts(sorted_accounts); // выводим отсортированный список
}
void save_data(list<bank>& accounts) {
ofstream file("labseven.txt");
if (file.is_open()) {
for (auto& account : accounts) {
file << account.get_clientt().get_fam() << " ";
file << account.get_clientt().get_name() << " ";
file << account.get_clientt().get_patron() << " ";
file << account.get_account() << " ";
file << account.get_sum() << endl;
}
file.close();
cout << "Данные успешно сохранены в файле labseven.txt." << endl;
}
}
void load_data(list<bank>& accounts) {
ifstream file("labseven.txt");
if (!file.is_open()) {
cout << "Ошибка при открытии файла accounts.txt. Файл будет создан при сохранении данных." << endl;
return;
}
while (!file.eof()) {
string fam;
string name;
string patron;
int number;
double balance;
file >> fam >> name >> patron;
file >> number >> balance;
if (!file.fail()) {
accounts.push_back(bank(fam, name, patron, number, balance));
}
}
file.close();
cout << "Данные успешно загружены из файла labseven.txt." << endl;
}
int main() {
setlocale(LC_ALL, "Russian");
system("chcp 1251");
list<bank> accounts;
load_data(accounts);
int C = 0;
do{
int x = menu();
switch (x) {
case 1:
try {
add_account(accounts);
break;
}
catch (...) {
cout << "\n";
cout << "Ошибка: В введённых данных ФИО присутствуют сторонние символы!";
cout << "\n";
break;
}
break;
case 2:
try {
insert_account(accounts);
break;
}
catch (...) {
cout << "\n";
cout << "Ошибка: В введённых данных ФИО присутствуют сторонние символы!";
cout << "\n";
break;
}
break;
case 3:
find_account(accounts);
break;
case 4:
remove_account(accounts);
break;
case 5:
sort_accounts(accounts);
break;
case 6:
print_accounts(accounts);
break;
case 7:
save_data(accounts);
exit(0);
default:
printf("Команды под данным номером не существует\n");
break;
}
} while (C != 1);
return 0;
}