30 de Março de 2011
0.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
0.2 O problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
0.3 Solução Proposta . . . . . . . . . . . . . . . . . . . . . . . . . 2
0.4 Entrada de dados . . . . . . . . . . . . . . . . . . . . . . . . . 3
0.5 Estrutura Abstrata de Dados . . . . . . . . . . . . . . . . . . 3
0.6 Análise das Funções . . . . . . . . . . . . . . . . . . . . . . . . 4
0.6.1 Funções do arquivo estacionamento.c . . . . . . . . . . 4
0.6.2 Funções de io.c . . . . . . . . . . . . . . . . . . . . . . 5
0.6.3 Funções de manobras.c . . . . . . . . . . . . . . . . . . 7
0.7 Saı́da de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . 7
0.8 Análise de resultados . . . . . . . . . . . . . . . . . . . . . . . 8
0.9 Conclusão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1
0.1 Introdução
Estacionamento é o nome dado a área de um terreno destinada aos motoris-
tas para estacionarem seus carros.
Os estacionamentos são feitos geralmente para uma ocupação apenas tem-
porária de suas vagas. Embora alguns sejam gratuitos, a maioria cobra uma
taxa pela ocupação de uma das suas vagas, geralmente proporcional ao tempo
de ocupação da mesma.
São problemas comuns em estacionamentos pequenas batidas e falta de vagas,
ambas as situações provocadas quase sempre pela falta de vagas no estaciona-
mento. (Fonte: wikipédia).
Neste trabalho, deve-se desenvolver um programa na linguagem C que simule
o funcionamento de um estacionamento, com o objetivo de tirar um veı́culo
especı́fico (chamado de ’Z’) do estacionamento, detectando e alertando sobre
configurações e manobras impossı́veis, como dois veı́culos ocupando o mesmo
lugar ou um movimento que possa causar uma colisão entre dois veı́culos ou
entre um veı́culo e os muros do estacionamento.
2
0.2 O problema
O estacionamento da empresa fictı́cia ’TremdaFolia’ possui dimensões 6x6,
identificadas de X1Y1 até X6Y6. Dois tipos de veı́culos podem ocupar as
vagas do estacionameto: carros (dimensão 2x1) e caminhões (dimensão 3x1).
No caso especı́fico deste trabalho, os veı́culos não fazem curvas. Eles podem
andar para frente, de marcha ré ou ’de lado’, tanto no eixo X como no eixo Y.
A saı́da do estacionamento está localizada nas posições X5Y4 e X6Y4. Deve-
se levar o carro Z até esta posição do estacionamento, também manobrando
os outros veı́culos conforme as suas limitações, de modo a permitir a saı́da do
carro Z, sempre alertando sobre configurações que tornem a movimentação
inviável.
3
0.3 Solução Proposta
O programa recebe um arquivo com as configurações iniciais das posições
dos veı́culos dentro do estacionamento e verifica se a configuração é válida
(dois veı́culos ocupando a mesma vaga ou chocando-se com a parede do esta-
cionamento). Sendo viável a configuração do arquivo de entrada, o programa
então posiciona os veı́culos no estacionamento, sendo este representado em
uma matriz alocada dinamicamente. Posicionados os veı́culos na matriz,
o programa lê as configurações do arquivo contendo as movimentações dos
veı́culos para levar o carro Z até a saı́da. Se não forem detectadas manobras
inviáveis, o programa executa as movimentações e verifica se o carro Z saiu
do estacionamento, a cada movimentação executada.
4
0.4 Entrada de dados
O usuário copila o programa com o Makefile. Após copilar o programa,
simplesmente digitando “make”, o usuário deverá entrar com o comando
“./programa -c [ arquivo de configuração do estacionamento ] -m [ arquivo de
manobras ]”, e logo o programa será executado.
5
0.5 Estrutura Abstrata de Dados
Para este programa, nós optamos por usar uma lista linear com descritor. A
estrutura abstrata de dados permite representar todos os veı́culos que estão
no estacionamento, suas posições e seu tamanho, além de seu nome.
6
0.6 Análise das Funções
Abaixo, todas as funções implementadas neste programa terão uma breve
explicação.
7
void freelista(Lista x)
Descrição: Libera a memória ocupada pela lista de veı́culos.
Complexidade: O(1)
8
Complexidade: O(N), sendo N o número de veı́culos inseridos na lista
automóveis.
Complexidade: O(1)
Complexidade: O(1)
void ajuda(void)
Descrição: Ensina o usuário como utilizar corretamente o programa.
Complexidade: O(1)
void getcputime(void)
Descrição: Faz o calculo do tempo de usuário e o tempo de sistema, utilizando
o getrusage.
Complexidade: O(1)
9
0.6.3 Funções de manobras.c
int executa movimentos(Lista *automoveis, int **matriz, char *manobras)
Descrição: Recebe o arquivo de manobras e chama a função que realiza os
movimentos dos automóveis no estacionamento. Também verifica, antes de
chamar a função de movimento, se existe um veı́culo com o nome que está no
arquivo de movimento, e, de acordo com o retorno da função de movimen-
tação, ele retorna para o usuário se o veı́culo Z saiu do estacionamento com
sucesso e encerra o programa.
10
0.7 Saı́da de Dados
Logo após a execução do programa, será exibida uma saida na tela para o
usuário, com o resultado obtido com as configurações. Durante a configu-
ração inicial do estacionamento, algum veı́culo pode ficar posicionado sobre
outro ou atráves da parede do estacionamento, o que é configurado como um
erro, e o programa é encerrado. Durante os movimentos dos veı́culos, um dos
veı́culos pode colidir com outro, ou então com a parede do estacionamento,
configurando assim, um erro, e encerrando o programa.
Em cada uma das movimentações do carro Z, é verificado se ele foi capaz de
sair do estacionamento. Em caso positivo, o usuário recebe uma mensagem
de que o carro Z saiu do estacionamento e o programa é encerrado.
Após todas as movimentações, caso o carro Z não tenha saido do estaciona-
mento, e não tenham acontecido nenhuma colisão, o programa retorna uma
mensagem dizendo que o carro Z não conseguiu sair do estacionamento, e é
logo encerrado.
11
0.8 Análise de resultados
A tabela e o gráfico a seguir mostram a variação do tempo de execução do
programa, de acordo com o número de movimentos dos veı́culos no estaciona-
mento. O numero de veı́culos no estacionamento não interfere na execução
do programa, visto que o máximo de veı́culos que podem ser posicionados no
estacionamento, ao mesmo tempo, são dezesseis.
12
Figura 4: Tabela Movimentos x Tempo
13
0.9 Conclusão
Neste trabalho foi resolvido o problema de retirar o carro ’Z’ do estaciona-
mento da empresa ”TremdaFolia”. Exploramos algumas práticas que prati-
camente não utilizávamos, como o uso das funções gettimeofday, getrusage e
getopt, além de reforçar nosso conhecimento em outras áreas, como alocação
dinâmica de memória e tipos abstratos de dados, o que nos dá um pouco
mais de maturidade no uso da linguagem C.
14