Lógica de Saque
Parte da seção Object Oriented Programming 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. Diferente dos depósitos, os saques têm uma restrição extra — você não pode retirar mais dinheiro do que possui. Sua função withdraw precisa verificar o saldo antes de permitir a transação.
Com base no seu projeto de Conta Bancária existente, você estenderá o módulo com a funcionalidade de saque. É aqui que o encapsulamento realmente brilha — sua função pode acessar o saldo oculto para verificar se há fundos suficientes, algo que o código externo nunca poderia fazer diretamente.
Você trabalhará com três arquivos:
account.h: Adicione um novo protótipo de função:withdraw. Esta função recebe um ponteiro Account e um valordouble, retornando umint(1 para sucesso, 0 se o saque falhar). Mantenha todas as suas 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 (balance >= amount). Se ambas as condições passarem, subtraia o valor do saldo e retorne 1. Caso contrário, retorne 0 sem modificar o saldo.main.c: Demonstre seu fluxo de trabalho 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 com falha (maior que o saldo restante).
No seu arquivo principal, crie uma conta e imprima uma confirmação. Deposite os fundos iniciais e imprima o resultado. Em seguida, realize o saque bem-sucedido e imprima se ele teve sucesso. Por fim, tente o saque que deve falhar (fundos insuficientes) e imprima esse 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 destroyedOnde 1001 é o ID da conta, 500.00 é o depósito, 200.00 é o saque bem-sucedido e 400.00 é o saque que falhou (porque restam apenas 300.00 após o primeiro saque). Formate todos os valores com duas casas decimais usando %.2f.
Sua função withdraw demonstra o poder do encapsulamento — ela pode verificar o saldo oculto internamente para tomar decisões, enquanto o código externo não tem como ignorar essa validação ou espiar 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 Object Oriented Programming
1Fundamentos da Programação Modular
Arquivos de CabeçalhoInclude GuardsArquivos-FonteFunções EstáticasRecapitulação: Calculadora Modular4Encapsulamento
Conceito de Ponteiros OpacosDefinindo Structs OpacasGetters e SettersValidação em SettersRecapitulação: Caixa Secreta2Objetos e Métodos
Structs como ObjetosO Ponteiro 'Self'Const CorrectnessPonteiro vs ValorMétodos AuxiliaresRecapitulação: Point Manager5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de Vida de Objetos
Padrão de ConstrutorPadrão de DestrutorInicialização na StackCópia ProfundaRecapitulação: String Wrapper6Herança via Composição
Incorporação de StructsA Regra do Primeiro MembroAcessando Membros PaiUpcastingRecapitulação: Hierarquia de Formas9Projeto: Desenhador de Formas
Visão Geral do ProjetoImplementação do Círculo