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

Функция CompareIntDesc()

23.08.2013, 00:54. Показов 1569. Ответов 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
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,882
Записей в блоге: 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
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,882
Записей в блоге: 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
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,882
Записей в блоге: 12
23.08.2013, 12:35
Ну, и зачем? Во-первых, зачем c_str()? Чтобы сделать 2 никому не нужных преобразования? Процессор слишком мощный? StrToDate получает в качестве параметра строку, а не const char *, вообще-то... Во-вторых, если есть готовая функция для сравнения (да еще и - чудо!!! - возвращающая результат нужного типа) - я предпочитаю использовать именно ее, а не самописные аналоги...
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 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
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,882
Записей в блоге: 12
23.08.2013, 15:57
Не
Цитата Сообщение от Avazart Посмотреть сообщение
одно из значений : 1, 0, -1
, а
0 ... less than 0 ... number above 0
, то есть, должно быть любое целочисленное значение, по знаку которого определится результат сравнения.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.08.2013, 16:00
Я имел ввиду что значения три, а не два...

Ноль не имеет знака.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,882
Записей в блоге: 12
23.08.2013, 16:27
Значений, возвращаемых этой функцией, может быть не 2 и не три, а 232, весь диапазон int... Если я верну из функции (-2013), что будет, по-твоему? Ошибка (судя по посту №7 - да, ведь (-2013) не является ни (-1), ни нулем, ни единицей)?
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru