Black November

ATÉ 50% OFF

TÁ ACABANDO!

0 dias

0 horas

0 min

0 seg

1
resposta

Desafio: Aplicação de Compras

package newcompras.br.com.newcompras;

import java.util.Scanner;

public class Principal {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int opcao = 1;
        
        System.out.print(" Digite o limite do cartão de crédito: R$ ");
        double limiteCartao = scanner.nextDouble();
        
        CartaoDeCredito cartao = new CartaoDeCredito(limiteCartao);
        while (opcao != 0) {
            scanner.nextLine();
            System.out.print(" Digite a descrição da compra: ");
            String descricao = scanner.nextLine();
            
            System.out.print(" Digite o valor da compra: R$ ");
            while (!scanner.hasNextDouble()) {
                System.out.println(" Valor inválido! Digite um número para o valor da compra:");
                scanner.nextLine(); 
                System.out.print(" Digite o valor da compra: R$ ");
            }
            double valor = scanner.nextDouble();

            Compra novaCompra = new Compra(descricao, valor);

            if (cartao.registraCompra(novaCompra)) {
                System.out.println(" Compra realizada com sucesso!");
                System.out.printf("\n Saldo Atual: %.2f\n", cartao.getSaldo());
                do {
                    System.out.print("\nDigite 0 para sair ou 1 para continuar nas compras: ");

                    while (!scanner.hasNextInt()) {
                        System.out.println(" Opção inválida! Por favor, digite 0 ou 1.");
                        scanner.nextLine(); 
                        System.out.print("\nDigite 0 para sair ou 1 para continuar: ");
                    }

                    opcao = scanner.nextInt();
                    if (opcao != 0 && opcao != 1) {
                        System.out.println(" Opção inválida! Por favor, digite 0 para sair ou 1 para continuar.");
                    }
                } while (opcao != 0 && opcao != 1);
                System.out.println();
            }else {
                System.out.println(" Saldo insuficiente!");
                break;
            }
        }
        
        System.out.println("***************************");
        System.out.println("COMPRAS REALIZADAS:");
        
        // lista de compras ORDENADA por valor
        for (Compra compra : cartao.getListaDeComprasOrdenada()) {
            System.out.printf("%s - %.2f\n", compra.getDescricao(), compra.getValor());
        }
        System.out.println("***************************");
        System.out.printf(" Saldo do cartão: %.2f\n", cartao.getSaldo());
        System.out.println("***************************");        
        scanner.close();
    }
}
package newcompras.br.com.newcompras;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CartaoDeCredito {
    private double limite;
    private double saldo;
    private List<Compra> listaDeCompras;

    public CartaoDeCredito(double limite) {
        this.limite = limite;
        this.saldo = limite; 
        this.listaDeCompras = new ArrayList<>();
    }
    public boolean registraCompra(Compra compra) {
        if (this.saldo >= compra.getValor()) {
            this.saldo -= compra.getValor();
            this.listaDeCompras.add(compra);
            return true;
        }
        return false;
    }

    public double getSaldo() {
        return saldo;
    }
    public List<Compra> getListaDeComprasOrdenada() {       
        Collections.sort(this.listaDeCompras);
        return this.listaDeCompras;
    }

    public double getLimite() {
        return limite;
    }
}
package newcompras.br.com.newcompras;

import java.util.Objects;

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

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

    public String getDescricao() {
        return descricao;
    }

    public double getValor() {
        return valor;
    }
    @Override
    public String toString() {
        return String.format("%s - %.2f", descricao, valor);
    }
    @Override
    public int compareTo(Compra outraCompra) {
        return Double.compare(this.valor, outraCompra.valor);
    }
}

Matricule-se agora e aproveite até 50% OFF

O maior desconto do ano para você evoluir com a maior escola de tecnologia

QUERO APROVEITAR
1 resposta

Que ótimo trabalho, Izaura!

A aplicação está muito bem estruturada, separando claramente as responsabilidades entre as classes Principal, CartaoDeCredito e Compra. O uso do Comparable na classe Compra para ordenar por valor é a solução ideal e foi implementado corretamente, permitindo que o Collections.sort() funcione magicamente em getListaDeComprasOrdenada().

Aqui estão algumas observações/pontos de destaque:

Validação de Entrada: Gostei muito da inclusão do while (!scanner.hasNextDouble()) para forçar uma entrada numérica válida para o valor da compra. Isso aumenta muito a robustez do seu programa!

Limpeza do Buffer: Você se lembrou de adicionar o scanner.nextLine(); no início do loop principal. Isso é fundamental para evitar que o nextLine() subsequente consuma a linha vazia deixada pelo último nextDouble() ou nextInt(). Excelente!

Lógica de Continuação: A estrutura do loop principal, controlada pela variável opcao, funciona bem para o fluxo proposto (comprar ou parar após uma compra bem-sucedida, ou parar se o saldo for insuficiente).

Sugestão de Refinamento (Pode ser ignorada, pois o código já funciona):

Na função getListaDeComprasOrdenada():

public List<Compra> getListaDeComprasOrdenada() {       
    Collections.sort(this.listaDeCompras); // Modifica a lista interna
    return this.listaDeCompras;
}

Se você quisesse garantir que a lista interna de compras mantivesse a ordem de inserção original, mesmo após pedir a lista ordenada, seria uma boa prática criar uma cópia antes de ordenar. Mas para o escopo deste desafio, a abordagem atual está perfeitamente aceitável!

Parabéns pelo código! Está limpo, funcional e demonstra um bom domínio do uso de coleções e interfaces em Java.