← Desenvolvimento

Duvida em C

Lida 1002 vezes

Offline

WolfmanZ 
Membro
Mensagens 2 Gostos 0
Troféus totais: 14
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Level 3 Level 2 Level 1 First Post Karma Sixth year Anniversary Fifth year Anniversary


O trabalho consiste em: comparar as strings e ver contar os caracteres diferentes e se for igual a n imprime e depois volta a meter diferentes=0 e passa para a linha seguinte ate encontrar n_top!

O programa nao me está a fazer bem a soma dos diferentes chega a um e passa logo ao if e nao queria isso!

Código: [Seleccione]
while(n_top != counter || n<tam_str){  // n_top quantos quer procurar  ; n=nº de vezes que fazes o ciclo while
     n++;
        for(i=0; i<linhas-1; i++){        // isto vem da leitura de um ficheiro que tem varias linhas e que cada linha tem 2048 caracteres so com "0" e "1"
                 for(k=0; k<2048-tam_str; k++)    // percorrer  linha-a - linha
                 {
                          for(j=0; j<tam_str, j++){                                  //comparar a string e contar o numero de caracteres diferentes 
                                 if(x[i].assinatura[k+j] != asi_bio[j]){
                                                         diferentes++;
                                 }
                          }
                          if(diferentes==n){
                          cont2++;
                          diferentes=0;
                          if(cont2 < n_top-cont+1){
                          printf("\n%s\t ( Distancia %d )\t %d\n",x[i].bi,n,i+1);   // imprime a linha
                          i++;
                          }
                          else{
                          break;
                          }
                          }
                          else{
                               
                          }
                 }                                 
        }
    counter=cont+cont2;
    }
Offline

kaydara 
Membro
Mensagens 616 Gostos 1
Feedback +1

Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 500 Posts 100 Posts

eu até te ajudava mas preferia que pusesses o enunciado completo e de forma a poder compreender o pretendido e já agora o resto do teu código
Offline

WolfmanZ 
Membro
Mensagens 2 Gostos 0
Troféus totais: 14
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Level 3 Level 2 Level 1 First Post Karma Sixth year Anniversary Fifth year Anniversary

enunciado:  http://www.di.ubi.pt/~hugomcp/progAlg/enunciadoTrabPratico_10_11.pdf

Código: [Seleccione]
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct{
        char bi[9];
        char assinatura[2049];
}PESSOA;


void menu1(PESSOA *x);
void leitura_Ficheiro(PESSOA *x);
void menu2(PESSOA *x, unsigned long int linhas, unsigned long int tam_file);
void pesquisa(PESSOA *x, unsigned long int linhas, unsigned long int tam_file);

int main()
{
    PESSOA *x = NULL;
    menu1(x);
    scanf(" ");
}

void menu1(PESSOA *x)
{
     int i,escolha;
     for(i=0;i<40;i++)
                      printf("*");
                      printf("\n");
                      printf("\nMENU-DANGER_DB\n\n");
     for(i=0;i<40;i++)
                      printf("*");
                      printf("\n");
                      printf("\n1:Leitura de ficheiro\n\n2:Exit\n\n");
     for(i=0;i<40;i++)
                      printf("*");
                      printf("\n");
     
     printf("\nIntroduza o valor correspondente ao que quer fazer no menu:\n\n");
     scanf("%d",&escolha);
     
     switch(escolha){
                     
     case 1:
leitura_Ficheiro(x);
break;
     case 2:
break;
     default:
printf("\nOpcao inexistente!\n\n");
menu1(x);
    break;
     }     
}


void leitura_Ficheiro(PESSOA *x)
{
     FILE *fp;
char path[200+1];
     unsigned long int tam_file, linhas=0, line=0;
int i=0;


puts("\nIntroduza o Caminho para o Ficheiro:\n");
scanf("%s", path);

/*Abrir Ficheiro */
fp = fopen(path, "r");

/* Verifica se a abretura foi feita com sucesso */

if (fp == NULL)
    printf("\nImpossivel abrir o ficheiro %s !!\n",path);
else
{
    printf("\nFicheiro %s aberto com sucesso!!!\n\n",path);
   
   
    if(!fseek(fp,0,SEEK_END)){
tam_file = ftell(fp);
            }

else{
printf("\nErro a calcular tamanho do ficheiro...\n\n");
        } 

linhas=tam_file/2058;
             
x = (PESSOA *) malloc(linhas*sizeof(PESSOA));

if(x == NULL)
printf("\nErro de memoria...\n\n");

else{
rewind(fp);
 
        while(!feof(fp)){
                          fgets(x[line].bi, 9, fp);
                          fgetc(fp);
                          fgets(x[line].assinatura, 2049,fp);
                          fgetc(fp);
                          line++;
                          }   
           
            fclose(fp);   
        }
            menu2(x, line, tam_file);
free(x);
}
}

void menu2(PESSOA *x, unsigned long int linhas, unsigned long int tam_file)
{     
     int i,escolha;
     for(i=0;i<40;i++)
                      printf("*");
                      printf("\n");
                      printf("\nMENU-DANGER_DB\n\n");
     for(i=0;i<40;i++)
                      printf("*");
                      printf("\n");
                      printf("\n1:Leitura de ficheiro\n\n2:Pesquisa de Assinatura Biométrica\n\n3:Exit\n\n");
     for(i=0;i<40;i++)
                      printf("*");
                      printf("\n");
     
     printf("\nIntroduza o valor correspondente ao que quer fazer no menu:\n\n");
     scanf("%d",&escolha);
     
     switch(escolha){
     case 1:
leitura_Ficheiro(x);
break;
     case 2:
pesquisa(x,linhas, tam_file);
break;
     case 3:
break;
     default:
printf("\nOpcao inexistente!\n\n");
menu2(x,linhas, tam_file);
    break;
     }     
}

void pesquisa(PESSOA *x, unsigned long int linhas, unsigned long int tam_file)
{
     int n_top, cont=0, cont2=0, counter=0, i, tam_str, j=0, k, n=0;
     char asi_bio[2049], ass[2049];
     int diferentes = 0, dif=0;
     
typedef struct{
        int lines[];
}RESULTADO;
     
     RESULTADO y;
     fflush(stdin);

printf("\nQual o n numeros de n-matches:\n");
     scanf("%d", &n_top);
     printf("\nIntroduza um valor:\n");
     scanf("%s", asi_bio);

     for(i=0; i<linhas-1; i++){
     if(strstr(x[i].assinatura,asi_bio)){
     cont++;
     if(cont!=n_top)
     printf("\n %s \t(Distâncias 0)\t%d\n",x[i].bi,i+1);
     else break;
     }
     }
     
     printf("\n%d\n\n",cont);
     
     tam_str=strlen(asi_bio);
     printf("%d",tam_str);
     
     while(n_top != counter || n<tam_str){
     n++;
        for(i=0; i<linhas-1; i++){
                 for(k=0; k<2048-tam_str; k++)
                 {
                          for(j=0; j<tam_str; j++){
                                 if(x[i].assinatura[k+j] != asi_bio[j]){
                                                         diferentes++;
                                 }
                          if(diferentes==n){
                          cont2++;
                          diferentes=0;
                          if(cont2 < n_top-cont+1){
                          printf("\n%s\t ( Distancia %d )\t %d\n",x[i].bi,n,i+1);
                          i++;
                          }
                          }
                          }
                 }                                 
        }
    counter=cont+cont2;
    }   
   
    printf("\n%d",counter);
                 
     free(x);
}

isto é para amanha  a noite se conseguisses dar uma ajuda agradecia