barry
barry

Reputation: 4147

initializing a const multidimensional array in c++

I'm currently working through some exercises in a c++ book, which uses text based games as its teaching tool. The exercise I am stuck on involves getting the pc to select a word from a const array of words (strings), mixing the letters up and asking the player to guess the word. This was easy, but as a follow on the book asks to add the option to provide a hint to the player to help them guess, firstly as a parallel array (again, no problem) and then as a 2 dimensional array. This is where I'm stuck. My (shortened) array of words is as follows:

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

I need to provide a hint for each of these words but not sure how to go about it. Posting this from phone so extensive googling is not an option!

My parallel array was as follows:

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

Just need to combine the two.

Thanks in advance, Barry

Upvotes: 6

Views: 33981

Answers (5)

Graham
Graham

Reputation: 69

Use a struct array:

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

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

Then you refer to them as:

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

Upvotes: 6

SigmaXiPi
SigmaXiPi

Reputation: 118

Though the book tells you to use 2 arrays, the better way to do this would be an array of structures so that you can access the words and hints by name rather than by an integer index. An ad hoc structure is also better than a pair since you can name the members. Another useful trick in C++ is to have the compiler calculate the number of elements in the array using the sizeof operator. This reduces redundancy in the code which reduces the chances of bugs.

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;
  }    
}

Upvotes: -1

ChadNC
ChadNC

Reputation: 2503

Here is a simple example That will give you a 2 dimensional array[2][2] from the other two arrays that you already have that you can use as a starting point.

#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;
}

For some reason no matter what I do the box will not let me copy and paste the code in so that it formats correctly. sorry.

Upvotes: 0

user200632
user200632

Reputation: 414

you could make 2d array?

string aArray[][2] = {{"wall", "brick..."}, 
                               {"glasses", "corrective eye tool thingymajig"},
                               {"calculator", "number cruncher"}};

not sure if the syntax is right but i hope you get the concept.

it's an array inside another array.

EDITED: i removed the NUM_WORDS from the first square bracket. you can't declare multi dimentional array from variables.. sorry i forgot about that. i just tested it and it works.

Upvotes: 17

f0b0s
f0b0s

Reputation: 3097

huh... maybe you should use pair struct?

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

now, you can use WORDS[i].first -- as the unknown word

and WORDS[i].second as its hint.

Upvotes: 0

Related Questions