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

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

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

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

Листинг программы
  1. #include <stdio.h>
  2. int main(int argc, char *argv[])
  3. {
  4. int n;
  5. printf("Enter size of massive ");
  6. scanf("%d", &n);
  7.  
  8. double arr[n];
  9. for(int i = 0; i < n; i++){
  10. printf("arr[%d] ", i);
  11. scanf("%lf", &arr[i]);}
  12. printf("\n prostoi massiv \n");
  13. for(int i = 0; i < n; i++){
  14. printf("%lf ", arr[i]);}
  15. // представляем, что отрицательный элемент самый первый
  16. for(int pos = 0; pos < n; pos++)
  17. {
  18. for(int x = pos +1; x < n; x++)
  19. if(arr[pos] > arr[x] && arr[x] < 0 && arr[pos] < 0){
  20. int min = arr[x];
  21. arr[x] = arr[pos];
  22. arr[pos] = min;
  23. }
  24. }
  25. printf("\n sorted: \n");
  26. for (int x = 0; x < n; x++) {
  27. printf("%lf ", arr[x]);
  28. }
  29. return 0;
  30. }

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

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #define N  10
  5.  
  6. //сортировка выбором
  7. void ssort(double a[], int n, int (*cmp)(double)){
  8.         double t;
  9.         int i, j, k;
  10.         for(i = 0; i < n; ++i){
  11.                 if(!(*cmp)(a[i]))
  12.                         continue;
  13.                 k = i;
  14.                 j = i + 1;
  15.                 while((j < n) && !(*cmp)(a[j]))
  16.                         ++j;
  17.                        
  18.                 for(; j < n; ++j){
  19.                         if((*cmp)(a[j]) && (a[j] < a[k]))
  20.                                 k = j;      
  21.                 }
  22.                 if(i != k){
  23.                         t    = a[i];
  24.                         a[i] = a[k];
  25.                         a[k] = t;
  26.                 }
  27.         }        
  28. }
  29.  
  30. static int compare(double n) { return (n < 0.0); }
  31.  
  32. int main(void){
  33.         int    i;
  34.         double a[N];
  35.      
  36.         srand((unsigned int)time(NULL));
  37.         for(i = 0; i < N; ++i)
  38.                 a[i] = -9 + rand() % 19;
  39.        
  40.         //вывеод исходного массива
  41.         for(i = 0; i < N; ++i)
  42.                 printf("% 2lg ", a[i]);
  43.         putchar('\n');
  44.                        
  45.         ssort(a, N, compare);
  46.        
  47.         //вывод отсортированного массива(только отрицательных элементов)
  48.         for(i = 0; i < N; ++i)
  49.                 printf("% 2lg ", a[i]);
  50.         return 0;
  51. }

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы