Загрузка данных
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <algorithm>
#include <sstream>
using namespace std;
struct BankAccount {
int number;
string owner;
double balance;
double rate;
};
int readInt(const string& prompt) {
string line;
int value;
while (true) {
cout << prompt;
getline(cin, line);
istringstream iss(line);
if (iss >> value && iss.eof()) return value;
cout << "Ошибка, повторите\n";
}
}
double readDouble(const string& prompt) {
string line;
double value;
while (true) {
cout << prompt;
getline(cin, line);
istringstream iss(line);
if (iss >> value && iss.eof()) return value;
cout << "Ошибка, повторите\n";
}
}
string readLine(const string& prompt) {
string s;
cout << prompt;
getline(cin, s);
return s;
}
bool uniqueNumber(const vector<BankAccount>& accs, int num) {
for (auto& a : accs) if (a.number == num) return false;
return true;
}
BankAccount inputAccount(const vector<BankAccount>& accs) {
BankAccount a;
do {
a.number = readInt("Номер счета: ");
} while (a.number <= 0 || !uniqueNumber(accs, a.number));
a.owner = readLine("Владелец: ");
a.balance = readDouble("Баланс: ");
a.rate = readDouble("Ставка (%): ");
if (a.rate < 0) a.rate = 0;
return a;
}
void printAll(const vector<BankAccount>& accs) {
if (accs.empty()) { cout << "Нет счетов\n"; return; }
for (auto& a : accs)
cout << a.number << " | " << a.owner << " | " << a.balance << " | " << a.rate << "%\n";
}
void addAccount(vector<BankAccount>& accs) {
accs.push_back(inputAccount(accs));
}
void deleteAccount(vector<BankAccount>& accs) {
int num = readInt("Номер счета для удаления: ");
auto it = remove_if(accs.begin(), accs.end(), [num](BankAccount& a) { return a.number == num; });
if (it != accs.end()) accs.erase(it, accs.end());
else cout << "Не найден\n";
}
void editAccount(vector<BankAccount>& accs) {
int num = readInt("Номер счета для редактирования: ");
for (auto& a : accs) {
if (a.number == num) {
cout << "Текущие: " << a.owner << " " << a.balance << " " << a.rate << "\n";
string o = readLine("Новый владелец (пусто - без изменений): ");
if (!o.empty()) a.owner = o;
double b = readDouble("Новый баланс ( -1 без изменений): ");
if (b != -1) a.balance = b;
double r = readDouble("Новая ставка ( -1 без изменений): ");
if (r != -1 && r >= 0) a.rate = r;
return;
}
}
cout << "Не найден\n";
}
void negativeBalance(const vector<BankAccount>& accs) {
bool found = false;
for (auto& a : accs) if (a.balance < 0) { cout << a.number << " " << a.owner << " " << a.balance << "\n"; found = true; }
if (!found) cout << "Нет счетов с отрицательным балансом\n";
}
void addInterest(vector<BankAccount>& accs) {
for (auto& a : accs) a.balance += a.balance * a.rate / 100.0;
cout << "Проценты начислены\n";
}
void maxBalance(const vector<BankAccount>& accs) {
if (accs.empty()) return;
auto m = max_element(accs.begin(), accs.end(), [](BankAccount& x, BankAccount& y) { return x.balance < y.balance; });
cout << "Макс. баланс: " << m->number << " " << m->owner << " " << m->balance << "\n";
}
void save(const vector<BankAccount>& accs, const string& file) {
ofstream f(file);
if (!f) return;
f << accs.size() << "\n";
for (auto& a : accs) f << a.number << "|" << a.owner << "|" << a.balance << "|" << a.rate << "\n";
}
void load(vector<BankAccount>& accs, const string& file) {
ifstream f(file);
if (!f) return;
size_t n; f >> n; f.ignore();
vector<BankAccount> tmp;
for (size_t i = 0; i < n; i++) {
string line; getline(f, line);
if (line.empty()) continue;
BankAccount a;
size_t p1 = line.find('|');
size_t p2 = line.find('|', p1 + 1);
size_t p3 = line.find('|', p2 + 1);
a.number = stoi(line.substr(0, p1));
a.owner = line.substr(p1 + 1, p2 - p1 - 1);
a.balance = stod(line.substr(p2 + 1, p3 - p2 - 1));
a.rate = stod(line.substr(p3 + 1));
tmp.push_back(a);
}
accs = tmp;
}
int main() {
vector<BankAccount> accounts;
int choice;
string file = "accounts.txt";
do {
cout << "\n1-Ввод 2-Вывод 3-Добавить 4-Удалить 5-Редакт 6-Отриц.баланс 7-Проценты 8-Макс.баланс 9-Сохранить 10-Загрузить 0-Выход\n";
choice = readInt("Выбор: ");
switch (choice) {
case 1: {
int n = readInt("Количество: ");
accounts.clear();
for (int i = 0; i < n; i++)
accounts.push_back(inputAccount(accounts));
break;
}
case 2: printAll(accounts); break;
case 3: addAccount(accounts); break;
case 4: deleteAccount(accounts); break;
case 5: editAccount(accounts); break;
case 6: negativeBalance(accounts); break;
case 7: addInterest(accounts); break;
case 8: maxBalance(accounts); break;
case 9: save(accounts, file); break;
case 10: load(accounts, file); break;
case 0: break;
default: cout << "Неверно\n";
}
} while (choice != 0);
return 0;
}