-
Notifications
You must be signed in to change notification settings - Fork 2
Trabalho C Filas Simples (FIFO e Circular)
Neste trabalho, você deverá implementar filas simples em linguagem C usando vetor de struct.
A fila é uma estrutura em que o primeiro elemento a entrar é o primeiro a sair. Esse comportamento é conhecido como FIFO, do inglês First In, First Out.
Além da fila normal, este trabalho também utiliza fila circular simples. A fila circular reaproveita posições do vetor usando o operador de módulo.
Modelo geral:
#define MAX 100
Registro fila[MAX];
int inicio = 0;
int fim = 0;
int quantidade = 0;Para avançar uma posição circularmente:
fim = (fim + 1) % MAX;O objetivo principal é praticar:
- inserção no fim da fila;
- remoção do início da fila;
- consulta do próximo elemento;
- controle de
inicio,fimequantidade; - fila circular com vetor;
- atendimento por prioridade ou rotação;
- salvamento e carregamento em CSV.
Este trabalho exige atenção com os índices do vetor, principalmente na fila circular.
- Se você quer simular atendimento com duas filas e regra de prioridade, escolha C1 - Atendimento Bancário.
- Se você quer um tema mais direto sobre prioridade, escolha C2 - Fila de Impressão.
- Se você quer trabalhar com rotação em fila circular, escolha C3 - Escalonador de Processos (Round-Robin).
Leia cada tema antes de decidir. A escolha deve considerar não apenas o assunto, mas também a estrutura exigida.
Você irá simular um sistema de atendimento bancário com senhas normais e preferenciais. O programa deverá manter duas filas:
- uma fila normal simples para senhas normais;
- uma fila circular simples para senhas preferenciais.
Este tema é interessante porque combina duas estruturas e exige uma regra clara para decidir quem será atendido primeiro.
| Campo | Tipo | Descrição |
|---|---|---|
senha |
int |
Senha de atendimento |
tipo |
char |
N para normal ou P para preferencial |
horario |
char[20] |
Horário de chegada |
- Fila normal simples para senhas normais.
- Fila circular simples para senhas preferenciais.
A regra sugerida é chamar 2 senhas normais para cada 1 senha preferencial. Também é permitido implementar uma regra configurável, desde que ela esteja clara no menu e no relatório.
- Gerar senha e enfileirar na fila correta.
- Chamar próximo respeitando a regra de atendimento.
- Exibir as duas filas.
- Buscar senha.
- Cancelar senha.
Entram: N1, N2, P3, N4, P5
Atendimento sugerido: N1, N2, P3, N4, P5
Se uma das filas estiver vazia, o programa deve continuar atendendo pela fila que ainda tiver elementos.
Você irá simular uma fila de impressão com trabalhos normais e prioritários. Trabalhos prioritários devem ser processados antes dos normais.
Este tema é uma boa escolha para quem quer implementar duas filas com uma regra de atendimento mais simples do que a do banco.
| Campo | Tipo | Descrição |
|---|---|---|
id |
int |
Identificador do trabalho de impressão |
arquivo |
char[50] |
Nome do arquivo |
paginas |
int |
Quantidade de páginas |
tipo |
char |
N para normal ou P para prioritário |
- Fila normal simples.
- Fila circular simples para trabalhos prioritários.
Sempre processe um trabalho prioritário se existir. Se não houver trabalho prioritário, processe um trabalho normal.
- Enfileirar trabalho.
- Processar próximo, exibindo os detalhes e removendo da fila.
- Listar ambas as filas.
- Buscar trabalho por ID.
- Cancelar trabalho.
Fila normal: arquivo_a.pdf, arquivo_b.pdf
Fila prioritária: contrato.pdf
Próximo processado: contrato.pdf
Você irá simular um escalonador de processos usando Round-Robin. Nesse modelo, cada processo recebe um pequeno tempo de execução chamado quantum. Se o processo não terminar nesse tempo, ele volta para o fim da fila circular.
Este tema é uma boa escolha para entender melhor a utilidade prática da fila circular.
| Campo | Tipo | Descrição |
|---|---|---|
pid |
int |
Identificador do processo |
nome |
char[30] |
Nome do processo |
prioridade |
int |
Prioridade do processo |
tempoRestante |
int |
Tempo restante de execução |
- Fila circular simples única.
O escalonador percorre a fila circular executando cada processo por um quantum fixo, por exemplo, 2 unidades de tempo.
Depois da execução:
- se o processo ainda tiver tempo restante, ele volta para a fila;
- se o processo terminar, ele é removido da fila.
- Adicionar processo.
- Executar próximo e simular o quantum.
- Listar fila de prontos.
- Consultar próximo processo.
- Remover processo, simulando matar o processo.
Processo P1: tempo 5
Quantum: 2
Primeira execução: P1 fica com tempo 3
Segunda execução: P1 fica com tempo 1
Terceira execução: P1 termina e sai da fila
O programa deve implementar:
-
Enfileirar: inserir no fim. -
Desenfileirar: remover do início ou atender. -
Consultar próximo: espiar o início sem remover. -
Listar: exibir toda a fila. -
Salvar CSV: gravar os dados atuais em arquivo. -
Carregar CSV: reconstruir a fila a partir do arquivo. - Menu interativo com opções numéricas.
- Defina a
structdo registro. - Implemente primeiro uma fila normal simples.
- Teste enfileirar, desenfileirar e listar.
- Implemente a fila circular simples com
inicio,fimequantidade. - Teste os casos de fila vazia, fila cheia e fila com vários elementos.
- Adapte a estrutura ao tema escolhido.
- Implemente busca e cancelamento.
- Implemente salvar em CSV.
- Implemente carregar do CSV.
- Teste a regra de atendimento ou rotação.
senha;tipo;horario
1;N;09:05
2;P;09:06
3;N;09:07- Estatísticas de atendimento, como total atendido e tempo médio de espera.
- Salvar o estado das duas filas em arquivos separados.
- Salvar o estado das duas filas em uma única seção estruturada.
- Configuração da proporção de prioridade no menu.
- Confirmação antes de cancelar senhas, processos ou trabalhos.
- Relatório simples de atendimentos ou execuções realizadas.
- Implementação com alocação dinâmica e encadeamento, conforme a página de orientações de extra.
- Trate fila cheia antes de enfileirar.
- Trate fila vazia antes de desenfileirar.
- Na fila circular, use módulo para avançar os índices.
- Teste quando
fimchega ao final do vetor e precisa voltar para o começo. - Teste também o caso em que a fila possui apenas um elemento.