Неправильно выполняется перестановка массива
Даны два массива 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 шт):
Автор решения: Harry
→ Ссылка
Как-то у вас все очень сложно...
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
Автор решения: Stanislav Volodarskiy
→ Ссылка
Тут вы обращаетесь за правый конец массива (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. Ещё раз: компилятору наплевать на эти красивости. Другой программист вам спасибо скажет.