Page 1

Documenta¸c˜ao AEDS 3 Iago Augusto de Carvalho1

Lucas Emanuel Teixeira2

30 de Mar¸co de 2011

1 Numero 2 Numero

de matr´ıcula: 102050001 de matr´ıcula: 102050025


Sum´ ario 0.1 0.2 0.3 0.4 0.5 0.6

0.7 0.8 0.9

Introdu¸c˜ao . . . . . . . . . . . . . . . . . . . O problema . . . . . . . . . . . . . . . . . . Solu¸c˜ao Proposta . . . . . . . . . . . . . . . Entrada de dados . . . . . . . . . . . . . . . Estrutura Abstrata de Dados . . . . . . . . An´alise das Fun¸c˜oes . . . . . . . . . . . . . . 0.6.1 Fun¸c˜oes do arquivo estacionamento.c 0.6.2 Fun¸c˜oes de io.c . . . . . . . . . . . . 0.6.3 Fun¸c˜oes de manobras.c . . . . . . . . Sa´ıda de Dados . . . . . . . . . . . . . . . . An´alise de resultados . . . . . . . . . . . . . Conclus˜ao . . . . . . . . . . . . . . . . . . .

1

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

2 2 2 3 3 4 4 5 7 7 8 9


0.1

Introdu¸c˜ ao

Estacionamento ´e o nome dado a ´area de um terreno destinada aos motoristas para estacionarem seus carros. Os estacionamentos s˜ao feitos geralmente para uma ocupa¸c˜ao apenas tempor´aria de suas vagas. Embora alguns sejam gratuitos, a maioria cobra uma taxa pela ocupa¸c˜ao de uma das suas vagas, geralmente proporcional ao tempo de ocupa¸c˜ao da mesma. S˜ao problemas comuns em estacionamentos pequenas batidas e falta de vagas, ambas as situa¸c˜oes provocadas quase sempre pela falta de vagas no estacionamento. (Fonte: wikip´edia). 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¸c˜oes e manobras imposs´ıveis, como dois ve´ıculos ocupando o mesmo lugar ou um movimento que possa causar uma colis˜ao 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˜oes 6x6, identificadas de X1Y1 at´e X6Y6. Dois tipos de ve´ıculos podem ocupar as vagas do estacionameto: carros (dimens˜ao 2x1) e caminh˜oes (dimens˜ao 3x1). No caso espec´ıfico deste trabalho, os ve´ıculos n˜ao fazem curvas. Eles podem andar para frente, de marcha r´e ou ’de lado’, tanto no eixo X como no eixo Y. A sa´ıda do estacionamento est´a localizada nas posi¸c˜oes X5Y4 e X6Y4. Devese levar o carro Z at´e esta posi¸c˜ao do estacionamento, tamb´em manobrando os outros ve´ıculos conforme as suas limita¸c˜oes, de modo a permitir a sa´ıda do carro Z, sempre alertando sobre configura¸c˜oes que tornem a movimenta¸c˜ao invi´avel.

3


0.3

Solu¸c˜ ao Proposta

O programa recebe um arquivo com as configura¸c˜oes iniciais das posi¸c˜oes dos ve´ıculos dentro do estacionamento e verifica se a configura¸c˜ao ´e v´alida (dois ve´ıculos ocupando a mesma vaga ou chocando-se com a parede do estacionamento). Sendo vi´avel a configura¸c˜ao do arquivo de entrada, o programa ent˜ao posiciona os ve´ıculos no estacionamento, sendo este representado em uma matriz alocada dinamicamente. Posicionados os ve´ıculos na matriz, o programa lˆe as configura¸c˜oes do arquivo contendo as movimenta¸c˜oes dos ve´ıculos para levar o carro Z at´e a sa´ıda. Se n˜ao forem detectadas manobras invi´aveis, o programa executa as movimenta¸c˜oes e verifica se o carro Z saiu do estacionamento, a cada movimenta¸c˜ao executada.

Figura 1: Fluxograma de a¸c˜oes do programa

4


0.4

Entrada de dados

O usu´ario copila o programa com o Makefile. Ap´os copilar o programa, simplesmente digitando “make”, o usu´ario dever´a entrar com o comando “./programa -c [ arquivo de configura¸c˜ao do estacionamento ] -m [ arquivo de manobras ]”, e logo o programa ser´a executado.

5


0.5

Estrutura Abstrata de Dados

Para este programa, n´os optamos por usar uma lista linear com descritor. A estrutura abstrata de dados permite representar todos os ve´ıculos que est˜ao no estacionamento, suas posi¸c˜oes e seu tamanho, al´em de seu nome.

Figura 2: Lista Ve´ıculos

6


0.6

An´ alise das Fun¸ c˜ oes

Abaixo, todas as fun¸c˜oes implementadas neste programa ter˜ao uma breve explica¸c˜ao.

0.6.1

Fun¸ c˜ oes do arquivo estacionamento.c

int posiciona veiculos(Lista *automoveis, int **matriz) Descri¸c˜ao: Chama a fun¸c˜ao que posiciona os ve´ıculos no estacionamento, e verifica se houve algum erro na configura¸c˜ao do posicionamento inicial do estacionamento. Complexidade: O(1). automovel atualiza dados(Lista *automoveis, char nome, int x, int y) Descri¸c˜ao: Ap´os o movimento de um autom´ovel, esta fun¸c˜ao atualiza na Lista autom´oveis a posi¸c˜ao atual do ve´ıculo. Complexidade: O(n), sendo N o n´ umero de ve´ıculos inseridos na lista autom´oveis. int **aloca matriz(int **matriz, int x, int y) Descri¸c˜ao: Esta fun¸c˜ao aloca a matriz na qual ser´a simulada o estacionamento, e a retorna para o programa principal. Complexidade: O(1) int posiciona(Lista *lista, int **matriz) Descri¸c˜ao: Recebe a lista de ve´ıculos e os posiciona inicialmente no estacionamento, verificando se as posi¸c˜oes em que eles ser˜ao colodados s˜ao v´alidas, sem colis˜oes com outros carros ou com a parede do estacionamento. Caso haja colis˜ao, retorna o erro. Complexidade: O(1) void freematriz(int **matriz) Descri¸c˜ao: Libera a mem´oria ocupada pela matriz que simula o estacionamento ao fim do programa. Complexidade: O(1)

7


void freelista(Lista x) Descri¸c˜ao: Libera a mem´oria ocupada pela lista de ve´ıculos. Complexidade: O(1)

0.6.2

Fun¸ c˜ oes de io.c

int le veiculos(Lista automoveis, char *posicoes) Descri¸c˜ao: Lˆe o arquivo que cont´em a configura¸c˜ao inicial do estacionamento, com os ve´ıculos e suas posi¸c˜oes, e os insere na lista autom´oveis. Complexidade: O(N), sendo N o n´ umero de ve´ıculos no arquivo de configura¸c˜ao inicial do estacionamento. automovel busca dados(Lista *automoveis, char nome) Descri¸c˜ao: Pesquisa na lista autom´oveis e retorna os dados de um autom´ovel qualquer a partir de seu nome. Complexidade: O(N), sendo N o n´ umero de ve´ıculos inseridos na lista autom´oveis. Lista criaLista(Lista lista) Descri¸c˜ao: Cria a lista que ser´a utilizada para guardar os ve´ıculos e seus dados, e a retorna para o programa principal. Complexidade: O(1) int ehVazia(Lista lista) Descri¸c˜ao: Verifica se a lista ve´ıculos est´a vazia. Complexidade: O(1) int insere(automovel veiculo, Lista *lista) Descri¸c˜ao: Recebe os dados de um ve´ıculo e o insere na lista autom´oveis. Tamb´em verifica se existem dois autom´oveis com o mesmo nome. Complexidade: O(1) int pesquisa nome(Lista *lista, char nome) Descri¸c˜ao: Pesquisa na lista um nome de ve´ıculo, para saber se j´a existe algum autom´ovel com o mesmo nome do que est´a para ser inserido.

8


