Menu
Coddy logo textTech

Логика снятия

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

challenge icon

Задание

Легко

Ваш Bank Account растёт! Теперь добавим возможность снимать средства. В отличие от депозитов, снятие средств имеет дополнительное ограничение. Нельзя снять больше денег, чем у вас есть. Ваша функция withdraw должна проверить баланс, прежде чем разрешить транзакцию.

Продолжая работу над существующим проектом Bank Account, вы расширите модуль функциональностью снятия средств. Именно здесь инкапсуляция действительно раскрывает свои преимущества. Ваша функция может получить доступ к скрытому балансу, чтобы проверить достаточность средств, чего внешний код никогда не смог бы сделать напрямую.

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

  • account.h: добавьте новый прототип функции: withdraw. Эта функция принимает указатель Account и сумму типа double, возвращая int (1 при успехе, 0, если снятие не удалось). Сохраните все существующие объявления для create_account, destroy_account и deposit.
  • account.c: Implement функцию withdraw. Снятие должно быть успешным только при выполнении двух условий: сумма должна быть положительной (больше нуля), И на счёте должно быть достаточно средств (balance >= amount). Если оба условия выполнены, вычтите сумму из баланса и верните 1. В противном случае верните 0 без изменения баланса.
  • main.c: продемонстрируйте полный рабочий процесс deposit и withdraw. Создайте счёт, внесите deposit, чтобы установить баланс, затем протестируйте снятие средств: как успешное, так и неуспешное.

Вы получите четыре входных значения: идентификатор account (целое число), сумму deposit (для формирования начальных средств), сумму успешного withdraw (меньше или равную внесённой сумме) и сумму неудачного withdraw (больше оставшегося баланса).

В основном файле создайте account и выведите подтверждение. Внесите начальные средства и выведите результат. Затем выполните успешный withdraw и выведите, был ли он успешным. Наконец, попытайтесь выполнить withdraw, который должен завершиться неудачей (недостаточно средств), и выведите этот результат. Уничтожьте account и подтвердите очистку.

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

Account 1001 created
Deposit 500.00: 1
Withdraw 200.00: 1
Withdraw 400.00: 0
Account destroyed

Здесь 1001 — идентификатор account, 500.00 — deposit, 200.00 — успешный withdraw, а 400.00 — неудачный withdraw (поскольку после первого снятия остаётся только 300.00). Отформатируйте все суммы с двумя знаками после десятичной точки, используя %.2f.

Ваша функция withdraw демонстрирует силу инкапсуляции. Она может внутренне проверять скрытый баланс для принятия решений, тогда как внешний код не может обойти эту проверку или напрямую просмотреть баланс.

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

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

int main() {
    int account_id;
    scanf("%d", &account_id);
    
    double valid_amount;
    scanf("%lf", &valid_amount);
    
    double invalid_amount;
    scanf("%lf", &invalid_amount);
    
    Account* account = create_account(account_id);
    printf("Account %d created\n", account_id);
    
    int result_invalid = deposit(account, invalid_amount);
    printf("Deposit %.2f: %d\n", invalid_amount, result_invalid);
    
    int result_valid = deposit(account, valid_amount);
    printf("Deposit %.2f: %d\n", valid_amount, result_valid);
    
    destroy_account(account);
    printf("Account destroyed\n");
    
    return 0;
}

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

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