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

Функция CompareIntDesc()

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

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

Ребята подскажите, пожалуйста, нашёл функцию сортировки цифр в 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.08.2013, 00:54
Ответы с готовыми решениями:

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

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

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

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

Или вообще вот так:
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
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
23.08.2013, 12:13  [ТС]
Я сделал вот так
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
 Аватар для volvo
33402 / 21512 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 12
23.08.2013, 12:35
Ну, и зачем? Во-первых, зачем c_str()? Чтобы сделать 2 никому не нужных преобразования? Процессор слишком мощный? StrToDate получает в качестве параметра строку, а не const char *, вообще-то... Во-вторых, если есть готовая функция для сравнения (да еще и - чудо!!! - возвращающая результат нужного типа) - я предпочитаю использовать именно ее, а не самописные аналоги...
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.08.2013, 15:47
Насколько я помню ф-ция компаратор должна возвращать одно из значений : 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
 Аватар для volvo
33402 / 21512 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 12
23.08.2013, 15:57
Не
Цитата Сообщение от Avazart Посмотреть сообщение
одно из значений : 1, 0, -1
, а
0 ... less than 0 ... number above 0
, то есть, должно быть любое целочисленное значение, по знаку которого определится результат сравнения.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.08.2013, 16:00
Я имел ввиду что значения три, а не два...

Ноль не имеет знака.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33402 / 21512 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 12
23.08.2013, 16:27
Значений, возвращаемых этой функцией, может быть не 2 и не три, а 232, весь диапазон int... Если я верну из функции (-2013), что будет, по-твоему? Ошибка (судя по посту №7 - да, ведь (-2013) не является ни (-1), ни нулем, ни единицей)?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.08.2013, 17:17
Вопрос не в значениях, а в состоянии, их три : больше, меньше, равно.

Именно поэтому ф-ция возвращает 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
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
23.08.2013, 23:25
Avazart, такая скрупулезность совершенно ни к чему, и вот почему. Использовать компаратор большая часть людей будет как-то так:
C++
1
2
3
4
int res( 0 );
if( ( res = CompareDates( /**/ ) ) > 0 ) /**/;
else if( res < 0 ) /**/;
else /**/;
Поэтому неважно, единички компаратор отдает или произвольные числа. Важны знак и его отсутствие.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
24.08.2013, 00:10
Цитата Сообщение от BRcr Посмотреть сообщение
Поэтому неважно, единички компаратор отдает или произвольные числа. Важны знак и его отсутствие
Важно, если необходимо соблюдение относительного порядка следование равных элементов.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
24.08.2013, 00:13
А?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
24.08.2013, 00:17
Два равных элемента могут быть связаны с разными данными, иногда требуется соблюсти их относительный первоначальный порядок при сортировке
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
24.08.2013, 00:25
ОК. Как это реализовать, если компаратор возвращает одно из трех известных значений, и почему это нельзя или сложнее реализовать, если компаратор возвращает произвольные значения, отличающиеся знаком?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
24.08.2013, 00:43
Ну согласен возможно мое предположение ошибочно, не каждый день смотрю внутрь быстрой сортировки (тем более на 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.08.2013, 00:43
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru