Universidade Federal de Ouro Preto – UFOP
Instituto de Ciências Exatas e Biológicas – ICEB
Departamento de Computação – DECOM
Disciplina: Algoritmos e Estrutura de Dados I – CIC102 / 20091
Professor: David Menotti ([email protected])
Trabalho Prático 1
Revisão de Programação, Tipos Abstratos de Dados
e Combinação de Alocação Estática e Dinâmica de Memória
Valor: 0,5 pontos (5% da nota total)
Documentação em Latex: +0,1 pontos
Data de entrega: 31/03/2009
O objetivo desse trabalho é rever conceitos básicos de programação bem como explorar os conceitos de
Tipos Abstratos de Dados (TADs) e análise de complexidade.
Você deverá implementar um tipo abstrato de dados TConj para representar conjuntos de elemento
inteiros. Seu tipo abstrato deverá armazenar os dígitos do conjunto e o número de elementos n.
Considere que o tamanho máximo de um conjunto é limitado pela memória principal (você deverá usar
alocação dinâmica) e deve crescer de 10 em 10 elementos (consulte a função em C – realloc – não
será permitido o uso de encadeamento). Use arranjos unidimensionais (vetores) para implementar o
TAD. Por exemplo, considerando que o seu conjunto armazena os elementos 5, 2, 3, 9, e 1, seu TAD
deverá ter a seguinte estrutura:
Elemento
:
5
0
2
3
9
1
2
3
1
...
n
:
5
4
Lembre-se ainda que segundo a definição de conjuntos os elementos são únicos, ou seja, seu TAD deve
impedir a existência de elementos repetidos.
As operações que devem ser realizadas em seu TAD são
1. Inicializar o conjunto: cria um conjunto vazio (já com 10 elementos físicos)
void Inicializar(TConj* pA);
2. Inserir um elemento no conjunto, retornando 1 se possível e 0 se não.
int InserirElemento(TConj* pA, int elem);
3. Excluir um elemento do conjunto, retornando 1 se realizado e 0 se não.
int ExcluirElemento(TConj* pA, int elem);
4. Setar um elemento em uma posição do conjunto, retornando em 1 caso de sucesso e 0 em caso
contrário.
int SetElemento(TConj* pA, int elem, int pos);
5. Recuperar elemento de uma posição do conjunto, retornando em 1 caso de sucesso e 0 em caso
contrário.
int GetElemento (TConj A, int pos, int* pelem);
6. Testar se um elemento está presente no conjunto, retornando sua posição ou -1 se não estiver
presente
int TestarElemento (TConj A, int elem);
7. Gerar um conjunto aleatoriamente com n elementos:
TConj GerarConjunto(int n);
8. Criar um conjunto a partir de um número. Ex: o número 2537 gera o conjunto 2,5,3,7 com
Universidade Federal de Ouro Preto – UFOP
Instituto de Ciências Exatas e Biológicas – ICEB
Departamento de Computação – DECOM
Disciplina: Algoritmos e Estrutura de Dados I – CIC102 / 20091
Professor: David Menotti ([email protected])
9.
10.
11.
12.
13.
14.
n = 4.
TConj Num2Conj(int num);
Gerar um número a partir do conjunto. (Operação inversa da descrita acima)
int Conj2Num(TConj A);
Comparar 2 conjuntos, retornando 1 se são iguais e 0 se são diferentes
int Comparar(TConj A, TConj B);
Imprimir os elementos do conjunto.
void Imprimir(TConj A);
Unir os conjunto A e B, gerando um terceiro conjunto C.
TConj* Uniao(TConj A,TConj B);
Fusionar (intersecção) os elementos do conjunto A e B, gerando um terceiro conjunto C.
TConj* Inter(TConj A,TConj B);
Subtrair o conjunto A do conjunto B, gerando um terceiro conjunto C.
TConj* Subtrair (TConj A,TConj B);
Implemente o seu TAD em arquivos separados do programa principal (TConj.c e TConj.h). Se
necessário, você pode criar outras funções auxiliares em seu TAD. Suas funções devem executar testes
de consistência (por exemplo, não se pode setar um elemento na posição 8 se o conjunto foi
configurado para 4 elementos).
Uma vez criado o seu TAD, você deverá utilizá-lo em dois programas diferentes.
O primeiro é o programa de testes mostrado a seguir:
main() {
TConj a,b,c,d;
int elemento, num;
Inicializar(a);
srand(time(NULL));
for(i=0;i<20;i++)
InserirElemento(a,rand()%40);
Imprimir(a);
srand(time(NULL));
for(i=0;i<10;i++)
RemoverElemento(a,rand()%20-1);
Imprimir(a);
if (TestarElemento(a,9) == -1)
printf(“o elemento 9 não esta presente em a”);
elemento = GetElemento(a,1);
b = GerarConjunto(10);
Universidade Federal de Ouro Preto – UFOP
Instituto de Ciências Exatas e Biológicas – ICEB
Departamento de Computação – DECOM
Disciplina: Algoritmos e Estrutura de Dados I – CIC102 / 20091
Professor: David Menotti ([email protected])
num = Conj2Num(b);
c = Num2Conj(num);
if (Comparar(b,c))
else
printf(“os conjunto sao iguais\n”);
printf(“os conjunto sao diferentes\n”);
d=Unir(a,b);
Imprimir(d);
d=Inter(a,b);
Imprimir(d);
d=Subtrair(a,b);
Imprimir(d);
}
O segundo programa no qual seu TAD deve ser usado é na implementação do Jogo da Senha (por
exemplo: http://www.usinadejogos.com.br/senha.html). O jogo da senha gera um número aleatório
e deve permitir que o usuário adivinhe este número. Considere que os elementos possíveis
para este programa são os algarismos 0, 1, 2, 3, ... 9. A cada tentativa do usuário, o jogo
deverá lhe informar quantos elementos estão certos na posição certa e quantos estão certos
mas na posição errada Por exemplo:
O jogo gera o número: 5219. E o usuário joga:
Tentativa
1
2
3
4
5
6
Número
2381
4298
8267
9215
1295
5219
Resposta
02
11
10
22
13
4 0 - Você acertou em 6 tentativas.
O jogo deve permitir 4 níveis de dificuldade (fácil, difícil e teste) – o nível fácil usa senhas de
apenas 3 dígitos sem repetição, o nível difícil usa senhas de 4 dígitos sem repetição. O modo
teste é igual ao difícil, mas a senha aparece para o usuário. O número de tentativas máximo é
um parâmetro a ser solicitado do usuário. A interface do jogo pode ser completamente textual, mas
você deve utilizar o TAD criado para implementar o jogo. (Note que o seu programa principal não
poderá acessar diretamente a estrutura interna do TAD. Se necessário, acrescente novas funções
ao seu TAD detalhando-as na documentação do trabalho)
Universidade Federal de Ouro Preto – UFOP
Instituto de Ciências Exatas e Biológicas – ICEB
Departamento de Computação – DECOM
Disciplina: Algoritmos e Estrutura de Dados I – CIC102 / 20091
Professor: David Menotti ([email protected])
O que deve ser entregue
• Código fonte do programa em C ou C++ (bem identada e comentada).
• Documentação do trabalho. Entre outras coisas, a documentação deve conter:
1. Introdução: descrição do problema a ser resolvido e visão geral sobre o
funcionamento do programa.
2. Implementação: descrição sobre a implementação do programa. Deve ser detalhada
a estrutura de dados utilizada (de preferência com diagramas ilustrativos), o
funcionamento das principais funções e procedimentos utilizados, o formato de
entrada e saída de dados, bem como decisões tomadas relativas aos casos e detalhes
de especificação que porventura estejam omissos no enunciado.
3. Estudo de Complexidade: estudo da complexidade do tempo de execução dos
procedimentos implementados e do programa como um todo (notação O).
4. Listagem de testes executados: os testes executados devem ser simplesmente
apresentados.
5. Conclusão: comentários gerais sobre o trabalho e as principais dificuldades
encontradas em sua implementação.
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 0,1 pontos.
8. Formato: mandatoriamente em PDF (http://www.pdf995.com/).
Obs1: Consulte as dicas do Prof. Nívio Ziviani de como deve ser feita uma boa
implementação
e
documentação
de
um
trabalho
prático:
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/aedI091/tps/modelo.zip
(caso alguém 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
código, os arquivos e a documentação. Também deve ser entregue a documentação impressa
na próxima aula (teórica ou prática) após a data de entrega do trabalho.
Universidade Federal de Ouro Preto – UFOP
Instituto de Ciências Exatas e Biológicas – ICEB
Departamento de Computação – DECOM
Disciplina: Algoritmos e Estrutura de Dados I – CIC102 / 20091
Professor: David Menotti ([email protected])
Comentários Gerais:
• Comece a fazer este trabalho logo, enquanto o problema está fresco na memória e o
prazo para terminá-lo está tão longe quanto jamais poderá estar;
• Clareza, identação e comentários no programa também vão valer pontos;
• O trabalho é individual (grupo de UM aluno);
• Trabalhos copiados (e FONTE) terão nota zero;
• Trabalhos entregue em atraso serão aceitos, todavia a nota atribuída ao trabalho será
zero;
• Evite discussões inócuas com o professor em tentar postergar a data de entrega do
referido trabalho.
Download

Trabalho Prático 1 Revisão de Programação, Tipos - Decom