2009-11-02 5 views
2

Je travaille actuellement sur quelques exercices dans un livre C++, qui utilise des jeux de texte comme outil d'enseignement. L'exercice sur lequel je suis bloqué consiste à faire en sorte que le pc sélectionne un mot parmi un ensemble de mots const (cordes), en mélangeant les lettres et en demandant au joueur de deviner le mot. C'était facile, mais comme le suivant, le livre demande d'ajouter une option permettant de donner un indice au joueur pour l'aider à deviner, d'abord sous la forme d'un tableau parallèle (pas de problème), puis sous la forme d'un tableau bidimensionnel. C'est là que je suis coincé. Mon (raccourci) tableau de mots est la suivante:initialisation d'un tableau multidimensionnel const en C++

const string WORDS[NUM_WORDS] = {"wall", "glasses"}; 

Je dois fournir une indication pour chacun de ces mots, mais ne savez pas comment s'y prendre. Postant cela à partir d'un téléphone si googling si vaste n'est pas une option!

Mon réseau parallèle est la suivante:

const string HINTS[NUM_WORDS] = "brick...", "worn on head"}; 

juste besoin de combiner les deux.

Merci à l'avance, Barry

Répondre

13

vous pourriez faire le tableau 2d? Je ne sais pas si la syntaxe est bonne, mais j'espère que vous obtenez le concept.

C'est un tableau dans un autre tableau. EDITED: J'ai supprimé NUM_WORDS du premier crochet. vous ne pouvez pas déclarer multi array multidimensionnel à partir de variables .. désolé j'ai oublié à ce sujet. Je viens de le tester et ça marche.

0

hein ... peut-être vous devriez utiliser struct paire?

std::pair<std::string, std::string> WORDS[10] = { make_pair("wall", "brick"), 
                make_pair("glasses, worn") } 

maintenant, vous pouvez utiliser des mots [i] .first - comme le mot inconnu

et des mots [i] .SECOND comme indice.

+0

ou peut-être vous avez juste besoin de vôtre utiliser des tableaux et même index: mot = MOTS [ i], hint = HINTS [i] Je ne comprends pas vraiment la question – f0b0s

+0

vous pourriez également envisager un vecteur de paires de chaînes, ce qui peut faciliter le codage et réduire les bugs. std :: vecteur > Notez l'espace entre le>> à la fin là. L'initialisation en utilisant une seule instruction ne sera pas possible (afaik) – pxb

+0

ouais, je sais, mais les vecteurs n'ont pas d'initialisation avec {}, seulement en copiant des tableaux c. – f0b0s

0

Voici un exemple simple qui vous donnera un tableau bidimensionnel [2] [2] des deux autres tableaux que vous avez déjà et que vous pouvez utiliser comme point de départ.

#include "stdafx.h" 
#include "iostream" 
#include "string" 

#define NUM_WORDS 2 
using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    const string WORDS[NUM_WORDS] = {"wall", "glasses"}; 
    const string HINTS[NUM_WORDS] = {"brick", "worn on head"}; 

    string hw[NUM_WORDS][NUM_WORDS]; 

    for(int i=0; i < NUM_WORDS; i++) 
     for(int j=0; j < NUM_WORDS; j++) 
     { 
      if(i > 0) 
       hw[i][j] = HINTS[j]; 
      else if(j > 0) 
       hw[i][j] = WORDS[i+1]; 
      else 
       hw[i][j] = WORDS[i]; 
     } 
    for(int i=0; i < NUM_WORDS; i++) 
     for(int j=0; j < NUM_WORDS; j++) 
     { 
      cout << "hw[" << i << "][" << j << "]= " << hw[i][j] << endl; 
     } 

    char c; 
    cin.get(c); 
    return 0; 
} 

Pour une raison quelconque, peu importe ce que je fais la boîte ne me laisse pas copier et coller le code dans afin qu'il formate correctement. Pardon.

+0

Vous devez indenter le code de 4 espaces (8 lorsque le code est après une liste). Vous pouvez le faire en surlignant le code, puis en cliquant sur l'icône "1010". – GManNickG

-1

Bien que le livre vous dise d'utiliser 2 tableaux, le meilleur moyen d'y parvenir serait un tableau de structures afin que vous puissiez accéder aux mots et aux astuces par leur nom plutôt que par un index entier. Une structure ad hoc est également préférable à une paire puisque vous pouvez nommer les membres. Une autre astuce utile en C++ consiste à demander au compilateur de calculer le nombre d'éléments dans le tableau en utilisant l'opérateur sizeof. Cela réduit la redondance dans le code, ce qui réduit les risques de bogues.

int main(){ 
    /////////////version 1 - the way I would do it 
    struct element{ 
    string word; 
    string hint; 
    }; 

    const element array[] = { 
    {"wall", "brick..."}, 
    {"glasses", "corrective eye tool thingymajig"}, 
    {"calculator", "number cruncher"} 
    };  
    const size_t NUM_WORDS = sizeof(array)/sizeof(element); 

    for(size_t i=0; i<NUM_WORDS; i++){ 
    cout << array[i].word << ": " << array[i].hint << endl; 
    } 

    /////////////version 2 - the way the book asks for it 
    const string array2[][2] = { 
    {"wall", "brick..."}, 
    {"glasses", "corrective eye tool thingymajig"}, 
    {"calculator", "number cruncher"} 
    };  
    const size_t NUM_WORDS2 = sizeof(array2)/(sizeof(string)*2); 

    for(size_t i=0; i<NUM_WORDS2; i++){ 
    cout << array2[i][0] << ": " << array2[0][1] << endl; 
    }  
} 
+0

Merci pour la réponse. Pourquoi avons-nous besoin de multiplier sizeof() par 2 lors de l'obtention de la taille du tableau? – barry

+0

sizeof (string)? !!! sizeof class! = taille des caractères de la chaîne. sizeof chaîne sera plus grande, ou moins - dépend de la réalisation. mais c'est faux! cette taille de tour sur c-arrays est bonne seulement pour les types de POD. – f0b0s

+0

la première variante est fausse aussi. juste le tester. sizeof (string ("abcd")) ne sera pas 4 ou 5, il pourrait être par exemple 32 – f0b0s

4

utiliser un tableau de struct:

typedef struct 
{ 
    string Word; 
    string Hint; 
} 
WORDDEF; 

const WORDDEF WordList[] = 
{ 
    {"wall", "brick..."}, 
    {"glasses", "worn on head"}, 
    ... 
}; 

Ensuite, vous les qualifiez:

printf ("For entry %d, Word is %s, Hint is %s\n", 1, WordList[1].Word, WordList[1].Hint); 
Questions connexes