Menu
Coddy logo textTech

Итоги — Менеджер банковских счетов

Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy. Урок 33 из 104.

challenge icon

Задание

Легко

Давайте создадим полноценный менеджер банковских счетов Bank Account Manager, который объединяет все изученные в этой главе концепции свойств класса: закрытые члены с геттерами и сеттерами, const-функции-члены, изменяемые члены, статические переменные и методы, а также дружественные функции.

Вы создадите два файла, чтобы организовать свой код:

  • BankAccount.h: Define класс BankAccount, который управляет данными счета с правильной инкапсуляцией. Ваш класс должен содержать:
    • Закрытые члены: accountNumber (строка), ownerName (строка), balance (double) и mutable int queryCount для отслеживания количества проверок баланса
    • Закрытый статический член totalAccounts для отслеживания количества существующих счетов
    • Конструктор, принимающий номер счета, имя владельца и начальный баланс. Он должен инициализировать queryCount значением 0 и увеличивать totalAccounts
    • Константные геттеры: getAccountNumber(), getOwnerName() и getBalance(): геттер баланса должен увеличивать queryCount при каждом вызове
    • Константный геттер getQueryCount(), возвращающий количество проверок баланса
    • Метод deposit(double amount), который добавляет сумму к балансу только в том случае, если сумма положительна
    • Метод withdraw(double amount), который вычитает сумму из баланса только в том случае, если сумма положительна и не превышает текущий баланс
    • Статический метод getTotalAccounts(), возвращающий общее количество созданных счетов
    • Declare дружественную функцию transfer(BankAccount& from, BankAccount& to, double amount), которая переводит деньги между счетами. Она должна выполнять перевод только в том случае, если сумма положительна, а на исходном счете достаточно средств

    Define статический член и дружественную функцию после определения класса.

  • main.cpp: Продемонстрируйте совместную работу всех этих возможностей. Считайте из входных данных два имени владельцев и два начальных баланса (всего четыре строки: name1, balance1, name2, balance2), затем:
    • Create два объекта BankAccount с номерами счетов "ACC001" и "ACC002"
    • Выведите "Total accounts: <count>"
    • Выведите "<name>: $<balance>" для первого счета
    • Выведите "<name>: $<balance>" для второго счета
    • Внесите 500.0 на первый счет
    • Выведите "After deposit - <name>: $<balance>" для первого счета
    • Переведите 300.0 с первого счета на второй с помощью дружественной функции
    • Выведите "After transfer:"
    • Выведите " <name>: $<balance>" для первого счета
    • Выведите " <name>: $<balance>" для второго счета
    • Выведите "Query count for <name>: <count>" для первого счета

Форматируйте все значения баланса с двумя десятичными знаками, используя std::fixed и std::setprecision(2) из <iomanip>. Преобразуйте входные значения баланса из строк в double с помощью std::stod().

Не забудьте добавить защитные макросы заголовка в файл заголовка и подключить <string> и <iostream> там, где это необходимо.

Попробуйте сами

#include <iostream>
#include <string>
#include <iomanip>
#include "BankAccount.h"

int main() {
    // Считать ввод
    std::string name1, name2;
    std::string balance1Str, balance2Str;
    
    std::getline(std::cin, name1);
    std::getline(std::cin, balance1Str);
    std::getline(std::cin, name2);
    std::getline(std::cin, balance2Str);
    
    double balance1 = std::stod(balance1Str);
    double balance2 = std::stod(balance2Str);
    
    // Установить форматирование вывода для 2 знаков после запятой
    std::cout << std::fixed << std::setprecision(2);
    
    // TODO: Создать два объекта BankAccount с номерами счетов "ACC001" и "ACC002"
    
    // TODO: Print "Total accounts: <count>"
    
    // TODO: Вывести "<name>: $<balance>" для первого счёта
    
    // TODO: Вывести "<name>: $<balance>" для второго счёта
    
    // TODO: Внести 500.0 на первый счёт
    
    // TODO: Print "After deposit - <name>: $<balance>" for the first account
    
    // TODO: Перевести 300.0 с первого счёта на второй, используя friend-функцию
    
    // TODO: Print "After transfer:"
    
    // TODO: Вывести "  <name>: $<balance>" для первого счёта (обратите внимание на отступ в 2 пробела)
    
    // TODO: Вывести "  <name>: $<balance>" для второго счёта (обратите внимание на отступ в 2 пробела)
    
    // TODO: Print "Query count for <name>: <count>" for the first account
    
    return 0;
}

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор C++