Lógica de Saque
Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 25 de 61.
Desafio
FácilSua conta bancária está crescendo! Agora vamos adicionar a capacidade de sacar fundos. Diferentemente dos depósitos, os saques têm uma restrição extra. Você não pode retirar mais dinheiro do que tem. Sua função de saque precisa verificar o saldo antes de permitir a transação.
Dando continuidade ao seu projeto de conta bancária, você vai estender o módulo com a funcionalidade de saque. É aqui que o encapsulamento realmente se destaca. Sua função pode acessar o saldo oculto para verificar se há fundos suficientes, algo que o código externo nunca conseguiria fazer diretamente.
Você trabalhará com três arquivos:
account.h: Adicione um novo protótipo de função:withdraw. Essa função recebe um ponteiro para Account e um valordouble, retornando umint(1 em caso de sucesso, 0 se o saque falhar). Mantenha todas as declarações existentes paracreate_account,destroy_accountedeposit.account.c: Implemente a funçãowithdraw. Um saque só deve ser bem-sucedido se duas condições forem atendidas: o valor deve ser positivo (maior que zero) E a conta deve ter fundos suficientes (saldo >= valor). Se ambas as condições forem satisfeitas, subtraia o valor do saldo e retorne 1. Caso contrário, retorne 0 sem modificar o saldo.main.c: Demonstre o fluxo completo de depósito e saque. Crie uma conta, faça um depósito para estabelecer um saldo e, em seguida, teste os saques: tanto os bem-sucedidos quanto os malsucedidos.
Você receberá quatro entradas: o ID da conta (um número inteiro), um valor de depósito (para estabelecer os fundos iniciais), um valor de saque bem-sucedido (menor ou igual ao valor depositado) e um valor de saque malsucedido (maior que o saldo restante).
No arquivo principal, crie uma conta e imprima uma confirmação. Deposite os fundos iniciais e imprima o resultado. Em seguida, faça o saque bem-sucedido e imprima se ele foi bem-sucedido. Por fim, tente fazer o saque que deve falhar (por falta de fundos) e imprima o resultado. Destrua a conta e confirme a limpeza.
Imprima a saída neste formato:
Account 1001 created
Deposit 500.00: 1
Withdraw 200.00: 1
Withdraw 400.00: 0
Account destroyedEm que 1001 é o ID da conta, 500.00 é o depósito, 200.00 é o saque bem-sucedido e 400.00 é o saque malsucedido (pois restam apenas 300.00 após o primeiro saque). Formate todos os valores com duas casas decimais usando %.2f.
Sua função de saque demonstra o poder do encapsulamento. Ela pode verificar internamente o saldo oculto para tomar decisões, enquanto o código externo não tem como ignorar essa validação nem consultar o saldo diretamente.
Experimente você mesmo
#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;
}Todas as lições de Programação Orientada a Objetos
1Fundamentos da Programação Modular
Arquivos de cabeçalhoProteções de inclusãoArquivos-fonteFunções estáticasRevisão: calculadora modular4Encapsulamento
Conceito de ponteiros opacosDefinindo structs opacasGetters e settersValidação em settersRevisão: caixa secreta2Objetos e métodos
Structs como objetosO ponteiro 'Self'Correção de constPonteiro vs. valorMétodos auxiliaresRevisão: Gerenciador de pontos5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de vida do objeto
Padrão de construtorPadrão de destrutorInicialização da pilhaCópia profundaRevisão: wrapper de String6Herança por composição
Incorporação de structRegra do primeiro membroAcessando membros do tipo paiUpcastingRevisão: hierarquia de formas9Projeto: Desenhador de Formas
Visão geral do projetoImplementação do círculoImplementação do retânguloUso polimórficoContêiner de formasPratique por conta própria: Compilador de C online