Anda di halaman 1dari 9

Universidade Federal de Ouro Preto UFOP Instituto de Cincias Exatas e Biolgicas ICEB Departamento de Computao DECOM Disciplina: Algoritmos

mos e Estruturas de Dados I CIC102 Professor: David Menotti (menottid@gmail.com)

Trabalho Prtico 2 Listas / Filas / Pilhas


Valor: 1,2 pontos (12% da nota total) Documentao em Latex: 0,1 pontos extra Data de entrega: 22/10/2008

Este trabalho prtico divido em 3 partes principais. A primeira parte est relacionada com Listas duplamente encadeadas, enquanto que a segunda e terceira esto direcionadas pilhas e filas, respectivamente.

1. Matrizes Esparsas
(Utilizao de Listas por meio de Estruturas Auto-Referencias ([3] apud [2]))

Objetivos Consiste em concretizar os conceitos de Listas implementadas por encadeamento atravs de uma aplicao: Matrizes esparsas. Descrio
Matrizes esparsas so matrizes nas quais a maioria das posies preenchida por zeros. Para essas matrizes, podemos economizar um espao significativo de memria se apenas os termos diferentes de zero forem armazenados. As operaes usais sobre essas matrizes (somar, multiplicar, inverter, pivotar) tambm podem ser feitas em tempo muito menor se no armazenarmos as posies que contm zeros. Uma maneira eficiente de presentar estruturas com tamanho varivel e/ou desconhecido com o emprego de alocao encadeada, utilizando listas. Vamos usar essa representao para armazenar as matrizes esparsas. Cad coluna da matriz ser representada por uma lista linear circular com uma clula cabea. Da mesma maneira, cada linha da matriz tambm ser representada por uma lista linear circular com uma clula cabea. Cada clula da estrutura, alm das clulas cabea, representar os termos diferentes de zero da matriz e dever ser como no cdigo abaixo:
typedef struct Celula { Celula direita, abaixo; int linha, coluna; double valor; } Celula;

O campo abaixo deve ser usado para referenciar o elemento diferente de zero na mesma coluna. O campo direita deve ser usadao para referenciar o prximo elemento diferente de zero na mesma linha. Dada uma matriz A, para um valor A(i,j) diferente de zero, dever haver uma clula com o campo valor contendo A(i,j), o campo linha contendo i e o campo coluna contendo j. Essa clula dever pertencer a lista ciruclar da linha i e tambm dever pertencer lista circular da coluna j. Ou seja, cada clula pertencer a duas listas ao mesmo tempo. Para diferenciar as clulas cabea, coloque -1 nos campos linha e coluna dessas clulas. Considere a seguinte matriz esparsa:

Universidade Federal de Ouro Preto UFOP Instituto de Cincias Exatas e Biolgicas ICEB Departamento de Computao DECOM Disciplina: Algoritmos e Estruturas de Dados I CIC102 Professor: David Menotti (menottid@gmail.com) 50 10 A= 0 30 0 0 0 0 0 0 0 0 60 5 0 20

A representao da matriz A pode ser vista na Figura 1. Com essa representao, uma matriz esparsa m x n com r elementos diferentes de zero gastar ( m + n + r ) clulas. bem verdade que cada clula ocupa vrios bytes na memria; no entanto, o total de memria usado ser menor do que as m x n posies necessrias para representar a matriz toda, desde que r seja suficientemente pequeno.

1 1

1 50

1 10

3 20

1 30

3 60

4 5

Figura 1. Exemplo de Matriz Esparsa. Dada a representao de listas duplamente encadeadas, o trabalho consiste em desenvolver em C/C++ um tipo abstrato de dados Matriz com as seguintes operaes, conforme esta especificao:

Universidade Federal de Ouro Preto UFOP Instituto de Cincias Exatas e Biolgicas ICEB Departamento de Computao DECOM Disciplina: Algoritmos e Estruturas de Dados I CIC102 Professor: David Menotti (menottid@gmail.com)
a) void imprimeMatriz() Esse mtodo imprime (uma linha da matriz por linha na sada) a matriz A, inclusive os elementos iguais a zero. b) void leMatriz() Esse mtodo l, de algum arquivo de entrada, os elementos diferentes de zero de uma matriz e monta a estrutura especificada anteriormente. Considere que a entrada conssite dos valores de m e n (nmero de linhas e de colunas da matriz) seguidos de triplas ( i, j, valor) para os elementos diferentes de zero da matriz. Por exemplo, para a matriz anterior, a entrada seria: 4, 1, 2, 2, 4, 4, 4, 4 1, 1, 3, 1, 3, 4, 50.0 10.0 20.0 -30.0 -60.0 -5.0