Complexidade: O(N), sendo N o n´ umero de ve´ıculos inseridos na lista autom´oveis. int erro posicionamento(int verifica) Descri¸c˜ao: Recebe a vari´avel de erro e, se houve algum, mostra a sa´ıda para o usu´ario, de acordo com o c´odigo que recebeu. Os erros poss´ıvels s˜ao quando, na configura¸c˜ao inicial do estacionamento, um ve´ıculo fica estacionado sobre outro (erro 1) ou quando um ve´ıculo ocupa o lugar de uma parede do estacionamento (erro 2). Complexidade: O(1) int erro movimento(int verifica, char nome) Descri¸c˜ao: Recebe a vari´avel de erro e, se houve algum, mostra a sa´ıda para o usu´ario, de acordo com o c´odigo que recebeu. Os erros poss´ıvels s˜ao quando, na movimenta¸c˜ao 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¸c˜ao: Ensina o usu´ario como utilizar corretamente o programa. Complexidade: O(1) void tempo(double get1, double get2); Descri¸c˜ao: Calcula o tempo de execu¸c˜ao do programa, usando o gettimeoftheday. Complexidade: O(1) void getcputime(void) Descri¸c˜ao: Faz o calculo do tempo de usu´ario e o tempo de sistema, utilizando o getrusage. Complexidade: O(1)

9


0.6.3

Fun¸ c˜ oes de manobras.c

int executa movimentos(Lista *automoveis, int **matriz, char *manobras) Descri¸c˜ao: Recebe o arquivo de manobras e chama a fun¸c˜ao que realiza os movimentos dos autom´oveis no estacionamento. Tamb´em verifica, antes de chamar a fun¸c˜ao de movimento, se existe um ve´ıculo com o nome que est´a no arquivo de movimento, e, de acordo com o retorno da fun¸c˜ao de movimenta¸c˜ao, ele retorna para o usu´ario se o ve´ıculo Z saiu do estacionamento com sucesso e encerra o programa. Complexidade: O(N), sendo N o n´ umero de manobras. int movimenta(char nome, char direcao, int movimento, int **matriz, Lista automoveis) Descri¸c˜ao: Recebe os dados do movimento da fun¸c˜ao ”executa movimentos”e realiza os movimentos dos ve´ıculos dentro da matriz que simula o estacionamento. Ao fim do movimento, chama a fun¸c˜ao “atualiza dados” e troca a posi¸c˜ao do ve´ıculo que acabou de se movimentar na lista autom´oveis. Tamb´em retorna um c´odigo de sucesso caso o carro Z tenha saido do estacionamento. Complexidade: O(1)

10


0.7

Sa´ıda de Dados

Logo ap´os a execu¸c˜ao do programa, ser´a exibida uma saida na tela para o usu´ario, com o resultado obtido com as configura¸c˜oes. Durante a configura¸c˜ao inicial do estacionamento, algum ve´ıculo pode ficar posicionado sobre outro ou atr´aves da parede do estacionamento, o que ´e configurado como um erro, e o programa ´e encerrado. Durante os movimentos dos ve´ıculos, um dos ve´ıculos pode colidir com outro, ou ent˜ao com a parede do estacionamento, configurando assim, um erro, e encerrando o programa. Em cada uma das movimenta¸c˜oes do carro Z, ´e verificado se ele foi capaz de sair do estacionamento. Em caso positivo, o usu´ario recebe uma mensagem de que o carro Z saiu do estacionamento e o programa ´e encerrado. Ap´os todas as movimenta¸c˜oes, caso o carro Z n˜ao tenha saido do estacionamento, e n˜ao tenham acontecido nenhuma colis˜ao, o programa retorna uma mensagem dizendo que o carro Z n˜ao conseguiu sair do estacionamento, e ´e logo encerrado.

11


0.8

An´ alise de resultados

A tabela e o gr´afico a seguir mostram a varia¸c˜ao do tempo de execu¸c˜ao do programa, de acordo com o n´ umero de movimentos dos ve´ıculos no estacionamento. O numero de ve´ıculos no estacionamento n˜ao interfere na execu¸c˜ao do programa, visto que o m´aximo de ve´ıculos que podem ser posicionados no estacionamento, ao mesmo tempo, s˜ao dezesseis.

Figura 3: Gr´afico Movimentos x Tempo

12


Figura 4: Tabela Movimentos x Tempo

13


0.9

Conclus˜ ao

Neste trabalho foi resolvido o problema de retirar o carro ’Z’ do estacionamento da empresa ”TremdaFolia”. Exploramos algumas pr´aticas que praticamente n˜ao utiliz´avamos, como o uso das fun¸c˜oes gettimeofday, getrusage e getopt, al´em de refor¸car nosso conhecimento em outras ´areas, como aloca¸c˜ao dinˆamica de mem´oria e tipos abstratos de dados, o que nos d´a um pouco mais de maturidade no uso da linguagem C.

14

título  

meu pdffdsafdsafadsfdsaf

Read more
Read more
Similar to
Popular now
Just for you