Menu
Coddy logo textTech

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

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

challenge icon

Задание

Легко

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

Вы создадите два файла для организации вашего кода:

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

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

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

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

Не забудьте про guard-вставки (header guards) в заголовочном файле и подключение <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: Выведите "Total accounts: <count>"
    
    // TODO: Выведите "<name>: $<balance>" для первого счета
    
    // TODO: Выведите "<name>: $<balance>" для второго счета
    
    // TODO: Внесите 500.0 на первый счет
    
    // TODO: Выведите "After deposit - <name>: $<balance>" для первого счета
    
    // TODO: Переведите 300.0 с первого счета на второй, используя дружественную функцию friend
    
    // TODO: Выведите "After transfer:"
    
    // TODO: Выведите "  <name>: $<balance>" для первого счета (обратите внимание на отступ в 2 пробела)
    
    // TODO: Выведите "  <name>: $<balance>" для второго счета (обратите внимание на отступ в 2 пробела)
    
    // TODO: Выведите "Query count for <name>: <count>" для первого счета
    
    return 0;
}

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