c) TMatriz somaMatriz(TMatriz A, TMatriz B) Esse mtodo recebe como parmetros as matrizes A e B, devolvendo uma matriz C que a soma de A com B. d) TMatriz multiplicaMatriz(TMatriz A, TMatriz B) Esse mtodo recebe como parmetros as matrizes A e B, devolvendo uma matriz C que o produto de A por B. Para inserir e retirar clulas das listas que formam a matriz, crie mtodos especiais para esse fim. Por exemplo void insere(int i, int j, double v) para inserir o valor v na linha i, coluna j da matriz A ser til tanto na funo leMatriz quando na funo somaMatriz. As matrizes a serem lidas para testas as funes so: a) a mesma matriz mostrada no enunciado deste problema e ilustrada pela Figura 1.

0 0 50 30 10 0 20 0 b) 0 0 0 0 0 0 0 5
c)

3 0 0 0 1 0

obrigatrio o uso de alocao dinmica de memria para implementar as listas de adjacncia que representam as matrizes. A anlise de complexidade deve ser feita em funo de m, n (dimenses da matriz) e r (nmero de elementos diferentes de zero). As funes devero ser testados utilizando-se um programa main similiar ao apresentado abaixo:

Universidade Federal de Ouro Preto UFOP Instituto de Cincias Exatas e Biolgicas ICEB Departamento de Computao DECOM Disciplina: Algoritmos e Estruturas de Dados I CIC102 Professor: David Menotti (menottid@gmail.com)
void main(void) { TMatriz A, B,C; A.leMatriz(); A.imprimeMatriz(); B.leMatriz(); B.imprimeMatriz(); C = somaMatriz(A,B); C.imprimeMatriz(); B.leMatriz(); A.imprimeMatriz();B.imprimeMatriz(); C = somaMatriz(A,B); C.imprimeMatriz(); C = multiplicaMatriz(A,B); C.imprimeMatriz(); C = multiplicaMatriz(B,B); A.imprimeMatriz(); B.imprimeMatriz(); C.imprimeMatriz(); }

2. Avaliador de expressoes aritmticas (forma infixa)


(extrado e modificado de [1])

Objetivos Consiste em concretizar os conceitos de pilhas de um relevante tpico de cincia da computao: avaliador de expresses aritmticas usando vrios tipos de pilha. Descrio
Considere a soma de A mais B. Imaginamos a aplicao do operador + sobre os operandos A e B, e escrevemos a soma como A + B. Essa representao particular chamada infixa. Existem duas notaes alternativas para expressar a soma de A e B usando os smbolos A, B e +. So elas: + A B prefixa A B + posfixa Os prefixos pre, pos e in referem-se posio relativa do operador em relao aos dois operandos. Na notao prefixa, o operador precede os dois operandos; na notao posfixa, o operador introduzido depois dos dois operandos e; na notao infixa, o operador aparece entre os dois operandos. Na realidade, as notaes prefixa e posfixa no so to incmodas de usar como possam parecer a princpio. Por exemplo, uma funo em C para retornar a soma dos dois argumetnos, A e B, chamada por add(A,B). O operador add precede os operandos A e B. Examinemos agora alguns exemplos adicionais. A avaliao da expresso A + B * C, conforme escrita em notao infixa, requer o conhecimento de qual das duas operaes, + ou *, deve ser efetuada em primeiro lugar. No caso de + e *, sabemos que a multiplicao deve ser efetuada antes da adio (na ausncia de parnteses que indiquem o contrrio). Sendo assim, interpretamos A + B * C como A + ( B * C ), a menos que especificado de outra forma. Dizemos, ento, que a multiplicao tem precedncia sobre a adio. Suponha que queiramos reescrever A + B * C em notao posfixa. Aplicando as regras da precedncia, converteremos primeiro a parte da expresso que avaliada em primeiro lugar, ou seja a multiplicao. Fazendo essa converso em estgios, obteremos:

Universidade Federal de Ouro Preto UFOP Instituto de Cincias Exatas e Biolgicas ICEB Departamento de Computao DECOM Disciplina: Algoritmos e Estruturas de Dados I CIC102 Professor: David Menotti (menottid@gmail.com)
A+(B*C) A+(BC*) A(BC*)+ ABC*+ Parnteses para obter nfase Converte a multiplicao Converte a adio Forma posfixa

