Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2024, 11:54   #1
vovamakarovych
Пользователь
 
Регистрация: 09.04.2019
Сообщений: 50
По умолчанию Функция должна реорганизовать масив , переставив все нечетные в лево

Функция принимает массив целочисленных чисел, диапазон значений которых составляет от 0 до 100. В функции нужно переставить элементы массива, так что в левой стороне были все нечетные числа а справа все четные. Например, массив 1, 4, 5, 8, 9 должен быть переписан на 1, 5, 9, 4, 8.

Я написал функцию которая делает перестановку чисел. В ней создал новой массив куди записываю правильные значения.

В main создаю массив рандомно заполняю. Но моя програма не правильно работает. И я не знаю почему.

Код:
nt* segregateEvenOdd(const int *array, const  size_t size)
{
    
    int* arrayNew = new int[size + 1] ;
    int count = 0;
    for (int index = 1; index <= size; ++index)
    {   
        if (array[index] % 2 != 0)
        {
            ++count;   
        }
    }
    for (int index = 1; index <= size; ++index)
    {
        if (array[index] % 2 == 0)
        {
            arrayNew[count] = array[index];
            ++count;
        }
    }
  
   return arrayNew;
}
int main()
{
    int size = 10;
    int* array = new int[size + 1];
    
    for (unsigned index = 0; index <= size; ++index)
    {
        array[index] = std::rand() % 100;
    }
    segregateEvenOdd(array, size);
    for (unsigned index = 0; index <= size; ++index)
    {
        
        std::cout << "Array:" << array[index] << "\n";
    }
    
    return 0;
}
consol:

Цитата:
Array:41
Array:67
Array:34
Array:0
Array:69
Array:24
Array:78
Array:58
Array:62
Array:64
Array:5
vovamakarovych вне форума Ответить с цитированием
Старый 22.12.2024, 12:39   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,821
По умолчанию

Вы в функции segregateEvenOdd создаете новый массив и возвращаете его. Старый не меняете и выводите старый.
p51x вне форума Ответить с цитированием
Старый 22.12.2024, 13:07   #3
vovamakarovych
Пользователь
 
Регистрация: 09.04.2019
Сообщений: 50
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Вы в функции segregateEvenOdd создаете новый массив и возвращаете его. Старый не меняете и выводите старый.
Я не меняю старый в main е?
vovamakarovych вне форума Ответить с цитированием
Старый 22.12.2024, 13:09   #4
vovamakarovych
Пользователь
 
Регистрация: 09.04.2019
Сообщений: 50
По умолчанию

Не совсем понял . Можете пример навести в моем коде что мне нужно изменить?
vovamakarovych вне форума Ответить с цитированием
Старый 22.12.2024, 13:32   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,427
По умолчанию

Для вывода результата:
Код:
    int* arrayRes = segregateEvenOdd(array, size);
    for (unsigned index = 0; index <= size; ++index)
    {
        std::cout << "Array:" << arrayRes[index] << "\n";
    }
Но в коде есть ещё куча недоработок: новый массив заполняется не до конца, индексы перебираются обычно до "< size", выделенную память нужно освобождать.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 22.12.2024, 14:42   #6
vovamakarovych
Пользователь
 
Регистрация: 09.04.2019
Сообщений: 50
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Для вывода результата:
Код:
    int* arrayRes = segregateEvenOdd(array, size);
    for (unsigned index = 0; index <= size; ++index)
    {
        std::cout << "Array:" << arrayRes[index] << "\n";
    }
Но в коде есть ещё куча недоработок: новый массив заполняется не до конца, индексы перебираются обычно до "< size", выделенную память нужно освобождать.
1)Переделал. Но мне нужно чтобы значения были отсортированы. А у меня получается что слева не парные, справа парные, но не отсортированные.
2)А как мне в моей функции где я new делаю удалять память , делать delete[]? Я ведь новый массив возвращаюи не могу его удалять.

Код:
int* segregateEvenOdd(const int *array, const  size_t size)
{
    
    int* arrayNew = new int[size + 1] ;
    int count = 0;
    for (int index = 0; index < size; ++index)
    {   
        if (array[index] % 2 != 0)
        {
            arrayNew[count] = array[index];
            ++count;
        }
    }
    for (int index = 0; index < size; ++index)
    {
        if (array[index] % 2 == 0)
        {
            arrayNew[count] = array[index];
            ++count;
        }
    }
  
   return arrayNew;
}

int main()
{
   int size = 10;
    int* array = new int[size + 1];
    
    for (unsigned index = 0; index <= size; ++index)
    {
        array[index] = std::rand() % 100;
    }
    int* arrayRes = segregateEvenOdd(array, size +  1);
    for (unsigned index = 0; index <= size; ++index)
    {
        std::cout << "Array:" << arrayRes[index] << "\n";
    }
    delete[] arrayRes;

    return 0;
}

Последний раз редактировалось vovamakarovych; 22.12.2024 в 14:46.
vovamakarovych вне форума Ответить с цитированием
Старый 22.12.2024, 15:01   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,427
По умолчанию

Код:
int* segregateEvenOdd(const int *array, const int size)
{
    int* arrayNew = new int[size];
    int count = 0;

    for (int index = 0; index < size; ++index)
    {   
        if (array[index] % 2 != 0)
        {
            arrayNew[count] = array[index];
            ++count;
        }
    }

    for (int index = 0; index < size; ++index)
    {
        if (array[index] % 2 == 0)
        {
            arrayNew[count] = array[index];
            ++count;
        }
    }

    return arrayNew;
}

int main()
{
    size_t size = 10;
    int* array = new int[size];
    
    std::cout << "Before:" << std::endl;
    for (int index = 0; index < size; ++index)
    {
        array[index] = std::rand() % 100;
        std::cout << array[index] << " ";
    }
    std::cout << std::endl;

    int* arrayRes = segregateEvenOdd(array, size);
    
    std::cout << "After:" << std::endl;
    for (int index = 0; index < size; ++index)
    {
        std::cout << arrayRes[index] << " ";
    }
    std::cout << std::endl;

    delete[] array;
    delete[] arrayRes;

    return 0;
}
Удалять надо оба массива и в конце работы программы, а не в функции segregateEvenOdd. Вы уверены, что требуется сортировка, а не только разделение на четные и нечетные?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 22.12.2024, 15:02   #8
vovamakarovych
Пользователь
 
Регистрация: 09.04.2019
Сообщений: 50
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Код:
int* segregateEvenOdd(const int *array, const int size)
{
    int* arrayNew = new int[size];
    int count = 0;

    for (int index = 0; index < size; ++index)
    {   
        if (array[index] % 2 != 0)
        {
            arrayNew[count] = array[index];
            ++count;
        }
    }

    for (int index = 0; index < size; ++index)
    {
        if (array[index] % 2 == 0)
        {
            arrayNew[count] = array[index];
            ++count;
        }
    }

    return arrayNew;
}

int main()
{
    size_t size = 10;
    int* array = new int[size];
    
    std::cout << "Before:" << std::endl;
    for (int index = 0; index < size; ++index)
    {
        array[index] = std::rand() % 100;
        std::cout << array[index] << " ";
    }
    std::cout << std::endl;

    int* arrayRes = segregateEvenOdd(array, size);
    
    std::cout << "After:" << std::endl;
    for (int index = 0; index < size; ++index)
    {
        std::cout << arrayRes[index] << " ";
    }
    std::cout << std::endl;

    delete[] array;
    delete[] arrayRes;

    return 0;
}
Удалять надо оба массива и в конце работы программы, а не в функции segregateEvenOdd. Вы уверены, что требуется сортировка, а не только разделение на четные и нечетные?
да. в задании вказано: Например, массив 1, 4, 5, 8, 9 должен быть переписан на 1, 5, 9, 4, 8.
vovamakarovych вне форума Ответить с цитированием
Старый 22.12.2024, 15:05   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,427
По умолчанию

Из такого примера может следовать не сортировка, а наоборот сохранение порядка следования чисел из исходного массива.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 22.12.2024, 16:01   #10
vovamakarovych
Пользователь
 
Регистрация: 09.04.2019
Сообщений: 50
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Из такого примера может следовать не сортировка, а наоборот сохранение порядка следования чисел из исходного массива.
я уточнил в препода. сказал нужно чтоб нечетные и четные ишли от меньшего до большего
Тоесть сначала все нечетные от меньшего до большего потом четные от меньшего до большего
vovamakarovych вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает функция которая должна с json формата возвращать в стандартный dimaSlon Qt и кроссплатформенное программирование С/С++ 76 08.06.2018 17:35
На С++ написать программу с реализацией в виде вызова функции по ссылке: Функция должна вернуть не одно, а ДВА(или более) значения Raitek Помощь студентам 2 23.01.2015 07:41
Функция, сортирующая сначала нечетные числа в массиве по возрастанию, а потом четные по убыванию. yurets17 Помощь студентам 1 12.11.2013 19:01
Вывести сначала все его четные (нечетные) елементы, а потом- нечетные(четные). tondo Помощь студентам 4 25.04.2012 00:17
Паскаль, вывести строки массива, поочередно, с лево на право, справа на лево Amid1990 Помощь студентам 2 15.11.2010 13:00