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!