As nicas regras a lembrar durante o processo de converso que as operaes com a precedncia mais alta so convertidas em primeiro lugar e que, depois de uma parte da expresso ter sido convertida para posfixa, ela deve ser tratada como um nico operando. Examine o mesmo exemplo com a precedncia de operadores invertida pela insero deliberada de parnteses. ( A + B) *C (AB+)*C (AB+)C* AB+C* Forma infixa Converte a adio Converte a multiplicao Forma posfixa

Nesse exemplo, a adiao convertida antes da multiplicao por causa dos parnteses. Ao passar de ( A + B ) * C para ( A B + ) * C, A e B so os operandos e + o operador. Ao passar de ( A B + ) * C para ( A B +) C *, ( A B + ) e C so operandos e * o operador. As regras para converter da forma infixa para a posfixa so simples, desde que voc conhea as regras de precedncia. Consideramos cinco operaes binrias: adio, substrao, multiplicao, diviso e exponenciao. As quatro primeiras esto disponveis em C e so indicadas pelos conhecidos operadores +, -, * e /. A quinta oeprao, exponenciao, representada pelo operador $. O valor da expresso A $ B A elevado potncia B, de maneira que 3 $ 2 9. Veja a seguir a ordem de precedncia (da superior para a inferior) para esses operadores binrios: Exponenciao Multiplicao / Diviso Adio / Substrao Quando operadores sem parnteses e da mesma ordem de precedncia so avaliados, pressupe-se a ordem da esquerda para a direita, exceto no caso da exponenciao, em que a ordem supostamente da direita para a esquerda. Sendo assim, A + B + C significa ( A + B ) + C, enquanto A $ B $ C significa A $ ( B $ C). Usando parnteses, podemos ignorar a precedncia padro. Apresentamos os seguintes exemplos adicionais de converso da forma infixa para a posfixa. Procure entender cada um dos exemplos (e faz-los por contra prpria) antes de prosseguir com o restante deste trabalho. Forma Infixa A+B A+B-C (A+B)*(C-D) A$B*C-D+E/F/(G+H) ((A+B)*C-(D-E))$(F+G) A-B/(C*D$E) Forma Posfixa AB+ AB+CAB+CD-* AB $ C * D - E F / G H + / + AB+C*DE--FG+$ ABCDE$*/-

As regras de precedncia para converter uma expresso da forma infixa apra a prefixa so idnticas. A nica mudana da converso posfixa que o operador posicionado antes dos operadnos, em vez de depois deles. Apresentamos as formas prefixas das expresses anteriores.

Universidade Federal de Ouro Preto UFOP Instituto de Cincias Exatas e Biolgicas ICEB Departamento de Computao DECOM Disciplina: Algoritmos e Estruturas de Dados I CIC102 Professor: David Menotti (menottid@gmail.com)
Forma Infixa A+B A+B-C (A+B)*(C-D) A$B*C-D+E/F/(G+H) ((A+B)*C-(D-E))$(F+G) A-B/(C*D$E) Forma Prefixa +AB -+ABC *+AB-CD +-*$ABCD//EF+GH $-+ABCDE+FG -A/B*C$DE

Observe que a forma prefixa de uma expresso complexa no representa a imagem espelhada da forma posfixa, como podemos notar no segundo exemplo apresentado anteriormente, A + B C. De agora em diante, consideraremos somente as transformaes posfixas e deixaremos para o leitor, como exerccio, a maior parte do trablaho envolvendo a forma prefixa. Uma questo imediatamente bvia sobre a forma posfixa de uma expresso a ausncia de parnteses. Examine as duas expresses, A + ( B * C ) e ( A + B ) * C. Embora os parnteses em uma das expresses sejam suprfluos (por conveno, A + B * C = A + ( B * C )), os parnteses na segunda expresso so necessrios para evitar confuso com a primeira. As formas posfixas dessas expresses so: Forma Infixa A+(B*C) (A+B)*C Forma Posfixa ABC*+ AB+C*

