2009-11-02 113 views
2

一个const多维数组我目前通过在C++的书,它采用基于文本的游戏,它的教学工具,一些练习工作。我坚持的练习包括让电脑从一个常量单词(字符串)中选择一个单词,混合字母并要求玩家猜测单词。这很简单,但是本书的后续内容要求添加选项以向玩家提供提示,帮助他们猜测,首先作为并行数组(再次没有问题),然后作为二维数组。这是我卡住的地方。话我(缩短)排列如下:初始化在C++

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

我需要为每个的这些话,但不知道如何去了解它提供的提示。从手机上发布这么广泛的谷歌搜索不是一种选择!

我的平行排列如下:

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

只是需要把两者结合起来。

由于提前, 巴里

回答

13

你可以把二维数组?

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

不确定语法是否正确,但我希望你能理解这个概念。

它的另一个数组里的数组。

EDITED:ⅰ除去NUM_WORDS从第一方括号。你不能从变量声明多维数组..对不起,我忘了这一点。我只是测试它,它的工作原理。

0

呵呵...... 也许你应该使用对结构?

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

现在,您可以用字[I]。第一 - 为未知单词

和字[I]。第二个是它的提示。

+0

或者也许你只需要使用你的阵列和相同指数: 字=字[我],提示=提示[我] 我真的不知道 – f0b0s 2009-11-02 18:10:41

+0

问题,你也可以考虑一个字符串对的向量,这可能会使编码更容易,并减少错误。 std :: vector > 请注意>>结尾处的空格。 虽然(afaik) – pxb 2009-11-02 18:13:34

+0

yeah,但我知道,使用单个语句的初始化将不可能,但矢量不会使用{}进行初始化,只能通过复制c数组。 – f0b0s 2009-11-02 18:18:22

0

下面是一个简单的例子这会给你一个2维阵列[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

您必须将代码缩进4个空格(当代码位于列表后面时为8)。您可以通过突出显示代码来完成此操作,然后单击“1010”图标。 – GManNickG 2009-11-02 20:36:19

-1

尽管这本书告诉我们使用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

感谢您的回答。为什么我们需要在获取数组大小时将sizeof()乘以2? – barry 2009-11-03 13:19:14

+0

sizeof(string)?!!! sizeof class!=字符串的字符大小。 sizeof字符串将会更大或更小 - 取决于实现。但它是错误的! c-array上这个尺寸的技巧只适用于POD类型。 – f0b0s 2009-11-03 13:34:11

+0

第一个变体也是错误的。 只是测试它。 sizeof(string(“abcd”))不会是4或5,它可能是32 – f0b0s 2009-11-03 13:36:59

4

使用结构数组:

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