CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Wyszukiwanie ciągu dowolnych znaków

Wyszukiwanie ciągu dowolnych znaków

dział ogólny

Wyszukiwanie ciągu dowolnych znaków

Nowy postprzez Monika18 » poniedziałek, 14 listopada 2011, 11:31

Witam wszystkich użytkowników forum.
Mam taki problem ponieważ robię program który wyszukuje wiersz z ciągiem znaków i chodzi o to że wstawiam komponent RichEdit i w tym komponencie umieszczam ciąg lilczb na przykład:
12, 15, 20, 25, 30
15, 20, 30, 40, 50
16, 18, 25, 35, 40
Następnie wstawiam komponent TEdit i i komponent TButton i do komponentu TEdit wpisuję liczby które mają być wyszukane na przykład:
15, 30, 50
i program nie ma problemu z wyszukaniem tych liczb ale gdy wpiszę na przykład:
15, 30, 45
to program nie wyszukuje wiersza z ciągiem znaków a zależy mi na tym żeby wyszukał wiersz w którym znajdują się tylko te dwie liczby czyli 15 i 30 nawet wtedy gdy do komponentu TEdit
jest wpisane 15, 30, 45.

A o to jest kod mojego programu:

KOD cpp:     UKRYJ  
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

int SearchNumbers(TStrings *List, String Text)
{
  Text += ",";

  vector<String> Numbers;

  int p = -1;
  do
  {
   p = Text.Pos(",");
   if(p == 0) break;

   String sSeg = Text.SubString(1, p - 1).Trim();
   if(!sSeg.IsEmpty()) Numbers.push_back(sSeg);

   Text = Text.Delete(1, p + 1);

  }while(p > 0);

  int nCount = Numbers.size(), lCount = List->Count;

  int l = 0;
  do
  {
        p = 0;
        String sLine = List->Strings[l];

        for(int n = 0; n < nCount; n++)
        {

         String searchNumber = Numbers[n];
         int s = sLine.Pos(searchNumber);

         if(s > 0) p++; else break;

         if(p == nCount) return l;
        }

        l++;
  }while(l < lCount);

 return -1;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
{
 int index = SearchNumbers(RichEdit1->Lines, Edit2->Text);

 if(index < 0) ShowMessage("Niczego nie znaleziono");
 else
 {
  RichEdit1->SelStart = RichEdit1->Perform(EM_LINEINDEX, index, 0);
  RichEdit1->SelLength = RichEdit1->Lines->Strings[index].Length();
  RichEdit1->Perform(EM_SCROLLCARET, 0, 0);
  RichEdit1->SetFocus();
 }

}        
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Otwrz1Click(TObject *Sender)
{
if (OpenDialog1->Execute())
RichEdit1->Lines->LoadFromFile(OpenDialog1->FileName);
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Zapisz1Click(TObject *Sender)
{
if (SaveDialog1->Execute())
RichEdit1->Lines->SaveToFile(SaveDialog1->FileName);

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Wklej1Click(TObject *Sender)
{
RichEdit1->PasteFromClipboard();
}



Serdecznie proszę o pomoc.
Avatar użytkownika
Monika18
Bladawiec
Bladawiec
 
Posty: 8
Dołączył(a): niedziela, 13 listopada 2011, 17:53
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windows xp
Kompilator: c++ builder
Gadu Gadu: 0
    Windows XPFirefox

Re: Wyszukiwanie ciągu dowolnych znaków

Nowy postprzez Cyfrowy Baron » wtorek, 15 listopada 2011, 10:19

Zanim odpowiem, chciałbym zaznaczyć, że Twój kod wygląda co najmniej dziwacznie, jednak z braku czasu nie tworzyłem nowego kodu, lecz oparłem się na Twoim i poddałem go takiej modyfikacji by działał zgodnie z założeniami.

KOD cpp:     UKRYJ  
int SearchNumbers(TStrings *List, String Text)
{
  Text += ",";

  vector<String> Numbers;

  int p = -1;
  do
  {
   p = Text.Pos(",");
   if(p == 0) break;

   String sSeg = Text.SubString(1, p - 1).Trim();
   if(!sSeg.IsEmpty()) Numbers.push_back(sSeg);

   Text = Text.Delete(1, p + 1);

  }while(p > 0);

  int nCount = Numbers.size(), lCount = List->Count;

  int l = 0;
  int iYes = -1;
  int t = 0;

  do
  {

   String sLine = List->Strings[l];
   int n = 0;

   for( int i = 0; i < nCount; i++ )
   {
        int p = sLine.Pos( Numbers[i] );

        if(p > 0)
        {
         n++;
        }

        if( t < n )
        {
          t = n;
          iYes = l;

        }
   }

   l++;
  }while( l < lCount);

 return iYes;
}


W tym tygodniu mam mnóstwo zajęć, więc póki co nic lepszego nie zaprezentuję.
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: Wyszukiwanie ciągu dowolnych znaków

Nowy postprzez Monika18 » wtorek, 15 listopada 2011, 11:57

Tak to działa, a jak zrobić żeby dodać opcję wyszukiwania znaków od tyłu?
Na przykład od dołu komponentu TMemo, trzeba tu użyć jakiegoś komponentu żeby ustalać rodzaj wyszukiwania czy tekst ma być wyszukiwany od końca całego tekstu czy od przodu?
Avatar użytkownika
Monika18
Bladawiec
Bladawiec
 
Posty: 8
Dołączył(a): niedziela, 13 listopada 2011, 17:53
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windows xp
Kompilator: c++ builder
Gadu Gadu: 0
    Windows XPFirefox

Re: Wyszukiwanie ciągu dowolnych znaków

Nowy postprzez Cyfrowy Baron » wtorek, 15 listopada 2011, 12:05

Przecież linie przeglądasz w pętli do while, zrób tak by pętla liczyła od końca:

KOD cpp:     UKRYJ  
int nCount = Numbers.size(), lCount = List->Count;

  int l = lCount - 1;
  int iYes = -1;
  int t = 0;

  do
  {

   String sLine = List->Strings[l];
   int n = 0;

   for( int i = 0; i < nCount; i++ )
   {
        int p = sLine.Pos( Numbers[i] );

        if(p > 0)
        {
         n++;
        }

        if( t < n )
        {
          t = n;
          iYes = l;

        }
   }

   l--;
  }while( l > 0);
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: Wyszukiwanie ciągu dowolnych znaków

Nowy postprzez Monika18 » sobota, 19 listopada 2011, 15:33

Szuka od tyłu teraz, a mam pytanie, jest możliwość zrobienia żeby po każdym kliknięciu komponentu TButton zaznaczało kolejny wiersz w którym występuje choćby jeden znak wpisany do komponentu TEdit?
Avatar użytkownika
Monika18
Bladawiec
Bladawiec
 
Posty: 8
Dołączył(a): niedziela, 13 listopada 2011, 17:53
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windows xp
Kompilator: c++ builder
Gadu Gadu: 0
    Windows XPFirefox

Re: Wyszukiwanie ciągu dowolnych znaków

Nowy postprzez Cyfrowy Baron » sobota, 19 listopada 2011, 17:21

Jest taka możliwość, ale to wymaga dodatkowego przycisku, który będzie resetował pozycję wyszukiwania, tak by mogło odbywać się od 0. Można tez ewentualnie zrobić tak, że resetowanie nastąpi, gdy już nic więcej się nie znajdzie. Jak znajdę chwilę to opracuję ten kod, tylko widzę, że to ja myślę za Ciebie... :(
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: Wyszukiwanie ciągu dowolnych znaków

Nowy postprzez Cyfrowy Baron » sobota, 19 listopada 2011, 19:43

To będzie coś w tym rodzaju:

KOD cpp:     UKRYJ  
int lCount = 0;

int SearchNumbers(TStrings *List, String Text)
{
  Text += ",";

  vector<String> Numbers;

  int p = -1;
  do
  {
   p = Text.Pos(",");
   if(p == 0) break;

   String sSeg = Text.SubString(1, p - 1).Trim();
   if(!sSeg.IsEmpty()) Numbers.push_back(sSeg);

   Text = Text.Delete(1, p + 1);

  }while(p > 0);

  int nCount = Numbers.size();


  int l = lCount - 1;
  int iYes = -1;
  int t = 0;

  do
  {

   String sLine = List->Strings[l];
   int n = 0;

   for( int i = 0; i < nCount; i++ )
   {
                int p = sLine.Pos( Numbers[i] );

                if(p > 0)
                {
         n++;
                }

                if( t < n )
        {
          t = n;
                  iYes = l;

        }
   }

   l--;
  }while( l > 0);

 return iYes;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 if( lCount <= 0 ) lCount = RichEdit1->Lines->Count;

 int index = SearchNumbers(RichEdit1->Lines, Edit1->Text);

 lCount = index;

 if(index < 0) ShowMessage("Niczego nie znaleziono");
 else
 {
  RichEdit1->SelStart = RichEdit1->Perform(EM_LINEINDEX, index, 0);
  RichEdit1->SelLength = RichEdit1->Lines->Strings[index].Length();
  RichEdit1->Perform(EM_SCROLLCARET, 0, 0);
  RichEdit1->SetFocus();
 }
}
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: Wyszukiwanie ciągu dowolnych znaków

Nowy postprzez Monika18 » poniedziałek, 21 listopada 2011, 10:31

Zaczynam już to rozumieć i faktycznie działa. A mam pytanie jak zrobić takie coś żebym mogła sobie dorobić jakieś pole wyboru i zaznaczać ile znaków ma wyszukać. Na przykład jeżeli chcę żeby wyszukiwało z 10 podanych znaków już wiersz w którym znajdują się tylko dwa znaki i go zaznaczało bo teraz wyszukuje wiersz w którym znajduje się najwięcej znaków i go zaznacza i od tego wiersza rozpoczyna wyszukiwanie następnych znaków.
Avatar użytkownika
Monika18
Bladawiec
Bladawiec
 
Posty: 8
Dołączył(a): niedziela, 13 listopada 2011, 17:53
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windows xp
Kompilator: c++ builder
Gadu Gadu: 0
    Windows XPFirefox

Re: Wyszukiwanie ciągu dowolnych znaków

Nowy postprzez Cyfrowy Baron » poniedziałek, 21 listopada 2011, 17:01

To się straje coraz bardziej skomplikowane, a ty coraz mniej rozumiesz ten kod. Za ilość wyszukiwanych liczb odpowiada zmienna nCount, więc to ona decyduje ile liczb jest przeszukiwanych. By wykluczyć jakieś liczny najprościej byłoby usunąć je z vektora.
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: Wyszukiwanie ciągu dowolnych znaków

Nowy postprzez Monika18 » wtorek, 22 listopada 2011, 09:30

Ale jeżeli te liczby by się usunęło vektora to wtedy on by nie wyszukiwał konkretnych liczb a mi chodzi o to żeby dorobić jakieś pole wyboru i zaznaczać ile liczb ma byś wyszukanych, na przykład podaję 8 liczb i zaznaczam że program ma wyszukać od trzech liczb z tych podanych ośmiu w komponencie TEdit i program rozpoczyna wyszukiwanie już od trzech liczb w TMemo.
Avatar użytkownika
Monika18
Bladawiec
Bladawiec
 
Posty: 8
Dołączył(a): niedziela, 13 listopada 2011, 17:53
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windows xp
Kompilator: c++ builder
Gadu Gadu: 0
    Windows XPFirefox

Re: Wyszukiwanie ciągu dowolnych znaków

Nowy postprzez Cyfrowy Baron » wtorek, 22 listopada 2011, 16:48

Jak napisałem wcześniej ilośc wyszukiwanych liczb zależy od zmiennej nCount, więc tej zmiennej możesz przypisywać ile liczb ma być szukanych.
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: Wyszukiwanie ciągu dowolnych znaków

Nowy postprzez Monika18 » wtorek, 22 listopada 2011, 18:53

A faktycznie dziękuje, działa. Chciała bym się jakoś odwdzięczyć za pomoc. Jak mogę się odwdzięczyć?
Avatar użytkownika
Monika18
Bladawiec
Bladawiec
 
Posty: 8
Dołączył(a): niedziela, 13 listopada 2011, 17:53
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windows xp
Kompilator: c++ builder
Gadu Gadu: 0
    Windows XPFirefox

Re: Wyszukiwanie ciągu dowolnych znaków

Nowy postprzez Cyfrowy Baron » wtorek, 22 listopada 2011, 20:26

To forum po to jest, więc nikt kto tutaj udziela odpowiedzi nie oczekuje wdzięczności.
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: Wyszukiwanie ciągu dowolnych znaków

Nowy postprzez Monika18 » środa, 23 listopada 2011, 07:49

Jednak coś jest nie tak bo mam zmienną:
int nCount = Numbers.size();
i teraz jeżeli przypiszę że ma być na przykład wyszukane trzy liczby w taki sposób:
int nCount = 3;
to nie to wyszukuje jakoś inaczej.
Avatar użytkownika
Monika18
Bladawiec
Bladawiec
 
Posty: 8
Dołączył(a): niedziela, 13 listopada 2011, 17:53
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windows xp
Kompilator: c++ builder
Gadu Gadu: 0
    Windows XPFirefox

Re: Wyszukiwanie ciągu dowolnych znaków

Nowy postprzez polymorphism » środa, 23 listopada 2011, 11:11

To wyszukiwanie liczb w linii jest źle napisane. Teraz wyszukuje poszczególne liczby z wektora, zamiast szukać sekwencji liczb, którą ów wektor zawiera.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Następna 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 5 gości