O objectivo deste projeto é o desenvolvimento, em linguagem C, de um sistema de gestão de uma base de dados de jogos de futebol amigáveis. 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 jogo. |
A | Adiciona uma nova equipa. |
l | Lista todos os jogos pela ordem em que foram introduzidos. |
p | Procura um jogo. |
P | Procura uma equipa. |
r | Apaga um jogo. |
s | Altera a pontuação (score) de um jogo. |
g | Encontra as equipas que venceram mais jogos. |
x | Termina o programa. |
O objetivo do projeto é ter um sistema de gestão da jogos de futebol que permita associar a cada jogo as equipas e o resultado.
Cada jogo e cada equipa é caracterizada por uma string não vazia, com um máximo de 1023
caracteres. Usando scanf
, a string pode ser lida através de %[^:\n]
,
i.e. uma string não vazia sem :
e \n
.
Cada jogo é caracterizado por:
- Um nome, uma string não vazia, com um máximo de 1023 caracteres (
%[^:\n]
). - Duas equipas, strings não vazias, com um máximo de 1023 caracteres cada (
%[^:\n]
). - Um score, um par de números inteiros não negativos.
Nota: Como os nomes longos são raros, as estruturas de dados utilizadas só deverão alocar a memória necessária para guardar as strings dadas.
Durante a execução do programa as instruções devem ser lidas do 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.
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. No caso de múltiplos erros para o mesmo comando deverá retornar apenas o primeiro desses erros.
Importantante:
Para simplificar o debug do projecto, no inicio de cada linha do output deverá aparecer o número da linha do comando de input que originou esse output.
A sigla NL
vai ser usada no texto seguinte para designar este número.
- a - Adiciona um novo jogo.
- Formato de entrada:
a nome:equipa1:equipa2:score1:score2
- Formato de saída: NADA (excepto erro).
- Erros:
NL Jogo existente.
no caso de já existir um jogo com esse nome no sistema.NL Equipa inexistente.
no caso de uma das equipas ou ambas não existirem no sistema.
- Formato de entrada:
- l - Lista todos os jogos introduzidos.
-
Formato de entrada:
l
-
Formato de saída: Uma linha por jogo no formato abaixo
NL nome-jogo nome-equipa1 nome-equipa2 score1 score2
Os jogos deverão ser listados pela ordem em que foram introduzidos. Caso não exista nenhum jogo no sistema, o comando não imprime nada.
-
Erros: Não aplicável.
-
- p - Procura um jogo com o nome dado.
- Formato de entrada:
p nome
- Formato de saída: Igual ao formato de saída do comando
l
mas apenas com o jogonome
. - Erros:
NL Jogo inexistente.
no caso de não existir nenhum jogo com esse nome no sistema.
- Formato de entrada:
- r - Apaga um jogo dado um nome.
- Formato de entrada:
r nome
- Formato de saída: NADA (excepto erro).
- Erros:
NL Jogo inexistente.
no caso de não existir nenhum jogo com esse nome no sistema.
- Formato de entrada:
- s - Altera o score de um jogo dado o nome.
- Formato de entrada:
s nome:score1:score2
- Formato de saída: NADA (excepto erro).
- Erros:
NL Jogo inexistente.
no caso de não existir nenhum jogo com esse nome no sistema.
- Formato de entrada:
- A - Adiciona uma nova equipa.
- Formato de entrada:
A nome
- Formato de saída: NADA (excepto erro).
- Erros:
NL Equipa existente.
no caso de já existir uma equipa com esse nome no sistema.
- Formato de entrada:
- P - Procura uma equipa dado um nome.
- Formato de entrada:
P nome
- Formato de saída:
NL nome numero-de-jogos-ganhos
. - Erros:
NL Equipa inexistente.
no caso de não existir nenhuma equipa com esse nome no sistema.
- Formato de entrada:
- g - Encontra as equipas que ganharam mais jogos e lista por ordem lexicográfica (do nome da equipa).
-
Formato de entrada:
g
-
Formato de saída:
NL Melhores número-de-jogos-ganhos NL * nome-equipa1 NL * nome-equipa2 NL * nome-equipa3 ...
Caso não exista nenhuma equipa, o comando não imprime nada (nem a palavra
Melhores
). -
Erros: Não aplicável.
-
O programa deverá escrever no standard output as respostas aos comandos apresentados no standard input. As respostas são igualmente linhas de texto formatadas conforme definido anteriormente neste enunciado. Tenha em atenção o número de espaços entre elementos do seu output, assim como os espaços no final de cada linha. Procure respeitar escrupulosamente as indicações dadas.
Ver os exemplos de input e respectivos outputs na pasta testes_enunciado/
.
O compilador a utilizar é o gcc
com as seguintes opções de compilação: -Wall -Wextra -Werror -ansi -pedantic
. Para compilar o programa deve executar o seguinte comando:
$ gcc -Wall -Wextra -Werror -ansi -pedantic -o proj2 *.c
Este comando deve ter como resultado a geração do ficheiro executável proj2
, caso não haja erros de compilação. A execução deste comando não deverá escrever qualquer resultado no terminal. Caso a execução deste comando escreva algum resultado no terminal, considera-se que o programa não compilou com sucesso. Por exemplo, durante a compilação do programa, o compilador não deverá escrever mensagens de aviso (warnings).
Algumas dicas para degugging podem ser encontradas aqui.
Não poderá ser usada a biblioteca search.h
O programa deve ser executado da forma seguinte:
$ ./proj2 < test.in > test.myout
Posteriormente poderá comparar o seu output (*.myout
) com o output previsto (*.out
) usando o comando diff
,
$ diff test.out test.myout
Para testar o seu programa poderá executar os passos indicados acima ou usar os scripts test.sh
e test-vg.sh
distribuídos nesta pasta. Para isso deverão ter a vossa solução nesta pasta e
-
Para executarem todos os testes de uma
pasta
deverão executar$ ./test.sh <pasta> <vossos_ficheiros_c>
-
Para executarem todos os testes de uma
pasta
com o valgrind deverão executar$ ./test-vg.sh <pasta> <vossos_ficheiros_c>
Estes scripts compilam os ficheiros indicados e comparam o resultado obtido com o resultado esperado.
A entrega do projecto deverá respeitar o procedimento seguinte:
-
Na página da disciplina aceda ao sistema para entrega de projectos. O sistema será activado uma semana antes da data limite de entrega. Instruções acerca da forma de acesso ao sistema serão oportunamente fornecidas.
-
Efectue o upload de um ficheiro arquivo com extensão
.zip
que inclua todos os ficheiros fonte que constituem o programa.- Se o seu código tiver apenas um ficheiro o zip conterá apenas esse ficheiro.
- Se o seu código estiver estruturado em vários ficheiros (
.c
e.h
) não se esqueça de os juntar também ao pacote.
-
Para criar um ficheiro arquivo com a extensão
.zip
deve executar o seguinte comando na directoria onde se encontram os ficheiros com extensão.c
e.h
(se for o caso), criados durante o desenvolvimento do projecto:$ zip proj2.zip *.c *.h
-
Como resultado do processo de upload será informado se a resolução entregue apresenta a resposta esperada num conjunto de casos de teste.
-
O sistema não permite submissões com menos de 10 minutos de intervalo para o mesmo aluno. Tenha especial atenção a este facto na altura da submissão final.
-
Data limite de entrega do projecto: 25 de Maio de 2020, às 23h59m. Até à data limite poderá efectuar o número de submissões que desejar, sendo utilizada para efeitos de avaliação a última submissão efectuada. Deverá portanto verificar cuidadosamente que a última submissão corresponde à versão do projecto que pretende que seja avaliada. Não existirão excepções a esta regra.
Na avaliação do projecto serão consideradas as seguintes componentes:
-
A primeira componente será feita automaticamente e avalia o desempenho da funcionalidade do programa realizado. Esta componente é avaliada entre 0 e 17 valores.
-
A segunda componente avalia a qualidade do código entregue, nomeadamente os seguintes aspectos: comentários, indentação, alocação dinâmica de memória, estruturação, modularidade e divisão em ficheiros, abstracção de dados, entre outros. Esta componente poderá variar entre -4 valores e +3 valores relativamente à classificação calculada no item anterior e será atribuída posteriormente. Algumas guidelines sobre este tópico podem ser encontradas aqui.
-
Na segunda componente serão utilizadas as ferramentas lizard, valgrind, e a opção fsanitize por forma a detectar a complexidade de código, fugas de memória (“memory leaks”) ou outras incorrecções no código, que serão penalizadas. Aconselha-se por isso que os alunos utilizem estas ferramentas para fazer debugging do código e corrigir eventuais incorrecções, antes da submissão do projecto. Mais informações podem ser encontradas aqui.
-
A classificação da primeira componente da avaliação do projecto é obtida através da execução automática de um conjunto de testes num computador com o sistema operativo GNU/Linux. Torna-se portanto essencial que o código compile correctamente e que respeite o formato de entrada e saída dos dados descritos anteriormente. Projectos que não obedeçam ao formato indicado no enunciado serão penalizados na avaliação automática, podendo, no limite, ter 0 (zero) valores se falharem todos os testes. Os testes considerados para efeitos de avaliação poderão incluir (ou não) os disponibilizados na página da disciplina, além de um conjunto de testes adicionais. A execução de cada programa em cada teste é limitada na quantidade de memória que pode utilizar, e no tempo total disponível para execução, sendo o tempo limite distinto para cada teste.
-
Note-se que o facto de um projecto passar com sucesso o conjunto de testes disponibilizado na página da disciplina não implica que esse projecto esteja totalmente correcto. Apenas indica que passou alguns testes com sucesso, mas este conjunto de testes não é exaustivo. É da responsabilidade dos alunos garantir que o código produzido está correcto.