Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2017, 09:13   #1
Александр121
Форумчанин
 
Регистрация: 17.09.2017
Сообщений: 265
По умолчанию код для сортировки элементов массива по убыванию как работает тут? - C (СИ)

Знаю код для сортировки элементов массива по убыванию но не допонимаю как именно он работает можете обьяснить?
Посмотрите код нужно ли что нибудь добавить?

Сумма положительных элементов массива
Произведение элементов массива между минимальными и максимальными по модулю эдементами
упорядочить элементы массива по убыванию

Код:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <locale.h>
#include <malloc.h>
#define bitint sizeof(int)  // макрос для подстановки   это команда для препроцессора, смысл ее в том, что в каждом месте программы, где стоит слово "bitint" будет вставлено sizeof(int)
int cmp( const void *a, const void *b ) //cmp для того чтобы вывести по возрастанию
{
    if  ( *((float*)a) < *((float*)b) )  // сортировка массива по убыванию
        return 1;
     else if  ( *((float*)a) > *((float*)b) )
        return -1;
     else return 0;
}
 
 
int main()
{
     float proiz,sum;
    int indexMin,indexMax;
    int n,i; //количество чисел
    float *x; //массив этих чисел
 
    setlocale(LC_CTYPE, "Rus"); //Русский язык в консоле
 
    printf("Введите количество чисел в последовательности: ");
    scanf("%d", &n);
 
 
    //Выделение памяти под массив
    x = (float*)malloc(n * sizeof(float));
 
 
    //Считывание массива
    printf("Введите по одному %d чисел:\n", n);
    for( i = 0; i < n; i++){
        scanf("%f", &x[i]);
    }
 
 
 
 
 
 
 
    for( i = 0; i < n; i++)
    {
        if(x[i]>0)   // сумма элементов массива положительных элементов
        sum = sum + x[i];
    }
    printf("%.f сумма \n",sum);
    indexMin=0;
    indexMax=0;
    for (i = 0; i <n; i++)
    {
        if(x[indexMin]>x[i]) //fabs модуль
            indexMin=fabs(i);  // запомнили индекс минимального  
    if(x[indexMax]<x[i])
            indexMax=fabs(i);  // запомнили индекс максимального
    }
    printf ("минимальный элемент %.f  \n", x[indexMin]);
    printf ("максимальный %.f  \n", x[indexMax]);
 
    if(indexMin==indexMax){
        printf (" Индексы минимального и максимального совпадают. Нечего умножать! \n");
    }
    else{
    if(indexMin>indexMax){
     i=indexMin; indexMin=indexMax; indexMax=i;
    }
    proiz=1;
    for(i=indexMin+1;i<indexMax;i++)  //цикл для произведения
    {
        proiz=proiz*x[i];// произведение
 
        }
        printf(" произведение между mах и min %f\n",proiz );
    }
    // сортируем по убыванию
    qsort( x, n, bitint, cmp );
 
    // массив на экран:
    for (i  = 0; i < n; i++)
        printf("%.f ", x[i]);
    printf("\n");
    //Освобождаем память
    free(x);
    return 0;
}
Александр121 вне форума Ответить с цитированием
Старый 09.12.2017, 09:39   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Откройте прошлые темы - там каждый кусок подробно разбирали с объяснениями.
p51x на форуме Ответить с цитированием
Старый 09.12.2017, 10:06   #3
Александр121
Форумчанин
 
Регистрация: 17.09.2017
Сообщений: 265
По умолчанию

Код:
то есть вот это просто компаратор для сравнения обьектов ?
if  ( *((float*)a) < *((float*)b) )  // сортировка массива по убыванию
        return 1;
     else if  ( *((float*)a) > *((float*)b) )
        return -1;
     else return 0;
Александр121 вне форума Ответить с цитированием
Старый 09.12.2017, 10:18   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

1. Я вам это писал
2. Справка http://en.cppreference.com/w/cpp/algorithm/qsort вам об этом говорит
3. По логике так: функция участвует в сортировке и только сравнивает элементы
Не, это не компаратор, а корона принца, однозначно.
p51x на форуме Ответить с цитированием
Старый 09.12.2017, 10:48   #5
Александр121
Форумчанин
 
Регистрация: 17.09.2017
Сообщений: 265
По умолчанию

qsort( x, n, bitint, cmp );
qsort быстрая сортировка, x количество чисел,n массив чисел.cmp что тут делает?
Александр121 вне форума Ответить с цитированием
Старый 09.12.2017, 10:58   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Вам надо срочно в начальную школу - учиться читать.

Цитата:
Sorts the given array pointed to by ptr in ascending order. The array contains count elements of size bytes. Function pointed to by comp is used for object comparison.

If comp indicates two elements as equivalent, their order is unspecified.

Parameters
ptr - pointer to the array to sort
count - number of elements in the array
size - size of each element in the array in bytes
comp - comparison function which returns ​a negative integer value if the first argument is less than the second,
a positive integer value if the first argument is greater than the second and zero if the arguments are equal.
The signature of the comparison function should be equivalent to the following:

int cmp(const void *a, const void *b);

The function must not modify the objects passed to it and must return consistent results when called for the same objects, regardless of their positions in the array.
p51x на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Delphi] необходимо создать программу для двоичной сортировки элементов одномерного массива, программа должна предусматривать иллюстрации реализуемого алгоритма Krame Помощь студентам 1 04.07.2017 17:33
Определить число элементов массива, меньших К. Осуществить сортировку массива по возрастанию методом сортировки выбором. pfkbz Microsoft Office Excel 1 22.05.2017 16:45
[TASM]как работает этот код для сортировки знаков методом подсчета Ciaran Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 08.02.2012 09:39
Процедура для сортировки массива по возрастанию (прокоментируйте код программы на Delphi) Natashka Milashka Помощь студентам 1 20.05.2011 16:20
Сортировка элементов массива по убыванию nadminka Общие вопросы .NET 1 18.05.2010 23:08