2
respostas

Sistema de Compras

Passo 1: Criar a Classe Compra

import java.text.DecimalFormat; // Importe para formatar o valor monetário

public class Compra implements Comparable<Compra> {
    private String descricao;
    private double valor;

    // Construtor
    public Compra(String descricao, double valor) {
        this.descricao = descricao;
        this.valor = valor;
    }

    // Getters
    public String getDescricao() {
        return descricao;
    }

    public double getValor() {
        return valor;
    }

    // Sobrescrever o método toString() para uma representação legível
    @Override
    public String toString() {
        // Formata o valor para duas casas decimais
        DecimalFormat df = new DecimalFormat("0.00");
        return "Descrição: " + descricao + " - Valor: R$ " + df.format(valor);
    }

    // Implementar a interface Comparable para ordenar por valor
    @Override
    public int compareTo(Compra outraCompra) {
        // Compara os valores. Retorna um valor negativo se esta compra for menor,
        // zero se for igual, e positivo se for maior.
        // Convertemos para Double para usar o método compareTo da classe Double,
        // que lida melhor com números de ponto flutuante.
        return Double.valueOf(this.valor).compareTo(Double.valueOf(outraCompra.valor));
    }
}

Passo 2: Criar a Classe CartaoDeCredito

import java.util.ArrayList; // Precisamos do ArrayList para a lista de compras
import java.util.List;      // Usaremos a interface List para declarar a lista (bom hábito de polimorfismo)
import java.text.DecimalFormat; // Para formatar o saldo e limite na exibição

public class CartaoDeCredito {
    private double limite;
    private double saldo;
    private List<Compra> listaDeCompras; // Usamos a interface List

    // Construtor
    public CartaoDeCredito(double limite) {
        this.limite = limite;
        this.saldo = limite; // Saldo inicial é igual ao limite
        this.listaDeCompras = new ArrayList<>(); // Inicializa o ArrayList vazio
    }

    // Método para lançar uma compra
    public boolean lancaCompra(Compra compra) {
        if (this.saldo >= compra.getValor()) { // Verifica se há limite suficiente
            this.saldo -= compra.getValor(); // Deduz o valor da compra do saldo
            this.listaDeCompras.add(compra); // Adiciona a compra à lista
            return true; // Compra realizada com sucesso
        } else {
            return false; // Saldo insuficiente
        }
    }

    // Getters
    public double getLimite() {
        return limite;
    }

    public double getSaldo() {
        return saldo;
    }

    // Getter para a lista de compras (para que possamos iterar e ordenar fora desta classe)
    public List<Compra> getListaDeCompras() {
        return listaDeCompras;
    }

    // Opcional: toString para o cartão, útil para depuração
    @Override
    public String toString() {
        DecimalFormat df = new DecimalFormat("0.00");
        return "Cartão de Crédito [Limite: R$ " + df.format(limite) + ", Saldo Disponível: R$ " + df.format(saldo) + "]";
    }
}
2 respostas

Passo 3: Criar a Classe Principal (Main ou AplicacaoCartao)

import java.util.Collections; // Para usar o Collections.sort()
import java.util.Scanner;    // Para entrada de dados do usuário
import java.text.DecimalFormat; // Para formatar a saída monetária

public class Main {
    public static void main(String[] args) {
        Scanner leitura = new Scanner(System.in);
        DecimalFormat df = new DecimalFormat("0.00"); // Formatação para valores monetários

        System.out.println("Digite o limite do cartão: ");
        double limite = leitura.nextDouble();

        CartaoDeCredito cartao = new CartaoDeCredito(limite);

        int sair = 0;
        while (sair != 1) {
            System.out.println("Digite a descrição da compra:");
            String descricao = leitura.next(); // Usa next() para pegar uma palavra, nextLine() para linha inteira

            System.out.println("Digite o valor da compra:");
            double valor = leitura.nextDouble();

            Compra compra = new Compra(descricao, valor);

            if (cartao.lancaCompra(compra)) {
                System.out.println("Compra realizada!");
                System.out.println("Saldo atual: R$ " + df.format(cartao.getSaldo()));
            } else {
                System.out.println("Saldo insuficiente!");
            }

            System.out.println("Digite 0 para continuar ou 1 para sair:");
            sair = leitura.nextInt();
        }

        System.out.println("\n*********************************");
        System.out.println("COMPRAS REALIZADAS:");
        // Ordena a lista de compras do cartão
        // Collections.sort usa o método compareTo que implementamos na classe Compra
        Collections.sort(cartao.getListaDeCompras());

        // Percorre e imprime as compras ordenadas
        for (Compra c : cartao.getListaDeCompras()) {
            System.out.println(c.toString());
        }
        System.out.println("*********************************");

        System.out.println("\nSaldo final do cartão: R$ " + df.format(cartao.getSaldo()));

        leitura.close(); // Fechar o Scanner é uma boa prática
    }
}

Oii, Daiane!

Obrigada por compartilhar sua implementação completa.

Seu projeto tá bem estruturado e organizado! A separação das responsabilidades entre as classes Compra, CartaoDeCredito e Main segue boas práticas de orientação a objetos. E, o uso de interface List pra favorecer o polimorfismo e a implementação da interface Comparable na classe Compra para facilitar a ordenação demonstram domínio dos conceitos apresentados no curso.

Parabéns pela dedicação no projeto!

Quer continuar estudando? Se liga nesses materiais:
Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!