Vous êtes sur la page 1sur 6

SCC0201/601 (Introduo Cincia de Computao II)  Prof. Moacir P.

Ponti Junior

Trabalho 08
Implemente sua atividade sozinho sem compartilhar, olhar cdigo de seus colegas, ou buscar na Internet. Esse trabalho necessita de tempo para ser implementado. Comece a pensar e trabalhar nele o quanto antes.

Aplicao de tabela hash na criao de um contador de ocorrncias de palavras


Seu programa ir utilizar uma tabela hash com encadeamento para contar o nmero de ocorrncias de palavras em um arquivo de entrada. cada palavra: 1. Realizar busca na tabela hash 2. Se a palavra no existe na tabela, insira a palavra com o valor de 1 ocorrncia. Nesse caso voc dever criar um novo n e lig-lo uma posio da tabela hash. 3. Se a palavra j existe na tabela, incremente o valor de ocorrncia e no crie um novo n. O algoritmo bsico executa, para

Maisculas e minsculas:
culas. representam a mesma palavra.

o programa no deve ser sensvel maisculas e mins-

Dever considerar , por exemplo, que as palavras:

Hash, HASH, hash e HasH,


1

A escolha de m:
m

a tabela dever armazenar no mximo

100.000

palavras diferentes

da lingua inglesa, cada uma com no mximo compartimentos

45

caracteres . Para escolher o nmero de

em tabelas hash com encadeamento considerada uma boa prtica

(CORMEN et al, 2002; SEDGEWICK, 1998) dividir o nmero mximo de elementos por 5 ou 3 e tomar um nmero primo prximo do resultado.

A funo hash:

programe uma funo hash e o mapeamento de compresso conforme

achar melhor.

Em aula foram apresentadas vrias funes diferentes que podem ser o programa dever manter cada lista encadeada ordenada

utilizadas nesse caso.

As m listas encadeadas:

alfabeticamente pela palavra. Voc poder escolher como realizar essa ordenao. Isso ser importante para obter a sada (ordenada) posteriormente. arquivo que possuam: alfabtica.

A sada (resultado): a sada do programa ser composta de todas as palavras no 3 ou mais caracteres e 3 ou mais ocorrncias no texto, uma
A sada dever estar em ordem

por linha, com a contagem logo a seguir da palavra.

A maior palavra da lngua inglesa a constar num dicionrio

pneumonoultramicroscopicsilicovolcano-

coniosis,

com 45 letras. Essa palavra foi inventada em 1935 propositalmente para ser a maior palavra

em ingls. Por isso 45 ser o limite nesse trabalho.

Entrada
A entrada ser composta por um arquivo texto contendo uma srie de palavras em ingls conforme descrito na seo anterior. Palavras vlidas para contagem sero aquelas compostas por 3 ou mais caracteres separados por: aspas simples, espaos em branco, parnteses, sinais de maior e menor, e pontuao, ou seja: Exemplo de arquivo texto:

' .

, ; :

? ( ) < >.

In computer science, a hash table or hash map is a data structure that uses a hash function to map identifying values, known as keys, to associated values (e.g., map a name into a telephone number). Thus, a hash table implements an associative array. The hash function is used to transform the key into the index (the hash) of an array (table) element.
Aps a informao do arquivo texto a entrada composta de operaes na tabela hash. H quatro tipos de operaes:

search, count,

max.
Exemplo:

search

deve ser seguido por uma palavra a consultar e o programa dever gerar

como sada a palavra seguida da frequncia dessa palavra no texto.

search array.
count
deve ser seguido por um nmero inteiro e o programa dever retornar todas as palavras com aquela contagem, em ordem alfabtica seguida da sua frequncia. Exemplo:

count 3. max:
seguido da palavra com

max

no possui nenhum parmetro, e deve retornar

a maior frequncia e sua frequncia.

delete deve ser seguido por uma palavra e o programa dever apenas remover essa
palavra da tabela. Sero mostrados exemplos de sada na prxima seo. Exemplo de entrada aps o arquivo:

search map search into search or count 3 max delete array search array

Sada
A sada ser composta, incialmente pela impresso das palavras (em ordem alfabtica) que atendam aos requisitos denidos na seo anterior seguido por um espao em branco

e pela contagem das suas ocorrncias, uma por linha. Exemplo de lista impressa aps aleitura do arquivo:

hash 6 map 3 table 3 the 4


Essa sada dever ser exibida aps a leitura do arquivo texto fornecido. A seguir, o programa dever gerar os resultados das consultas. Exemplo de sada aps as consultas feitas na entrada acima:

map 3 into 2 or 0 map 3 table 3 max: hash 6 array 0


Uma palavra que no apareceu na lista inicial, pode aparecer na consulta. No entanto, se a palavra no tenha ocorrncias vlidas dever ser gerado como sada o valor

0.

Note

que, no exemplo, a palavra into, apesar de possuir quatro caracteres, no foi impressa na primeira lista completa, pois aparece apenas 2 vezes no texto, mas ao ser consultada o programa exibiu a palavra com valor

2.

J a palavra or no foi computada pois no Assim

possui o mnimo de trs caracteres e por isso no dever mostrar ocorrncias. como array que foi deletada antes da consulta.

Ser fornecido o conjunto de arquivos relativo ao exemplo descrito nesse texto. No havero casos de teste adicionais disponveis. Os alunos devero criar seus prprios casos de teste para vericar a corretude do programa.

Planejamento para desenvolver


