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

Лаб. 7 ООП (Вариант 1)

.docx
Скачиваний:
0
Добавлен:
30.08.2024
Размер:
74.31 Кб
Скачать

#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;

}