Отрицательные элементы массива отсортировать в порядке возрастания - 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; }
Объяснение кода листинга программы
- #include
Включает в себя файл стандартного ввода/вывода, который содержит функции для работы с консолью. - #include
Включает в себя файл стандартной библиотеки, который содержит функции для работы с памятью и строками. - #include
Включает в себя файл стандартной библиотеки, который содержит функции для работы со временем. - #define N 10 Определяет константу N, которая равна 10.
- *void ssort(double a[], int n, int (cmp)(double))** Функция сортировки выбором, принимает на вход массив a, его размер n и функцию сравнения cmp.
- double t; Объявляет переменную t типа double, которая будет использоваться в функции для временного хранения значения.
- int i, j, k; Объявляет три переменные i, j, k типа int, которые будут использоваться в функции для цикла и обмена значениями.
- for(i = 0; i < n; ++i){ Начало цикла for, который проходит по всем элементам массива.
- *if(!(cmp)(a[i]))** Проверка, является ли текущий элемент отрицательным, если нет, то переход к следующему элементу.
- k = i; Присваивает значение переменной k, равное индексу текущего элемента.
- j = i + 1; Присваивает значение переменной j, равное индексу следующего элемента.
- *while((j < n) && !(cmp)(a[j]))** Начало цикла while, который проходит по всем элементам массива до тех пор, пока не найдет отрицательный элемент или не достигнет конца массива.
- for(; j < n; ++j){ Начало цикла for, который проходит по всем элементам массива с индексом больше k.
- *if((cmp)(a[j]) && (a[j] < a[k]))** Проверка, является ли текущий элемент меньше текущего отрицательного элемента и если да, то обновление значения k.
- t = a[i]; Присваивание значения переменной t, равного значению текущего элемента.
- a[i] = a[k]; Замена значения текущего элемента на значение k-го элемента.
- a[k] = t; Замена значения k-го элемента на значение t.
- } Конец функции ssort.
- static int compare(double n) { return (n < 0.0); } Функция сравнения, которая возвращает 1, если число отрицательное, и 0 в противном случае.
- int main(void){ Функция main, которая содержит основной код программы.
- int i; Объявление переменной i типа int для цикла.
- double a[N]; Объявление массива a типа double с размером N.
- srand((unsigned int)time(NULL)); Инициализация генератора случайных чисел текущим временем.
- for(i = 0; i < N; ++i) Начало цикла for, который заполняет массив a случайными числами.
- a[i] = -9 + rand() % 19; Генерация случайного числа от -9 до 0.
- printf(
% 2lg
, a[i]); Вывод элемента массива с пробелом после него. - putchar('\n'); Перевод строки.
- ssort(a, N, compare); Вызов функции сортировки ssort с массивом a, его размером N и функцией сравнения compare.
- for(i = 0; i < N; ++i) Начало цикла for, который выводит отсортированный массив.
- printf(
% 2lg
, a[i]); Вывод элемента массива с пробелом после него. - return 0; Конец функции main.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д