Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Vitaly_
0 / 0 / 0
Регистрация: 20.03.2013
Сообщений: 60
#1

Динамические массивы: разбить исходный массив на два - с четными и нечетными элементами - C++

10.09.2014, 18:27. Просмотров 880. Ответов 12
Метки нет (Все метки)

Доброе время суток !
Подскажите пожалуйста как создать динамический масив в таком случае :

У меня есть исходный массив "A", допустим, на 10 елеменотов , мне нужно его разбить на 2 масива в одном буду находиться парные элементы массива "A", а в другом не парные, притом мы не знаем количество парных и непарных эелементов в масиве "A", так вот как мне реализовать эти 2 массива.

Заранее спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.09.2014, 18:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Динамические массивы: разбить исходный массив на два - с четными и нечетными элементами (C++):

Массивы. Вначале заполнить элементами с четными индексами, а затем — с нечетными. Осуществить сдвиг вправо на k позиций - C++
При выполнении задания элементы массива генерировать с помощью генератора случайных чисел. 1. Дан массив A. Заполнить массив В...

Вначале заполнить массив элементами с четными индексами, а затем - с нечетными. - C++
прошу помощи дан массив a, заполнить массив b элементами масива а следующим образом: вначале заполнить элементами с четными индексами,...

Из 1 массива сделать 2 с четными и нечетными элементами - C++
Задан массив с количеством элементов N Сформировать два массива в первый включить элементы исходного массива с четными номерами а во второй...

Разделить последовательность на два массива с четными и нечетными номерами соответственно - C++
массив. Разделить последовательность А(10) на два массива, записать в один из них элементы с четными номерами, а в другой - с нечетными.

Переписать в другие массивы элементы с четными/нечетными порядковыми номерами - C++
Помогите написать код для решения сей задачи, пожалуйста. Дан массив b0, b1,…, b2n-1. Написать программу построения новых ...

Сформировать два массива: в первый включить элементы с четными номерами, а во второй — с нечетными - C++
Задан массив с количеством элементов N. Сформировать два массива: в первый включить элементы исходного массива с четными номерами, а во...

12
Boleon
Guardian of Asgaard
372 / 315 / 106
Регистрация: 11.11.2013
Сообщений: 1,046
Завершенные тесты: 1
10.09.2014, 18:29 #2
Считаешь кол-во парных элементов - это размер одного массива. Размер второго будет оставшаяся часть.
0
Vitaly_
0 / 0 / 0
Регистрация: 20.03.2013
Сообщений: 60
10.09.2014, 18:33  [ТС] #3
то есть сначала циклом сосчитать парные и непарные элементы через инкримент по отдельности, а потом через цикл использовать искрометны записать в массивы ?
0
Boleon
Guardian of Asgaard
372 / 315 / 106
Регистрация: 11.11.2013
Сообщений: 1,046
Завершенные тесты: 1
10.09.2014, 18:42 #4
Второй способ:
Когда находишь нужный элемент - создаешь массив размера 1 и записываешь в него значение. Если находишь второй, то увеличиваешь размер на +1 и т.д.
C++
1
2
3
4
5
6
7
8
9
10
11
for ( int i = 0; i < size; i++ ) {
    if ( array[i] == 42 ) {
        int index = 0;
        int length = 1;
        int arrayNew[length];
 
        arrayNew[index] = array[i];
        length += 1;
        index += 1;
    }
}
Добавлено через 2 минуты
п.с. смотря как ты его будешь использовать - зона видимости.
Можно вначале объявить, всё зависит от ситуации.
C++
1
2
3
4
5
6
7
8
9
10
11
int index = 0;
int length = 1;
int arrayNew[length];
 
for ( int i = 0; i < size; i++ ) {
    if ( array[i] == 42 ) {
        arrayNew[index] = array[i];
        length += 1;
        index += 1;
    }
}
0
Vitaly_
0 / 0 / 0
Регистрация: 20.03.2013
Сообщений: 60
10.09.2014, 18:44  [ТС] #5
мне потом эти 2 массива надо отсортировать, а потом записать в один файл , то есть либо по очереди записать , либо слить в один массив, тот же "А", и записать
0
Boleon
Guardian of Asgaard
372 / 315 / 106
Регистрация: 11.11.2013
Сообщений: 1,046
Завершенные тесты: 1
10.09.2014, 18:53 #6
Vitaly_, используй тогда второй способ, это динамический массив будет. Там 42 - это в виде магического числа при котором будет выполняться твоё условие записи в массив.
Для двух динамических массивов будет такой вид:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int mainSize = 10;
int mainArray[mainSize];
 
int index1 = 0;
int length1 = 1;
int array1[length1];
 
int index2 = 0;
int length2 = 1;
int array2[length2];
 
for ( int i = 0; i < mainSize; i++ ) {
    if ( mainArray[i] == 42 ) {
        array1[index1] = mainArray[i];
        length1 += 1;
        index1 += 1;
    }
    if ( mainArray[i] == 121 ) {
        array2[index2] = mainArray[i];
        length2 += 1;
        index2 += 1;
    }
}
1
Vitaly_
0 / 0 / 0
Регистрация: 20.03.2013
Сообщений: 60
10.09.2014, 20:20  [ТС] #7
спасибо

Добавлено через 1 час 25 минут
В чем проблема ? я проверял про бейкпоинту вроде все хорошо,но выводит
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
int main() {
    
    int const mainSize = 10;
    int mainArray[mainSize]= {5,5,7,5,6,3,5,0,7,4};
    
    int index1 = 0;
    int length1 = 1;
    int array1[length1];
    
    int index2 = 0;
    int length2 = 1;
    int array2[length2];
    
    for ( int i = 0; i < mainSize; i++ ) {
        if ( (mainArray[i]%2) == 0 ) {
            array1[index1] = mainArray[i];
            length1 += 1;
            index1 += 1;
        }
        if (mainArray[i]%2 ==! 0){
            array2[index2] = mainArray[i];
            length2 += 1;
            index2 += 1;
        }
    }
    for (int i = 0; i<index1; i++) {
        cout << array1[i]<<" ";
    }
    
    cout <<"\n";
    
    for (int i = 0; i<index2; i++) {
        cout << array2[i]<<" ";
    }
}
вывод :
3 0 4
5 5 7 5 3 0 4
0
Boleon
Guardian of Asgaard
372 / 315 / 106
Регистрация: 11.11.2013
Сообщений: 1,046
Завершенные тесты: 1
10.09.2014, 21:46 #8
Vitaly_, я в MinGW скомпилировал твой код, выдало
0
Миниатюры
Динамические массивы: разбить исходный массив на два - с четными и нечетными элементами  
BlackIce
310 / 172 / 64
Регистрация: 18.01.2014
Сообщений: 387
10.09.2014, 23:05 #9
Цитата Сообщение от Darkrduk Посмотреть сообщение
Для двух динамических массивов будет такой вид:
Извините, а где в вашем коде динамические массивы?
Если увеличить размерность массивов, ну к примеру, до 100, то программа с вашим кодом не будет работать.
0
Boleon
Guardian of Asgaard
372 / 315 / 106
Регистрация: 11.11.2013
Сообщений: 1,046
Завершенные тесты: 1
11.09.2014, 10:16 #10
Цитата Сообщение от BlackIce
Извините, а где в вашем коде динамические массивы?
Если увеличить размерность массивов, ну к примеру, до 100, то программа с вашим кодом не будет работать.
Почему не будет?
0
BlackIce
310 / 172 / 64
Регистрация: 18.01.2014
Сообщений: 387
11.09.2014, 10:42 #11
Цитата Сообщение от Darkrduk Посмотреть сообщение
Почему не будет?
Потому, что вы создаете массивы размером в один элемент, а работаете с ними так, будто они динамически меняют свой размер. Вы таким кодом просто портите программный стек.
100 элементов, ваш код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    int const mainSize = 100;
    int mainArray[mainSize];
    for (int i = 0; i < mainSize; ++i) mainArray[i] = rand() % 100;
    
    int index1 = 0;
    int length1 = 1;
    int array1[length1];
    
    int index2 = 0;
    int length2 = 1;
    int array2[length2];
    
    for ( int i = 0; i < mainSize; i++ ) {
        if ( (mainArray[i]%2) == 0 ) {
            array1[index1] = mainArray[i];
            length1 += 1;
            index1 += 1;
        } else {
            array2[index2] = mainArray[i];
            length2 += 1;
            index2 += 1;
        }
    }
Динамические массивы: разбить исходный массив на два - с четными и нечетными элементами
Программы выдает ерунду, хотя и отрабатывает без фатальных ошибок.

Если же просто взять все массивы достаточного размера, то все работает нормально:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    int const mainSize = 100;
    int mainArray[mainSize];
    for (int i = 0; i < mainSize; ++i) mainArray[i] = rand() % 100;
    
    int index1 = 0;
    int length1 = 1;
    int array1[mainSize];
    
    int index2 = 0;
    int length2 = 1;
    int array2[mainSize];
    
    for ( int i = 0; i < mainSize; i++ ) {
        if ( (mainArray[i]%2) == 0 ) {
            array1[index1] = mainArray[i];
            length1 += 1;
            index1 += 1;
        } else {
            array2[index2] = mainArray[i];
            length2 += 1;
            index2 += 1;
        }
    }
Динамические массивы: разбить исходный массив на два - с четными и нечетными элементами

Рекомендация общего характера: использовать std::vector вместо массивов, если число элементов заранее неизвестено.
1
BlackIce
310 / 172 / 64
Регистрация: 18.01.2014
Сообщений: 387
11.09.2014, 11:03 #12
Например, так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <vector>
#include <cstdlib>
#include <iostream>
using namespace std;
 
int main() {
    int n;
    cout << "array size? ";
    cin >> n;
    vector<int> mainArray(n);
    for (int i = 0; i < n; ++i) {
        mainArray[i] = rand() % 100;
        std::cout << mainArray[i] << ' ';
    }
    cout << "\n\n";
    
    vector<int> evenArray;
    vector<int> oddArray;
    
    for (int i = 0; i < n; ++i) {
        (mainArray[i] % 2 == 0 ? evenArray : oddArray).push_back(mainArray[i]);
    }
    
    for (int i = 0; i < evenArray.size(); i++) cout << evenArray[i] << ' ';
    cout << "\n\n";
    
    
    for (int i = 0; i < oddArray.size(); i++) cout << oddArray[i] << ' ';
    cout << '\n';
}
0
Boleon
Guardian of Asgaard
372 / 315 / 106
Регистрация: 11.11.2013
Сообщений: 1,046
Завершенные тесты: 1
11.09.2014, 11:14 #13
Цитата Сообщение от BlackIce
вы создаете массивы размером в один элемент, а работаете с ними так, будто они динамически меняют свой размер.
Есть такое... В идеале конечно лучше сразу выделять память под несколько элементов, используя некий коэффициент, суть примерно такая:
C++
1
2
3
4
5
6
7
8
int newLength(int length, int index) {
    float multiple = 1.5;
 
    if ( index >= length / multiple ) {
        return length * multiple;
    }
    return length;
}
Но и убирать не используемую память тоже было бы не плохо
0
11.09.2014, 11:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2014, 11:14
Привет! Вот еще темы с ответами:

Сформировать массивы: в первый включить элементы исходного массива с четными номерами, а во второй с нечетными - C++
помогите решить..........Задан массив с количеством элементов N. Сформировать два массива: в первый включить элементы исходного массива с...

Заполнить массив чередующимися четными и нечетными числами - C++
Необходимо заполнить массив чередующимися четными и нечетными.В коде есть где то ошибка,массив выводит какой-то бредовый.Прошу помощи,что...

Динамические массивы с подряд идущими элементами в памяти - C++
Здравствуйте. Помогите разобраться, пожалуйста, с динамическими двумерными массивами. Если я объявлю двумерный массив следующим...

Преобразовать массив так, чтобы элементы с четными и нечетными значениями чередовались - C++
Пожалуйста помогите с задачей: Дан массив целых чисел. Преобразовать его так, чтобы элементы с четными и нечетными значениями...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru