Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Desafio: Simulador de pedidos em uma cafeteria

import java.util.Scanner;

public class CafeteriaAtendimento {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // Pergunta quantos itens
        System.out.print("Quantos itens o cliente vai pedir? ");
        int numItens = scanner.nextInt();

        double total = 0.0;

        // Laço para ler cada item
        for (int i = 0; i < numItens; i++) {
            System.out.print("Digite o nome do item " + (i + 1) + ": ");
            String nomeItem = scanner.next(); // Não usamos nextLine para evitar problemas de leitura
            System.out.print("Digite o preço do item " + (i + 1) + ": ");
            double precoItem = scanner.nextDouble();

            // Soma o preço do item ao total
            total += precoItem;
        }

        // Pergunta se é cadastrado
        System.out.print("Você é cadastrado no nosso app? (sim ou não): ");
        String cadastrado = scanner.next();

        // Aplica o desconto, se cadastrado
        if (cadastrado.equalsIgnoreCase("sim")) {
            total *= 0.90; // Aplica 10% de desconto
            System.out.printf("Valor com desconto: R$ %.2f\n", total);
        } else {
            System.out.printf("Valor total: R$ %.2f\n", total);
        }

        scanner.close(); // Fecha o scanner
    }
}

Eu pos app porque geralmente em mercados e alguns estabelecimentos, tem aplicações que o cliente pode estar cadastrado e ganhar desconto

1 resposta
solução!

Olá, Otavio. Como vai?

O seu código para o desafio do simulador da cafeteria ficou excelente! A lógica de repetição para acumular os preços dos produtos e a estrutura de decisão para aplicar o desconto com base no cadastro do cliente foram implementadas perfeitamente. O seu insight de simular a regra do aplicativo de fidelidade foi ótimo e trouxe um cenário muito real de mercado para o exercício.

Também foi muito perspicaz a sua escolha de usar o método scanner.next() para evitar o famoso problema do consumo do caractere de nova linha (\n) que acontece ao misturar leituras numéricas com strings no Java.

Para agregar ainda mais valor ao seu aprendizado e elevar o nível do seu código em Java, quero propor dois pequenos pontos de melhoria contínua:

1. Lidando com nomes compostos nos itens

Embora o scanner.next() resolva o problema da quebra de linha, ele tem uma limitação: ele lê apenas a primeira palavra digitada. Se o cliente for pedir um "Café Espresso" ou "Pão de Queijo", o programa vai capturar apenas "Café" ou "Pão" e tentará ler a próxima palavra como se fosse o preço, gerando um erro de execução (InputMismatchException).

Para permitir que o usuário digite nomes compostos com espaços, a boa prática no Java é usar o scanner.nextLine(), limpando o buffer do teclado logo após ler os números inteiros ou decimais.

2. Deixando o código mais limpo e imune a erros de digitação

Na verificação do desconto, em vez de depender estritamente de strings longas como "sim" ou "não", podemos simplificar a entrada para um tipo booleano ou aceitar apenas a inicial "s".

Veja como o seu código pode ser otimizado com essas boas práticas de tratamento de buffer:

import java.util.Scanner;

public class CafeteriaAtendimento {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Quantos itens o cliente vai pedir? ");
        int numItens = scanner.nextInt();
        
        // Boa prática: limpa o \n que sobrou no buffer após ler o inteiro
        scanner.nextLine(); 

        double total = 0.0;

        for (int i = 0; i < numItens; i++) {
            // Agora com nextLine() você pode digitar "Pão de Queijo" sem quebrar o programa
            System.out.print("Digite o nome do item " + (i + 1) + ": ");
            String nomeItem = scanner.nextLine(); 
            
            System.out.print("Digite o preço do item " + (i + 1) + ": ");
            double precoItem = scanner.nextDouble();
            
            // Novamente, limpa o buffer após ler o double para preparar a próxima linha de texto
            scanner.nextLine(); 

            total += precoItem;
        }

        System.out.print("Você é cadastrado no nosso app? (s/n): ");
        String cadastrado = scanner.nextLine();

        // Aceita "s", "sim", "S", "Sim"
        if (cadastrado.toLowerCase().startsWith("s")) {
            total *= 0.90; // Aplica 10% de desconto
            System.out.printf("Valor com desconto do app: R$ %.2f\n", total);
        } else {
            System.out.printf("Valor total: R$ %.2f\n", total);
        }

        scanner.close();
    }
}

Parabéns pelo excelente projeto e por pensar na experiência do usuário final ao incluir a mecânica de desconto do app! Continue evoluindo na sua jornada de programação.

Espero que possa ter lhe ajudado!