Дан массив A(N). - C (СИ)
Формулировка задачи:
Дан массив A(N). Построить массив С из позитивных элементов заданного массива А и упорядочить массив С в порядке убывания.
Пробовал делать не получается. Помогите разобраться.
#include<stdio.h> #include<conio.h> const int n=10; main() { int A[n], B[n]; int i, a=-5, b=10, j, d; for (i=0;i<n;i++) { A[i]=rand()%(b-a+1)+a; printf("A[%d]=%d\n", i, A[i]); } for (i=0;i<n;i++) { if(A[i]>0) { B[i]=A[i]; printf("\nB[%d]=%d\n", i, B[i]); } } printf("Otsortirovannui masiv\n"); for(i=0;i<=n-1;i++) for(j=n-2;j>=i;j--) if(B[j]>B[j+1]) { d=B[j]; B[j]=B[j+1]; B[j+1]=d; } for(i=0;i<n;i++) printf("B[%d]=%d\n", i, B[i]); getch(); }
Решение задачи: «Дан массив A(N).»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N ( 20 ) void print_array( int *arr, size_t size ) { size_t i = 0; while ( i < size ) fprintf( stdout, "%4d", arr[ i++ ] ); puts(""); } int comp( const void *i, const void *j ) { return *(int *)j - *(int *)i; } int main(){ int array_a[ N ], *array_c, i = 0, cntr = 0; srand( time( 0 ) ); while ( i < N ) { array_a[ i ] = rand() % N - ( N / 2 ); if ( array_a[ i ] > 0 ) { ++cntr; if ( (array_c = (int*) realloc( array_c, cntr * sizeof( int ) ) ) == NULL ) { fprintf( stderr, "error of memory. line 27\n"); exit( 0 ); } array_c[ cntr - 1 ] = array_a[ i ]; } ++i; } qsort( array_c, cntr, sizeof( int), comp ); puts("array_a"); print_array( array_a, N ); if ( cntr ) { puts("array_c"); print_array( array_c, cntr ); } else fprintf( stdout, "all nums is negative or 0\n"); free( array_c ); getchar(); return 0; }
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы:
для работы с функциями ввода-вывода, для работы с функциями работы с памятью, для инициализации генератора случайных чисел. - Определяется размер массива N.
- Создается функция print_array для вывода элементов массива на экран. Она принимает указатель на первый элемент массива и размер массива. В цикле выводит все элементы массива на экран, используя функцию fprintf для форматированного вывода.
- Создается функция comp для сортировки массива методом сортировки слиянием. Она принимает указатели на два элемента массива и возвращает разницу между ними.
- В функции main создается массив array_a типа int с размером N и инициализируется случайными числами от -N/2 до N/2. Создается указатель array_c на первый элемент массива.
- В цикле выделяется память под массив array_c размером cntr*sizeof(int) и копируется элемент array_a[i] в array_c. Если память не может быть выделена, выводится сообщение об ошибке и программа завершается.
- Массив array_c сортируется функцией qsort с использованием функции comp.
- Выводится на экран массив array_a.
- Если cntr не равно нулю, то выводится на экран массив array_c.
- Если cntr равно нулю, то выводится сообщение
all nums is negative or 0
. - Выделяется память под массив array_c и освобождается память под массивом array_a.
- Программа ожидает нажатия любой клавиши и завершается.
- Возвращается 0, что означает успешное выполнение программы.