Лаб. 2 ООП (Вариант 18)
.docx
ПРОБЛЕМА С ДЕСТРУКТОРАМИ!
#include <stdio.h>
#include <clocale>
#include <iostream>
#include <cstring>
#include <iomanip>
#include <fstream>
#define N 999
#define L 20
using namespace std;
class bank;
class date {
int day;
char* month;
int year;
public:
int mon;
date();
date(int day, char* month, int mon, int year);
date(date& other);
~date();
int getDay();
char* getMonth();
int getMon();
int getYear();
friend class bank;
};
class bank {
char* fam;
char* name;
int account;
double sum;
static int count;
date open;
public:
bank();
bank(char* fam, char* name, int account, double sum, date& open);
bank(bank& other);
~bank();
char* getFam();
char* getName();
int getAccount();
double getSum();
date getOpen();
static int getCount();
friend void new_account(bank client[]);
friend void show_client(bank client[]);
void filter_sum(bank client[]);
friend void sort_alphabet(bank client[]);
void filter_date(bank client[]);
};
int bank::count = 0;
const char* mass_months[12] = { "январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь" };
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-> ");
cin >> x;
cout << "\n";
return x;
}
//конструктор по умолчанию
date::date() {
cout << "date1\n";
day = 0;
month = nullptr;
mon = 0;
year = 0;
}
//конструктор для инициализации
date::date(int day, char* month, int mon, int year) {
cout << "date2\n";
this->day = day;
this->month = new char[strlen(month) + 1];
strcpy_s(this->month, strlen(month) + 1, month);
this->year = mon;
this->year = year;
}
//конструктор копирования
date::date(date& other) {
cout << "date3\n";
day = other.day;
month = new char[strlen(other.month) + 1];
strcpy_s(month, strlen(other.month) + 1, other.month);
mon = other.mon;
year = other.year;
}
//деструктор
date::~date() {
cout << "date1\n";
delete[] month;
}
//Геттеры для класса date
int date::getDay() {
return day;
}
char* date::getMonth() {
return month;
}
int date::getMon() {
return mon;
}
int date::getYear() {
return year;
}
//конструктор по умолчанию
bank::bank() {
cout << "bank1\n";
fam = nullptr;
name = nullptr;
account = 0;
sum = 0;
open = date();
count++;
}
//конструктор для инициализации
bank::bank(char* fam, char* name, int account, double sum, date& open) {
cout << "bank2\n";
this->fam = new char[strlen(fam) + 1];
strcpy_s(this->fam, strlen(fam) + 1, fam);
this->name = new char[strlen(name) + 1];
strcpy_s(this->name, strlen(name) + 1, name);
this->account = account;
this->sum = sum;
this->open = open;
count++;
}
//конструктор копирования
bank::bank(bank& other) {
cout << "bank3\n";
fam = new char[strlen(other.fam) + 1];
strcpy_s(fam, strlen(other.fam) + 1, other.fam);
name = new char[strlen(other.name) + 1];
strcpy_s(name, strlen(other.name) + 1, other.name);
account = other.account;
sum = other.sum;
open = other.open;
count++;
}
//деструктор
bank::~bank() {
cout << "bank4\n";
delete[] fam;
delete[] name;
count--;
}
//Геттеры для класса bank
char* bank::getFam() {
return fam;
}
char* bank::getName() {
return name;
}
int bank::getAccount() {
return account;
}
double bank::getSum() {
return sum;
}
date bank::getOpen() {
return open;
}
int bank::getCount() {
return count;
}
void new_account(bank client[]) {
int acc_num;
cout << "Введите номер счёта (1-999): ";
cin >> acc_num;
if (acc_num < 1 || acc_num > 999 || acc_num == client[acc_num].account) {
do {
cout << "Недопустимое значение!" << "\n";
cout << "Введите номер счёта (1-999): ";
cin >> acc_num;
} while (acc_num < 1 || acc_num > 999);
}
char fam[L];
cout << "Введите фамилию клиента: ";
//getchar();
//fgets(fam, L, stdin);
cin >> fam;
char name[L];
cout << "Введите имя клиента: ";
//getchar();
//fgets(name, L, stdin);
cin >> name;
double sum;
cout << "Введите сумму депозита: ";
cin >> sum;
if (sum < 0 || sum > 9999999) {
do {
cout << "Недопустимое значение!" << "\n";
cout << "Введите сумму депозита: ";
cin >> sum;
} while (sum < 0 || sum > 9999999);
}
int year;
cout << "Введите год взятия кредита (1407-2022): ";
cin >> year;
if (year > 2022 || year < 1407) {
do {
cout << "Недопустимое значение!" << "\n";
cout << "Введите год взятия кредита (1407 - 2022): ";
cin >> year;
} while (year > 2022 || year < 1407);
}
int schet_month;
int f = 5;
char month[L];
do {
schet_month = 0;
cout << "Введите месяц взятия кредита (строчными буквами): ";
cin >> month;
for (int i = 0; i < 12; i++) {
schet_month++;
if (strcmp(mass_months[i], month) == 0) {
f = 1;
break;
}
}
if (f != 1) {
cout << "Недопустимое значение!" << "\n";
}
} while (f != 1);
int day;
if (schet_month == 2 && year % 4 == 0) {
cout << "Введите число взятия кредита (1-29): ";
cin >> day;
if (day < 1 || day>29) {
do {
cout << "Недопустимое значение!" << "\n";
cout << "Введите число взятия кредита (1-29): ";
cin >> day;
} while (day < 1 || day>29);
}
}
if (schet_month == 2 && year % 4 != 0) {
cout << "Введите число взятия кредита (1-28): ";
cin >> day;
if (day < 1 || day>28) {
do {
cout << "Недопустимое значение!" << "\n";
cout << "Введите число взятия кредита (1-28): ";
cin >> day;
} while (day < 1 || day>28);
}
}
if (schet_month == 4 || schet_month == 6 || schet_month == 9 || schet_month == 11) {
cout << "Введите число взятия кредита (1-30): ";
cin >> day;
if (day < 1 || day>30) {
do {
cout << "Недопустимое значение!" << "\n";
cout << "Введите число взятия кредита (1-30): ";
cin >> day;
} while (day < 1 || day>30);
}
}
if (schet_month == 1 || schet_month == 3 || schet_month == 5 || schet_month == 7 || schet_month == 8 || schet_month == 10 || schet_month == 12) {
cout << "Введите число взятия кредита (1-31): ";
cin >> day;
if (day < 1 || day>31) {
do {
cout << "Недопустимое значение!" << "\n";
cout << "Введите число взятия кредита (1-31): ";
cin >> day;
} while (day < 1 || day>31);
}
}
date open(day, month, schet_month, year);
client[acc_num] = bank(fam, name, acc_num, sum, open);
cout << "\n";
cout << "Счёт успешно добавлен.\n";
}
void show_client(bank client[]) {
char fam[L], name[L];
char* ffam;
char* nname;
int a = 0;
cout << "Введите фамилию клиента: ";
//fgets(buff, L, stdin);
cin >> fam;
ffam = new char[strlen(fam) + 1];
strcpy_s(ffam, strlen(fam) + 1, fam);
cout << "Введите имя клиента: ";
//fgets(buff, L, stdin);
cin >> name;
nname = new char[strlen(name) + 1];
strcpy_s(nname, strlen(name) + 1, name);
for (int i = 0; i < L * 2; i++) printf("_"); printf("\n");
for (int i = 0; i < N; i++) {
if (client[i].account == i && (strcmp(client[i].fam, ffam) == 0) && (strcmp(client[i].name, nname) == 0)) {
printf("Номер счёта |");
cout << setw(L) << client[i].account << "|" << "\n";
for (int i = 0; i < L; i++) printf("_ "); printf("\n");
printf("Cумма кредита |");
cout << setw(L) << client[i].sum << "|" << "\n";
for (int i = 0; i < L * 2; i++) printf("_"); printf("\n");
//ssum += client[i].sum;
}
if (i != client[i].account) {
a++;
}
}
if (a == N - 1) {
cout << "Пользователи не введены" << "\n";
}
}
void bank::filter_sum(bank client[]) {
int sm;
int a = 0;
cout << "Введите сумму: ";
cout << "\n";
cin >> sm;
if (sm < 0 || sm>9999999) {
do {
cout << "Недопустимое значение!" << "\n";
cout << "Введите процент по кредиту: ";
cin >> sm;
} while (sm < 0 || sm >9999999);
}
printf(" № | Фамилия Имя|\n");
for (int i = 0; i < L * 2 + 5; i++) printf("_"); printf("\n");
for (int i = 1; i < N; i++) {
if (i == client[i].account && sm < client[i].sum) {
cout << setw(4) << client[i].account << "|";
cout << setw(L) << client[i].fam;
cout << setw(L) << client[i].name << "|" << "\n";
for (int i = 0; i < L * 2 + 5; i++) printf("_"); printf("\n");
}
if (i != client[i].account) {
a++;
}
}
if (a == N - 2) {
cout << "Пользователи не введены" << "\n";
}
cout << "\n";
}
void sort_alphabet(bank client[]) {
int n, s;
int a = 0;
char buff[L];
printf(" № | Фамилия Имя| Сумма |\n");
for (int i = 0; i < 53; i++) printf("_"); printf("\n");
for (int i = 1; i < N - 1; i++) {
for (int j = i + 1; j < N; j++) {
if ((i == client[i].account && j == client[j].account) && (strcmp(client[i].fam, client[j].fam) > 0)) {
swap(client[i].fam, client[j].fam);
swap(client[i].name, client[j].name);
swap(client[i].account, client[j].account);
swap(client[i].sum, client[j].sum);
}
if (i != client[i].account) {
a++;
}
}
}
if (a == N - 3) {
cout << "Пользователи не введены" << "\n";
}
else {
for (int i = 1; i < N; i++) {
for (int j = 1; j < N; j++) {
if (i == client[j].account) {
cout << setw(4) << client[i].account << "|";
cout << setw(L) << client[i].fam;
cout << setw(L) << client[i].name << "|";
cout << setw(7) << client[i].sum << "|" << "\n";
for (int i = 0; i < 53; i++) printf("_"); printf("\n");
}
}
}
}
cout << "\n";
}
void bank::filter_date(bank client[]) {
int n, s;
int a = 0;
char buff[L];
printf(" № | Фамилия Имя|День| Месяц | Год|\n");
for (int i = 0; i < 64; i++) printf("_"); printf("\n");
for (int i = 1; i < N - 1; i++) {
for (int j = i + 1; j < N; j++) {
if ((i == client[i].account && j == client[j].account) && (client[i].open.year < client[j].open.year)) {
bank temp = client[i];
client[i] = client[j];
client[j] = temp;
}
if ((i == client[i].account && j == client[j].account) && (client[i].open.year == client[j].open.year) && (client[i].open.mon < client[j].open.mon)) {
bank temp = client[i];
client[i] = client[j];
client[j] = temp;
}
if ((i == client[i].account && j == client[j].account) && (client[i].open.year == client[j].open.year) && (client[i].open.mon == client[j].open.mon) && (client[i].open.day < client[j].open.day)) {
bank temp = client[i];
client[i] = client[j];
client[j] = temp;
}
}
}
if (a == N - 3) {
cout << "Пользователи не введены" << "\n";
}
else {
for (int i = 1; i < N; i++) {
for (int j = 1; j < N; j++) {
if (i == client[j].account) {
cout << setw(4) << client[i].account << "|";
cout << setw(L) << client[i].fam;
cout << setw(L) << client[i].name << "|";
cout << setw(4) << client[i].open.day << "|";
cout << setw(8) << client[i].open.getMonth() << "|";
cout << setw(4) << client[i].open.year << "|" << "\n";
for (int i = 0; i < 64; i++) printf("_"); printf("\n");
}
}
}
}
cout << "\n";
}
int main() {
setlocale(LC_ALL, "Russian");
system("chcp 1251");
bank* mass = (bank*)malloc(N * sizeof(bank));
bank A;
int C = 0;
do {
int x = menu();
switch (x) {
case 1:
new_account(mass);
break;
case 2:
show_client(mass);
break;
case 3:
A.filter_sum(mass);
break;
case 4:
sort_alphabet(mass);
break;
case 5:
A.filter_date(mass);
break;
case 6:
exit(0);
default:
printf("Команды под данным номером не существует\n");
break;
}
} while (C != 1);
return 0;
}