CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - StringGrid - funkcja max / min

StringGrid - funkcja max / min

dział ogólny

StringGrid - funkcja max / min

Nowy postprzez swiezak » wtorek, 8 marca 2011, 20:46

Witam,
Nieco przerobiłem funkcję CyfrowegoBarona do wyszukiwania tekstu w StringGridzie, jednak mam pewien problem, gdyż zawsze w pierwszym wyniku dostaję że znajduje wynik w komórce [0][0], gdzie jest ten błąd?
Oprócz tego mam problem pewien gdyż warunek IF nie działa do końca sprawnie gdyż tu w stringridzie porównuje jak stringi czyli dostaje wyniki po kolei takie:
Znaleziono : 1,11764705882353 w komórce: [2] [8]
Znaleziono : 1 w komórce: [2] [9]
Znaleziono : 1,17647058823529 w komórce: [3] [7]
Znaleziono : 2,75 w komórce: [3] [8]
Znaleziono : 1,76470588235294 w komórce: [5] [2]
Znaleziono : 0,666666666666667 w komórce: [5] [6]
Znaleziono : 0,5 w komórce: [3] [4]
Znaleziono : 0,5 w komórce: [4] [2]
Znaleziono : 0,5 w komórce: [7] [6]
Znaleziono : 0,5 w komórce: [8] [7]
Znaleziono : 0,428571428571429 w komórce: [9] [8]
Znaleziono : 0,1 w komórce: [6] [2]
Znaleziono : 0,1 w komórce: [6] [2]//powtorzone czyli nie znajdzie mniejszego,tu by mi sie przydał stosowny komunikat

KOD cpp:     UKRYJ  
        String col = StringGrid1->Col;
        String row =  StringGrid1->Row ;
        String max = 0.1;


        for(int col = 2; col < StringGrid1->ColCount; col++)
        {
                for(int row = 2; row < StringGrid1->RowCount; row++)
                {
                        String przeszukiwanaKomorka = StringGrid1->Cells[col][row];

                   if(max >0 && max < 1 && max < przeszukiwanaKomorka)
                   {
                                max = przeszukiwanaKomorka;
                                StringGrid1->SetFocus();

                                StringGrid1->Col = col;
                                StringGrid1->Row = row;

                                c=col;
                                r=row;
                                // break; /* wyjście z pętli */
                        }
                }
        }
Memo1->Lines->Add("Znaleziono : " + max + " w komórce:  [" + col + "] [" + row + "]");
 



Oprócz tego: przydałoby mi się aby czyściło znaleziono komórkę jak również te które są nad tą komórką jak i po jej lewej
coś ala:
Obrazek
jak to przerobić?
KOD cpp:     UKRYJ  
           for (int j = 2 ; j < c+1; j++)
                {
                        for (int i = 2; i < r+1; i++)
                        {
                                StringGrid1->Cells[i][r]="/";
                                StringGrid1->Cells[c][j]= "**";
                                StringGrid1->Cells[c][r]= "";
                        }
                }

Dziękuję bardzo, od kilku dni nie mogę sobie poradzić z takimi problemikami.
Pozdrawiam
Ostatnio edytowano poniedziałek, 25 kwietnia 2011, 02:45 przez swiezak, łącznie edytowano 1 raz
Avatar użytkownika
swiezak
Bladawiec
Bladawiec
 
Posty: 25
Dołączył(a): sobota, 25 grudnia 2010, 02:25
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows 7 x64
Kompilator: Embarcadero C++ Builder 2010
Gadu Gadu: 0
    Windows 7Chrome

Re: StringGrid - funkcja max

Nowy postprzez Cyfrowy Baron » wtorek, 8 marca 2011, 22:28

