2010-05-14 7 views
2

Au cours des derniers mois, je l'ai toujours été chemine lentement mais sûrement à C++, et j'ai rencontré un accroc que j'ai sens à comprendre. J'ai essayé de demander/lire/chercher, mais je n'ai jamais trouvé de réponse appropriée. Peut-être que c'est simplement parce que la question est difficile à poser.En comparant l'entrée de C avec tableau des valeurs

Ce que je suis en train de faire est à la fin de mon programme, ont la séquence de fin comparer la valeur d'entrée avec des valeurs dans un tableau. Dois-je boucler une séquence de comparaison? Y a-t-il un moyen plus simple de contourner cela?

#include <iostream> 
#include <string> 
using namespace std; 

int main() { 

    string YesAnswers[5] = {"Y", "YES", "yes" "y"}; 
    string Name; 
    string YN; 

    do { 
     cout << "Enter your name: "; 
     getline(cin, Name); 

     cout << "Your name is "<< Name; 

     cout <<"\nIs this correct? Y\N: "; 
     cin >> YN; 

    } while(YN == YesAnswers); 

    system("Pause"); 
    return 0; 
} 
+2

Notez que, alors que vous avez déclaré 'YesAnswers' comme ayant cinq éléments, vous attribuez seulement quatre cordes à elle. Aussi, vous bouclez aussi longtemps que l'utilisateur donne une réponse affirmative, qui je crois est le contraire de votre comportement prévu (je pourrais me tromper). –

+1

D'ailleurs, vous pouvez juste laisser la taille si vous l'initialisez là: 'string YesAnswers [] = {" Y "," YES "," yes "," y "}; –

Répondre

4

Vous pouvez utiliser std::find() de <algorithm>:

while (std::find(YesAnswers, YesAnswers + 4, YN) != YesAnswers + 4); 

Ou, si vous deviez faire YesAnswers un vector ou un autre récipient au lieu d'un tableau:

std::vector<std::string> YesAnswers; 

while (std::find(YesAnswers.begin(), YesAnswers.end(), YN) != YesAnswers.end()); 

std::find() cherche des un élément dans une plage; s'il trouve l'élément, il renvoie un itérateur (ou un pointeur, dans le cas d'un tableau) à l'élément trouvé; s'il ne trouve pas l'élément, il renvoie un itérateur (ou un pointeur) à la fin de la plage.

Notez que, comme la plupart (tous?) Des algorithmes de la bibliothèque standard, la gamme est fermé au début, mais ouvert à la fin. C'est-à-dire que l'itérateur/pointeur "fin" doit pointer sur l'élément un-passé-la-fin.

0

Vous pouvez utiliser un std::set. Les ensembles sont commandés et sont donc plus rapides à trouver des choses qu'un std::vector pour un grand nombre d'éléments, mais dans votre cas, vous n'en avez que 4, donc cela fait probablement peu ou pas de différence. Depuis les ensembles sont conçus pour regarder les choses rapidement, ils ont effectivement leur propre membre find de sorte que vous n'avez pas besoin d'utiliser std::find. Donc, définir YesAnswers comme

set<string> YesAnswers; 
YesAnswers.insert("Y"); 
YesAnswers.insert("YES"); 
//... and so on 

puis vérifiez YN avec

YesAnswers.find(YN) != YesAnswers.end() 

Je pense toujours la réponse de @ James est mieux pour vos besoins bien que vous pouvez garder YesAnswers comme un tableau avec son initialisation d'une ligne comme contrairement aux insertions multi-lignes pour un ensemble.

0

En cas général, si vous voulez trouver si une valeur est un membre d'une collection, vous devez boucle ou utiliser certaines fonctions de l'algorithme ou un membre de collection que d'autres réponses suggèrent.

Dans votre cas, il n'y a que quatre possibilités, donc théoriquement vous pouvez simplement vérifier tous explicitement dans une condition à l'aide logique OU (opérateur ||).

La meilleure solution pour votre problème particulier à mon avis, est de prendre une entrée de l'utilisateur, le convertir en majuscules (vérifier par exemple here comment) et le comparer avec seulement deux chaînes "Y" ou "OUI ".

0

Quelques choses: Vous pouvez déclarer des variables du même type sur la même ligne, par exemple:

Nom de chaîne

, YN;

Vous pouvez réellement déclarer un booléen, initialisé à True pour votre boucle et changer False donné un ensemble de conditions.** (C++ traite toute valeur non-0 comme True et 0 comme False, donc vous pouvez réellement utiliser un Integer comme valeur booléenne si vous le souhaitez.)

Bool IsYourName = True;

faire {

...

IsYourName = False;

for (int i = 0; i < YesAnswers.size(); i ++)

if (YN == YesAnswers[i]) 

    IsYourName = True; 

}

while (IsYourName);

C'est une autre façon de penser à approcher la boucle

Questions connexes