1
resposta

[Sugestão] Controle de estoque

int quantidadeDeProdutos = 0;

Console.WriteLine("Deseja adicionar um produto ao estoque?");
Console.WriteLine("1 - Sim | 0 - Não");
int opcao = ValidarDados();

while (opcao == 1)
{
    Console.WriteLine("Quantidade:");
    int quantidade = ValidarDados();
    quantidadeDeProdutos += quantidade;
    Console.WriteLine($"Estoque atual: {quantidadeDeProdutos}\n");

    Console.WriteLine("Deseja continuar?");
    Console.WriteLine("1 - Sim | 0 - Não");
    opcao = ValidarDados();
}

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

// função para validar dados numéricos
int ValidarDados ()
{
    while(true)
    {
        string quantidade = Console.ReadLine()!;

        if (int.TryParse(quantidade, out int quantidadeValida))
        {
            return quantidadeValida;
        }
        else
        {
            Console.WriteLine("Informe uma quantidade válida!");
        }
    }
}
1 resposta

Olá, José. Como vai?

O seu código em C# ficou excelente! Assim como no seu projeto do número secreto, você manteve o padrão de qualidade e usou a função ValidarDados() com int.TryParse e o parâmetro out. Isso blinda o seu sistema de controle de estoque contra falhas caso o usuário digite uma letra ou um caractere inválido nos menus. É uma prática de mercado excepcional!

A estrutura do laço while (opcao == 1) está bem desenhada para esse fluxo condicional e o console vai rodar perfeitamente.

Analisando a arquitetura do seu código, há uma oportunidade fantástica de melhoria focada na Experiência do Usuário (UX) e na limpeza de código, utilizando o laço do-while que você estudou neste capítulo.

No seu modelo atual com o while tradicional, você precisou duplicar as linhas de código que exibem o menu e leem a opção do usuário (uma vez antes do laço para permitir a entrada, e outra vez no final do laço para decidir se ele continua).

Como o menu de adicionar produtos precisa rodar pelo menos uma vez para o usuário decidir o que quer fazer, o do-while elimina essa repetição de código. Ele executa o bloco primeiro e faz a checagem da condição apenas no final.

Para te ajudar a visualizar como a lógica se torna mais direta e linear ao movermos a condição para o fim do bloco, observe a estrutura de execução do fluxo:

Veja como o seu código fica mais enxuto, elegante e sem nenhuma repetição utilizando essa reestruturação:

int quantidadeDeProdutos = 0;
int opcao;

do
{
    Console.WriteLine("Deseja adicionar um produto ao estoque?");
    Console.WriteLine("1 - Sim | 0 - Não");
    opcao = ValidarDados();

    if (opcao == 1)
    {
        Console.WriteLine("Quantidade:");
        int quantidade = ValidarDados();
        quantidadeDeProdutos += quantidade;
        Console.WriteLine($"Estoque atual: {quantidadeDeProdutos}\n");
    }
    else if (opcao != 0)
    {
        Console.WriteLine("Opção inválida! Tente novamente.\n");
    }

} while (opcao != 0); // O laço continua rodando enquanto o usuário não digitar 0 para sair

Console.WriteLine($"\nEstoque final total: {quantidadeDeProdutos}");
Console.WriteLine("Obrigado por usar nosso sistema de estoque!");

O que melhorou com essa refatoração?

  • Fim do código duplicado: As perguntas do menu agora só existem em um único lugar dentro do programa.
  • Tratamento de opções inválidas: Adicionamos um else if (opcao != 0) bem simples. Se o usuário digitar um número aleatório (como 5), o sistema avisa que a opção é inválida e o laço repete o menu de forma inteligente, em vez de simplesmente fechar o programa.

Parabéns por aplicar consistentemente funções de validação nos seus exercícios e por demonstrar uma evolução nítida na linguagem C#!

Espero que possa ter lhe ajudado!