Menu
Coddy logo textTech

Получение баланса

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

challenge icon

Задание

Легко

Ваша Bank Account почти готова! Вы создали возможность создавать аккаунты, вносить средства с помощью deposit и снимать деньги с помощью withdraw, но отсутствует одна важная часть. Сейчас внешний код никак не может увидеть текущий balance. Давайте исправим это, добавив getter-функцию.

Getter — это правильный способ предоставить доступ к скрытым данным в инкапсулированном модуле. Вместо того чтобы делать поле balance публичным (что нарушило бы инкапсуляцию), вы предоставляете функцию только для чтения, которая возвращает это значение. Так данные остаются защищёнными, а контролируемый доступ к ним сохраняется.

Вы продолжите работать с тремя файлами:

  • account.h: добавьте новый прототип функции: get_balance. Эта функция принимает const Account * (поскольку она только читает данные и никогда их не изменяет) и возвращает значение типа double, представляющее текущий balance. Сохраните все существующие объявления.
  • account.c: реализуйте функцию get_balance. Она просто возвращает скрытое поле balance из account. Обратите внимание: эта функция может обращаться к внутренним данным, поскольку определена в том же файле, что и struct; внешний код по-прежнему не может напрямую заглянуть внутрь.
  • main.c: теперь вы наконец можете увидеть, что происходит внутри ваших аккаунтов! Создайте аккаунт, выполните несколько операций и используйте новый getter, чтобы отображать balance на каждом шаге.

Вы получите четыре входных значения: идентификатор account (целое число), сумму deposit, сумму withdrawal и сумму второго deposit.

В основном файле создайте аккаунт и выведите его initial balance (должен быть равен 0.00). Внесите первую сумму с помощью deposit и выведите новый balance. Снимите указанную сумму с помощью withdraw и снова выведите balance. Наконец, выполните второй deposit и выведите итоговый balance. Затем уничтожьте аккаунт.

Выведите результат в следующем формате:

Account 1001 created
Balance: 0.00
Balance: 500.00
Balance: 200.00
Balance: 350.00
Account destroyed

Здесь 1001 — это идентификатор account, а значения balance отражают: initial (0.00), значение after внесения 500.00, значение after снятия 300.00 и значение after внесения ещё 150.00. Форматируйте все значения balance с двумя знаками после десятичной точки, используя %.2f.

С этим getter ваш модуль Bank Account теперь предоставляет полный контролируемый доступ к данным аккаунта: пользователи могут видеть balance, но изменять его могут только через ваши проверенные функции deposit и withdraw.

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

#include <stdio.h>
#include "account.h"

int main() {
    int account_id;
    scanf("%d", &account_id);
    
    double deposit1;
    scanf("%lf", &deposit1);
    
    double withdraw_amount;
    scanf("%lf", &withdraw_amount);
    
    double deposit2;
    scanf("%lf", &deposit2);
    
    Account* account = create_account(account_id);
    printf("Account %d created\n", account_id);
    
    // TODO: Вывести начальный баланс с помощью get_balance
    
    deposit(account, deposit1);
    // TODO: Вывести баланс после первого депозита
    
    withdraw(account, withdraw_amount);
    // TODO: Вывести баланс после снятия
    
    deposit(account, deposit2);
    // TODO: Вывести баланс после второго депозита
    
    destroy_account(account);
    printf("Account destroyed\n");
    
    return 0;
}

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

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