Неправильно выполняется перестановка массива

Рейтинг: -1Ответов: 2Опубликовано: 14.04.2023

Даны два массива X(n) и Y(m). Преобразовать каждый массив, расположив вначале только положительные элементы (сохранив их порядок), остальные элементы заменить нулями. Формирование нового массива осуществлять с помощью функции. Я пробовал реализовать код, но он каждый раз выводит мусор(числа из 10+ цифр)

int newarray(int *X, int n){
    for (int i = 0; i < n; i++)
        if (X[i] < 0)
            X[i] = 0;
    int temp = 0;
    for (int i = 0; i < n; i++){
        if (X[i] == 0){
            for (int j = i+1; j < n+1;j++)
                if (X[j] != 0)
                   swap(X[i],X[j]);

        }
    }
    for (int i = 0; i < n; i++)
        cout << X[i] << ' ';
    cout << endl;
return 0;
}

Ответы

▲ 2Принят

Как-то у вас все очень сложно...

void newarray(int *X, int n)
{
    int j = 0;
    for (int i = 0; i < n; i++) if (X[i] > 0) X[j++] = X[i];
    for(; j < n; X[j++] = 0);
}

Вот результат работы: https://ideone.com/VCKQyt

▲ 1

Тут вы обращаетесь за правый конец массива (j == n). Поэтому чепуха в результате:

           for (int j = i+1; j < n+1;j++)
                if (X[j] != 0)

Этот код делает тоже что и код Harry, но написан более аккуратно.

// функция не создаёт новый массив, а чистит старый. Поэтому clean
// размер массива привыкайте передавать первым,
//   чтобы зависимости были в порядке чтения текста
// для компилятора int a[] - тоже самое что и int *a,
//   но документирует что это массив, его размер в комментарии
void clean(int n, int a[/* n */]) {
    int j = 0;
    for (int i = 0; i < n; ++i) {
        if (a[i] > 0) {
            // тот, кто разрешил инкремент в выражениях, в рай не попадёт точно
            // иногда это позволяет написать код короче
            // но сейчас не тот случай: присвоили, подвинули индекс - так яснее
            a[j] = a[i];
            ++j;
        }
    }
    // цикл for можно по разному крутить-вертеть
    //   лучше сразу договориться что в заголовке только код связанный с 
    //   индексом, а полезная работа делается в теле цикла
    // никогда не опускайте фигурные скобки,
    //   сколько людей свернули на этом себе шею - не сосчитаешь
    for(; j < n; ++j) {
        a[j] = 0;
    }

    // одна функция делает одну вещь,
    // печати массива тут не будет
}

P.S. Ещё раз: компилятору наплевать на эти красивости. Другой программист вам спасибо скажет.