Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
1
resposta

[Sugestão] Soma das vendas

using System.Globalization;

decimal valorDasVendas = 0;
bool continuar = true;

while (continuar)
{
    Console.Write("Informe o valor da venda (ou 0 para encerrar): ");
    decimal valorInformado = ValidarDados();

    if (valorInformado != 0)
    {
        valorDasVendas += valorInformado;
    }
    else
    {
        continuar = false;
        Console.WriteLine($"Total das vendas do dia: R${valorDasVendas.ToString("F2")}");
    }
}

decimal ValidarDados ()
{
    while(true)
    {
        string valor = Console.ReadLine()!;

        if (decimal.TryParse(valor, CultureInfo.GetCultureInfo("pt-BR"), out decimal valorValido))
        {
            return valorValido;
        }
        else
        {
            Console.WriteLine("Informe um valor válido!");
        }
    }
}
1 resposta
solução!

Olá, José. Como vai?

O seu código em C# ficou fantástico! É nítido como você está consolidando os conceitos de forma sólida. O uso do tipo decimal para manipular valores financeiros foi uma escolha cirúrgica e de altíssimo nível profissional, pois evita os problemas de arredondamento e precisão binária que acontecem quando usamos float ou double.

Gostaria de parabenizá-lo também pela evolução na sua função ValidarDados(). Ao adicionar CultureInfo.GetCultureInfo("pt-BR") dentro do decimal.TryParse, você blindou o sistema para aceitar perfeitamente o padrão de moeda brasileiro (reconhecendo a vírgula como separador decimal). Excelente!

Analisando a estrutura do seu laço principal, há uma oportunidade fantástica de aplicar uma boa prática de mercado para tornar o seu código mais limpo (Clean Code): a eliminação da variável de controle booleana (continuar).

No seu modelo atual, você usa a variável continuar = true para manter o laço ativo e muda para false no bloco else para forçar o encerramento na próxima checagem do cabeçalho. Na programação moderna, quando queremos interromper um laço while imediatamente no momento em que uma condição é atingida, nós utilizamos a palavra-chave break.

O break corta o fluxo do laço na mesma hora, eliminando a necessidade de criar, gerenciar e testar uma variável booleana na memória.

Para visualizar como o fluxo do programa se torna mais direto e linear ao usarmos o break em vez de uma variável de controle, observe a estrutura de execução:

Veja como o seu código principal fica mais direto, elegante e enxuto com essa refatoração:

using System.Globalization;

decimal valorDasVendas = 0;

// Usamos true diretamente para criar o loop, pois o controle de saída será interno
while (true)
{
    Console.Write("Informe o valor da venda (ou 0 para encerrar): ");
    decimal valorInformado = ValidarDados();

    // Se o usuário digitou 0, exibe o total e encerra o laço na hora com o break
    if (valorInformado == 0)
    {
        Console.WriteLine($"\nTotal das vendas do dia: R${valorDasVendas.ToString("F2")}");
        break; 
    }

    // Se não for 0, o código continua naturalmente para a soma
    valorDasVendas += valorInformado;
}

Console.WriteLine("Obrigado por usar nosso sistema de vendas!");

O que melhorou com essa mudança?

  • Menos variáveis na memória: Removemos a variável continuar, deixando o escopo do código mais limpo.
  • Leitura linear: O código agora foca primeiro na "condição de parada" (se for 0, sai). Se passar pelo if, o programa simplesmente acumula o valor, eliminando a necessidade do bloco else.

Parabéns pelo excelente domínio na validação de dados regionais e pela escolha correta dos tipos numéricos para finanças!

Espero que possa ter lhe ajudado!