Логика снятия
Часть раздела Объектно-ориентированное программирование путешествия по C на Coddy. Урок 25 из 61.
Задание
ЛегкоВаш 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;
}Все уроки раздела Объектно-ориентированное программирование
1Основы модульного программирования
Заголовочные файлыСтражи включенияИсходные файлыСтатические функцииПовторение: Модульный калькулятор4Инкапсуляция
Концепция непрозрачных указателейОпределение непрозрачных структурГеттеры и сеттерыВалидация в сеттерахИтоги: Секретный ящик2Объекты и методы
Структуры как объектыУказатель 'Self'Константная корректностьУказатель против значенияВспомогательные методыИтоги: Point Manager5Проект: Простой банковский счет
Настройка проектаРеализация счета3Жизненный цикл объекта
Паттерн «Конструктор»Паттерн «Деструктор»Инициализация в стекеГлубокое копированиеПовторение: String Wrapper6Наследование через композицию
Встраивание структурПравило первого элементаДоступ к элементам родителяUpcastingПовторение: Иерархия фигур9Проект: Рисование фигур
Обзор проектаРеализация кругаРеализация прямоугольникаПолиморфное использованиеКонтейнер фигурПотренируйтесь самостоятельно: Онлайн-компилятор C