KOD cpp:     UKRYJ  
         String przeszukiwanaKomorka = StringGrid1->Cells[col][row];
                   if(max >0 && max < 1 && max < przeszukiwanaKomorka)
                   {
                                max = przeszukiwanaKomorka;


Zauważ, że max przechowuje zawsze wartość którą jej przypiszesz, jeżeli więc w którymś obiegu pętli zmiennej max zostanie przypisana wartość ze zmiennej przeszukiwanaKomorka i jest ona większa od 1 to warunek nigdy nie zostanie spełniony i dalsze przeszukiwanie nie ma sensu.



Kolejna sprawa. Słyszałeś o konwersji między zmiennymi oraz o tym, że istnieją różne rodzaje zmienych?!
KOD cpp:     UKRYJ  
String max = 0.1;


To zmienna String, nie można jej przypisać wartości liczbowej, czyli powinno być tak:

KOD cpp:     UKRYJ  
String max = "0.1";


Jednak ty porównujesz wartości w warunku więc zarówno zmienna max jak i przeszukiwanaKomorka powinny być typu float lub double. Zmienne col i row przechowują numery kolumn i wierszy, więc są to liczby, nie mogą więc być przechowywane w zmiennej typu String, gdyż ta przechowuje tylko łańcuchy znaków. Te zmienne powinny być typu Integer. Poza tym one są w tym kodzie zbędne, gdyż nigdzie ich nie wykorzystujesz.

Ten kod powinien wyglądać tak:

KOD cpp:     UKRYJ  
 float max = 0.1;

 for(int col = 2; col < StringGrid1->ColCount; col++)
 {
   for(int row = 2; row < StringGrid1->RowCount; row++)
   {
      String sTemp = StringGrid1->Cells[col][row];
       
      if( sTemp.IsEmpty() ) continue; /* jeżeli komórka niczego nie zawiera pomiń resztę i przejdź do następnego obiegu pętli */

      float przeszukiwanaKomorka = StrToFloatDef( sTemp, 0.1 ); /* jeżeli nie można przekonwertować łańcucha znaków na liczbę zmiennej zostanie przypisana wartość domyślna, tutaj 0.1 */
   
      if( max > 0 && max < 1 && max < przeszukiwanaKomorka )
      {
         max = przeszukiwanaKomorka;
         StringGrid1->SetFocus();

        StringGrid1->Col = col;
        StringGrid1->Row = row;

        StringGrid1->Cells[col][row] = ""; /* wyczyszczenie komórki */

        c = col; /* nieznana zmienna */
        r = row; /* nieznana zmienna */
     }
   }
 }
Memo1->Lines->Add( "Znaleziono : " + (String)max + " w komórce:  [" + (String)col + "] [" + (String)row + "]");


Co do reszty to sam musisz przemyśleć ten warunek, gdyż nie mam zielonego pojęcia co chcesz nim osiągnąć.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
swiezak
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: StringGrid - funkcja max

Nowy postprzez swiezak » czwartek, 10 marca 2011, 00:38

Dziękuję, wszystko wspaniale wyszukuje, ale jest pewien bug, otóż przy każdym wyszukaniu w jakiś sposób losowy czyści również inne pola.
W załączniku skompilowany program wraz ze źródłami aby zobrazować ten problem. gdzie jest błąd?
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
swiezak
Bladawiec
Bladawiec
 
Posty: 25
Dołączył(a): sobota, 25 grudnia 2010, 02:25
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows 7 x64
Kompilator: Embarcadero C++ Builder 2010
Gadu Gadu: 0
    Windows 7Chrome

Re: StringGrid - funkcja max

Nowy postprzez Cyfrowy Baron » czwartek, 10 marca 2011, 14:31

KOD cpp:     UKRYJ  
void __fastcall TForm2::Button2Click(TObject *Sender)
{
 float max = 0.1;
 int c, r;

 for(int col = 2; col < StringGrid1->ColCount; col++)
 {
   for(int row = 2; row < StringGrid1->RowCount; row++)
   {
      String sTemp = StringGrid1->Cells[col][row];

      if( sTemp.IsEmpty() ) continue;

      float przeszukiwanaKomorka = StrToFloatDef( sTemp, 0.1 );

      if( max < przeszukiwanaKomorka )
      {
       max = przeszukiwanaKomorka;
       StringGrid1->SetFocus();

       StringGrid1->Col = col;
       StringGrid1->Row = row;

       c = col;
       r = row;
     }
   }
 }


 /* czyści znalezioną komórkę oraz komórki na nią */
 for(int col = 0; col <= c; col++)
 {
  StringGrid1->Cells[col][r] = "";

  if(col == c)
  {
   /* czyści komórki z lewej strony komórki znalezionej */
   for(int row = 0; row <= r; row++)
   {
    StringGrid1->Cells[c][row] = "";
   }
  }
 }

 Memo1->Lines->Add( "Znaleziono : " + (String)max +
                    " w komórce:  [" + c + "] [" + r + "]"
                  );
}


Czyszczenie komórek może odbywać się dopiero po odnalezieniu komórki właściwej, gdyż przed jej znalezieniem nie jest jeszcze wiadomym, która to komórka, dlatego nie można ich czyścić w trakcie wyszukiwania.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
swiezak
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: StringGrid - funkcja max

Nowy postprzez swiezak » piątek, 11 marca 2011, 04:10

Dziękuję bardzo :).
A ma Pan jakiś pomysł jak rozwiązać sprawę komunikatu, że więcej nie może szukać bo już nie ma do tego danych?
Avatar użytkownika
swiezak
Bladawiec
Bladawiec
 
