Как сказал Ваханчо в комментарии, odd[]
и even[]
являются статическими массивами.Это означает, что после создания вы не можете изменить размер любого из них.Более того, при объявлении массива размер не может быть «динамическим», т. Е. int odd[n];
действителен только тогда, когда n
является константой времени компиляции (обратите внимание, что некоторые компиляторы предлагают его как расширение, но это не стандартный c ++).
Итак, здесь мы немного застряли, и большинство из них рассмотрят использование обычного std::vector
, который имеет переменный размер.К сожалению, вы указали «Использовать массивы» в своем вопросе.Эрф, вернемся к исходной точке.
Давайте немного подумаем и вспомним, что массивы можно рассматривать как указатели.На следующем изображении мы определяем массив arr[5]
.Тогда arr
- это указатель на адрес 1000, первое значение вашего массива:
Оповещение о спойлере: вы можете создать динамический массив с этим свойством.Итак, давайте определим указатель для наших двух массивов нечетных и четных чисел и объявим их связанный размер:
int * odd_array = NULL;
int * even_array = NULL;
int odd_array_size = 0, even_array_size = 0;
Теперь идея состоит в том, чтобы увеличить размер хорошего массива, когда мы находим нечетноеили даже число и используйте функцию C void* realloc(void* ptr, size_t size)
, предлагаемую <cstdlib>
, чтобы увеличить размер, выделенный для вашего массива.В вашем случае вы, вероятно, захотите сделать это, когда вы зацикливаетесь на массиве input
.Вот пример того, что вы можете получить в вашем случае:
for (int n = 0; n < 10; n++)
{
if ((input_array[n]) % 2 != 0) // We find an odd number
{
odd_array_size++; // Increase the size of the array
odd_array = (int*)realloc(odd_array, odd_array_size * sizeof(int)); // Reallocate more memory
odd_array[odd_array_size-1] = input_array[n]; // Add the value in your new allocated memory
}
else
{
// Same here, but in the case of an even number
even_array_size++;
even_array = (int*)realloc(even_array, even_array_size * sizeof(int));
even_array[even_array_size-1] = input_array[n];
}
}
С этим вы получите два массива odd_array
и even_array
, заполненные соответственно нечетными и четными числами вашего input_array
, которые оба имеют связанный размер odd_array_size
и even_array_size
Это в основном C-способ сделать это.Возможно, вы подумаете о «умных» указателях (для обеспечения безопасности при освобождении памяти) и, если вам позволят, std::vectors
, которые являются лучшим способом решения этой проблемы.Так что не забывайте освобождать ваши два массива в конце вашей программы, если вы используете это.
Я надеюсь, что это будет полезно и понятно, не стесняйтесь спрашивать меня в комментариях, если это необходимо.