No existem parnteses nas duas expresses transformadas. A ordem dos operadores nas expresses posfixas determina a verdadeira ordem das operaes, ao avaliar a expresso, tornando desnecessrio o uso de parnteses. Ao passar da forma infixa para a posfixa, abrimos mo da possibilidade de observar rapidamente os operandos associados a um determinado operador. Entretanto, obtemos uma forma no-ambgua da expresso original sem o uso dos incmodos parnteses. Na verdade, a forma posfixa da expresso orginal poderia parecer mais simples, no fosse o fato de que ela parece difcil de avaliar. Por exemplo, como saberemos que, se A = 3, B = 4 e C = 5, nos exemplos anteriores, ento 3 4 5 * + equivaler a 23 e 3 4 + 5 * equivaler a 35? Considerando o contedo exposto acima, pede para criar um programa que seja capaz de avaliar uma expresso infixa. Para criar tal programa, sugere-se, a princpio, criar uma funo que seja capaz de converter uma expresso da forma infixa para a forma posfixa. Uma vez que a expresso posfixa obtida, pode-se facilmente implementar, atravs de pilhas, um programa para avaliar a expresso posfixa, que , em essncia, equivalente a expresso infixa original. O programa a ser construdo dever, antes de avaliar a expresso infixa, verificar se a expresso sintticamente vlida. Ou seja, se o nmero de operandos, operadores e parnteses correto, alm da sua posio dentro da expresso (que pode ser representada por uma cadeia de caracteres). Por exemplo, a seguinte expresso invlida: ( 3 ( + 5 ) ), pois embora tenhamos o nmero correto de parnteses, operandos e operadores, a posio do segundo parnteses de abertura invlida. Considere que as expresses sero compostas por nmeros de um nico algarismo (ou seja, 0, 1, 2, ..., 8 e 9), as cinco operaes apresentadas anteriores, e parenteses. O programa deve detectar automaticamente a ordem de precedncia das operaes (sugesto: atravs da comparao do elemento no topo da pilha e o operador lido). Ao final, o programa dever apresentar o valor numrico da expresso avalida, por exemplo, para a expresso 3 + 5 * 14 / ( 4 + 3 ) o valor a ser apresentado ser 13.

Universidade Federal de Ouro Preto UFOP Instituto de Cincias Exatas e Biolgicas ICEB Departamento de Computao DECOM Disciplina: Algoritmos e Estruturas de Dados I CIC102 Professor: David Menotti (menottid@gmail.com)

3. Filas, Simulao
(Utilizao de Filas por meio de encadeamento ([4] apud [2]))

Objetivos Consiste em concretizar os conceitos de Filas implementadas por encadeamento atravs de uma aplicao: Simulaao de de aterrisagem e decolagem em um aeroporto. Descrio
Suponha um aeroporto que possui trs pistas, numeradas como 1, 2 e 3. Existem quatro prateleiras de espera para aterrisagem, duas para cada uma das pistas 1 e 2. Aeronaves que se aproximam do aeroporto devem integrar-se a uma das prateleiras (filas) de espera, sendo que essas filas devem procurar matner o mesmo tamanho. Assim que um avio entra em uma fila de aterissagem, ele recebe um nmero de identificao ID e outro nmero inteiro que indica a quantidade de unidades de tempo que o avio pode permanecer na fila antes que ele tenha de descer (do contrrio, seu combustvel termina e ele cai). Existem tambm filas para decolagem, uma para cada pista. Os avies que chegam nessas filas tambm recebem uma identificao ID. Essas filas devem procurar manter o mesmo tamanho. A cada unidade de tempo, de zero a trs aeronaves podem chegar nas filas de decolagem, e de zero a trs aeronaves podem chegar nas prateleiras. A cada unidade de tempo, cada pista pode ser usada para umpouso ou uma decolagem. A pista 3 em geral s usada para decolagens, a no ser que um dos avies nas prateleiras fique sem combustvel, quando ento ela deve ser imediatamente usada para pouso. Se apensar uma aeronave est com falta de combustvel, ela pousara na pista 3; se mais de um avio estiver nessa situao, as outras pistas podero ser utilizadas (a cada unidade de tempo no mximo trs avies podero estar nessa desagradvel situao). Utilize inteiros pares (mpares) sucessivos para a ID dos avies chegando nas filas de decolagem (aterrisagem). A cada unidade de tempo, assuma que os avies entram nas filas antes que aterrisagens ou decolagens ocorram. Tente projetar um algoritmo que no permita o crescimento excessivo das filas de aterrisagem ou decolagem. Coloque os avies sempre no final das filas que no devem ser reordenadas. A sada do programa dever indicar o que ocorre a cada unidade de tempo. Periodicamente imprima: a) o contedo de cada fila; b) o tempo mdio de espera para decolagem; c) o tempo mdio de espera para aterrissagem; d) o nmero de avies que aterrissam sem reserva de combustvel. Os itens b e c devem ser calculados para os avies que j decolaram ou pousaram respectivamente. A sada do programa deve ser auto-explicativa e fcil de entender. A entrada poderia ser criada manualmente, mas o melhor utilizar um gerador de nmeros aleatrios. Para cada unidade de tempo, a entrada deve ter as seguintes informaes: a) nmero de avies (zero a trs) chegando nas filas de aterrissagem com respectivas reservas de combustvel (de 1 a 20 em unidades de tempo); b) nmero de avies (zero a trs) chegando nas filas de decolagem;

Universidade Federal de Ouro Preto UFOP Instituto de Cincias Exatas e Biolgicas ICEB Departamento de Computao DECOM Disciplina: Algoritmos e Estruturas de Dados I CIC102 Professor: David Menotti (menottid@gmail.com)
O que deve ser entregue para todas as 3 partes

Cdigo fonte do programa em C ou C++ (bem identada e comentada). Documentao do trabalho. Entre outras coisas, a documentao deve conter: 1. Introduo: descrio do problema a ser resolvido e viso geral sobre o funcionamento do programa. 2. Implementao: descrio sobre a implementao do programa. Deve ser detalhada a estrutura de dados utilizada (de preferncia com diagramas ilustrativos), o funcionamento das principais funes e procedimentos utilizados, o formato de entrada e sada de dados, bem como decises tomadas relativas aos casos e detalhes de especificao que porventura estejam omissos no enunciado. 3. Estudo de Complexidade: estudo da complexidade do tempo de execuo dos procedimentos implementados e do programa como um todo (notao O). 4. Listagem de testes executados: os testes executados devem ser simplesmente apresentados. 5. Concluso: comentrios gerais sobre o trabalho e as principais dificuldades encontradas em sua implementao. 6. Bibliografia: bibliografia utilizada para o desenvolvimento do trabalho, incluindo sites da Internet se for o caso 7. Em Latex: Caso o trabalho seja elaborado/escrito em latex, ganha-se 20% de pontos extra, ou seja 0,1 pontos. 8. Formato: mandatoriamente em PDF (http://www.pdf995.com/).

Obs1: Consulte as dicas do Prof. Nvio Ziviani de como deve ser feita uma boa implementao e documentao de um trabalho prtico: http://www.dcc.ufmg.br/~nivio/cursos/aed2/roteiro/ Obs2: Veja modelo de como fazer o trabalho em latex: http://www.decom.ufop.br/prof/menotti/aedI/tps/modelo.zip (caso algum desenvolva um modelo similar em word, favor me enviar)

Como deve ser feita a entrega:


A entrega DEVE ser feita pelo Moodle na forma de um nico arquivo zipado, contendo o cdigo, os arquivos e a documentao. Como o trabalho composto de 3 partes, crie um diretrio/pasta para cada uma das partes. Tambm deve ser entregue a documentao impressa na prxima aula (terica ou prtica) aps a data de entrega do trabalho. Comentrios Gerais: Comece a fazer este trabalho logo, enquanto o problema est fresco na memria e o prazo para termin-lo est to longe quanto jamais poder estar; Clareza, identao e comentrios no programa tambm vo valer pontos; O trabalho individual (grupo de UM aluno); Trabalhos copiados (e FONTE) tero nota zero; Trabalhos entregue em atraso sero aceitos, todavia a nota atribuda ao trabalho ser zero Evite discusses incuas com o professor em tentar postergar a data de entrega do referido trabalho.

Universidade Federal de Ouro Preto UFOP Instituto de Cincias Exatas e Biolgicas ICEB Departamento de Computao DECOM Disciplina: Algoritmos e Estruturas de Dados I CIC102 Professor: David Menotti (menottid@gmail.com)
Referncias:

[1] Aaron M. Tenenbaum, Yedidyah Langsam, Moshe J. Augenstein, Estruturas de Dados Usando C, Makron Books/Pearson Education, 1995. [2] N. Ziviani, F.C. Botelho, Projeto de Algoritmos com implementaes em Java e C++, Editora Thomson, 2006. [3] F.C. Botelho, Comunicao Pessoal, Belo Horizonte, MG, Brasil,, 2003. [4] J.N.C. rabe, Comunicao Pessoal, Belo Horizonte, MG, Brasil, 1992

Anda mungkin juga menyukai