2011-04-15 1 views
1

Je dois utiliser une recherche binaire pour trouver un nom demandé dans un tableau de structures. J'ai utilisé un code d'exemple de recherche binaire qui a cherché ints et l'ai modifié pour rechercher à travers les indecies de tableau pour comparer les noms dans chaque structure. Le programme fonctionne mais le nom n'est jamais trouvé, donc quelque chose ne va vraiment pas bien quelque part. Je ne sais pas si c'est la façon dont je prends le nom du flux ou juste ma mise en œuvre de la recherche en général. Quelqu'un peut-il jeter un coup d'œil pour fournir des informations? grâceAide à la mise en œuvre de la recherche binaire de noms dans un tableau de structures

code relevent de la fonction d'entrée:

char entryName[31]; 
char discard; 
string entryNameString; 

cout << "What is the name of the entry you would like to look up?" << endl; 
cin >> entryNameString; 
cin.get(entryName, 30); 
cin.get(discard); 
findName(listLength, arrayOfStructs, entryName); 

la fonction de recherche binaire:

void findName(int listLength, contactInfo* arrayOfStructs, const char* entryName) 
{ 
    bool found = false; 
    int low = 0, high = listLength-1, mid; 

    while (!found && low <= high) 
    { 
     mid = (low + high)/2; 
     if (strcmp(entryName, arrayOfStructs[mid].contactName) == 0) 
      found = true; 
     else 
      if (strcmp(entryName, arrayOfStructs[mid].contactName) < 0) 
       high = mid - 1; 
      else 
       low = mid + 1; 
    } 

    if (found) 
    { 
     cout << arrayOfStructs[mid].contactName << endl; 
     cout << arrayOfStructs[mid].birthday << endl; 
     cout << arrayOfStructs[mid].addressInfo.streetName << endl; 
     cout << arrayOfStructs[mid].addressInfo.cityName << endl; 
     cout << arrayOfStructs[mid].addressInfo.state << " "; 
     cout << arrayOfStructs[mid].addressInfo.zipcode << " "; 
     cout << arrayOfStructs[mid].addressInfo.phoneNumber << endl; 
     cout << arrayOfStructs[mid].typeOfentry << endl; 
    } 
    else 
     cout << "NOT FOUND" << endl; 
} 

EDIT:. arrayOfstructs [] contactName est ordonnée par ordre alphabétique (par exemple .contactName = Amanda, est situé dans un index plus petit que .contactName = Zorak)

+0

Est-ce que l'exercice est ici pour écrire votre propre recherche binaire? Sinon, vous pouvez simplement utiliser 'std :: find'. –

+1

Votre tableau est trié par contactName non? –

+0

Étiquette de devoirs nécessaire? – RedX

Répondre

2

Si vous essayez d'entrer des noms séparés par des espaces, vous devez utiliser std::getline au lieu de istream::operator>>.

+0

Merci, en remplissant cin >> entryNameString; avec getline (cin, entryNameString); résolu le problème! – darko

0

Puisque vous avez également demandé des commentaires généraux. Notez que vous comparez potentiellement les mêmes chaînes deux fois pour chaque itération. strcmp renvoie si c'est moins, égal ou supérieur (-1,0,1). Vous pouvez obtenir la valeur de retour et effectuer toutes les comparaisons ultérieures avec cela ...

int result = strcmp(entryName, arrayOfStructs[mid].contactName); 
if (result == 0)    
    found = true;   
else   
    if (result < 0)    
    high = mid - 1;   
    else    
    low = mid + 1; 
Questions connexes