Anda di halaman 1dari 15

Documentação AEDS 3

Iago Augusto de Carvalho1 Lucas Emanuel Teixeira2

30 de Março de 2011

1 Numero de matrı́cula: 102050001


2 Numero de matrı́cula: 102050025
Sumário

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.

Figura 1: Fluxograma de ações do programa

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.

Figura 2: Lista Veı́culos

6
0.6 Análise das Funções
Abaixo, todas as funções implementadas neste programa terão uma breve
explicação.

0.6.1 Funções do arquivo estacionamento.c


int posiciona veiculos(Lista *automoveis, int **matriz)
Descrição: Chama a função que posiciona os veı́culos no estacionamento, e
verifica se houve algum erro na configuração do posicionamento inicial do
estacionamento.
Complexidade: O(1).

automovel atualiza dados(Lista *automoveis, char nome, int x, int


y)
Descrição: Após o movimento de um automóvel, esta função atualiza na Lista
automóveis a posição atual do veı́culo.
Complexidade: O(n), sendo N o número de veı́culos inseridos na lista au-
tomóveis.

int **aloca matriz(int **matriz, int x, int y)


Descrição: Esta função aloca a matriz na qual será simulada o estaciona-
mento, e a retorna para o programa principal.
Complexidade: O(1)

int posiciona(Lista *lista, int **matriz)


Descrição: Recebe a lista de veı́culos e os posiciona inicialmente no estaciona-
mento, verificando se as posições em que eles serão colodados são válidas, sem
colisões com outros carros ou com a parede do estacionamento. Caso haja
colisão, retorna o erro.
Complexidade: O(1)

void freematriz(int **matriz)


Descrição: Libera a memória ocupada pela matriz que simula o estaciona-
mento ao fim do programa.
Complexidade: O(1)

7
void freelista(Lista x)
Descrição: Libera a memória ocupada pela lista de veı́culos.
Complexidade: O(1)

0.6.2 Funções de io.c


int le veiculos(Lista automoveis, char *posicoes)
Descrição: Lê o arquivo que contém a configuração inicial do estacionamento,
com os veı́culos e suas posições, e os insere na lista automóveis.
Complexidade: O(N), sendo N o número de veı́culos no arquivo de configu-
ração inicial do estacionamento.

automovel busca dados(Lista *automoveis, char nome)


Descrição: Pesquisa na lista automóveis e retorna os dados de um automóvel
qualquer a partir de seu nome.
Complexidade: O(N), sendo N o número de veı́culos inseridos na lista au-
tomóveis.

Lista criaLista(Lista lista)


Descrição: Cria a lista que será utilizada para guardar os veı́culos e seus
dados, e a retorna para o programa principal.
Complexidade: O(1)

int ehVazia(Lista lista)


Descrição: Verifica se a lista veı́culos está vazia.
Complexidade: O(1)

int insere(automovel veiculo, Lista *lista)


Descrição: Recebe os dados de um veı́culo e o insere na lista automóveis.
Também verifica se existem dois automóveis com o mesmo nome.
Complexidade: O(1)

int pesquisa nome(Lista *lista, char nome)


Descrição: Pesquisa na lista um nome de veı́culo, para saber se já existe al-
gum automóvel com o mesmo nome do que está para ser inserido.

8
Complexidade: O(N), sendo N o número de veı́culos inseridos na lista
automóveis.

int erro posicionamento(int verifica)


Descrição: Recebe a variável de erro e, se houve algum, mostra a saı́da para o
usuário, de acordo com o código que recebeu. Os erros possı́vels são quando,
na configuração inicial do estacionamento, um veı́culo fica estacionado sobre
outro (erro 1) ou quando um veı́culo ocupa o lugar de uma parede do esta-
cionamento (erro 2).

Complexidade: O(1)

int erro movimento(int verifica, char nome)


Descrição: Recebe a variável de erro e, se houve algum, mostra a saı́da
para o usuário, de acordo com o código que recebeu. Os erros possı́vels são
quando, na movimentação dos veı́culos, um veı́culo colide com outro (erro 1)
ou quando um veı́culo colide com uma das paredes do estacionamento (erro
2).

Complexidade: O(1)

void ajuda(void)
Descrição: Ensina o usuário como utilizar corretamente o programa.
Complexidade: O(1)

void tempo(double get1, double get2);


Descrição: Calcula o tempo de execução do programa, usando o gettime-
oftheday.
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.

Complexidade: O(N), sendo N o número de manobras.

int movimenta(char nome, char direcao, int movimento, int **ma-


triz, Lista automoveis)
Descrição: Recebe os dados do movimento da função ”executa movimentos”e
realiza os movimentos dos veı́culos dentro da matriz que simula o estaciona-
mento. Ao fim do movimento, chama a função “atualiza dados” e troca a
posição do veı́culo que acabou de se movimentar na lista automóveis. Tam-
bém retorna um código de sucesso caso o carro Z tenha saido do estaciona-
mento.
Complexidade: O(1)

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.

Figura 3: Gráfico Movimentos x Tempo

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

Anda mungkin juga menyukai