Relatorio AED
-
Upload
vitor-ferreira -
Category
Documents
-
view
243 -
download
0
description
Transcript of Relatorio AED
Algoritmos E Estrutura de Dados II
André Sousa, 11304/Miguel Oliveira, 10206/Vitor Ferreira, 6583
ESI-Engenharia de Sistemas Informáticos | 5 de junho de 2015
TRABALHO PRÁTICO DE ALGORITMOS E ESTRUTURA DE DADOS II
PÁGINA 1
PÁGINA 2
Agradecimentos
Aos professores em geral, “porque os professores com sabedoria e carinho, dedicam seu tempo para a
formação dos homens/mulheres do amanhã”.
Aos nossos pais e Irmãos, pois eles também são uma peça chave deste caminho, e estão sempre a puxar por
nós.
Aos nossos melhores amigos, e também em geral a nossa turma.
PÁGINA 3
Indice Remissivo
Agradecimentos .................................................................................................................................... 2
Índice de imagens ................................................................................................................................. 4
Introdução ............................................................................................................................................. 5
Divisão do Trabalho .............................................................................................................................. 6
Os nossos registos (structs) .................................................................................................................. 7
A função numero um, Adicionar um cliente....................................................................................... 9
A função numero 2, alteração de dados ............................................................................................. 10
A função numero três, remoção de um cliente ................................................................................... 11
A função numero quatro, procurar um cliente .................................................................................. 12
A função numero 5, gestão de infractores .......................................................................................... 13
Opção 6 do Menu – Procura de um carro .......................................................................................... 16
Opção 7 – verificar a situação de um cliente ...................................................................................... 17
Conclusão ............................................................................................................................................. 18
PÁGINA 4
Índice de imagens
Figura 1 - Menu (VVManager) .............................................................................................................. 6
Figura 2 - Funcionamento real do sistema (Sistema RFID) ............................................................... 6
Figura 3 - Registos (structs) do vvmanager ......................................................................................... 7
Figura 4 - Adicionar um cliente ........................................................................................................... 9
Figura 5-Alterar cliente ........................................................................................................................ 10
Figura 6 - Ciclo de procura while ......................................................................................................... 11
Figura 7 - Renomear um ficheiro temporário para o original e remover o mesmo .......................... 11
Figura 8 – Subopção 2 da opção 4 do menu principal (Listagem de todos os clientes) .................. 12
Figura 9 - Algoritmo de procura de cliente (tendo em conta que é indicado o nome) ................... 12
Figura 10 - Introdução de um infractor .............................................................................................. 13
Figura 11 - Listagem de infractores ...................................................................................................... 14
Figura 12 - Procurar um carro .............................................................................................................. 16
Figura 13 - Verificar cliente .................................................................................................................. 17
PÁGINA 5
Introdução
O presente trabalho tem como objetivo principal a consolidação de aptidões, ou seja
conseguir verificar se as aulas prático-teóricas ficaram de facto enraizadas, e se conseguimos num
qualquer programa, implementar estruturas de dados como listas, apontadores e arvores.
Optamos por desenvolver um simples sistema, em C (linguagem obrigatória), cujo
objetivo era a construção de um sistema capaz de gerir clientes/automóveis/infratores e preços de
uma dada Autoestrada
O Ideal seria, o sistema fazer exatamente toda a gestão da mesma autoestrada, ou seja
adicionar uma lista de clientes, que em determinado dia passaram naquele pórtico de portagem,
assim como adicionar numa outra lista há parte um outro sistema que fosse capaz de gerir as
infrações cometidas por um ou mais utilizadores da autoestrada (quando me refiro a infrações,
refiro-me a passagem na entrada da autoestrada ou à saída, sem por exemplo ter o devido
identificador colocado no vidro).
Como dito atrás a linguagem de programação utilizada, foi o C, e o IDE foi o visual studio
2013 (por opção própria)
Trabalhamos sempre com ficheiros, e temos sempre em conta que a informação é útil, dai
a nossa preocupação em nunca perder um único dado.
PÁGINA 6
Divisão do Trabalho
O presente trabalho (programa) está no momento capaz de efetuar as seguintes situações:
Adicionar um cliente
Atualizar dados de um cliente
Remover um cliente
Verificar a “situação” de um cliente
Adicionar infratores, bem como listar os mesmos
Listagem dos infractores de um dos últimos dias (com recurso a ficheiros)
Procurar clientes e carros
Adicionar um carro a um cliente (um cliente se por exemplo for uma empresa, pode ter
mais do que um carro)
Figura 1 - Menu (VVManager)
Quando aqui me refiro a situação de um cliente, refiro-me obviamente a situação do mesmo para
com a empresa em causa que faz a gestão das autoestradas. Ou seja refiro-me a se por exemplo a
situação está regularizada, se existem portagens por pagar ou se foi detetado algum problema ou
avaria, pois na verdade este sistema eletrónico que existe nas autoestradas é capaz de detetar
anomalias se as mesmas existirem.
Figura 2 - Funcionamento real do sistema (Sistema RFID)
PÁGINA 7
Os nossos registos (structs)
Temos registos para praticamente todos os objectos envolventes. Consideramos objectos
envolventes, os seguintes objectos:
Autoestradas
Clientes
Automóveis
Infractores
NIB/IBAN
Figura 3 - Registos (structs) do vvmanager
Consideramos a autoestrada e todos os outros “elementos” como um objeto, porque a mesma
contem informações armazenadas uteis ao programa, no momento de execução. Essas
informações dizem respeito a, por exemplo no caso da autoestrada:
Designacao
Local e código de Entrada
Local e código de saída
Preço
Classe do veiculo em causa
PÁGINA 8
No caso do cliente, considera-se útil conhecer:
O id, para exclusivamente associar um automóvel ao mesmo
Nome
Apelido
Idade
Sexo
Número de Telefone
Número de BI
Situação
…
No caso de um automóvel ou até mesmo no caso dos infractores considera-se útil conhecer:
Marca
Modelo
Matricula
Classe do veículo
Preço de portagem
PÁGINA 9
A função numero um, Adicionar um cliente
Como dito atrás todas as nossas funções envolvem a manipulação de ficheiros como é o caso desta.
Antes de mais nada ao construir esta função era necessário ter em conta que um cliente tinha um
ID, e que não deveriam existir ID’s repetidos, nem tão pouco ID’s negativos
O primeiro passo passa por pedir ao cliente que pretende aderir ao sistema, os dados acima
descritos na struct, como por exemplo o nome, apelido, idade, morada …
Numa segunda fase, mais avançada, devia-se então proceder a verificação do ID, uma vez que
(supomos) que este é introduzido manualmente por aquele, que de momento opera sob o sistema.
Para prosseguir com essa verificação será necessário abrir o ficheiro e percorrer o mesmo, através
da instrução fscanf(f,”%x”,var), onde f é um ficheiro passado por referencia, “%x” é um ou
mais parâmetros de leitura que diferenciam conforme os dados, e var, é a existência de
uma ou mais variáveis que vao guardar os dados lidos.
Numa terçeira fase esta função implicaria o percorrer de todos os clientes existentes em ficheiro,
com o um ciclo semelhante a while(!feof(f)) e apenas quando o fim do ficheiro for encontrado é
que era acresentado o cliente.
Por fim procedíamos ao Rename()&&Remove() com recurso a uma decisão ou um If() bem como
ao fechar do ficheiro (Instrução: fclose(f))
Figura 4 - Adicionar um cliente
PÁGINA 10
A função numero 2, alteração de dados
A função número 2 deveria permitir encontrar um cliente e alterar alguns dos dados do mesmo
como morada, situação face à empresa, idade, número de telemóvel …
Devido ao facto de ocorrerem problemas, na manipulação de ficheiros, este método está a
conseguir encontrar os clientes, mas depois falha, quando tem que escrever o cliente em causa já
atualizado. A manipulação de ficheiros, conforme direi na conclusão, foi das maiores dificuldades
que encontramos, na implementação deste sistema.
Figura 5-Alterar cliente
PÁGINA 11
A função numero três, remoção de um cliente
A função número três é em tudo semelhante a primeira função, exceto em duas situações
concretas.
Figura 6 - Ciclo de procura while
Podemos observar que aqui é pedida a referência de um cliente e que depois todos os clientes
exceto aquele que foi referenciado, são escritos num novo ficheiro, que será renomeado para o
ficheiro original e posteriormente apagado, conforme mostra o algoritmo abaixo.
Figura 7 - Renomear um ficheiro temporário para o original e remover o mesmo
De notar também que antes de entrar em execução o If(…) é necessário fechar ambos os ficheiros
para evitar erros por parte da execução, como “Denied Acess”
PÁGINA 12
A função numero quatro, procurar um cliente
Na opção quatro, eram dadas duas opções de procura do cliente (dos clientes). No primeiro caso
teríamos apenas de introduzir o primeiro nome para termos todos os clientes que continham
aquele nome, e no segundo caso existia um percorrer de todo o ficheiro, e todos os clientes eram
adicionados (impressos) no sistema
Em ambos os casos o algoritmo foi elaborado com recurso a um ou no máximo dois ciclos
While(…)
Figura 8 – Subopção 2 da opção 4 do menu principal (Listagem de todos os clientes)
No caso da procura pelo nome podemos observar o algoritmo implementado, no visual studio,
que na minha opinião é de muito fácil compreensão:
Figura 9 - Algoritmo de procura de cliente (tendo em conta que é indicado o nome)
PÁGINA 13
A função numero 5, gestão de infractores
A função numero 5, foi muito provavelmente a única função a dar muito mais trabalho. E é fácil
entender a razão da mesma função ter dado tanto trabalho. Numa primeira situação a função
número 5 começa logo com a introdução de um infractor, sim, pois sem infractores, não podemos
considerar “aceitável”
trabalhar com esta opção.
Não sei se cheguei a referir na
introdução mas o programa,
trabalha na sua maioria, com
apontadores e stacks para a
manipulação de dados. Aqui
as stacks também entram,
mas não dominam.
Na verdade existe uma lista
para Infractores que tem um
número de ordem
(semelhante a ordem de
chegada dos infractores). Um
infractor é introduzido e o
sistema avança para o
infractor seguinte (introdução de um novo infractor) até o operador introduzir um número menor
do que 0.
Durante esta operação de introdução de infractores, consideramos ser útil ter em conta o local da
infração (nó da autoestrada), bem como a classe do veiculo (porque classe diferente, preço
diferente) e o preço (Que deve ser o preço máximo, isto é por exemplo um veiculo de classe 1, que
cometa esta infração paga o equivalente a ir de Maia a Valença do Minho, ou seja 8.60€, para
qualquer local onde a infração tenha sido cometida)
Figura 10 - Introdução de um infractor
PÁGINA 14
O método dá ainda a
possibilidade de acrescentar
infractores bem como listas os
infractores atuais, e iniciar
uma nova lista, buscando os
infractores, por exemplo de
ontem a um ficheiro já
existente, no local do projecto.
Figura 11 - Listagem de infractores
PÁGINA 15
PÁGINA 16
Opção 6 do Menu – Procura de um carro
Em tudo semelhante a procura do cliente, só que aqui é pedida a matricula de um carro, e se o
mesmo for encontrado nos ficheiros do sistema é impresso. Aqui opto por pedir a matricula, pela
razão de que existem muitos carros iguais com a mesma marca e modelo mas não existem duas
matriculas iguais (a não ser que exista uma falsificação das mesmas), o que não pressuponho
Figura 12 - Procurar um carro
PÁGINA 17
Opção 7 – verificar a situação de um cliente
Imaginemos que é necessário verificar a situação de um cliente que reclama, ou diz que não está
em divida com a empresa. Como fazíamos? Simples, não é.
É na verdade um algoritmo de procura que aqui está implementado, que percorre o ficheiro,
verifica se o cliente está no mesmo e se estiver imprime apenas a situação corrente do cliente.
Para termos um maior rigor optamos por pedir ao cliente o nome, bem como os respetivos
apelidos, pois apenas queremos mostrar a “situação” para um cliente e não para dois.
Figura 13 - Verificar cliente
PÁGINA 18
Conclusão
Começo por dizer que é pena termos apenas duas semanas (cerca disso) para fazermos um projeto
desta envergadura.
Se não existissem testes e trabalhos de outras disciplinas consideraria tempo suficiente para
implementar este sistema, mas assim o projeto corria alguns riscos que de facto acabaram por ser
cometidos.
A nível de dificuldades posso dizer que cheguei a ficar um pouco confuso e desnorteado, quando
na opção 5 decidi implementar listas para gerir infractores, mas safei-me bem ai, e esta é das
funções que o programa melhor tem a correr.
Mas os verdadeiros problemas chegaram quando tive que implementar funções para trabalhar ou
manipular os clientes. Com constante manipulação a pressão foi tal que acabei-me por perder um
pouco dentro dos ciclos while e das instruções fscanf() e fprintf().
Apesar de tudo penso que no geral, ou seja no percurso do trabalho, este não me deu muitos
problemas e consegui em muitas situações safar-me, sem ajuda do grupo. O trabalho em si foi
bastante estimulante, dei muito de mim, perdi aqui muito, mas mesmo muito tempo.
Penso que valeu o sacrifício!