Tarefa 10 - Navios e docas

Prazo de entrega recomendado:

Você irá simular o fluxo de navios de um porto. Para isso, você deve aplicar os tipos abstratos de dados pilha e fila.


O porto Elisius trabalha com todo tipo de mercadoria, desde alimentos e matéria prima até eletrônicos e outros produtos industrializados. Para carregar ou descarregar contêineres, os navios são organizados em uma única fila, por ordem de chegada, de forma que cada um deles deve aguardar seu turno para atracar em uma das várias docas existentes.

Cada doca inicia o dia totalmente vazia e tem capacidade para armazenar um número limitado de contêineres, que são colocados um sobre os outros por um guindaste. Por esse motivo, um navio só pode ser carregado com o contêiner que está mais acima.

Cada navio que chega no porto transporta apenas um tipo de mercadoria e precisa descarregar ou carregar um certo número de contêineres. O fluxo de navios é gerenciado automaticamente pelo sistema do porto.

Quando chega o turno de um navio a ser carregado, ele é atracado na primeira doca que oferece a mercadoria e é carregado com quantos contêineres forem necessários. Se não houver docas oferecendo a mercadoria ou se o número de contêineres disponíveis com essa mercadoria nessa doca for menor que a demanda remanescente do navio, ele retorna ao final da fila.

Quando chega o turno de um navio a ser descarregado, ele é atracado na primeira doca que tem espaço disponível para pelo menos um conteiner e descarrega quantos contêineres forem possíveis. Se não houver docas com espaço disponível ou se o número de contêineres descarregados for menor que a carga do navio, ele retorna ao final da fila.

Infelizmente, nem sempre é possível esvaziar a fila de navios. Isso acontece por dois motivos: porque não há oferta de contêineres demandos, ou porque o porto não tem capacidade para armazenar todos os contêineres. Embora rara, quando essa situação acontece, o sistema deve detectar e alertar a autoridade portuária.

Sua tarefa é escrever um programa docas.c que controla o fluxo de navios do porto.

Entrada

As três primeiras linhas contêm o número de docas, a capacidade de cada doca e o número de navios. Em seguida, há a sequência de navios, cada um representado por uma linha com o nome, o objetivo carrega ou descarrega, o tipo de mercadoria e o número de contêineres a serem carregados ou descarregados. Os nomes dos navios e dos tipos de mercadorias possuem no máximo 20 caracteres.

Exemplo de entrada

2
4
6
irina carrega arroz 2
luna descarrega feijao 8
edith descarrega arroz 10
verus carrega arroz 2
seaowl carrega feijao 8
wonder carrega arroz 3

Saída

Para cada operação de carga ou descarga realizada por um navio, a saída deverá conter uma linha contendo os dados do navio, o índice da doca utilizada e o número de contêineres carregados ou descarregados nessa operação, separados por espaço simples ou por \t.

Se não for possível esvaziar a fila depois de todas operações de carga e desgarda, então a saída deverá conter também uma linha no final informando o número X de navios remanescentes: ALERTA: impossivel esvaziar fila, restam X navios..

Exemplo de saída

luna descarrega feijao doca: 0 conteineres: 4
edith descarrega arroz doca: 1 conteineres: 4
verus carrega arroz doca: 1 conteineres: 2
seaowl carrega feijao doca: 0 conteineres: 4
wonder carrega arroz doca: 1 conteineres: 2
luna descarrega feijao doca: 0 conteineres: 4
edith descarrega arroz doca: 1 conteineres: 4
seaowl carrega feijao doca: 0 conteineres: 4
wonder carrega arroz doca: 1 conteineres: 1
irina carrega arroz doca: 1 conteineres: 2
edith descarrega arroz doca: 0 conteineres: 2

Critérios

É obrigatório representar o conjunto de navios como fila e o conjunto de contêineres de uma doca como uma pilha. Para passar na tarefa é necessário implementar o funcionamento básico do porto, supondo que a fila sempre se esvazia.

Correção

Esta tarefa será corrigida automaticamente sempre que você realizar um git push. Depois de terminada a tarefa, deve-se utilizar o botão na interface de notas para solicitar a correção de um monitor.

Turma AB: O peso desta tarefa será 3.