iebf
(usa Ubuntu)
Enviado em 14/03/2013 - 10:49h
Segue o código para analise
#include <stdio.h>
#define QTD_TAGS 50
#define TAM_TAG 64
//matriz que armazena as tags
int tags[QTD_TAGS][TAM_TAG];
//variáveis globais
int valor, nivel, colisoes; //colisoes por leitura
int caminho[TAM_TAG];
int total_sucessos, total_vazios, total_colisoes; //metricas
int tags_colididas[QTD_TAGS]; //a cada rodada armazena o indice das
//tags que colidiram
//prototipo das funções
int leitura();
int le_tags();
int desce_esquerda();
int desce_direita();
int sobe(int n);
void imprime_caminho();
void refaz_tags_colididas();
void gerar_tags();
int main(int argc, char **argv)
{
gerar_tags();
int i;
//inicializações
nivel = -1;
valor = 0;
total_sucessos = total_vazios = 0;
total_colisoes = 0;
colisoes = QTD_TAGS;
leitura();
printf("\nVazios.....: %d\n", total_vazios);
printf("Colisões ..: %d\n", total_colisoes);
printf("Sucessos...: %d\n", total_sucessos);
getchar();
return 0;
}
int leitura(){
if(nivel > -1){
caminho[nivel] = valor;
colisoes = le_tags();
printf("\ntags: %d caminho: ",colisoes);
imprime_caminho();
}
if(colisoes == 0){
total_vazios++;
printf("Vazio \n");
}else if(colisoes == 1){
total_sucessos++;
printf("Sucesso \n");
}else{
total_colisoes++;
printf("Colisão \n");
if(nivel+1 < TAM_TAG){
desce_esquerda();
sobe(1);
desce_direita();
sobe(1);
}
}
return 1;
}
int le_tags(){
int i, j = 0;
refaz_tags_colididas();
for(i = 0; i < colisoes; i++ ){
if(tags[tags_colididas[i]][nivel] == valor){
tags_colididas[j] = tags[i][nivel];
j++;
}
}
return j;
}
int desce_esquerda(){
nivel++;
valor = 0;
leitura();
return 1;
}
int desce_direita(){
nivel++;
valor = 1;
leitura();
return 1;
}
int sobe(int n){
nivel -= n;
}
void imprime_caminho(){
int i;
for (i = 0; i <= nivel; i++)
printf("%d", caminho[i]);
printf("\n");
}
void refaz_tags_colididas(){
int i,j,k,acerto;
k=0;
//printf("\n ---- refaz_tags_colididas ---- ");
for (i=0; i < QTD_TAGS; i++){
acerto = 0;
//printf("\ni = %d\nj = ", i);
for (j=0 ; j <= nivel; j++){
//printf("%d", j);
if(caminho[j] == tags[i][j]){
acerto++;
}else{
//printf("saiu");
break;
}
}
if (acerto == nivel+1){
//printf("\n-------------- K = %d", k);
tags_colididas[k] = i;
k++;
}
}
// printf("\nvalor de k = %d", k);
colisoes = k;
}
//código para gerador de tags
void gerar_tags(){
int vtemp[TAM_TAG];
// int tags[QTD_TAGS][TAM_TAG];
int i, j, k, l, iguais;
srand(time(NULL));
for(j=0; j < QTD_TAGS; j++ ){
for(i=0; i < TAM_TAG;i++){
vtemp[i]=(int)rand()&1;
}
if(j==0){
for(k=0; k < TAM_TAG; k++){
tags[j][k] = vtemp[k];
}
}else{
for(l=0; l < j; l++ ){
iguais = 0;
for(k = 0; k < TAM_TAG; k++){
if(tags[l][k] == vtemp[k]){
iguais++;
}
}
if(iguais == TAM_TAG){
l = j;
j--;
}else{
for(k=0; k < TAM_TAG; k++){
tags[j][k] = vtemp[k];
}
}
}
}
}
for(j = 0; j < QTD_TAGS; j++){
printf("\n");
for(i = 0; i < TAM_TAG; i++ ){
printf("%d", tags[j][i]);
}
}
}