Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
1

Функция CompareIntDesc()

23.08.2013, 00:54. Показов 1433. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!

Ребята подскажите, пожалуйста, нашёл функцию сортировки цифр в StringList, но почему-то правильная сортировка проходит только после того как я несколько раз нажму кнопку. Почему не сортирует правильно с первого раза. Заранее благодарен за ответ.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Сортируем цифры по возрастанию
 int __fastcall CompareIntDesc(TStringList *List, int Index1, int Index2)
 {
  int a = atoi(List->Strings[Index1].c_str());
  int b = atoi(List->Strings[Index2].c_str());
  return a > b;
 }
 
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   TStringList *list = new TStringList();
   list->Assign(ListBox1->Items);
   list->CustomSort(CompareIntDesc);
   ListBox1->Items->Assign(list);
   delete list;
   list = NULL;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.08.2013, 00:54
Ответы с готовыми решениями:

Функция удаления текста в скобках [2], непосредственно функция + 12кб вложений
Доброго времени суток, случилось так, что пришлось работать с с-строками (лаба, угу), в которой...

Функция sqrt: существует более одного экземпляра. Функция перегруженная
#include <iostream> #include <math.h> #include <iomanip> using namespace std; int main(){...

Перегрузка операций: friend-функция или функция-член класса
Здравствуйте, меня интересует вопрос, в чем разница при перегрузке операторов через operator и...

Выясните, сохраняет ли булева функция 0, 1, является ли функция линейной, монотонной, само двойственной?
Помогите пожалуйста!!! Булева функция задана вектором значений F(x)=(1001) Выясните, сохраняет...

16
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
23.08.2013, 01:10 2
C++
1
2
3
// ...
return a - b;
// ...
Почему - см. в описании, что должна возвращать функция: TStringListSortCompare
1
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
23.08.2013, 11:16  [ТС] 3
UI, скажи а можно ли сделать такую функцию как я приводил выше только чтобы она сортировала даты (например: 12.12.2012)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
23.08.2013, 11:35 4
Всё можно сортировать. Даты - вот так: Сортировка дат

Или вообще вот так:
C++
1
2
3
4
5
int __fastcall CompareDates(TStringList *List, int Index1, int Index2)
{
    // Не забудь подключить DateUtils.hpp
    return CompareDate(StrToDate(List->Strings[Index1]), StrToDate(List->Strings[Index2]));
}
1
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
23.08.2013, 12:13  [ТС] 5
Я сделал вот так
C++
1
2
3
4
5
6
int __fastcall CompareDateDesc(TStringList *List, int Index1, int Index2)
 {
  TDateTime a = StrToDate(List->Strings[Index1].c_str());
  TDateTime b = StrToDate(List->Strings[Index2].c_str());
  return a - b;
 }
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
23.08.2013, 12:35 6
Ну, и зачем? Во-первых, зачем c_str()? Чтобы сделать 2 никому не нужных преобразования? Процессор слишком мощный? StrToDate получает в качестве параметра строку, а не const char *, вообще-то... Во-вторых, если есть готовая функция для сравнения (да еще и - чудо!!! - возвращающая результат нужного типа) - я предпочитаю использовать именно ее, а не самописные аналоги...
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.08.2013, 15:47 7
Насколько я помню ф-ция компаратор должна возвращать одно из значений : 1, 0, -1 ( >, =, < ) а не тип bool или разницу

Добавлено через 1 минуту
You return 0 if the entry referred to by Index1 equals the entry referred to by Index2

You return less than 0 if the entry referred to by Index1 is less than the entry referred to by Index2

You return a number above 0 if the entry referred to by Index1 is greater than the entry referred to by Index2
По ссылке UI http://docwiki.embarcadero.com... ortCompare
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
23.08.2013, 15:57 8
Не
Цитата Сообщение от Avazart Посмотреть сообщение
одно из значений : 1, 0, -1
, а
0 ... less than 0 ... number above 0
, то есть, должно быть любое целочисленное значение, по знаку которого определится результат сравнения.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.08.2013, 16:00 9
Я имел ввиду что значения три, а не два...

