Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

[Projeto] Desafio: hora da prática

var estoque = new Dictionary<string, int>();

void ExibirMenu()
{
    Console.Clear();
    Console.WriteLine("Menu do estoque:\n");
    Console.WriteLine("1 - Registrar produto");
    Console.WriteLine("2 - Alterar produto");
    Console.WriteLine("3 - Exibir produtos registrados");
    Console.WriteLine("4 - Pesquisar produto");
    Console.WriteLine("5 - Sair");
    Console.Write("\nDigite o número da opção desejada: ");
    int opcaoEscolhida = int.Parse(Console.ReadLine()!);
    ExibirOpcaoEscolhida(opcaoEscolhida);
}

void ExibirOpcaoEscolhida(int opcao)
{
    switch (opcao)
    {
        case 1:
            RegistrarProdutos();
            break;
        case 2:
            MenuDeAlteracoes();
            break;
        case 3:
            ExibirProdutosRegistrados();
            break;
        case 4:
            PesquisarProduto();
            break;
        case 5:
            Console.WriteLine("Programa finalizado!");
            break;
        default:
            Console.WriteLine("Opção inválida.");
            Thread.Sleep(2000);
            ExibirMenu();
            break;
    }
}

void RegistrarProdutos()
{
    Console.Clear();
    Console.WriteLine("Registro de produtos\n");
    string produto = ValidarInformacoes("Informe o nome do produto: ");
    string quantidadeDoProduto = ValidarInformacoes("\nInforme a quantidade do produto: ");
    int quantidade = int.Parse(quantidadeDoProduto);
    estoque.Add(produto, quantidade);
    Console.WriteLine("\nO produto foi registrado com sucesso!");
    Thread.Sleep(2000);
    ExibirMenu();
}

// para prevenir string vazias ou com somente espaços
string ValidarInformacoes(string mensagem)
{
    string? entrada;

    do
    {
        Console.Write(mensagem);
        entrada = Console.ReadLine();

        if (string.IsNullOrWhiteSpace(entrada))
        {
            Console.WriteLine("\nInformação inválida!");
        }
    }
    while (string.IsNullOrWhiteSpace(entrada));

    return entrada;
}

void ExibirProdutosRegistrados()
{
    Console.Clear();
    Console.WriteLine("Lista de Produtos do estoque\n");
    int contador = 1;
    foreach (string produto in estoque.Keys)
    {
        Console.WriteLine($"{contador}. {produto} - Quantidade = {estoque[produto]}");
    }

    Console.WriteLine("\nAperte qualquer tecla para voltar ao menu principal");
    Console.ReadKey();
    ExibirMenu();
}

a continuação segue a baixo, foi o único jeito de mandar todo o código, por conta do limite de caracteres.
3 respostas
void MenuDeAlteracoes()
{
    Console.Clear();
    Console.WriteLine("Atualizar informações de entrada/saída de produtos\n");
    string produto = ValidarInformacoes("Informe o nome do produdo: ");

    if (estoque.TryGetValue(produto, out int quantidade))
    {
        Console.WriteLine($"\n{produto} encontrado, quantidade: {quantidade}");
        Console.WriteLine("\nDeseja remover ou adicionar:");
        Console.WriteLine("\n1 - Remover");
        Console.WriteLine("2 - Adicionar");
        Console.Write("\nDigite o número da opção desejada: ");
        int opcao = int.Parse(Console.ReadLine()!);
        AcoesDeAlteracao(opcao, produto);
    }
    else
    {
        Console.WriteLine("\nO Produto informado não existe no estoque!");
    }

    Console.WriteLine("\nAperte qualquer tecla para voltar ao menu principal");
    Console.ReadKey();
    ExibirMenu();
}

void AcoesDeAlteracao(int opcao, string produto)
{
    switch (opcao)
    {
        case 1:
            RemoverProduto(produto);
            break;
        case 2:
            AdicionarProduto(produto);
            break;
        default:
            Console.WriteLine("Opção inválida.");
            Thread.Sleep(2000);
            ExibirMenu();
            break;
    }
}

void RemoverProduto(string produto)
{
    string valorInformado = ValidarInformacoes("Qual a quantidade do produto que você deseja remover: ");
    int quantidade = int.Parse(valorInformado);

    if (estoque[produto] > quantidade)
    {
        estoque[produto] -= quantidade;
        Console.WriteLine("Remoção feita com sucesso!");
    } else
    {
        Console.WriteLine("A quantidade para remoção é maior que o estoque disponível");
    }
}

void AdicionarProduto(string produto)
{
    string valorInformado = ValidarInformacoes("Qual a quantidade do produto que você deseja adicionar: ");
    int quantidade = int.Parse(valorInformado);
    estoque[produto] += quantidade;
    Console.WriteLine("A quantidade do produto em estoque foi atualizada!");
}

void PesquisarProduto()
{
    char continuar;

    do
    {
        Console.Clear();
        string produto = ValidarInformacoes("Informe o nome do produdo: ");

        if (estoque.TryGetValue(produto, out int quantidade))
        {
            Console.WriteLine($"\n{produto} encontrado, quantidade: {quantidade}");
            continuar = char.Parse(ValidarInformacoes("\nDeseja fazer procurar outro produto s/n ?: "));
        }
        else
        {
            Console.WriteLine("\nO Produto informado não existe no estoque!");
            continuar = char.Parse(ValidarInformacoes("\nDeseja fazer procurar outro produto s/n ?: "));
        }
    } while (continuar == 's');

    Console.WriteLine("\nAperte qualquer tecla para voltar ao menu principal");
    Console.ReadKey();
    ExibirMenu();
}

ExibirMenu();
solução!

Oi, José Willamys!

Meus parabéns pela dedicação na resolução deste desafio. É muito empolgante ver como você transformou um exercício de Dicionários em um sistema completo de gestão, com menus, validações e controle de fluxo.

Sua estrutura demonstra um amadurecimento técnico notável no uso do C#. A criação do método ValidarInformacoes é uma escolha excelente, pois centraliza a lógica de prevenção contra entradas vazias em um único lugar, seguindo o princípio de reutilização de código. Além disso, o uso do TryGetValue na pesquisa e alteração de produtos garante que o sistema não trave caso um item não exista, o que torna a aplicação muito mais confiável.

Pra elevar ainda mais a qualidade do seu projeto, deixo uma observação sobre a entrada de números: no seu código, você utilizou o int.Parse(). Se um usuário digitar uma letra sem querer, o programa pode fechar inesperadamente. Uma alternativa interessante para seus próximos projetos seria o int.TryParse(), que permite validar se o texto digitado é realmente um número antes de tentar a conversão. Você pode ler mais sobre como tratar essas entradas na documentação sobre conversões numéricas no .NET.

Você notou como a divisão do código em métodos menores facilitou a organização, especialmente quando o sistema começou a crescer com as funções de adicionar e remover itens?

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

a divisão do código em métodos menores o torna bastante legível e super organizado, isso facilita bastante o trabalho.