C/C++

Программа не выполняет условия задания, исходный массив меняет сам себя, помогите найти ошибку

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


Задание: Дан одномерный массив Zm. Сформировать массив Хk, состоящий из ненулевых элементов массива Zm, сначала с четным, а затем с нечетным индексом. Исходный массив Zm отсортировать по убыванию.


Программа:
#include <stdio.h>
#include <stdlib.h>

int main() {
int m, i, k = 0, p, j;
printf("Введите размер массива:"); scanf("%d", &m);
int Z[m], X[k];
for (i = 1; i<=m; i++) {
Z[i] = rand()%10;
printf("Z[%d]=%d\n", i, Z[i]);
}
printf("Mas:\n");
for (i = 1; i<=m; i++) {
printf("%d ", Z[i]);
}


//записываем четные
for (i = 1; i<=m; i++) {
if ((Z[i] != 0) && (i % 2 == 0)) {
k = k + 1;
X[k] = Z[i];
}
}

//записываем не четные
for (i = 1; i<=m; i++) {
if ((Z[i] != 0) && (i % 2 != 0)) {
k = k + 1;
X[k] = Z[i];
}
}

//вывод
printf("\nX[K]:\n");
for (i=1; i<=k; i++) {
printf("%d ", X[i]);
}

printf("\nСортировка");
for (i=1; i<=m; i++) {
for (j=1; j<=m-i; j++) {
if (Z[j] < Z[j+1]) {
p = Z[j];
Z[j] = Z[j+1];
Z[j+1] = p;
}
}
}
printf("\n");
for (i=1; i<=m; i++) {
printf("%d ", Z[i]);
}
}
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int m, k=0, j=0, p; printf("m: "); scanf("%d",&m); int Z[m]; srand(time(NULL));
printf("Z="); for(int i=0;i<m;++i){Z[i]=rand()%10; printf("%d ",Z[i]); k+=!Z[i];}
printf("\n"); k=m-k; int X[k];
for(int i=0;i<m;++++i)if(Z[i])X[j++]=Z[i];
for(int i=1;i<m;++++i)if(Z[i])X[j++]=Z[i];
printf("X="); for(int i=0;i<k;++i)printf("%d ",X[i]); printf("\n");
for(int i=1;i<m;++i)for(int j=1;j<m;++j)
if(Z[j]>Z[j-1]){p=Z[j-1]; Z[j-1]=Z[j]; Z[j]=p;}
printf("Z=");for(int i=0;i<m;++i)printf("%d ",Z[i]); printf("\n"); return 0;}
Сембеков Нурлан
Сембеков Нурлан
95 061
Лучший ответ
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define RAND(min, max) (rand() % ((max) - (min)) + (min))
int compare(const void* pa, const void* pb) {
return *(int*)pa - *(int*)pb;
}
int main(void) {
unsigned m, k;
unsigned i, j;
unsigned zero = 0;
int* z = NULL;
int* x = NULL;
printf("%s", "Введите размер массива: ");
scanf("%u", &m);
z = (int*)malloc(m * sizeof(int));
srand((unsigned)time(NULL));
for (i = 0; i < m; ++i) z[i] = RAND(0, 10);
for (i = 0; i < m; ++i) printf("%3i", z[i]);
puts("");
for (i = 0; i < m; ++i) if (!z[i]) ++zero;
k = m - zero;
x = (int*)malloc(k * sizeof(int));
for (i = 0, j = 0; j < m; j += 2) if (z[j]) x[i++] = z[j];
for (j = 1; j < m; j += 2) if (z[j]) x[i++] = z[j];
for (i = 0; i < k; ++i) printf("%3i", x[i]);
puts("");
qsort(z, m, sizeof(int), compare);
for (i = 0; i < m; ++i) printf("%3i", z[i]);
puts("");
free(x);
free(z);
return 0;
}
Вячеслав Карибаев Это через динамический массив?