1
resposta

Desafio: Simulador de pedidos em uma cafeteria

import java.util.Scanner;
import java.util.Locale;
import java.text.DecimalFormat;

public class Cafeteria_Pedidos {
    public static void main(String[] args) {
        Locale.setDefault(Locale.US);
        Scanner sc = new Scanner(System.in);
        DecimalFormat df = new DecimalFormat("#0.00");

        String[] nomes = {
                "Café expresso",
                "Cappuccino",
                "Latte",
                "Pão de queijo",
                "Bolo do dia",
                "Item personalizado"
        };
        double[] precos = {4.50, 8.00, 7.50, 5.00, 6.00};

        System.out.println("=== Cardápio ===");
        for (int i = 0; i < precos.length; i++) {
            System.out.printf("%d - %s : R$ %s%n", i + 1, nomes[i], df.format(precos[i]));
        }
        System.out.printf("%d - %s (informe nome e preço)%n", precos.length + 1, nomes[precos.length]);

        double total = 0.0;
        int contador = 0;

        System.out.println();
        System.out.println("Digite o número do item para adicioná-lo ao pedido.");
        System.out.println("Digite 0 para encerrar e prosseguir para o pagamento.");

        while (true) {
            System.out.print("Escolha (0 para encerrar): ");
            String entrada = sc.nextLine().trim();
            int escolha;
            try {
                escolha = Integer.parseInt(entrada);
            } catch (NumberFormatException e) {
                System.out.println("Entrada inválida. Digite um número válido.");
                continue;
            }

            if (escolha == 0) {
                break;
            }

            if (escolha < 1 || escolha > precos.length + 1) {
                System.out.println("Opção fora do cardápio. Tente novamente.");
                continue;
            }

            if (escolha == precos.length + 1) {
                System.out.print("Nome do item personalizado: ");
                String nomePersonalizado = sc.nextLine().trim();
                double precoPersonalizado;
                while (true) {
                    System.out.print("Preço do item R$ ");
                    String p = sc.nextLine().trim().replace(",", ".");
                    try {
                        precoPersonalizado = Double.parseDouble(p);
                        if (precoPersonalizado < 0) {
                            System.out.println("Preço não pode ser negativo.");
                            continue;
                        }
                        break;
                    } catch (NumberFormatException e) {
                        System.out.println("Preço inválido. Digite um número, exemplo 3.50");
                    }
                }
                total += precoPersonalizado;
                contador++;
                System.out.printf("Adicionado: %s - R$ %s%n", nomePersonalizado, df.format(precoPersonalizado));
            } else {
                int idx = escolha - 1;
                double preco = precos[idx];
                total += preco;
                contador++;
                System.out.printf("Adicionado: %s - R$ %s%n", nomes[idx], df.format(preco));
            }
        }

        System.out.println();
        if (contador == 0) {
            System.out.println("Nenhum item foi adicionado. Encerrando sem cobrança.");
            sc.close();
            return;
        }

        boolean cadastrado = false;
        while (true) {
            System.out.print("Cliente é cadastrado? (s/n): ");
            String resp = sc.nextLine().trim().toLowerCase();
            if (resp.equals("s") || resp.equals("sim")) {
                cadastrado = true;
                break;
            } else if (resp.equals("n") || resp.equals("nao") || resp.equals("não")) {
                cadastrado = false;
                break;
            } else {
                System.out.println("Responda com 's' para sim ou 'n' para não.");
            }
        }

        double desconto = 0.0;
        double totalFinal = total;
        if (cadastrado) {
            desconto = total * 0.10;
            totalFinal = total - desconto;
        }

        System.out.println();
        System.out.println("=== Resumo do Pedido ===");
        System.out.printf("Quantidade de itens: %d%n", contador);
        System.out.printf("Valor total sem desconto: R$ %s%n", df.format(total));
        System.out.printf("Desconto aplicado: R$ %s%n", df.format(desconto));
        System.out.printf("Valor a pagar: R$ %s%n", df.format(totalFinal));

        sc.close();
    }
}

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
1 resposta

Oii, Vinicius.

Obrigada por compartilhar seu código!

A utilização de printf para formatar a saída do resumo é uma excelente escolha, pois deixa o código limpo e legível. Um detalhe muito positivo foi o uso de uma variável df para formatar os valores monetários antes de exibi-los. Isso demonstra uma boa prática de programação para lidar com números decimais.

E, fechar o Scanner com sc.close() é um passo fundamental para evitar o vazamento de recursos, parabéns por se atentar a isso!

  Alura   Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!