Отрицательные элементы массива отсортировать в порядке возрастания - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д