Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Сортировка


Автор: VOX 24.2.2009, 13:33
Здравствуйте!
Вот ссылка на мой проект
Код

http://www.sendspace.com/file/96m363



Значит делаю сортировку, а сортирует вот так:
1
10
11
12
13
14
15
16
17
18
19
2
20
22
23
24
26
27
28
29
3
30
31
32
33
34
35
37
38
39
4
40
41
42
43
44
45
46
47
48
49
5
50
51
52
53
54
55
56
57
58
59
6
60
61
62
63
64
65
66
67
68
69
7
70
71
72
73
74
8
9
----------------------------------------
Подскажите как реализовать человеческую сортировку.
Спасибо!


Автор: Soah 24.2.2009, 13:39
Цитата(VOX @  24.2.2009,  13:33 Найти цитируемый пост)
Значит делаю сортировку

может код покажите smile 

вы что сравниваете строки?

Автор: Dmi3ev 24.2.2009, 13:43
Цитата

может код покажите smile 

вы что сравниваете строки?

я покажу)))
скачал архив, вот что там VOX написал:
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include "DateUtils.hpp"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
 
#pragma link "trayicon"
#pragma link "XPManifest"
#pragma resource "*.dfm"
TForm1 *Form1;
int cHour, cMinute;     // время на индикаторе
int alrHour, alrMinute; // время сигнала
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
    cHour = HourOf( Now() );
    Label4->Caption = IntToStr(cHour);
    cMinute = MinuteOf( Now() );
    Label5->Caption = (cMinute);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
        ListBox1->Items->Add(Edit1->Text);
        Edit1->Clear();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
        ListBox1->Sorted = 1;
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button4Click(TObject *Sender)
{
        ListBox1->Clear();        
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button5Click(TObject *Sender)
{
        ListBox1->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button6Click(TObject *Sender)
{
        ListBox1->Items->SaveToFile("myfile.txt");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button7Click(TObject *Sender)
{
        ListBox1->Items->LoadFromFile("myfile.txt");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button8Click(TObject *Sender)
{
        ListBox1->Items->Delete(ListBox1->ItemIndex);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
    int l = Edit1->Text.Length();
    for(int i = 0; i < ListBox1->Count; ++i)
    {
        if(ListBox1->Items->Strings[i].SubString(1,l)==Edit1->Text)
        {
            //ListBox1->SetFocus();
            ListBox1->ItemIndex=i;
            break;
        }
    }
}
// Функция обратной сортировки
int __fastcall MyComp(TStringList *pList,int pI1, int pI2)
{
    if (pList->Strings[pI1] > pList->Strings[pI2]) return -1;
    if (pList->Strings[pI1] < pList->Strings[pI2]) return 1;
    return 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
        TStringList *list = new TStringList;
        list->Sorted = 0;
        list->CaseSensitive = 0; // без чувствительности к регистру
        list->Text = Memo1->Text; // к примеру
        list->CustomSort(MyComp);
        Memo1->Text = list->Text; // ; ))
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button9Click(TObject *Sender)
{
        Form1->Close(); // закрыть форму приложения
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ListBox2Click(TObject *Sender)
{
        Form1->Close(); // закрыть форму приложения
}
//---------------------------------------------------------------------------


void __fastcall TForm1::N3Click(TObject *Sender)
{
        Form1->Close(); // закрыть форму приложения
}
//---------------------------------------------------------------------------

void __fastcall TForm1::N6Click(TObject *Sender)
{
        Form1->Close(); // закрыть форму приложения
}
//---------------------------------------------------------------------------


void __fastcall TForm1::N4Click(TObject *Sender)
{
        ListBox1->Items->LoadFromFile("myfile.txt");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::N5Click(TObject *Sender)
{
        ListBox1->Items->SaveToFile("myfile.txt");
        
}
//---------------------------------------------------------------------------

Автор: VOX 24.2.2009, 13:50
аммм.... Ну там часики вставил ))) 
а вообще речь идет о ListBox1
----------------------------------------------
Вот там и сортирует как то неправильно

Автор: Soah 24.2.2009, 13:51
Цитата(Soah @  24.2.2009,  13:39 Найти цитируемый пост)
вы что сравниваете строки?

Цитата(Dmi3ev @  24.2.2009,  13:43 Найти цитируемый пост)
 
if (pList->Strings[pI1] > pList->Strings[pI2]) return -1;    
if (pList->Strings[pI1] < pList->Strings[pI2]) return 1;    
return 0;

а надо сравнивать числа
Код

if (atoi(pList->Strings[pI1]) > atoi(pList->Strings[pI2])) return -1;    
if (atoi(pList->Strings[pI1]) < atoi(pList->Strings[pI2])) return 1;    
return 0;

Автор: VOX 24.2.2009, 13:53
Если вы про это:
--------------------------------------------------------
Код

// Функция обратной сортировки
int __fastcall MyComp(TStringList *pList,int pI1, int pI2)
{
    if (pList->Strings[pI1] > pList->Strings[pI2]) return -1;
    if (pList->Strings[pI1] < pList->Strings[pI2]) return 1;
    return 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
        TStringList *list = new TStringList;
        list->Sorted = 0;
        list->CaseSensitive = 0; // без чувствительности к регистру
        list->Text = Memo1->Text; // к примеру
        list->CustomSort(MyComp);
        Memo1->Text = list->Text; // ; ))
}
//---------------------------------------------------------------------------
То это обратная сортировка, для Мемо1
А криво сортирует в ListBox1


Добавлено через 12 минут и 29 секунд
в общем попробывал, выдало ряд ошибок:
Код

[C++ Error] Unit1.cpp(141): E2034 Cannot convert 'AnsiString' to 'const char *'
[C++ Error] Unit1.cpp(141): E2342 Type mismatch in parameter '__s' (wanted 'const char *', got 'AnsiString')
[C++ Error] Unit1.cpp(142): E2096 Illegal structure operation

Автор: Soah 24.2.2009, 14:08
VOX, может код покажешь, именно сортировку.
Ты же не хочешь чтобы я дал тебе ссылку на страницу с 100 миллиардов сток, и сказал посмотри, ответ там есть.
Цени наше и своё время.

Автор: VOX 24.2.2009, 14:17
Я понял, прошу прощения!
вот кодес:
Код

void __fastcall TForm1::Button2Click(TObject *Sender)
{
        ListBox1->Sorted = 1;
}

---------------------

Автор: Soah 24.2.2009, 14:47
Код

void sortListBoxItems(TStrings* items)
{
    for (int i = 0; i < items->Count-1; ++i)
        for (int j = i; j  < items->Count; ++j)
            if(StrToInt(items->Strings[i]) > StrToInt(items->Strings[j])) 
            {
                AnsiString temp = items->Strings[i];
                items->Strings[i] = items->Strings[j];
                items->Strings[j] = temp;
            }
}

void __fastcall TForm1::Button2Click(TObject *Sender)
{
    sortListBoxItems(ListBox1->Items);
}

Автор: VOX 24.2.2009, 15:08
Странно, но при клике на кнопку - никакой реакции :(

Добавлено через 2 минуты и 38 секунд
Код

http://www.sendspace.com/file/rdhf1d

вот сам проект (ваш кодес в конце)
закрепил за 10 кнопкой

Автор: Soah 24.2.2009, 15:19
Цитата(VOX @  24.2.2009,  14:17 Найти цитируемый пост)
 ListBox1->Sorted = 1;

зачем тебе это, замени на
Цитата(Soah @  24.2.2009,  14:47 Найти цитируемый пост)
sortListBoxItems(ListBox1->Items);


З.Ы. http://forum.vingrad.ru/forum/topic-149290.html
З.З.Ы какие числа вводишь ?

upd
Если нужно добавлять в сортировочном варианте, тогда можно так
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    ListBox1->Items->Add(Edit1->Text);
    TStrings* items =  ListBox1->Items;

    for (int i = 0; i < ListBox1->Items->Count-1; ++i)
        if(StrToInt(items->Strings[i]) > StrToInt(items->Strings[items->Count-1]))
        {
            AnsiString temp = items->Strings[i];
            items->Strings[i] = items->Strings[items->Count-1];
            items->Strings[items->Count-1] = temp;
        }

    Edit1->Clear();
}

Автор: VOX 24.2.2009, 15:39
вот эти числа
-----------------------
Код

1
10
11
12
13
14
15
16
17
18
19
2
20
22
23
24
26
27
28
29
3
30
31
32
33
34
35
37
38
39
4
40
41
42
43
44
45
46
47
48
49
5
50
51
52
53
54
55
56
57
58
59
6
60
61
62
63
64
65
66
67
68
69
7
70
71
72
73
74
8
9


Добавлено через 6 минут и 27 секунд
Первый код:
Код

void sortListBoxItems(TStrings* items)
{
    for (int i = 0; i < items->Count-1; ++i)
        for (int j = i; j  < items->Count; ++j)
            if(StrToInt(items->Strings[i]) > StrToInt(items->Strings[j])) 
            {
                AnsiString temp = items->Strings[i];
                items->Strings[i] = items->Strings[j];
                items->Strings[j] = temp;
            }
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    sortListBoxItems(ListBox1->Items);
}

-----------------------
вот он прекрасно работает!
Спасибо!
вот только как 
сортед = 1;
повлиял? я его снес, но он ведь за кнопкой закреплен,
до ее нажатие код не действителен, т.е. никак не влияет на ход программы...

Автор: Soah 24.2.2009, 15:54
Цитата(VOX @  24.2.2009,  15:39 Найти цитируемый пост)
повлиял? я его снес, но он ведь за кнопкой закреплен,

прочитай в справке что означает свойство Sorted,
чтобы ListBox сортировался не обязательно нажимать на кнопку,
достаточно присвоить свойству Soorted значение true один раз.

Автор: Dmi3ev 24.2.2009, 16:17
Цитата

if (atoi(pList->Strings[pI1]) > atoi(pList->Strings[pI2])) return -1;    
if (atoi(pList->Strings[pI1]) < atoi(pList->Strings[pI2])) return 1;    
return 0;

конечно тут будет ошибка, AnsiString надо в char конвертнуть с помощью 
.c_str();
а так можно придумать много чего, хотя бы даже вот так:
Код

//...
#include <vector.h>
#include <algorithm>
//...
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ListBox1->Clear();
ListBox1->Items->LoadFromFile("D:\\1.txt");

vector<int> v;
for (int i=0; i<ListBox1->Items->Count; i++)
 v.push_back(StrToInt(ListBox1->Items->Strings[i]));
sort(v.begin(), v.end());

Memo1->Clear();
for (int i=0; i<v.size(); i++)
 Memo1->Lines->Add(IntToStr(v[i]));
}

хоть так делай...

Автор: VOX 25.2.2009, 09:14
Я всё понял, спасибо, работает!

Автор: YanTsys 26.2.2009, 11:25
Цитата(Dmi3ev @ 24.2.2009,  16:17)
Цитата

if (atoi(pList->Strings[pI1]) > atoi(pList->Strings[pI2])) return -1;    
if (atoi(pList->Strings[pI1]) < atoi(pList->Strings[pI2])) return 1;    
return 0;

конечно тут будет ошибка, AnsiString надо в char конвертнуть с помощью 
.c_str();

Не проще pList->Strings[pI1].ToInt() или pList->Strings[pI1].ToIntDef(0) ?

Автор: Dmi3ev 26.2.2009, 11:36
YanTsys, да, да, да...
просто указал автору на ошибку  в этом коде и предложил свой вариант, которого еще не было)))
а я бы так и сделал, как ты говоришь)))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)