#c
#c
Вопрос:
До сих пор у меня спрашивали, какие кости они хотят хранить, и я помещал их в массив. Но когда я помещаю его в массив, я хочу, чтобы эти числа оставались. Но для следующего хода я хочу иметь возможность добавлять в массив другие числа без изменения остальных.
cin >> Hold;
switch (Hold)
{
case 1: DieHolder[0] = die1;
cout << "If you are done choosing dice use the 0 key to end." << endl;
break;
case 2: DieHolder[1] = die2;
cout << "If you are done choosing dice use the 0 key to end." << endl;
break;
case 3: DieHolder[2] = die3;
cout << "If you are done choosing dice use the 0 key to end." << endl;
break;
case 4: DieHolder[3] = die4;
cout << "If you are done choosing dice use the 0 key to end." << endl;
break;
case 5: DieHolder[4] = die5;
cout << "If you are done choosing dice use the 0 key to end." << endl;
break;
}
У меня это так, что числа помещаются в определенное место, но, похоже, не могут добавляться со следующего хода без изменения предыдущих чисел.
Затем он отображается на экране.
for (int i = 0; i < 5; i )
{
if (DieHolder[i] >= 1)
{
cout << i << ": " << DieHolder[i] << "n";
}
}
Я не уверен, как сохранить старые номера.
Комментарии:
1. Одно из решений, которое я видел, заключается в том, что вместо сохранения только числа в массиве вы сохраняете структуру, которая объединяет число вместе с флагом, который сообщает программе, нужно ли сохранять число или нет. При развертывании проверяйте флаг. Если он установлен, не создавайте новый номер.
Ответ №1:
Проблема, с которой вы сталкиваетесь, в основном связана с циклом for и оператором switch . Каждый раз, когда вы его запускаете, вы перезаписываете элемент, который был в том же индексе.
Есть несколько способов, которыми вы могли бы это сделать, но я бы предложил вместо этого использовать вектор, потому что он выделит для вас память. С обычным массивом в стиле c (как вы используете), который продолжает расти, вам придется самостоятельно изменять размер зарезервированной памяти, чтобы она могла безопасно расти.
Это был бы более безопасный подход, а также более динамичное решение вашей проблемы.
- Создайте
std::vector< std::vector<> >
тип, чтобы он был представлен в 2 измерениях. (Представьте это как сетку, где вдоль Y — выбор пользователем строк. И вдоль X размещены там штампы)
-
Не рекомендуется использовать ‘using std;’ из-за потенциальных конфликтов определения, но для целей обучения это нормально. и сделает более чистый код из-за отсутствия необходимости писать
std::
раньшеvector
/* ... Outside Loop Body ... */ using std; // This will initialize 5 rows of vectors, which will be where choices stack vector<vector<int>> DieHolder(5, vector<int>{});
Внутри тела цикла:
-
Я предполагаю, что переключатель должен помещать die1, die2 и т. Д. В определенные «строки»
-
Использование
at()
, как показано ниже, для доступа к определенной строке. -
При доступе к данной строке используйте
emplace_back()
для создания нового элемента в конце столбца, принадлежащего этой строке./* ... Loop Body ... */ cin >> Hold; switch (Hold) { // emplace_back() Will NOT overwrite, it will stack choices. case 1: DieHolder.at(0).emplace_back(die1); break; case 2: DieHolder.at(1).emplace_back(die2); break; case 3: DieHolder.at(2).emplace_back(die3); break; case 4: DieHolder.at(3).emplace_back(die4); break; case 5: DieHolder.at(4).emplace_back(die5); break; } cout << "If you are done choosing dice use the 0 key to end." << endl; /* ... */
Затем, используя цикл на основе вложенного диапазона, вы можете распечатать содержимое каждого элемента как таковое
/* ... */
for (auto amp; elements_row : DieHolder ){
for(auto amp; elements_column : elements_row){
cout << "Row: " << elements_row << endl;
if (elements_column >= 1){
cout << "Column: " << elements_column << endl;
}
}
}
/* ... */
Ответ №2:
Попробуйте использовать 2-мерные массивы. Например, say die1
определяется как:
int *die1;
int d1loc = 0;
die1
является an int * (int pointer)
, поэтому он указывает на местоположение an int
. d1loc
означает, что int (dice number)
die1
включено.
Вот ваша программа, переписанная для использования 2-мерных массивов.
int *die1, die2, die3, die4, die5;
int dloc[5] = {0};
cin >> Hold;
switch (Hold)
{
case 1: DieHolder[0][dloc[0] ] = die1;
cout << "If you are done choosing dice use the 0 key to end." << endl;
break;
case 2: DieHolder[1][dloc[1] ] = die2;
cout << "If you are done choosing dice use the 0 key to end." << endl;
break;
case 3: DieHolder[2][dloc[2] ] = die3;
cout << "If you are done choosing dice use the 0 key to end." << endl;
break;
case 4: DieHolder[3][dloc[3] ] = die4;
cout << "If you are done choosing dice use the 0 key to end." << endl;
break;
case 5: DieHolder[4][dloc[4] ] = die5;
cout << "If you are done choosing dice use the 0 key to end." << endl;
break;
}
for (int i = 1; i < 6; i )
for (int j = 0; j < dloc[i][j]; j )
cout << i << ": " << DieHolder[i][j] << "n";
Попробуйте это сами, и если это не сработает, сообщите мне в комментариях
Комментарии:
1. Мои кости сделаны с помощью rand, я не знаю, как я могу это сделать с помощью int * die1, die2, die3, die4, die5; Я все еще новичок в c
2. @Gamez: чтобы вставить случайное число в новое местоположение, выполните:
DieHolder[DICE_NUMBER][dloc[DICE_NUMBER ]] = RANDOM_NUMBER
вы должны сгенерировать случайное число и поместить его в этот формат, чтобы вставить его в следующую позицию.