1
resposta

[Ajuda] [Dúvida] Senha de Atendimento

Boa noite gente, terminei a atividade e queria uma ajuda, tentei colocar uma lista no codigo achando útil conseguir manipular senhas anteriores para serem mostradas no sistema. Exemplo: "Senha atual: 005" "Senhas já chamdas: 001, 002, 003 e 004". Porém não consegui fazer essa parte, se alguem puder me ajudar fico agradecido.

int senhaNova = 0, contador = 0, opcaoEscolhida;
List<int> senhaChamada = new List<int>();

do
{   
    Console.WriteLine("**************************");
    Console.WriteLine("Digite o serviço desejado:");
    Console.WriteLine("**************************\n");
    Console.WriteLine("[1] Gerar nova senha");
    Console.WriteLine("[2] Chamar proxima senha");
    Console.WriteLine("[3] Sair\n");
    opcaoEscolhida = int.Parse(Console.ReadLine()!);

    switch (opcaoEscolhida)
    {
        case 1:
            senhaNova++;
            senhaChamada.Add(senhaNova);
            Console.WriteLine($"SENHA GERADA. Sua senha é: {senhaNova.ToString("D3")}\n");
            Thread.Sleep(1600);
            Console.Clear();
            break;
        case 2:
            if (senhaChamada.Count > 0)
            {
                Console.WriteLine($"Senha chamada: {senhaChamada[contador].ToString("D3")}");
                Thread.Sleep(1600);
                contador++;
                Console.Clear();
            } else
            {
                Console.WriteLine("Nenhuma senha foi registrada para chamada ainda...\n");
            }
            break;
        default:
            Console.WriteLine("Saindo...");
            Thread.Sleep(1200);
            break;
    }
} while (opcaoEscolhida != 3);
1 resposta

Oii, Samuel! Tudo bem?

É muito bom ver você explorando além do que o exercício propõe. Adicionar uma lista para rastrear o histórico das senhas é uma excelente forma de treinar a lógica de coleções no C#.

No seu código atual, você está adicionando a senha na lista assim que ela é gerada (no case 1). Pra exibir as "Senhas já chamadas", precisamos separar o que é uma senha aguardando do que é uma senha que já passou pelo atendimento.

Uma forma de fazer isso é criar uma segunda lista ou simplesmente percorrer a lista atual até o ponto onde o seu contador parou.

Código Sugerido

using System;
using System.Collections.Generic;
using System.Threading;

int senhaNova = 0;
int contador = 0;
int opcaoEscolhida;
List<int> senhaChamada = new List<int>();

do
{
    Console.WriteLine("**************************");
    Console.WriteLine("Digite o serviço desejado:");
    Console.WriteLine("**************************\n");
    Console.WriteLine("[1] Gerar nova senha");
    Console.WriteLine("[2] Chamar próxima senha");
    Console.WriteLine("[3] Sair\n");
    
    // o uso do ! garante que não estamos recebendo um valor nulo
    bool entradaValida = int.TryParse(Console.ReadLine(), out opcaoEscolhida);

    if (!entradaValida)
    {
        Console.WriteLine("Opção inválida. Digite um número.");
        Thread.Sleep(1000);
        Console.Clear();
        continue;
    }

    switch (opcaoEscolhida)
    {
        case 1:
            senhaNova++;
            senhaChamada.Add(senhaNova);
            Console.WriteLine($"SENHA GERADA. Sua senha é: {senhaNova.ToString("D3")}\n");
            Thread.Sleep(1600);
            Console.Clear();
            break;

        case 2:
            // verifica se existem senhas na lista que ainda não foram chamadas
            if (contador < senhaChamada.Count)
            {
                int atual = senhaChamada[contador];
                Console.WriteLine("==============================");
                Console.WriteLine($"SENHA ATUAL: {atual.ToString("D3")}");
                Console.WriteLine("==============================");

                // exibe o histórico de senhas anteriores ao 'contador' atual
                if (contador > 0)
                {
                    Console.Write("Senhas já chamadas: ");
                    for (int i = 0; i < contador; i++)
                    {
                        Console.Write(senhaChamada[i].ToString("D3"));
                        
                        // adiciona vírgula apenas entre os números
                        if (i < contador - 1)
                        {
                            Console.Write(", ");
                        }
                    }
                    Console.WriteLine();
                }

                contador++; // avança o marcador para a próxima senha
                Thread.Sleep(3500);
                Console.Clear();
            }
            else
            {
                Console.WriteLine("Não há novas senhas para chamar no momento.\n");
                Thread.Sleep(1500);
                Console.Clear();
            }
            break;

        case 3:
            Console.WriteLine("Encerrando o sistema...");
            Thread.Sleep(1200);
            break;

        default:
            Console.WriteLine("Opção inexistente. Tente novamente.");
            Thread.Sleep(1200);
            Console.Clear();
            break;
    }
} while (opcaoEscolhida != 3);

Mostrando o codigo funcionando

O que mudou?

  1. Lógica do histórico: O for percorre a lista senhaChamada do início (índice 0) até o índice anterior ao contador. Isso garante que apenas as senhas que já foram "atendidas" apareçam na lista de chamadas.
  2. Verificação de limite: Troquei senhaChamada.Count > 0 por contador < senhaChamada.Count. Isso evita que o sistema tente chamar uma senha que ainda não foi gerada ou que o contador ultrapasse o tamanho da lista.
  3. Visualização: Usei o Console.Write dentro do laço para imprimir as senhas na mesma linha, separadas por vírgula.

Uma dica extra

Se você quiser deixar o sistema ainda mais organizado, pode usar duas listas diferentes:

  • List<int> filaEspera: Para senhas geradas mas não chamadas.
  • List<int> historicoAtendimento: Para mover a senha da fila de espera para cá assim que o atendente apertar o botão.

Continue praticando, pois essa é a melhor forma de fixar como os índices das listas funcionam.

Um abraço e bons estudos.