| | |
Recursos para a Cadeira
REFERENDO: Mudar a data do teste? Choice
Trabalho "final" Assignment
-
Sumários das aulas teóricas:- 15/2 - Apresentação da Disciplina, Método de avaliação e Datas das avaliações
- 22/2 - Análise de Complexidade temporal e Espacial. Tipo Abstracto de Dados Fila
- 1/3 - Tad árvores pretas e vermelhas (RBT), propriedades das rbts, operações: criar, pesquisa,inserir.
- 8/3
- Tad árvores pretas e vermelhas (RBT): estrutura de dados em C para
representar uma rbt, implementação da operação de inserção. Remoção na
rbt.
- 15/3 - Remoção na Rbt. Tad Trie: pesquisa, inserção e remoçãoç estrutura de dados para representar uma trie em C.
- 29/3 - Tad Trie. Tad Btree: propriedades da Btree operação de pesquisa e inserção, representação de uma btree em C.
Fórum ADA - 2004/2005 Forum
Inquérito para turnos Choice
Livro: ANSI C for Programmers on UNIX Systems (também existe na reprografia) PDF document
Livro: Debugging with GDB PDF document
Livro: The GNU C Programming Tutorial PDF document
Livro online: The C Programming Language (Kernigham & Ritchie) file
-
Avaliação da 1ª frequência file
notas 2a frequencia + 1o Exame file
notas do exame de recurso file
Teste 1 Journal
| | | | 1 |
Introdução (noções básicas de algoritmos em C)
-
ExercÃcio 1- Desenvolva, em C, um programa 'HelloWorld'.
- Crie uma função int impar(int x), que verifica se o número inteiro dado como parâmentro é Ãmpar. Utilize a seguinte função main() para testar:
int main() { int i = 3;
if (impar(i)) { printf("%d é um número Ãmpar.\n", i); } else { printf("%d não é um número Ãmpar.\n", i); } }
- Crie um procedimento void primos(int x), que mostra todos os números primos de 1 a x.
Correcção do ExercÃcio 1 zip archive
| 
| | | 2 |
TAD: Listas, Filas e Pilhas
-
ExercÃcio 2
- Altere a disciplina da fila, que é fifo (primeiro a entrar é o
primeiro a sair) para lifo (o primeiro a entrar é o último a sair).
- Implemente a operação remove(int valor), que deve remover o valor indicado da fila.
- Implemente a operação insere_apos(int valor1, int valor2), que deve inserir o valor1 após o valor2 na fila.
- Reimplemente o TAD fila usando os seguintes tipos para lista, fila:
struct lista{int val[34];} struct fila {int cabeca, cauda; struct lista l;};
Implementando a nova operação int fila_cheia(fila f) que retorna True (?o que é True em C?) quando a fila tem 34 valores.
- Reimplemente o TAD fila com as operações remove(int valor) e insere_apos(int valor1, int valor2), usando o seguinte tipo para lista:
struct lista{ int val; lista *prox; lista *ant;};
- Para cada implementação do tipo fila indique a
complexidade (função do número de elementos na fila) da sua
implementação das operações sobre o tipo fila.
NOTA: Esta semana não há exercÃcio para entregar.
| 
| | | 3 | TAD: Red-Black Trees
-
ExercÃcio 3
Considere o TAD rbt e a implementação dada na teórica (ficheiro: rbt.tgz) (rot_dir.c)
- (para fazer numa folha de papel)
Insira os seguintes valores numa rbt: 12 14 15 17 2 3 5 8 1 10;
pela ordem indicada.
Indique para cada inserção qual a rbt obtida. - Implemente a operação altura_preta de uma rbt.
teste a sua função para diferentes rbts.
- Implemente a operação maximo_rbt, que deve retornar a maior chave.
(correcção)
- Implemente a operação minimo_rbt, que deve retornar a menor chave.
- Implemente a operação lista_ord_rbt, que deve listar
os elementos por ordem crescente ou decrescente, de acordo com um
parâmetro booleano passado à função. (correcção)
- Implemente a operação é_rbt que dada uma struct rbt verifica se as 4 propriedades se verificam.
- Um nó ou é preto ou vermelho
- Uma folha (NIL) é preta.
- Se um nó é vermelho então os seus dois filhos são pretos
- Qualquer caminho de um nó a uma folha tem sempre o mesmo número de nós pretos.
(correcção)
ADA - ExercÃcio para entregar (3) Assignment
-
ExercÃcio 3.2
- (para fazer numa folha de papel)
Numa rbt vazia, insira os valores 4, 8, 2, 14, 11, 23, 30, 1 e 10.
- Na rbt anterior, remova os valores 11, 4 e 23.
- Implemente a função struct rbt *pesquisa(struct rbt *arv, int val), que devolve o nó da rbt cujo valor é val.
- Implemente a função struct rbt *sucessor(struct rbt *arv, int val), que devolve o nó sucessor do nó cujo valor é val.
ADA - ExercÃcio para entregar (3.2) Assignment
| 
| | | 4 |
TAD: B-Trees
-
ExercÃcio 4
Considere o TAD Btree e a implementação dada na teórica
(ficheiro: btree.tgz):
- Desenhe (em papel) a B-Tree de grau minimo 3 que se obtem após a inserção de
cada elemento da seguinte sequência de chaves:
8, 16, 24, 32, 64, 1, 4,
7, 3, 25, 28, 31, 27, 40, 41, 42, 43, 44, 45, 47, 49, 46, 50. - Defina a operação pesquisa que dada uma Btree e uma chave devolve true sse a chave está na Btree.
- Defina a operação máximo que dada uma Btree devolve a maior chave na Btree.
- Defina a operação num_chaves que dada uma Btree devolve o número de chaves na Btree.
- Defina a operação num_nos que dada uma Btree devolve o número de nos na Btree.
- Altere o tipo Btree e a implementação das operações de forma a que as chaves sejam strings em vez de inteiros.
ADA - ExercÃcio para entregar (4) Assignment
| 
| | | 5 | TAD: Tries
-
ExercÃcio 5
Considere o TAD trie e a implementação dada na teórica (ficheiro .tgz com a base):
- Usando papel e lápis, insira os seguintes valores numa trie: "abc", "abcde", "efg", "efgaa" e "bfg",
pela ordem indicada. Indique para cada inserção qual a trie obtida.
- Usando o papel da alÃnea anterior, remova os seguintes valores da trie: "abc" e "efgaa",
pela ordem indicada. indique para cada remoção qual a trie obtida.
- Implemente a operação remove que dada uma chave e uma trie remove a chave da trie.
Teste a sua função com as remoções da alÃnea 2.
- Implemente a função mÃnima que devolve a menor chave na trie.
Teste a sua função com as tries da alÃnea 1.
- Implemente a operação pesquisa, que dada uma chave devolve true se ela está na trie, false senão.
Teste a sua função para as diferentes tries da alÃnea 1.
- Implemente a operação próxima, que dada uma chave devolve a próxima chave na trie (ordem alfabética).
- Suponha que além de palavras gostaria de guardar num dicionário as linhas onde as palavras ocorrem.
- Altere o tipo trie, e a função insere para inserir uma chave e a
linha onde ocorre (note que uma palavra pode ocorrer em várias linhas).
- Altere a função lista_ord para listar as palavras por ordem alfabética e as linhas onde a palavra ocorre.
- Defina a operação palavrasNaLinha que dada uma linha lista todas as palavras que ocorrem na linha.
ADA - ExercÃcio para entregar (5) Assignment
| 
| | | 6 |
Pattern Matching
-
ExercÃcio 6
- Defina um função em C que implemente o algoritmo ingénuo para verificação de coincidência de padrões (naive search).
- Faça um programa que indique quantas vezes e em que shifts ocorre um padrão p na string t.
ex: p=''123123'' t=''123456712123123123124123123'' p ocorre 3 vezes em t em: 9,12 e 21.
- Defina uma função em C que implemente o algoritmo Rabin-Karp.
- Desenhe os autómatos finitos que reconhecem os seguintes padrões (e
construa as funções de transição), para o vocabulário {a,b,c,d}:
- p=''aaaaa''
- p=''ababa''
- p=''abcddcba''
- Defina uma função em C que dado um padrão (uma string), e
um vocabulário constrói a função de transição do autómato finito que
reconhece o padrão.
- Defina em C uma função que dado um padrão e um texto (duas
strings) usa um autómato finito para encontrar o shift do padrão no
texto.
| 
| | | 7 | Grafos
| 
| | | This topic 8 | Códigos de Huffman
-
ExercÃcio 8
- Construa a árvore de Huffman e a tabela de códigos para o texto seguinte:
``O rato roeu a rolha da garrafa do rei do russia''
- Codifique o texto de acordo com a sua tabela.
- Qual a Coeficiente de compressão do texto?
(Q
) nota: junto com o texto codificado tem que guardar a árvore de huffman.
- Qual é a taxa de compressão do texto? (
)
- Para construir a árvore de huffman é necessário construir uma tabela de frequências dos simbolos no texto.
Faça uma função que leia o texto do stdin e construa a tabela de
frequências sabendo que o texto pode conter qualquer simbolo do código
ascci.
Use a seguinte tabela:
int freq[256];
- Defina
uma função para construir a árvore de huffman a partir da tabela de frequencias (
int freq[256];).
Pode usar o seguinte tipo para representar a árvore de huffman:
struct ab{ int freq; char s; struct ab *esq; struct ab *dir; };
Nota: Cada simbolo com frequência diferente de 0 deve ser introduzido, por exemplo num vector (ex: struct tabela codigos[256];)
ordenado (decrescente) pela frequência do simbolo. A sua função deve
retirar as árvores com menor frequência e juntá-las numa e inserir a
nova árvore na estrura ordenada (ex:vector). Este procedimento deve ser
repetido até só existir uma árvore na estrutura. - Defina uma função que dada uma árvore de huffman constrói
uma tabela com os códigos dos simbolos do texto. Pode usar a seguinte
estrutura para representar a tabela:
struct tabela{char *codigo; int numbits;};
struct tabela codigos[256];
- Defina uma função que dada uma tabela com os códigos de
huffman e uma string com o texto a codificar escreve no stdout o código
da string de acordo com a tabela.
Nota: para fazer um shift para a esquerda basta multiplicar por 2 ou usar o operador <<
ex:
unsigned char x=1; /* x=0000 0001 em binário*/ x=x*2; ou x = x <<1; /* x=0000 0010 em binário*/
Se a codificação do seu texto não for um multiplo de 8 não se
preocupe, apesar de no stdout só poder escrever palavras com um minimo
de 8 bits.
- Defina a uma função que dada uma árvore de huffman a
escreve no stdout de forma a que possa ser reconstruÃda quando for lida
por outro programa.
| 
| |
| |