Я хочу, чтобы пользователь выбирал число, которое он хочет сохранить, и помещал в массив. И помещал их в отдельные индексы

#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 (как вы используете), который продолжает расти, вам придется самостоятельно изменять размер зарезервированной памяти, чтобы она могла безопасно расти.

Это был бы более безопасный подход, а также более динамичное решение вашей проблемы.

  1. Создайте 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>{});  
      

Внутри тела цикла:

  1. Я предполагаю, что переключатель должен помещать die1, die2 и т. Д. В определенные «строки»

  2. Использование at() , как показано ниже, для доступа к определенной строке.

  3. При доступе к данной строке используйте 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 вы должны сгенерировать случайное число и поместить его в этот формат, чтобы вставить его в следующую позицию.