CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Sortowanie StringGrid

Sortowanie StringGrid

dział ogólny

Re: Sortowanie StringGrid

Nowy postprzez Cyfrowy Baron » piątek, 18 lutego 2011, 11:57

jak on jest póżniej wykorzystywany w celu sortowania.


Nie wiem jak jest później wykorzystywany, gdyż wynik działania funkcji jest przekazywany CustomSort obiektu typu TStringList i to ta funkcja przetwarza dane, które otrzymuje od funkcji pomocniczej.

KOD cpp:     UKRYJ  
SortList->CustomSort( CustomSortDecreaseInt );


Nie wiem jaką metodę sortowania stosuje funkcja CustomSort gdyż w pomocy poza informacją, że ta funkcja porównuje dwie wartości typu strings nic więcej na ten temat nie ma.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Sortowanie StringGrid

Nowy postprzez czeri » piątek, 18 lutego 2011, 12:28

To i chyba można by i tak:
KOD cpp:     UKRYJ  
return -CompareValue(rTemp1, rTemp2);
Avatar użytkownika
czeri
Bladawiec
Bladawiec
 
Posty: 19
Dołączył(a): środa, 26 stycznia 2011, 15:32
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Mac OS X 10.5.8
Kompilator: C++ Builder 6
Gadu Gadu: 0
    MacintoshSafari

Re: Sortowanie StringGrid

Nowy postprzez Cyfrowy Baron » piątek, 18 lutego 2011, 12:40

Sprawdziłeś co zwraca funkcja CompareValue?

KOD text:     UKRYJ  
CompareValue returns
LessThanValue if A is less than B (by more than Epsilon if A and B are floating-point numbers).
EqualsValue if A is equivalent to B (the same, or within Epsilon if A and B are floating-point numbers).
GreaterThanValue if A is larger than B (by more than Epsilon if A and B are floating-point numbers).


KOD cpp:     UKRYJ  
signed char = CompareValue(long double A, long Double B, long double Epsilon)


Jeżeli A jest mniejsze od B zwraca -1
Jeżeli A jest większe od B zwraca 1
Jeżeli A jest równe B zwraca 0

Jak widzisz operator - nie ma tutaj zastosowania.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Sortowanie StringGrid

Nowy postprzez czeri » piątek, 18 lutego 2011, 13:24

Kod: Zaznacz cały
signed char = CompareValue(long double A, long Double B, long double Epsilon)


Jeżeli A jest mniejsze od B zwraca -1
Jeżeli A jest większe od B zwraca 1
Jeżeli A jest równe B zwraca 0

Kod: Zaznacz cały
int foo(int u, int i)  /* funkcja pomocnicza */
{
        int z = u - i;
        return z;
}


To funkcja foo nie działa czasem na tej samej zasadzie? z tym, że jeśli wartość 'u' jest mniejsza od 'i' zwracana jest wartość ujemna, jeśli są równe zwracane jest 0 a jeśli 'u' jest większe od 'i' zwracana jest wartość dodatnia
Ostatnio edytowano piątek, 18 lutego 2011, 13:41 przez czeri, łącznie edytowano 1 raz
Avatar użytkownika
czeri
Bladawiec
Bladawiec
 
Posty: 19
Dołączył(a): środa, 26 stycznia 2011, 15:32
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Mac OS X 10.5.8
Kompilator: C++ Builder 6
Gadu Gadu: 0
    MacintoshSafari

Re: Sortowanie StringGrid

Nowy postprzez Cyfrowy Baron » piątek, 18 lutego 2011, 13:41

W sumie to się zgadza, tylko po co włączać do projektu dodatkową bibliotekę math.hpp skoro zadanie ogranicza się do obliczania różnicy między dwiema wartościami.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Sortowanie StringGrid

Nowy postprzez mufasa » niedziela, 20 lutego 2011, 18:28

KOD cpp:     UKRYJ  
void __fastcall SortGrid(TStringGrid *Grid, int Col, TTypeSort tsSort)
{

        TStringList *SortList = new TStringList;
        String temp = "";

        for(int i = Grid->FixedRows; i < Grid->RowCount; i++) // FixedRows=1 RowCount=ilosc wierszy
        {
                temp = Grid->Cells[Col][i];    //przypisanie do temp wartosci komórki z sortowanej kolumny
                if(!temp.IsEmpty())
                {
                for(int z = Grid->FixedCols; z <= Grid->ColCount; z++)  //FixedCols=1 ColCount=ilosc kolumn
                {
                        if(Grid->Cells[z][i].IsEmpty())
                        Grid->Cells[z][i] = " ";  //jesli komorka jest pusta dodaj biały znak
                         if(z != Col)      //jesli z jest różne od kolumny po której sortujemy
                                 temp = temp + "^" + Grid->Cells[z][i]; //Dodanie separatora ^ pomiędzy komórkami

                 }
                 SortList->Add(temp.SubString(0, temp.Length() - 1));  //Tworzenie listy do sortowanis
                temp = "";   //wyczyszczenie temp
                }
        }
        switch(tsSort)  //wybór sortowania
        {
                 case tsIncrease:    SortList->CustomSort(CustomSortIncrease); break;
                 case tsIncreaseInt: SortList->CustomSort(CustomSortIncreaseInt); break;
                 case tsDecrease:    SortList->CustomSort(CustomSortDecrease); break;
                 case tsDecreaseInt: SortList->CustomSort(CustomSortDecreaseInt); break;
         }

         temp = "";  // wyczyszczenie temp

        for(int i = 0; i < SortList->Count; i++)   // wpisywanie danych do komórek
         {
                temp = SortList->Strings[i]; //przypisanie do temp pojedyńczego wiersza

                 int y = temp.Pos("^"); //pozycja separatora
                Grid->Cells[Col][i + 1] = temp.SubString(1, y - 1).Trim();   //funkcja Trim() usuwa białe znaki
                 temp = temp.Delete(1, y);
                int z;
                 for(z = Grid->FixedCols; z < Grid->ColCount; z++)  // od z=1 do z<ilosc kolumn z++
                 {
                        if(z != Col)
                        {
                                y = temp.Pos("^");  //pozycja separatora
                                Grid->Cells[z][i + 1] = temp.SubString(1, y - 1).Trim();
                                temp = temp.Delete(1, y);
                        }
                }
                z++;
                y = temp.Pos("^");  //pozycja separatora
                Grid->Cells[z][i + 1] = temp.SubString(1, y - 1).Trim();
                temp = temp.Delete(1, y);
        }

        delete SortList;
}


Takie pytanie dlaczego powtarzamy w funkcji sortującej raz z warunkiem a raz bez

KOD cpp:     UKRYJ  
                                y = temp.Pos("^");  //pozycja separatora
                                Grid->Cells[z][i + 1] = temp.SubString(1, y - 1).Trim();
                                temp = temp.Delete(1, y);


skoro to co jest poza warunkiem zawsze będzie zwracało wartość null bo już jest poza StringGridem

KOD cpp:     UKRYJ  
        for(z = Grid->FixedCols; z < Grid->ColCount; z++)  // od z=1 do z<ilosc kolumn z++
                 {
                        if(z != Col)
                        {
                                y = temp.Pos("^");  //pozycja separatora
                                Grid->Cells[z][i + 1] = temp.SubString(1, y - 1).Trim();
                                temp = temp.Delete(1, y);
                        }
                }
                z++;
                y = temp.Pos("^");  //pozycja separatora
                Grid->Cells[z][i + 1] = temp.SubString(1, y - 1).Trim();
                temp = temp.Delete(1, y);
        }


No chyba, że się myle...
Ostatnio edytowano poniedziałek, 21 lutego 2011, 09:55 przez Cyfrowy Baron, łącznie edytowano 1 raz
Powód: Zmieniono tagi CODE na CPP
Avatar użytkownika
mufasa
Bladawiec
Bladawiec
 
Posty: 26
Dołączył(a): poniedziałek, 31 stycznia 2011, 17:36
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: c++ builder 6 enterprise
Gadu Gadu: 0
    Windows XPFirefox

Re: Sortowanie StringGrid

Nowy postprzez Cyfrowy Baron » niedziela, 20 lutego 2011, 19:34

No chyba, że się myle...


Sprawdź zamiast domniemywać. Przeanalizuj działanie kodu, a znajdziesz odpowiedź.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Sortowanie StringGrid

Nowy postprzez mufasa » niedziela, 20 lutego 2011, 19:38

No właśnie nie widzę tego.....
Analizowałem kod za pomocą breakpointów ale dalej niewiem dlaczego jest to powtórzone :(
Avatar użytkownika
mufasa
Bladawiec
Bladawiec
 
Posty: 26
Dołączył(a): poniedziałek, 31 stycznia 2011, 17:36
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: c++ builder 6 enterprise
Gadu Gadu: 0
    Windows XPFirefox

Re: Sortowanie StringGrid

Nowy postprzez Cyfrowy Baron » niedziela, 20 lutego 2011, 20:18

Sprawdziłeś jak działa sortowanie bez powtarzania?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Sortowanie StringGrid

Nowy postprzez mufasa » niedziela, 20 lutego 2011, 20:28

Cyfrowy Baron napisał(a):Sprawdziłeś jak działa sortowanie bez powtarzania?


Na pierwszy rzut oka wygląda wszystko ok





testuje raz tak raz tak i wyniki są takie same
Avatar użytkownika
mufasa
Bladawiec
Bladawiec
 
Posty: 26
Dołączył(a): poniedziałek, 31 stycznia 2011, 17:36
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: c++ builder 6 enterprise
Gadu Gadu: 0
    Windows XPFirefox

Re: Sortowanie StringGrid

Nowy postprzez Cyfrowy Baron » poniedziałek, 21 lutego 2011, 10:07

Nie pamiętam dlaczego tak zrobiłem, a żeby stwierdzić dlaczego tak jest musiałbym przetestować tą funkcję w różnych konfiguracjach. Warunek pomija kolumnę sortowaną.

skoro to co jest poza warunkiem zawsze będzie zwracało wartość null bo już jest poza StringGridem


Czyli tylko w przypadku gdy warunek napotka kolumnę sortowana przekazaną funkcji poprzez jej argument, więc np. w przypadku 10 kolumn warunek pominie tylko jedną:

KOD cpp:     UKRYJ  
void __fastcall SortGrid(TStringGrid *Grid, int Col, TTypeSort tsSort)
// ...
if(z != Col)


Jak widać w przypadku gdy z równe Col zadania wewnątrz warunku zostaną wykonane.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Poprzednia strona

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 6 gości