Posty: 25
Dołączył(a): sobota, 25 grudnia 2010, 02:25
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows 7 x64
Kompilator: Embarcadero C++ Builder 2010
Gadu Gadu: 0
    Windows 7Chrome

Re: StringGrid - funkcja max

Nowy postprzez Cyfrowy Baron » piątek, 11 marca 2011, 09:52

Nie jestem pewien, czy dokładnie o to Tobie chodzi:

KOD cpp:     UKRYJ  
void __fastcall TForm2::Button2Click(TObject *Sender)
{
 float max = 0.1;
 int c, r;

 for(int col = 2; col < StringGrid1->ColCount; col++)
 {
   for(int row = 2; row < StringGrid1->RowCount; row++)
   {
      String sTemp = StringGrid1->Cells[col][row];

      if( sTemp.IsEmpty() ) continue;

      float przeszukiwanaKomorka = StrToFloatDef( sTemp, 0.1 );

      if( max < przeszukiwanaKomorka )
      {
       max = przeszukiwanaKomorka;
       StringGrid1->SetFocus();

       StringGrid1->Col = col;
       StringGrid1->Row = row;

       c = col;
       r = row;
     }
     
    if(col == StringGrid1->ColCount - 1 && row == StringGrid1->RowCount - 1)
     ShowMessage("Zakończono przeszukiwanie");
   }
 }


 /* czyści znalezioną komórkę oraz komórki na nią */
 for(int col = 0; col <= c; col++)
 {
  StringGrid1->Cells[col][r] = "";

  if(col == c)
  {
   /* czyści komórki z lewej strony komórki znalezionej */
   for(int row = 0; row <= r; row++)
   {
    StringGrid1->Cells[c][row] = "";
   }
  }
 }

 Memo1->Lines->Add( "Znaleziono : " + (String)max +
                    " w komórce:  [" + c + "] [" + r + "]"
                  );
}


Ten komunikat jest jednak zbędny, gdyż w sytuacji gdy co najmniej jedna komórka w tabeli zawiera liczbę, funkcja zawsze coś znajdzie.
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: StringGrid - funkcja max

Nowy postprzez swiezak » środa, 16 marca 2011, 04:38

Dziękuję.
Nad tym komunikatem jeszcze pracuję, w ogóle to chyba źle go przemyślałem.
Mam jeszcze problem z przerobieniem tego by zrobić tak że w komórkach przetrzymywane byłyby floaty, gdyż chciałbym je porównywać w sposób taki, że aby mi wyszukiwało nie MAX, ale liczby >= 1 && liczby >0 *ale również wg kolejności malejącej) ponieważ wszystkie liczby w StringGridzie (znaczy się oprócz 0 i 1 kolumnie i wierszu) będą liczbami float.
Pozdrawiam
Avatar użytkownika
swiezak
Bladawiec
Bladawiec
 
Posty: 25
Dołączył(a): sobota, 25 grudnia 2010, 02:25
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows 7 x64
Kompilator: Embarcadero C++ Builder 2010
Gadu Gadu: 0
    Windows 7Chrome

Re: StringGrid - funkcja max

Nowy postprzez Cyfrowy Baron » środa, 16 marca 2011, 10:17

Takie wyszukiwanie wymagałoby posortowania tabeli, a potem to już metodą porównania, czyli coś w stylu:

KOD cpp:     UKRYJ  
float foo(float u, float i)
{
 return ( u - i );
}


To jednak już zupełnie inny sposób przeszukiwania. Tabel StringGrid jest tabelą dwuwymiarową, a nie zwykłą listą z wartościami, więc pojawia się problem z kryterium sortowania, czyli czy sortować tylko wiersze czy tylko kolumny. Poza tym przypuszczam, iż zależy Tobie na tym, żeby zawartość komórek w tabeli pozostała na swoich miejscach, więc nie można posortować samej tabeli. Trzeba by najpierw przepisać zawartość komórek do jakiejś tymczasowej jedno-wymiarowej tablicy, posortować w tej tablicy i szukać również w tej tablicy, a potem podstawić to pod tabelę. Tutaj jednak pojawia się problem z powtarzającymi się wartościami w komórkach. Po posortowaniu tablicy otrzymasz najwyższą i najniższą wartość na jej przeciwstawnych końcach.
Przykład sortowania StringGrid w tym wątku: http://programowanie.cal.pl/forum/viewtopic.php?f=2&t=1258&p=9323&hilit#p9286
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: StringGrid - funkcja max

Nowy postprzez swiezak » środa, 16 marca 2011, 11:35

a co w wpisywaniem floatów do komórek StringGrida?

Co do tablicy to mam wątpliwości i myślę tu o dwuwymiarowej gdyż od razu mógłbym określić miejsce gdzie jest ta wyszukana liczba, wtedy "czyścić" w StringGridzie a w tablicy w tym miejscu zerować by zachować spójność co do liczby komórek więc pozostaje kwestia znalezienia liczby z odpowiedniego przedziału który podałem powyżej.
Avatar użytkownika
swiezak
Bladawiec
Bladawiec
 
Posty: 25
Dołączył(a): sobota, 25 grudnia 2010, 02:25
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows 7 x64
Kompilator: Embarcadero C++ Builder 2010
Gadu Gadu: 0
    NieznanyOpera

Re: StringGrid - funkcja max

Nowy postprzez Cyfrowy Baron » środa, 16 marca 2011, 12:03

swiezak napisał(a):a co w wpisywaniem floatów do komórek StringGrida?


A co to niby ma znaczyć?! :o
Komórki tabeli typu TStringGrid przechowują tylko łańcuchy znaków (tekst), czyli zmienne typu String. Nie wiem o co pytasz. Opisz problem dokładniej, gdyż widziałem, że Twoja tabela przechowuje liczby zmiennopozycyjne więc nie masz z tym żadnych problemów. Float to zmienna przechowująca liczby zmiennopozycyjne, czyli ułamki.




ozostaje kwestia znalezienia liczby z odpowiedniego przedziału który podałem powyżej.


Czy to będzie tablica jedno czy dwuwymiarowa to i tak musisz ją posortować. W przypadku tabeli StringGrid mamy jednak do czynienia z tablicą wielowymiarową, wszak tablica dwuwymiarowa to dwie kolumny i nieokreślona liczba wierszy, a twoja tabela ma więcej kolumn. W przypadku tablicy wielowymiarowej i tak szukasz najniższej wartości w każdej komórce tej tablicy, a nie tylko w wybranej kolumnie, więc równie dobrze możesz przepisać tabelę do tablicy jednowymiarowej, posortować, pobrać najniższą wartość, a potem w tabeli StringGrid odnaleźć tą wartość. Proste!
do tablicy to mam wątpliwości i myślę tu o dwuwymiarowej gdyż od razu mógłbym określić miejsce gdzie jest ta wyszukana liczba,


A niby jak określisz miejsce gdzie jest wyszukiwana liczba, przecież najpierw musisz to miejsce znaleźć. Bez posortowania nie znajdziesz tej liczby, a jak posortujesz to liczby i tak pozamieniają się miejscami... :)
Właściwie bez sortowania też można taka liczbę znaleźć, ale wtedy każda liczba będzie porównywana z każdą i te same liczby będą porównywane wielokrotnie, co w przypadku dużej tabeli będzie oznaczało miliony porównań. Do tego w przypadku tablicy wymiarowej dochodzą pętle, dla każdej kolumny oddzielna. Im więcej kolumn w tablicy tym więcej pętli, poza tym liczba kolumn musi być z góry ustalona, byś mógł określić ile pętli ma się wykonywać. W przypadku tablicy jednowymiarowej podczas sortowania liczby porównywane są tylko raz a i pętle są zbędne gdyż można zastosować rekurencję.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
swiezak
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: StringGrid - funkcja max

Nowy postprzez swiezak » poniedziałek, 25 kwietnia 2011, 02:45

Mam problem z przerobieniem tej funkcji na znajdującą wartość minimalną ( z przedziału 0 do 1), niby powinno to być proste, ale jednak za każdym razem do wyniku wpisuje wartość "0,100000001490116"
przerabiałem:
KOD cpp:     UKRYJ  
        float max = 0.1;
                int c, r;

                for (int col = 2; col < StringGrid1->ColCount; col++) {
                        for (int row = 2; row < StringGrid1->RowCount; row++) {
                                String sTemp = StringGrid1->Cells[col][row];

                                if (sTemp.IsEmpty())
                                        continue;

                                float przeszukiwanaKomorka = StrToFloatDef(sTemp, 0.1);

                                if ( /* przeszukiwanaKomorka > 1 || */ przeszukiwanaKomorka <=  0) {
                                        StringGrid1->Col = col;
                                        StringGrid1->Row = row;
                                        StringGrid1->Cells[col][row] = "";
                                }

                                if (max < przeszukiwanaKomorka && przeszukiwanaKomorka < 1) {
                                        max = przeszukiwanaKomorka;
                                        // StringGrid1->SetFocus();

                                        StringGrid1->Col = col;
                                        StringGrid1->Row = row;

                                        c = col;
                                        r = row;
                                }

                        }
                }
Avatar użytkownika
swiezak
Bladawiec
Bladawiec
 
Posty: 25
Dołączył(a): sobota, 25 grudnia 2010, 02:25
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows 7 x64
Kompilator: Embarcadero C++ Builder 2010
Gadu Gadu: 0
    Windows 7Chrome

Re: StringGrid - funkcja max / min

Nowy postprzez Cyfrowy Baron » poniedziałek, 25 kwietnia 2011, 08:28

swiezak napisał(a):a każdym razem do wyniku wpisuje wartość "0,100000001490116"


Odpowiedzialny jest za to ten fragment kodu:

KOD cpp:     UKRYJ  
float przeszukiwanaKomorka = StrToFloatDef(sTemp, 0.1);


Piszesz, że za każdym razem, więc w każdym obiegu pętli zmienna przyjmuje wartość 0.1, a to oznacza, że nie można dokonać konwersji zawartości zmiennej sTemp na liczbę, czyli zmienna sTemp zawiera tekst nie będący liczbą. Zmienne sTemp powinna zawierać tekst będący liczbą całkowitą, lub liczbą dziesiętną, ale nie z kropką lecz z przecinkiem. Dlaczego z przecinkiem skoro w kodzie podajesz z kropką? Dlatego, że taka jest składnia języka C++ i liczba dziesiętna w kodzie zawsze jest rozdzielana kropką. Jednak taka liczba pobierana z np. tabeli już w działającym programie musi być rozdzielona przecinkiem, chyba, że w systemie masz ustawione inaczej:
liczby.png
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
swiezak
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: StringGrid - funkcja max / min

Nowy postprzez swiezak » środa, 27 kwietnia 2011, 12:02

Baronie, ale dalej nie wiem jak mam to przerobić na szukanie wartości minimalnej ( z przedziału 0 do 1 ), a to jest kod który podałeś kilka postów wyżej.
Avatar użytkownika
swiezak
Bladawiec
Bladawiec
 
Posty: 25
Dołączył(a): sobota, 25 grudnia 2010, 02:25
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows 7 x64
Kompilator: Embarcadero C++ Builder 2010
Gadu Gadu: 0
    Windows 7Chrome

Re: StringGrid - funkcja max / min

Nowy postprzez Cyfrowy Baron » środa, 27 kwietnia 2011, 12:20

swiezak napisał(a):a to jest kod który podałeś kilka postów wyżej.


No nie jest to ten sam kod, gdyż go przerobiłeś. Chyba nie oczekujesz, że kod zmodyfikowany będzie działał dokładnie tak samo jak oryginał.

swiezak napisał(a):Baronie, ale dalej nie wiem jak mam to przerobić na szukanie wartości minimalnej ( z przedziału 0 do 1 )


No ja też nie wiem. Musiałbym znów ślęczeć nad Twoim kodem, ale mi się już nie chce.

Przyjrzyj się tym warunkom:

KOD cpp:     UKRYJ  
if ( /* przeszukiwanaKomorka > 1 || */ przeszukiwanaKomorka <=  0) {
                                        StringGrid1->Col = col;
                                        StringGrid1->Row = row;
                                        StringGrid1->Cells[col][row] = "";
                                }

                                if (max < przeszukiwanaKomorka && przeszukiwanaKomorka < 1) {
                                        max = przeszukiwanaKomorka;
                                        // StringGrid1->SetFocus();

                                        StringGrid1->Col = col;
                                        StringGrid1->Row = row;

                                        c = col;
                                        r = row;
                                }


Zwróć uwagę, że po spełnieniu warunku pierwszego kolejne działania nadal są wykonywane, gdyż warunek drugi może być spełniony pomimo spełnienia warunku pierwszego, wszak max może być równe i mniejsze 0 i jednocześnie przeszukiwanaKomorka może być mniejsza od 1. Może zajść i pewnie zachodzi sytuacja, gdy obydwa warunki zostają spełnione.
Może powinno być tak:

KOD cpp:     UKRYJ  
if ( /* przeszukiwanaKomorka > 1 || */ przeszukiwanaKomorka <=  0) {
                                        StringGrid1->Col = col;
                                        StringGrid1->Row = row;
                                        StringGrid1->Cells[col][row] = "";
                                }
                                else
                                {
                                 if (max < przeszukiwanaKomorka && przeszukiwanaKomorka < 1) {
                                        max = przeszukiwanaKomorka;
                                        // StringGrid1->SetFocus();

                                        StringGrid1->Col = col;
                                        StringGrid1->Row = row;

                                        c = col;
                                        r = row;
                                 }
                              }


Nie analizowałem tego kodu i nie sprawdzałem. To zadanie zostawiam Tobie.
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: StringGrid - funkcja max / min

Nowy postprzez Cyfrowy Baron » środa, 27 kwietnia 2011, 13:06

W tym poście http://programowanie.cal.pl/forum/viewtopic.php?f=2&t=1370&p=9938#p9938 są algorytmy do wyszukiwania największej i najmniejszej liczby z tablicy. Dopasuj sobie do tabeli StringGrid i problem z głowy.
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


Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 4 gości