2010-12-09 23 views
1

J'ai donc un fichier d'entrée. Il se compose de 40 numéros. Les 20 premiers nombres sont entrés dans un tableau (j'ai vérifié ceci, ils sont réellement là). Je ferme ensuite et rouvre le fichier d'entrée. Je compare les 20 premiers nombres dans le fichier d'entrée contre mon tableau en utilisant la recherche séquentielle. Cela signifie qu'ils devraient tous avoir du succès. Je compare ensuite les 20 nombres suivants aux nombres dans mon tableau, ils devraient tous être des recherches infructueuses. Mon tableau n'est pas trié à ce stade.C++ Recherche séquentielle ne trouvant pas le dernier élément

Le problème que je rencontre est que le dernier nombre de succès n'est jamais trouvé en utilisant séquentiel. Je ne suis pas sûr de savoir comment résoudre ce problème.

est ici la fonction de recherche séquentielle:

length = 19; 

void Search::sequential(ItemType item, bool& found) 
{ 
    int place = 0; 
    while (place < length && item != list[place]) 
    place++; 
    found = (place < length); 
} 

Et voici mes boucles avec succès/échec

outFile << "\n\n ************Sequential Successful ********** \n"; 
outFile << endl << "ID" << endl; 

inFile >> num; 
for(int i=0; i<=length && inFile; i++) 
{ 
    search.sequential(num, found); 
    if (found) 
    outFile << num << endl; 

    inFile >> num; 
} 


//sequential unsuccessful 
outFile << "\n\n ************Sequential unsuccessful ********** \n"; 
outFile << endl << "ID" << endl; 

for(int i=0; i<=length && inFile; i++) 
{ 
    search.sequential(num, found); 
    if (!found) 
    outFile << num << endl; 

    inFile >> num; 
} 

Cependant, ma sortie est:

************Sequential Successful ********** 

ID 
1111 
3352 
4567 
5678 
6789 
7890 
8901 
9012 
1223 
2113 
8546 
2374 
4723 
9573 
3284 
7474 
8594 
3589 
5858 
//THERE SHOULD BE 1925 HERE BUT THERE ISN'T 

    ************Sequential unsuccessful ********** 

ID 
9456 
3584 
2222 
4319 
4477 
5710 
5497 
1502 
1599 
1504 
1506 
9943 
8833 
9944 
6678 
5555 
5660 
9911 
6130 
1613 

Si je supprime la "Si (trouvé)" déclaration tout fonctionne parfaitement, mais comment puis-je contourner cela sans enlever cela?

Merci à l'avance

--------------- --------------- modifier

D'accord, quand je changé la longueur à 20, il ne semblait toujours pas fonctionner. Je suis tellement perdu.

Voici où je crée le tableau

inFile >> num; 
for (int i=0; i<length && inFile; i++) 
{ 
    search.addToList(num); 
    inFile >> num; 
} 

et voici la fonction addToList

void Search::addToList(ItemType num) 
{ 
    if (index < length) //ive tried taking out this statement just to see if it makes a difference and it didn't 
    { 
    list[index] = num; 
    index++; 
    } 
} 

I initialize index 0 dans le constructeur

Voilà comment je déclare le tableau

ItemType list[length]; 

IL FONCTIONNE !!!! Merci beaucoup à vous tous! Je l'apprécie vraiment beaucoup.

+1

Vous ne vous imprimez tableau incorrecte: dans sa forme actuelle, vous imprimez des éléments après la fin réelle du tableau. J'utilise habituellement 'for (int i = 0; i Lars

+0

Oui, cela montre que mon tableau contient les valeurs correctes, merci. –

+1

Première chose: déclarer votre tableau de cette façon donne un tableau de 19 éléments (index 0 à 18). Si vous voulez déclarer un tableau de 20 éléments (index 0 à 19), vous devez supprimer le moins 1. – Kipotlov

Répondre

3

Il y a 2 solutions: longueur doit obtenir 20 en tant que valeur

length = 20; 

ou utilisation "< =" au lieu de "<" (dans ce cas "longueur" devrait être nommé "lastIndex")

void Search::sequential(ItemType item, bool& found) 
{ 
    int index = 0; 
    while (index <= length && item != list[index]) 
    index++; 
    found = (index <= length); 
} 
+0

J'ai essayé mais cela ne semble pas fonctionner encore. Je pense qu'il doit y avoir quelque chose qui ne va pas ailleurs dans mon code. Merci pour l'entrée, c'est apprécié –

+0

Si cela ne fonctionne toujours pas avec ce changement, montrez-nous plus de votre code, à savoir la définition de tableau et la boucle d'entrée. – Lars

+0

Je ne sais pas si vous recevez un message lorsque je modifie mon message, donc il est mis à jour. –

0

Regardez votre fonction de recherche, quelle valeur aura l'indice lorsque vous essayez de trouver le 20e numéro?

0

Si vous avez 20 numéros, pourquoi définir la longueur à 19? C'est très contre-intuitif.

0

Problème classique de type "off-by-one". Voir la réponse de @ Kipotlov pour les corrections de code.

0

INDEX SEQUENTIAL RECHERCHE UTILISATION C

ce code fonctionne pour tous les cas à savoir si nous trouvons le dernier élément dans un tableau ce code fonctionnera ...

#include<stdio.h> 
void main() 
{ 
    int d[100],kin[20],pin[20],temp,k,i,j=0,n,n1=0,start,end; 
    printf("Enter the number of elements:"); 
    scanf("%d",&n); 
    for(i=0;i<n;i++) 
    scanf("%d",&d[i]); 
    printf("Enter the number to be searched:"); 
    scanf("%d",&k); 
    for(i=0;i<n;i+=3) 
    { 
    kin[n1]=d[i]; 
    pin[n1]=i; 
    n1++; 
    } 
    if(k < kin[0]) 
    { 
    printf("element not found"); 
    exit(0); 
    } 
    else 
    { 
    for(i=1;i<=n1;i++) 
     if(k < kin[i]) 
     { 
     start=pin[i-1]; 
     end=pin[i]; 
     break; 
     } 
     else 
     { 
     start=n1; 
     end=n-1; 
     } 
    } 
    for(i=start;i<=end;i++) 
    { 
    if(k==d[i]) 
    { 
     j=1; 
     break; 
    } 
    } 
    if(j==1) 
    printf("element found at position %d",i); 
    else 
    printf("element not found"); 
}