Ноль не имеет знака.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
23.08.2013, 16:27 10
Значений, возвращаемых этой функцией, может быть не 2 и не три, а 232, весь диапазон int... Если я верну из функции (-2013), что будет, по-твоему? Ошибка (судя по посту №7 - да, ведь (-2013) не является ни (-1), ни нулем, ни единицей)?
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.08.2013, 17:17 11
Вопрос не в значениях, а в состоянии, их три : больше, меньше, равно.

Именно поэтому ф-ция возвращает int, а не bool.

Добавлено через 39 минут
Цитата Сообщение от UI Посмотреть сообщение
Ошибка (судя по посту №7 - да, ведь (-2013) не является ни (-1), ни нулем, ни едини
Возвращать можно любое отрицательное число, не важно это -2013 или -1, но очевиднее использовать именно -1 в коде, а не магическое -2013

Добавлено через 3 минуты
В общем виде выглядеть должно приблизительно так

C++
1
2
3
4
5
6
int __fastcall CompareDates(TStringList *List, int Index1, int Index2)
{
   if ( /*...*/ ) return  1;
   if ( /*...*/ ) return  0;
   if ( /*...*/ ) return -1;
}
1
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
23.08.2013, 23:25 12
Avazart, такая скрупулезность совершенно ни к чему, и вот почему. Использовать компаратор большая часть людей будет как-то так:
C++
1
2
3
4
int res( 0 );
if( ( res = CompareDates( /**/ ) ) > 0 ) /**/;
else if( res < 0 ) /**/;
else /**/;
Поэтому неважно, единички компаратор отдает или произвольные числа. Важны знак и его отсутствие.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
24.08.2013, 00:10 13
Цитата Сообщение от BRcr Посмотреть сообщение
Поэтому неважно, единички компаратор отдает или произвольные числа. Важны знак и его отсутствие
Важно, если необходимо соблюдение относительного порядка следование равных элементов.
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
24.08.2013, 00:13 14
А?
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
24.08.2013, 00:17 15
Два равных элемента могут быть связаны с разными данными, иногда требуется соблюсти их относительный первоначальный порядок при сортировке
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
24.08.2013, 00:25 16
ОК. Как это реализовать, если компаратор возвращает одно из трех известных значений, и почему это нельзя или сложнее реализовать, если компаратор возвращает произвольные значения, отличающиеся знаком?
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
24.08.2013, 00:43 17
Ну согласен возможно мое предположение ошибочно, не каждый день смотрю внутрь быстрой сортировки (тем более на Deplhi)

Classes.pas
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
procedure QuickSort(SortList: TPointerList; L, R: Integer;
  SCompare: TListSortCompareFunc);
var
  I, J: Integer;
  P, T: Pointer;
begin
  repeat
    I := L;
    J := R;
    P := SortList[(L + R) shr 1];
    repeat
      while SCompare(SortList[I], P) < 0 do
        Inc(I);
      while SCompare(SortList[J], P) > 0 do
        Dec(J);
      if I <= J then
      begin
        if I <> J then
        begin
          T := SortList[I];
          SortList[I] := SortList[J];
          SortList[J] := T;
        end;
        Inc(I);
        Dec(J);
      end;
    until I > J;
    if L < J then
      QuickSort(SortList, L, J, SCompare);
    L := I;
  until I >= R;
end;
0
24.08.2013, 00:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.08.2013, 00:43
Помогаю со студенческими работами здесь

Какую библиотеку надо подключать чтоб работала функция _getch() и функция cin.get()?
какую библиотеку надо подключать чтоб работала функция _getch() и функция cin.get()

Функция - Pos(s,s1). Назначение - поиск первого вхождения подстроки s1 в строку s (аналогичная функция C - strstr)
Функция - Pos(s,s1). Назначение - поиск первого вхождения подстроки s1 в строку s (аналогичная...

Функция DisplayTranslucentSprite функция стала игнорировать параметр прозрачности
Здравствуйте. Что-то изменил в коде так, что функция стала игнорировать параметр прозрачности, т.е....

Чистая виртуальная функция функция не имеет оператора переопределения
Пишу программу для записи заметок. Есть 2 класса: Page и Note. Note наследуется от Page. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru