Логика снятия
Часть раздела Object Oriented Programming путешествия по C на Coddy — урок 25 из 61.
Задание
ЛегкоВаш банковский счет растет! Теперь давайте добавим возможность снятия средств. В отличие от депозитов, у снятия средств есть дополнительное ограничение — вы не можете снять больше денег, чем у вас есть. Ваша функция withdraw должна проверять баланс перед тем, как разрешить транзакцию.
Опираясь на ваш существующий проект банковского счета, вы расширите модуль функционалом снятия средств. Именно здесь инкапсуляция проявляет себя во всей красе — ваша функция может обращаться к скрытому балансу для проверки достаточности средств, чего внешний код никогда не смог бы сделать напрямую.
Вы будете работать с тремя файлами:
account.h: Добавьте прототип новой функции:withdraw. Эта функция принимает указатель на Account и сумму типаdouble, возвращаяint(1 в случае успеха, 0 если снятие не удалось). Сохраните все существующие объявления дляcreate_account,destroy_accountиdeposit.account.c: Реализуйте функциюwithdraw. Снятие средств должно быть успешным только при соблюдении двух условий: сумма должна быть положительной (больше нуля) И на счету должно быть достаточно средств (balance >= amount). Если оба условия соблюдены, вычтите сумму из баланса и верните 1. В противном случае верните 0, не изменяя баланс.main.c: Продемонстрируйте полный рабочий процесс внесения и снятия средств. Создайте счет, внесите депозит для формирования баланса, затем протестируйте снятие средств — как успешное, так и неуспешное.
Вы получите четыре входных значения: ID счета (целое число), сумму депозита (для создания начальных средств), сумму успешного снятия (меньше или равную внесенной сумме) и сумму неудавшегося снятия (больше оставшегося баланса).
В вашем основном файле создайте счет и выведите подтверждение. Внесите начальные средства и выведите результат. Затем выполните успешное снятие и выведите, было ли оно успешным. Наконец, попытайтесь выполнить снятие, которое должно завершиться ошибкой (недостаточно средств), и выведите этот результат. Удалите счет и подтвердите очистку.
Выведите результат в следующем формате:
Account 1001 created
Deposit 500.00: 1
Withdraw 200.00: 1
Withdraw 400.00: 0
Account destroyedГде 1001 — это ID счета, 500.00 — депозит, 200.00 — успешное снятие, а 400.00 — неудавшееся снятие (поскольку после первого снятия остается только 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;
}Все уроки раздела Object Oriented Programming
1Основы модульного программирования
Заголовочные файлыСтражи включенияИсходные файлыСтатические функцииПовторение: Модульный калькулятор4Инкапсуляция
Концепция непрозрачных указателейОпределение непрозрачных структурГеттеры и сеттерыВалидация в сеттерахИтоги: Секретный ящик2Объекты и методы
Структуры как объектыУказатель 'Self'Константная корректностьУказатель против значенияВспомогательные методыИтоги: Point Manager5Проект: Простой банковский счет
Настройка проектаРеализация счета3Жизненный цикл объекта
Паттерн «Конструктор»Паттерн «Деструктор»Инициализация в стекеГлубокое копированиеПовторение: String Wrapper6Наследование через композицию
Встраивание структурПравило первого элементаДоступ к элементам родителяUpcastingПовторение: Иерархия фигур9Проект: Рисование фигур
Обзор проектаРеализация круга