Menu
CoddyTech

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

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

challenge icon

Задание

Легко

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

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

  • BankAccount.h: Определите класс BankAccount, который управляет данными счета с помощью надлежащей инкапсуляции. В классе должны быть:
    • Закрытые члены: accountNumber (строка), ownerName (строка), 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>: $<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: Вывести "Total accounts: <count>"
    
    // TODO: Вывести "<name>: $<balance>" для первого счёта
    
    // TODO: Вывести "<name>: $<balance>" для второго счёта
    
    // TODO: Внести 500.0 на первый счёт
    
    // TODO: Вывести "After deposit - <name>: $<balance>" для первого счёта
    
    // TODO: Перевести 300.0 с первого счёта на второй с помощью дружественной функции
    
    // TODO: Вывести "After transfer:"
    
    // TODO: Вывести "  <name>: $<balance>" для первого счёта (обратите внимание на отступ в 2 пробела)
    
    // TODO: Вывести "  <name>: $<balance>" для второго счёта (обратите внимание на отступ в 2 пробела)
    
    // TODO: Выведите "Query count for <name>: <count>" для первого счёта
    
    return 0;
}

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

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