Как ввести значения в уже определенные массивы? - PullRequest
0 голосов
/ 29 мая 2019

Напишите программу, которая выводит 10 заданных чисел в две строки, одна для нечетных и одна для четных чисел.Использовать массивы.

После объявления входного массива для 10 чисел, которые вводит пользователь, я попытался объявить отдельные массивы для нечетных и четных значений, которые впоследствии будут отсортированы циклом for.

Я застреваю, когда мне нужно присвоить эти значения n нечетным или четным массивам.

int input[10];
int odd[]{};
int even[]{};
int n;

for(n=0;n<10;n++)
{
    if ((input[n])%2==0)
    {
      odd[n] = n; 
    }
    else
    {
      even[n] = n;
    }

Ответы [ 4 ]

3 голосов
/ 29 мая 2019

Для этого вам не нужно динамическое распределение.Мы можем просто сделать два массива и заполнить их по мере необходимости.

static constexpr std::size_t N = 10;
const int input[N] = { /* user input here */ };

int odd[N] = {};
int even[N] = {};

std::size_t countOdd = 0;
std::size_t countEven = 0;

for (std::size_t i = 0; i < N; i++)
{
    if (input[i] % 2 == 0)
       even[countEven++] = input[i];
    else
       odd[countOdd++] = input[i];
}

Там будет ровно N (10) элементов, "потраченных впустую" в конце odd и even всего (скакое-то неизвестное распространение) но кого это волнует?Десять автоматических хранилищ int с!Это ничего.? До тех пор, пока мы отслеживаем, сколько шансов и сколько у нас «забот» о четных событиях, все в порядке.

Теперь для вывода в две строки:

for (std::size_t i = 0; i < countOdd; i++)
    std::cout << odd[i] << ' ';
std::cout << '\n';

for (std::size_t i = 0; i < countEven; i++)
    std::cout << even[i] << ' ';
std::cout << '\n';

Легко!

Я использовал std::size_t, где это уместно для индексов массива, а не int, но вы можете проигнорировать это сейчас, если хотите.Я также исправил вашу операцию по модулю, и вы сохраняли индексы четных / нечетных значений, а не сами значения.


Полный пример программы:

#include <iostream>
#include <cstddef>  // for std::size_t

int main()
{
    static constexpr std::size_t N = 10;
    const int input[N] = { 1,5,9,14,3,99,82,42,43,70};

    int odd[N] = {};
    int even[N] = {};

    std::size_t countOdd = 0;
    std::size_t countEven = 0;

    for (std::size_t i = 0; i < N; i++)
    {
        if (input[i] % 2 == 0)
           even[countEven++] = input[i];
        else
           odd[countOdd++] = input[i];
    }

    for (std::size_t i = 0; i < countOdd; i++)
        std::cout << odd[i] << ' ';
    std::cout << '\n';

    for (std::size_t i = 0; i < countEven; i++)
        std::cout << even[i] << ' ';
    std::cout << '\n';
}

// g++ -std=c++17 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
// 1 5 9 3 99 43 
// 14 82 42 70 

( live демо )

2 голосов
/ 29 мая 2019

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

Все, что вам нужно сделать, это начать с двух указателей или указателей, один движется вперед, а другой назад. Пока элемент находится в правильном разделе, перемещайте указатель за ним. Как только оба указателя нашли элементы в неправильном разделе, поменяйте их местами и продолжайте. Как только указатели сходятся, раздел завершается.

Или, если вы хотите оставить вход без изменений, это позволяет вам сделать одно выделение, равное размеру всего ввода, без перераспределения или перемещения уже обработанных элементов в новый буфер.

1 голос
/ 29 мая 2019

Как сказал Ваханчо в комментарии, 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, которые являются лучшим способом решения этой проблемы.Так что не забывайте освобождать ваши два массива в конце вашей программы, если вы используете это.

Я надеюсь, что это будет полезно и понятно, не стесняйтесь спрашивать меня в комментариях, если это необходимо.

0 голосов
/ 29 мая 2019

Вам необходимо иметь динамический массив для odd и even.
Кроме того, вы допустили ошибку, если по модулю равно нулю, число является четным, а не нечетным. И вы хотите добавить input[n], а не n.

Я думаю, что вы должны использовать контейнеры STL вместо сырых массивов, это облегчит задачу.

Вы можете сделать следующее:

std::array<int, 10> input {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; // fill the array with anything you want

std::vector<int> odd, even;

for(unsigned int n = 0; n < input.size(); ++n)
{
    (input[n]%2) ? (odd.push_back(input[n])) : (even.push_back(input[n]));
}

Вы можете заменить троичный условный оператор condition ? action_if_true : action_if_false на:

if(input[n]%2)
    odd.push_back(input[n]);
else
    even.push_back(input[n]);

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...