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);
O que mudou?
- 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. - 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. - 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.