Отрицательные элементы массива отсортировать в порядке возрастания - C (СИ)

Узнай цену своей работы

Формулировка задачи:

дана задачка: есть вещественный массив и отрицательные элементы надо отсортировать в порядке возрастания, а остальные элементы без изменения.

#include <stdio.h>
 
int main(int argc, char *argv[])
{
int n;
printf("Enter size of massive ");
scanf("%d", &n);

double arr[n];
for(int i = 0; i < n; i++){
printf("arr[%d] ", i);
scanf("%lf", &arr[i]);}
printf("\n prostoi massiv \n");
for(int i = 0; i < n; i++){
printf("%lf ", arr[i]);}
 
// представляем, что отрицательный элемент самый первый
for(int pos = 0; pos < n; pos++)
{
for(int x = pos +1; x < n; x++)
if(arr[pos] > arr[x] && arr[x] < 0 && arr[pos] < 0){
int min = arr[x];
arr[x] = arr[pos];
arr[pos] = min;
}
 
}
 
printf("\n sorted: \n");
for (int x = 0; x < n; x++) {
printf("%lf ", arr[x]);
}
return 0;
}

Решение задачи: «Отрицательные элементы массива отсортировать в порядке возрастания»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N  10
 
//сортировка выбором
void ssort(double a[], int n, int (*cmp)(double)){
        double t;
        int i, j, k;
        for(i = 0; i < n; ++i){
                if(!(*cmp)(a[i]))
                        continue;
                k = i;
                j = i + 1;
                while((j < n) && !(*cmp)(a[j]))
                        ++j;
                        
                for(; j < n; ++j){
                        if((*cmp)(a[j]) && (a[j] < a[k]))
                                k = j;       
                }
                if(i != k){
                        t    = a[i];
                        a[i] = a[k];
                        a[k] = t;
                }
        }        
}
 
static int compare(double n) { return (n < 0.0); }
 
int main(void){
        int    i;
        double a[N];
     
        srand((unsigned int)time(NULL));
        for(i = 0; i < N; ++i)
                a[i] = -9 + rand() % 19;
        
        //вывеод исходного массива
        for(i = 0; i < N; ++i)
                printf("% 2lg ", a[i]);
        putchar('\n');
                        
        ssort(a, N, compare);
        
        //вывод отсортированного массива(только отрицательных элементов)
        for(i = 0; i < N; ++i)
                printf("% 2lg ", a[i]);
        return 0;
}

Объяснение кода листинга программы

  1. #include Включает в себя файл стандартного ввода/вывода, который содержит функции для работы с консолью.
  2. #include Включает в себя файл стандартной библиотеки, который содержит функции для работы с памятью и строками.
  3. #include Включает в себя файл стандартной библиотеки, который содержит функции для работы со временем.
  4. #define N 10 Определяет константу N, которая равна 10.
  5. *void ssort(double a[], int n, int (cmp)(double))** Функция сортировки выбором, принимает на вход массив a, его размер n и функцию сравнения cmp.
  6. double t; Объявляет переменную t типа double, которая будет использоваться в функции для временного хранения значения.
  7. int i, j, k; Объявляет три переменные i, j, k типа int, которые будут использоваться в функции для цикла и обмена значениями.
  8. for(i = 0; i < n; ++i){ Начало цикла for, который проходит по всем элементам массива.
  9. *if(!(cmp)(a[i]))** Проверка, является ли текущий элемент отрицательным, если нет, то переход к следующему элементу.
  10. k = i; Присваивает значение переменной k, равное индексу текущего элемента.
  11. j = i + 1; Присваивает значение переменной j, равное индексу следующего элемента.
  12. *while((j < n) && !(cmp)(a[j]))** Начало цикла while, который проходит по всем элементам массива до тех пор, пока не найдет отрицательный элемент или не достигнет конца массива.
  13. for(; j < n; ++j){ Начало цикла for, который проходит по всем элементам массива с индексом больше k.
  14. *if((cmp)(a[j]) && (a[j] < a[k]))** Проверка, является ли текущий элемент меньше текущего отрицательного элемента и если да, то обновление значения k.
  15. t = a[i]; Присваивание значения переменной t, равного значению текущего элемента.
  16. a[i] = a[k]; Замена значения текущего элемента на значение k-го элемента.
  17. a[k] = t; Замена значения k-го элемента на значение t.
  18. } Конец функции ssort.
  19. static int compare(double n) { return (n < 0.0); } Функция сравнения, которая возвращает 1, если число отрицательное, и 0 в противном случае.
  20. int main(void){ Функция main, которая содержит основной код программы.
  21. int i; Объявление переменной i типа int для цикла.
  22. double a[N]; Объявление массива a типа double с размером N.
  23. srand((unsigned int)time(NULL)); Инициализация генератора случайных чисел текущим временем.
  24. for(i = 0; i < N; ++i) Начало цикла for, который заполняет массив a случайными числами.
  25. a[i] = -9 + rand() % 19; Генерация случайного числа от -9 до 0.
  26. printf(% 2lg, a[i]); Вывод элемента массива с пробелом после него.
  27. putchar('\n'); Перевод строки.
  28. ssort(a, N, compare); Вызов функции сортировки ssort с массивом a, его размером N и функцией сравнения compare.
  29. for(i = 0; i < N; ++i) Начало цикла for, который выводит отсортированный массив.
  30. printf(% 2lg, a[i]); Вывод элемента массива с пробелом после него.
  31. return 0; Конец функции main.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.333 из 5
Похожие ответы