Ваше описание проблемы не очень понятно, но вы хотите сделать это:
- У вас есть два массива
s
и c
одинакового размера N
.
- Сначала пройдитесь по массиву назад. Если значение в
c
четное, добавьте соответствующее значение из s
в массив результатов.
- Наконец, добавьте остальные элементы
s
в массив. Массив результатов теперь будет содержать также N
элементов.
Первое, на что нужно обратить внимание: если вы посмотрите на c[4]
и решите добавить элемент s[4]
в массив результатов, индекс для этого массива будет 0
, потому что вы добавляете элементы спереди. В общем, если вы хотите добавить массив, вы делаете:
int array[5]; // space for 5 ints
int n = 0; // current length; start with empty array
array[n++] = 5; // array == [5]; n == 1
array[n++] = 8; // array == [5, 8]; n == 2
array[n++] = 15; // array == [5, 8, 15]; n == 3
Ваш обратный цикл работает, но, на мой взгляд, он немного неуклюжий. В C (и других языках) диапазоны описываются включающей нижней границей и исключительной верхней границей. В диапазоне [0, N
) значение N
просто выходит за пределы.
Циклы Forwad инициализируются до нижней границы, разбиваются на верхней границе и увеличиваются после каждого цикла. Из-за этой асимметрии обратные циклы проще, когда вы начинаете с верхней границы, разбиваете на нижней границе, но уменьшаете в начале цикла:
for (i = N; i-- > 0; ) ...
Пустой раздел обновления выглядит странно, но в этом цикле индекс никогда не покидает допустимый диапазон и поэтому также работает с целыми числами без знака.
Создайте ваши массивы:
int s[N] = {7, 3, 6, 2, 8}; // value array
int c[N] = {0, 12, 5, 23, 14}; // control array
int r[N]; // result array
int k = 0; // length of r
Теперь обойдите массивы назад и выберите нужные предметы:
for (i = N; i-- > 0; ) {
if (c[i] % 2 == 0) {
r[k++] = s[i];
}
}
Пройдите массив и выберите предметы, которые вы не выбрали в первом проходе:
for (i = 0; i < N; i++) {
if (c[i] % 2) {
r[k++] = s[i];
}
}
Вуаля.