Застрял в коде о массивах и движущихся цифрах в нем - PullRequest
0 голосов
/ 15 мая 2019

Существует два массива:

s: 7 3  6  2  8  
c: 0 12 5 23 14  
new array: 8 3 7 6 2

По сути, вы смотрите на массив c и, если он имеет четное число, вы печатаете один из массива s.Например, 14 даже для печати 8.Вам нужно напечатать их в том порядке, справа налево.

Итак, я прочитал первые два массива, но не знаю, как разместить остальную часть кода.Если вы введете:

array s: 1 2 3  
array c: 4 4 4

, вы получите: 3 2 1, что нам нужно, но если я укажу 1 нечетное число, я получу номер ошибки.Я не знаю, как поставить остаток массива s после того, как я положил четные числа.

for(d=0; d<ns; d++)
{
    scanf("%d", &s[d]); //here we have the first array

}
for(d=0; d<nc; d++)
{
    scanf("%d", &c[d]); //second array
}
for(d=0; d<ns; d++)
{
    if(c[d]%2==0)   //I check here if the nb. from second array are even
    {

        r[d]=s[d]; //I try to put the numbers from the first array 

    }
}
for(d=ns-1; d>-1; d--)
{
    printf("%d ", r[d]);  //I print the new array
}
}

1 Ответ

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

Ваше описание проблемы не очень понятно, но вы хотите сделать это:

  • У вас есть два массива 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];
    }
}

Вуаля.

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