Essa apenas uma sugesto, o aluno est livre para implementar na ordem que melhor desejar ou considerar mais eciente. 1.

Leitura e tratamento da entrada,


as operaes.

incluindo a leitura completa do arquivo

de texto, sem armazenar a contagem de palavras, apenas ler corretamente cada palavra no arquivo e depois cada comando na consulta, inicialmente sem realizar

2.

Implementao da contagem de palavras, armazenando numa lista encadeada


todas as palavras, sem tabela hash.

3.

Implementao da tabela hash,

escolhendo o tamanho da tabela e funo

hashing, com insero das palavras de forma ordenada e consulta. 4. 5.

Implementao da impresso inicial, gerando as sadas completa e ordenada. Implementao das operaes de consulta, tratando cada comando possvel.

Instrues e observaes
O projeto ser avaliado principalmente levando em considerao: 1. Processamento correto das entradas e sadas do programa; 2. Realizao das tarefas descritas; 3. Bom uso das tcnicas de programao (estruturas de controle, memria, funes, etc.); 4. Bom uso de estruturas de dados e algoritmos (escolha dos algoritmos e seus parmetros, estruturas de dados, etc.); 5. Boa endentao, clareza do cdigo e uso de comentrios relevantes.

Sobre a avaliao
1. Um dos objetivos da disciplina de ICC2 o aprendizado individual dos conceitos de programao. A principal evidncia desse aprendizado est nos trabalhos, que so individuais neste curso. Voc dever desenvolver seu trabalho sem copiar trechos de cdigo de outros alunos, nem codicar em conjunto. Portanto, compartilhem idias, solues, modos de resolver o problema, mas no o cdigo. O plgio vai contra o cdigo de tica da USP. Quando autores e copiadores combinam, esto ludibriando o sistema de avaliao.

O trabalho em grupo e a cooperao entre colegas em geral benco e til ao aprendizado. Para ajudar um colega voc pode lhe explicar estratgias e idiar. Por exemplo, pode explicar que preciso usar dois loops para processar os dados, ou que para poupar memria basta usar uma certa estrutura de dados, etc. O que voc no deve fazer mostrar o seu cdigo. Mostrar/compartilhar o cdigo pode prejudicar o aprendizado do seu colega:

 

depois de o seu colega ter visto o seu cdigo, ser muito mais difcil para ele imaginar uma soluo original e prpria; o seu colega no entender realmente o problema: a compreenso passa pela prtica da codicao e no pela imitao/cpia.

Um colega que tenha visto a sua soluo pode eventualmente divulg-la a outros colegas, deixando voc numa situao muito complicada, por tabela.

O texto acima foi baseado e adaptado da pgina

~mac2166/plagio/,

http://www.ime.usp.br/

da qual recomendo a leitura completa.

2. Todos os cdigos fontes sero comparados por um (ou mais) sistema(s) de deteco de plgio, e os trabalhos com alta similaridade detectada tero suas notas zeradas, tanto aqueles relativos ao cdigo de origem quanto do cdigo copiado. 3. A avaliao incluir a porcentagem de acertos vericada pelo SQTPM e tambm a anlise do seu cdigo, incluindo endentao, comentrios, bom uso da memria e prticas de programao. Portanto faa seu cdigo com cuidado, da melhor forma possvel.

Sobre o sistema de submisso (SQTPM)


1. Seu cdigo dever ser submetido num arquivo fonte .c. Esse arquivo dever obrigatoriamente conter no incio um comentrio com seu nome, nmero USP, turma e data da entrega do trabalho. 2. A compilao do cdigo feita pelo comando:

gcc -o prog proc.c -lm -Wall


3. A sada do seu programa deve ser exatamente igual sada esperada, incluindo: espaos em branco, quebras de linha e preciso decimal. 4. H um limite de 15 segundos para a execuo dos casos de teste e um limite de 16.5MB de memria total para ser utilizada. Voc dever gerenciar bem o tempo de execuo e o espao ocupado para que seu programa que dentro desses limites, para evitar uso excessivo, pois o sistema ir invalidar o caso em que o limite foi excedido. 5. Ao enviar, aguarde um pouco mais de 30 segundos, sem recarregar a pgina nem pressionar ESC, para obter a resposta. Caso demore muito mais para dar uma resposta, reinicie o navegador, e tente novamente. Verique se seu programa tem algum problema de entrada de dados (no est lendo todos os dados), se tem algum loop innito ou parada para pressionamento de tecla (getch()

system(PAUSE)).

getchar()

Caso no tenha, aguarde alguns minutos e tente novamente.

6. O erro de Violao de Memria signica acesso indevido memria ou arquivo. Use compilao com cdigo com erro. Exemplo 1 de violao de memria:

-g

e o programa

valgrind

para tentar detectar a linha de

char *array = (char *)malloc(sizeof(char) * N); scanf("%s", &filename); // acesso indevido, violacao de memoria free(array);

Exemplo 2 de violao de memria:

int **mat = (int **)malloc(sizeof(int *) * 3); mat[0] = (int *)malloc(sizeof(int)*10); for (i = 1; i < 3; i++) { // apenas a posicao 0 de mat foi alocada as outras nao // portanto esta liberando regiao nao alocada // gerando violacao de memoria free(mat[i]); }

Exemplo 3 de violao de memria:

int A[N]; int B[N]; int j = 0, i = 5; while (j < N){ A[i] = B[j]; // como j e i sao indices diferentes j++; // quando j = (N-1) i = (N-1)+5 e i++; // havera escrita indevida em A }

Vous aimerez peut-être aussi