O objectivo deste projeto é o desenvolvimento, em linguagem C, de um sistema de logística. A interacção com o programa deverá ocorrer através de um conjunto de linhas compostas por uma letra (comando) e um número de argumentos dependente do comando a executar. Os possíveis comandos são listados na Tabela seguinte e indicam as operações a executar.
Comando | Acção |
---|---|
a | adiciona um novo produto ao sistema |
q | adiciona stock a um produto existente no sistema |
N | cria uma nova encomenda |
V | lista o cliente de uma encomenda |
A | adiciona um produto a uma encomenda |
r | remove stock a um produto existente |
R | remove um produto de uma encomenda |
C | calcula o custo de uma encomenda |
p | altera o preço de um produto existente no sistema |
E | retorna a descrição e a quantidade de um produto numa dada encomenda |
m | retorna o identificador da encomenda em que um dado produto ocorre mais vezes |
l | lista todos os produtos existentes no sistema por ordem crescente de preço |
L | lista todos os produtos de uma encomenda por ordem alfabética da descrição |
Y | lista todas as encomendas por ordem crescente de custo |
x | termina o programa |
O objectivo do projecto é ter um sistema de logística que permite gerir stocks de produtos e encomendas.
Existem vários produtos que podem ser adicionados às encomendas.
Cada produto é caracterizado por:
- um identificador (um número inteiro no intervalo [0, 9 999])
- uma descrição (uma string não vazia com um máximo de 63 caracteres)
- o seu preço (um número inteiro maior que 0)
- o seu peso (um número inteiro maior que 0)
- a sua quantidade em stock (um número inteiro maior ou igual a 0)
Uma encomenda é um conjunto de produtos.
As restrições ao problema são as seguintes:
- Os identificadores dos produtos são únicos.
- Pode assumir que existirão no máximo 10 000 produtos diferentes.
- Os produtos são numerados de 0 a 9 999 e sequencialmente pela sua ordem de introdução.
- Pode assumir que todos os produtos criados com o comando
a
serão distintos. - Pode assumir que existirão no máximo 500 encomendas
- As encomendas são numeradas de 0 a 499 e sequencialmente pela sua ordem de introdução.
- Cada encomenda poderá pesar no máximo 200 unidades de peso.
- Só podem ser adicionados a encomendas produtos que existam em stock na quantidade necessária.
Pode assumir que todo o input fornecido respeitará os tipos indicados. Por exemplo, nunca será adicionado um produto cujo preço seja uma string, um valor negativo, nem zero.
O programa deverá ler os dados de entrada a partir da linha de comandos e do terminal.
Durante a execução do programa as instruções devem ser lidas do terminal (standard input) na forma de um conjunto de linhas iniciadas por um carácter, que se passa a designar por comando, seguido de um número de informações dependente do comando a executar; o comando e cada uma das informações são separados pelo caracter ':'
.
Os comandos disponíveis são descritos de seguida. Cada comando indica uma determinada acção que se passa a caracterizar em termos de formato de entrada, formato de saída, e erros a retornar. Se o comando gerar mais do que um erro, deverá ser indicado apenas o primeiro.
-
a - adiciona um novo produto ao sistema
- Formato de entrada:
a descricao:preco:peso:qtd
- Formato de saída:
Novo produto <idp>.
onde<idp>
é o identificador do produto criado.
- Formato de entrada:
-
q - adiciona stock a um produto existente no sistema
- Formato de entrada:
q idp:qtd
- Formato de saída: NADA (excepto erro)
- Erros:
Impossivel adicionar produto <idp> ao stock. Produto inexistente.
no caso de não existir nenhum produto criado com esse identificador
- Formato de entrada:
-
N - cria uma nova encomenda
- Formato de entrada:
N cliente
- Formato de saída:
Nova encomenda <ide> <cliente>.
onde<ide>
é o identificador da encomenda criada e<cliente>
é o nome do cliente da encomenda.
- Formato de entrada:
-
V - lista o cliente de uma encomenda
- Formato de entrada:
V ide
- Formato de saída:
<ide> <cliente>.
onde<ide>
é o identificador da encomenda criada e<cliente>
é o nome do cliente da encomenda.Impossivel listar encomenda <ide>. Encomenda inexistente.
no caso de não existir nenhuma encomenda criada com esse identificador
- Formato de entrada:
-
A - adiciona um produto a uma encomenda. Se o produto já existir na encomenda, adiciona a nova quantidade à quantidade existente
- Formato de entrada:
A ide:idp:qtd
- Formato de saída: NADA (excepto erro)
- Erros:
Impossivel adicionar produto <idp> a encomenda <ide>. Encomenda inexistente.
no caso de não existir nenhuma encomenda criada com esse identificadorImpossivel adicionar produto <idp> a encomenda <ide>. Produto inexistente.
no caso de não existir nenhum produto criado com esse identificadorImpossivel adicionar produto <idp> a encomenda <ide>. Quantidade em stock insuficiente.
no caso de não existir stock suficiente desse produto para satisfazer a encomendaImpossivel adicionar produto <idp> a encomenda <ide>. Peso da encomenda excede o maximo de 200.
no caso de a adição desse produto exceder o peso máximo permitido por encomenda
- Formato de entrada:
-
r - remove stock a um produto existente
- Formato de entrada:
r idp:qtd
- Formato de saída: NADA (excepto erro)
- Erros:
Impossivel remover stock do produto <idp>. Produto inexistente.
no caso de não existir nenhum produto criado com esse identificadorImpossivel remover <qtd> unidades do produto <idp> do stock. Quantidade insuficiente.
no caso de a quantidade de stock restante após a remoção ser negativa
- Formato de entrada:
-
R - remove um produto de uma encomenda
- Formato de entrada:
R ide:idp
- Formato de saída: NADA (excepto erro)
- Erros:
Impossivel remover produto <idp> a encomenda <ide>. Encomenda inexistente.
no caso de não existir nenhuma encomenda criada com esse identificadorImpossivel remover produto <idp> a encomenda <ide>. Produto inexistente.
no caso de não existir nenhum produto criado com esse identificador
- Formato de entrada:
-
C - calcula o custo de uma encomenda
- Formato de entrada:
C ide
- Formato de saída:
Custo da encomenda <ide> <total>.
onde<total>
é o valor total da encomenda<ide>
- Erros:
Impossivel calcular custo da encomenda <ide>. Encomenda inexistente.
no caso de não existir nenhuma encomenda criada com esse identificador
- Formato de entrada:
-
p - altera o preço de um produto existente no sistema
- Formato de entrada:
p idp:preco
- Formato de saída: NADA (excepto erro)
- Erros:
Impossivel alterar preco do produto <idp>. Produto inexistente.
no caso de não existir nenhum produto criado com esse identificador
- Formato de entrada:
-
E - lista a descrição e a quantidade de um produto numa encomenda
- Formato de entrada:
E ide:idp
- Formato de saída:
<desc> <qtd>.
onde<desc>
é a descrição do produto<idp>
e<qtd>
é a quantidade desse produto na encomenda<ide>
- Erros:
Impossivel listar encomenda <ide>. Encomenda inexistente.
no caso de não existir nenhuma encomenda criada com esse identificadorImpossivel listar produto <idp>. Produto inexistente.
no caso de não existir nenhum produto criado com esse identificador
- Formato de entrada:
-
m - lista o identificador da encomenda em que o produto dado ocorre mais vezes. Se houver 2 ou mais encomendas nessa situação, deverá imprimir a encomenda de menor
id
.- Formato de entrada:
m idp
- Formato de saída:
Maximo produto <idp> <ide> <qtd>.
onde<ide>
é o número da encomenda em que<idp>
ocorre mais vezes, sendo essa quantidade<qtd>
- Não deverá listar nada caso o produto
<idp>
não ocorra em nenhuma encomenda, ou caso não haja encomendas
- Erros:
Impossivel listar maximo do produto <idp>. Produto inexistente.
no caso de não existir nenhum produto criado com esse identificador
- Formato de entrada:
-
l - lista todos os produtos existentes no sistema por ordem crescente de preço. Se houver 2 ou mais produtos com o mesmo preço, deverá imprimir esses por ordem crescente de
id
de produto-
Formato de entrada:
l
-
Formato de saída: Um bloco no formato abaixo, e em que os produtos são listados por ordem crescente de preço
Produtos * <desc1> <preco1> <qtd1 em stock> * <desc2> <preco2> <qtd2 em stock> ... * <descn> <precon> <qtdn em stock>
-
Erros: Não aplicável
-
-
L - lista todos os produtos de uma encomenda por ordem alfabética da descrição
-
Formato de entrada:
L <ide>
-
Formato de saída: Um bloco no formato abaixo, e em que os produtos são listados por ordem alfabética de descrição
Encomenda <ide> * <desc1> <preco1> <qtd1 na ide> * <desc2> <preco2> <qtd2 na ide> ... * <descn> <precon> <qtdn na ide>
-
Erros:
Impossivel listar encomenda <ide>. Encomenda inexistente.
no caso de não existir nenhuma encomenda criada com esse identificador
-
-
Y - lista todas as encomendas existentes no sistema por ordem crescente do seu custo total. Se houver 2 ou mais encomendas com o mesmo custo, deverá imprimir essas por ordem crescente de
id
de encomenda-
Formato de entrada:
Y
-
Formato de saída: Um bloco no formato abaixo, e em que as encomendas são listadas por ordem crescente de custo
Encomendas * <ide1> <custo1> * <ide2> <custo2> ... * <iden> <custon>
-
Erros: Não aplicável
-
-
x - termina o programa
- Formato de entrada:
x
- Formato de saída: NADA
- Formato de entrada: