инициализация const многомерного массива в c ++ - PullRequest
3 голосов
/ 02 ноября 2009

В настоящее время я работаю над некоторыми упражнениями в книге c ++, в которой в качестве учебного пособия используются текстовые игры. Упражнение, в котором я застрял, состоит в том, чтобы заставить ПК выбрать слово из массива слов (строк), смешать буквы и попросить игрока угадать слово. Это было легко, но, как следует из книги, предлагается добавить опцию, чтобы дать подсказку игроку, чтобы он мог угадать, сначала как параллельный массив (опять-таки, без проблем), а затем как двумерный массив. Вот где я застрял. Мой (сокращенный) массив слов выглядит следующим образом:

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

Мне нужно дать подсказку для каждого из этих слов, но я не знаю, как это сделать. Публиковать это с телефона, так что поиск в Google не возможен!

Мой параллельный массив был следующим:

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

Просто нужно объединить два.

Спасибо заранее, Barry

Ответы [ 5 ]

14 голосов
/ 02 ноября 2009

Вы могли бы сделать 2d массив?

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

не уверен, что синтаксис правильный, но я надеюсь, что вы поняли концепцию.

это массив внутри другого массива.

РЕДАКТИРОВАНИЕ: я удалил NUM_WORDS из первой квадратной скобки. Вы не можете объявить многомерный массив из переменных. Извините, я забыл об этом. Я только что проверил, и это работает.

4 голосов
/ 10 апреля 2012

Использовать массив struct:

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

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

Тогда вы называете их:

printf ("For entry %d, Word is %s, Hint is %s\n", 1, WordList[1].Word, WordList[1].Hint);
0 голосов
/ 03 ноября 2009

Хотя в книге говорится, что вы должны использовать 2 массива, лучшим способом сделать это будет массив структур, чтобы вы могли получить доступ к словам и подсказкам по имени, а не по целочисленному индексу. Специальная структура также лучше, чем пара, так как вы можете назвать членов. Другой полезный трюк в C ++ - заставить компилятор вычислять количество элементов в массиве с помощью оператора sizeof. Это уменьшает избыточность в коде, что уменьшает вероятность ошибок.

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 голосов
/ 02 ноября 2009

Вот простой пример, который даст вам двумерный массив [2] [2] из двух других уже имеющихся у вас массивов, которые вы можете использовать в качестве отправной точки.

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

По какой-то причине, независимо от того, что я делаю, окно не позволит мне скопировать и вставить код, чтобы он правильно форматировал. извините.

0 голосов
/ 02 ноября 2009

да ... Может быть, вы должны использовать пару структуру?

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

теперь вы можете использовать СЛОВА [i] .first - в качестве неизвестного слова

и СЛОВА [i]. Секунды как подсказка.

...