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

Лаб. 2 ООП (Вариант 18)

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

ПРОБЛЕМА С ДЕСТРУКТОРАМИ!

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

}