CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - [C++]Operacje na stringach i przeszukiwanie tabeli

[C++]Operacje na stringach i przeszukiwanie tabeli

dział ogólny

[C++]Operacje na stringach i przeszukiwanie tabeli

Nowy postprzez swiezak » sobota, 25 grudnia 2010, 02:42

Witam serdecznie :)
Chcę napisać coś na zasadzie menu pizzerri. Mam stworzoną bazę w .txt o składni
Hawajska:cebula, czosnek
Meksykańska:oregano,cebula

Program ma działać w dwie strony, tzn. w chechkoxach ma do zaznaczenia składniki(bez powtórzeń) i wtedy reultatem są nazwy pizz które je zawierają oraz w chekboxaxh są nazwy pizz i rezultatem są wspólne składniki dla wybranych pizz.
Chciałbym się poradzić w jaki sposób to najlepiej zrobić? w formie petli ma wczytywać do tablicy dwukierunkowej i później na tej podstawie ma w jakiś sposób przeszukiwać? Narazie widzę tylko takię rozwiązanie jednak niebardzo wiem jak to przenieść w kod, szczególnie część "wczytuj do.. dopóki nie napotkasz ":", wczytuj do... dopóki nie napotkasz "," - i to wszystko póki nienapotka na koniec lini. Nie wiem jak na tych stringach te operacje przeprowadzić?
Czuję że przeszukiwanie dopasowań prawi mi jeszcze większą trudność...

Wiem, że może się wydać że jestem kompletnym laikiem i ktoś mądry napisze "kup sobie symfonie Grębosza i czytaj od początku" ale prosiłbym o jakieś pomocne posty ;) najlepiej się uczyć na przy realizacji postawionego sobie celu ;)

Pozdrawiam użytkowników :)
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: [C++]Operacje na stringach i przeszukiwanie tabeli

Nowy postprzez Cyfrowy Baron » sobota, 25 grudnia 2010, 10:19


Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
swiezak
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [C++]Operacje na stringach i przeszukiwanie tabeli

Nowy postprzez Darek_C++ » sobota, 25 grudnia 2010, 17:32

Zainteresuj się bazą danych opartą o SQLitedo przechowywania danych dzięki której znacznie ułatwisz sobie pracę.
Oczywiście niezbędna jest znajomość przynajmniej podstaw języka zapytań do bazy SQL.
Obsługa z poziomu C/C++
http://www.sqlite.org/cintro.html
http://www.sqlite.org/c3ref/intro.html

http://www.alhem.net/project/sqlite/

Firefox ma wtyczkę do obsługi tej bazy która też okaże się pomocna http://code.google.com/p/sqlite-manager/. Polecam.
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: [C++]Operacje na stringach i przeszukiwanie tabeli

Nowy postprzez swiezak » czwartek, 6 stycznia 2011, 03:27

Dziękuję bardzo, mogę prosić o mała podpowiedź co do przeszukiwania stringa?
Kod: Zaznacz cały
Hawajska:cebula, czosnek.
Meksykańska:oregano,cebula.

Teraz zmieniłem bazę z kropkami na końcu, choć pewnie i z "\n" zadziałołoby, ale...
Kod: Zaznacz cały
for(int i=0 ; i<ListaWczytana->Count ; i++)
      {
         ListaPliku->Strings[i].Length()
         pozycja=ListaWczytana->Strings[i].Pos(","); // int
         ListaSkladnikow->Add(ListaPliku->Strings[i].SubString(1,pozycja-1));
         ListaWczytana->Strings[i]=ListaWczytana->Strings[i].Delete(1,pozycja); //kasuje przecinek
      }

przydałaby mi się pętla wczytująca więcej niż jeden składnik z linijki, gdyż teraz przechodzi do następnej linii po wczytaniu jednego składnika.
Potrzebuje zliczyć ilość przecinków w stringu by od tego uzależnić ilość obrotów pętli wewnętrznej, zresztą, później będzie też po tej cyfrze dopisywać w tablicy dwuwymiarowej odpowiedni składnik do pizzy.
Wcześniej oczywiscie jest podobna pętla która wyszukuje po ":" i wstawia w listę Pizz.
Mogę liczyć na pomoc ? Dziękuje :)
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: [C++]Operacje na stringach i przeszukiwanie tabeli

Nowy postprzez Cyfrowy Baron » czwartek, 6 stycznia 2011, 11:21

Teraz zmieniłem bazę z kropkami na końcu, choć pewnie i z "\n" zadziałołoby, ale...


Nie zadziałało by. Najlepiej jakby na końcu niczego nie było.

Potrzebuje zliczyć ilość przecinków w stringu by od tego uzależnić ilość obrotów pętli wewnętrznej.


Zliczanie przecinków niepotrzebne, gdyż zaproponowany przeze mnie sposób zamienia linię na listę usuwając przecinki.


A co pomysł z plikiem typu INI nie podoba się?!

KOD cpp:     UKRYJ  
 TStringList *ListaWczytana = new TStringList();
 ListaWczytana->LoadFromFile(ExtractFilePath(ParamStr(0)) + "plik.txt");

 TStringList *ListaSkladnikow = new TStringList();

 int wCount = ListaWczytana->Count;
 for(int i = 0; i < wCount; i++)
 {
  String lValue = ListaWczytana->Strings[i];

  int p = 0;
  do
  {

    p = lValue.Pos(",");
    String sResult = lValue.SubString(1, p - 1).Trim();
    if(!sResult.IsEmpty()) ListaSkladnikow->Add(sResult);
    lValue = lValue.Delete(1, p);

  }while(p > 0);

  ListaSkladnikow->Add(lValue.Trim());
 }

 /* sprwdzenie co zawiera ListaSkladnikow */
 Memo1->Lines->Assign(ListaSkladnikow);


Nie wiem czy o to Tobie chodzi, ale tak zrozumiałem Twoje pytanie.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
swiezak
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [C++]Operacje na stringach i przeszukiwanie tabeli

Nowy postprzez swiezak » piątek, 7 stycznia 2011, 02:48

Dziękuję CyfrowyBaronie :) Twój kod mi się bardzo przydał, wystarczyła lekka modyfikacja :)
Szczerze powiedziawszy to wcześniej go bardzo długi czas przeglądałem kod Twojego programu, który zamieściłeś w tamtym wątku i sprawił mi może sporo kłopotu, to na pewno przez moje małe obycie z programowaniem bo sporo czasu zajęło samo rozwikłanie, za co dana zmienna odpowiada, strasznie dużo i to w języku angielskim ;)

Co do mojego programu:
Wstawianie nowych pizz i składników już mam zrobione.
Aktualnie chyba czeka mnie najwięcej pracy z wrzuceniem ich do tablicy ( hmm, ten StringGrid który miałeś u siebie w programie wygląda bardzo ciekawie, jednak nie wiem czy nadawałby się do przeszukiwania), przeszukiwania po niej i wyświetlanie odpowiadającym im warunkom, czyli wspólnych składników dla kilku pizz, czy też nazwy pizz dla wybranych składników.
Szczerze powiedziawszy to tablice to moja pięta achillesowa... prośba o kolejne naprowadzenie na właściwy tor ...

Dziękuję za pomoc, chwali się taką pomoc, mam nadzieję że zagoszczę na dłużej i kiedyś również innym będę pomagał :)
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: [C++]Operacje na stringach i przeszukiwanie tabeli

Nowy postprzez Cyfrowy Baron » piątek, 7 stycznia 2011, 09:44

( hmm, ten StringGrid który miałeś u siebie w programie wygląda bardzo ciekawie, jednak nie wiem czy nadawałby się do przeszukiwania),


Z całą pewnością się nadaje, a przeszukiwanie takiej prostej tablicy jest banalne, trzeba przeszukać każą komórkę w pętli. Komórki są identyfikowane tak jak na szachownicy w oparciu o kolumny (pion) i wiersze (poziom). Do komórek odwołujesz się poprzez właściwość Cells, podając numer kolumny i numer wiersza w którym komórka się znajduje.

KOD cpp:     UKRYJ  
StringGrid->Cells[ kolumna ][ wiersz ]


By zapisać coś do wybranego wiersza, np. do komórki znajdującej się w drugiej kolumnie i trzecim wierszu:

KOD cpp:     UKRYJ  
StringGrid->Cells[2][3] = "jakiś tekst";


By odczytać zawartość komórki i przepisać np. do zmiennej typu String postępujesz dokładnie tak samo:

KOD cpp:     UKRYJ  
String Value = StringGrid->Cells[2][3];


Przeszukiwanie to sprawdzanie komórka po komórce:

KOD cpp:     UKRYJ  
String findText = "jakiś tekst";

for(int col = 0; col < StringGrid1->ColCount; col++)
{
  for(int row = 0; row < StringGrid1->RowCount; row++)
  {
    String cellText = StringGrid1->Cells[col][row].Trim(); /* Trim() obcina spacje tylko na początku i końcu łańcucha znaków */
   
   /* SameText porównuje dwa łańcuchy znaków, funkcja nie rozróżnia wielkości liter, jeżeli łańcuchy są identyczne zwracana jest wartość true */
   if(SameText(findText, cellText)) /* można też tak: if(findText.LowerCase() == cellText.LowerCase()) */
   {
      ShowMessage("Znaleziono poszukiwany tekst: " + findText + "w komórce: " + (String)col + " - " + (String)row);
     
     StringGrid1->Col = col;
     StringGrid1->Row = row;
     break; /* wyjście z pętli */
   }
  }
}


Więcej o tabeli typu TStringGrid przeczytasz w serwisie Cyfrowy Baron w dziale: porady -> StringGrid.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
swiezak
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [C++]Operacje na stringach i przeszukiwanie tabeli

Nowy postprzez swiezak » sobota, 8 stycznia 2011, 05:49

Póki co nie mam pytań co do przeszukiwania bo uzupełnianie mnie przerosło... Już zbyt późna godzina bym mógł jeszcze coś wymyślić więc prosiłbym o pomoc, bo takową jak widze jest udzielana w godzinach rannych :)
Tyle narobiłem (żeby nie było że nic nie robię ;)
Kod: Zaznacz cały
int w = 0;
int k =0;
int pom =0;

for(int i = 0; i <  lValueWczytana->Count; i++)
{
  String lValue =  lValueWczytana->Strings[i];
  //StringGrid1->Cells[i][w]=lValue;
  int p = 0;
  do
  {
   p = lValue.Pos(",");
   String sResult = lValue.SubString(1, p - 1).Trim();
   if(!sResult.IsEmpty())
       lValueCechy->Add(sResult);
      if(i==0)    //sprawdzenie by nie nadpisalo pizz w 1 kolumnie, ale pewnie to jest nieoptymalne rozwiązanie
         StringGrid1->Cells[1][w]=sResult;
      else
         StringGrid1->Cells[i][w]=sResult;
   lValue = lValue.Delete(1, p);

    k++;
    w++;

  }
  while(p > 0);
  lValueCechy->Add(lValue.Trim());

}
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: [C++]Operacje na stringach i przeszukiwanie tabeli

Nowy postprzez Cyfrowy Baron » sobota, 8 stycznia 2011, 12:46

Piszesz w taki sposób, że trudno pojąć o co pytasz. Domyślam się, że tym razem chodzi o przepisanie pliku do tabeli typu TStringGrid. Właściwie to nie powinieneś mieć już z tym problemów.

KOD cpp:     UKRYJ  
#include <memory> /* potrzebne do std:auto_ptr */

void __fastcall ClearGrid(TStringGrid *Grid)
{
 /* tylko środowisko C++Builder 2009 i 2010 */
 for(int row = 0; row < Grid->RowCount; row++)
 {
   Grid->Rows[row]->Clear();
 }

 /* dla wcześniejszych wersji C++Builder
 for(int row = 0; row < Grid->RowCount; row++)
 {
  for(int col = 0; col < Grid->ColCount; col++)
  {
   Grid->Cells[col][row] = "";
  }
 }
 */

}
//---------------------------------------------------------------------------
void __fastcall WriteToGrid(TStringGrid *Grid, int col, int row, String Value)
{
 if( Grid->ColCount <= col ) Grid->ColCount += 1;
 Grid->Cells[col][row] = Value.Trim();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 ClearGrid(StringGrid1); // czyszczenie tabeli - konieczne

 StringGrid1->RowCount = 1;
 StringGrid1->ColCount = 2; /* 2 przy założeniu, że tabela musi mieć conajmniej dwie kolumny */

 std::auto_ptr<TStringList> ListaWczytana (new TStringList());
 ListaWczytana->LoadFromFile(ExtractFilePath(ParamStr(0)) + "plik.txt");

 int wCount = ListaWczytana->Count;
 for(int i = 0; i < wCount; i++)
 {
  if( StringGrid1->RowCount <= i ) StringGrid1->RowCount += 1;
  String lValue = ListaWczytana->Strings[ i ];

  int p = 0, col = 0;
  do
  {

    p = lValue.Pos(",");
    String sResult = lValue.SubString(1, p - 1).Trim();
    if(!sResult.IsEmpty())
    {
     WriteToGrid(StringGrid1, col, i, sResult);
     col += 1;
    }
    lValue = lValue.Delete(1, p);

  }while(p > 0);

  WriteToGrid(StringGrid1, col, i, lValue);
 }

}


Ponieważ funkcje ClearGrid i WriteToGrid nie są funkcjami globalnymi i nie są metodami klasy formularza, to zdarzenia, obiekty i metody tegoż formularza nic nie wiedzą o tych funkcjach, dlatego te funkcje muszą znajdować się nad zdarzeniem w którym są wywoływane, chodzi oczywiście o porządek zapisu w kodzie. Więcej o tym przeczytasz ► patrz serwis: Cyfrowy Baron w dziale: teoria -> Funkcje, oraz teoria -> przekazywanie obiektów i funkcji pomiędzy formularzami.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
swiezak
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [C++]Operacje na stringach i przeszukiwanie tabeli

Nowy postprzez swiezak » sobota, 8 stycznia 2011, 16:27

Dziękuje, jednak czytasz mi w myślach i wiesz o co mi chodzi :)
KOD cpp:     UKRYJ  
void __fastcall TForm1::Button6Click(TObject *Sender)
{
String findTexta = "jakiś tekst";

for(int col = 0; col < StringGrid1->ColCount; col++)
{
        for(int row = 0 ; row < StringGrid1->RowCount ; row++)
        {
    String cellText = StringGrid1->Cells[col][row].Trim(); // <-linia 294
   if(SameText(findText, cellText))
   {
      ShowMessage("Znaleziono poszukiwany tekst: " + findText + "w komórce: " + (String)col + " - " + (String)row);
     
     StringGrid1->Col = col;
     StringGrid1->Row = row;
     break;
   }
  }
}
}

Kod który zamieściłeś do przeszukiwania ma 3 następujące błędy:
[BCC32 Error] Unit1.cpp(294): E2451 Undefined symbol ' ' '

[BCC32 Error] Unit1.cpp(294): E2451 Undefined symbol ' '

[BCC32 Error] Unit1.cpp(294): E2451 Undefined symbol ' '


Wszystkie mają napisane w "Full parser context"
Unit1.cpp(287): parsing: void _fastcall TForm1::Button6Click(TObject *)
co odpowiada za "{"

Ktoś miał podobny problem - viewtopic.php?p=4428 ale pozmieniałem nazwy zmiennych i dalej jest to samo.


swoją drogą: Czym się różni
KOD cpp:     UKRYJ  
ListaWczytana->LoadFromFile(ExtractFilePath(ParamStr(0)) + "plik.txt");
od
KOD cpp:     UKRYJ  
ListaWczytana->LoadFromFile(OpenDialog1->FileName);
? Co lepiej stosować?
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: [C++]Operacje na stringach i przeszukiwanie tabeli

Nowy postprzez Cyfrowy Baron » sobota, 8 stycznia 2011, 18:50

Kod który zamieściłeś do przeszukiwania ma 3 następujące błędy:


Kod nie ma błędu, gdyż zanim zamieściłem go na forum, to najpierw przetestowałem w środowisku C++Builder 2010. Przejrzyj dobrze kod, czy nie wprowadziłeś tam gdzieś jakiegoś znaku, gdyż komunikat błędu wskazuje iż w linii 294 znajduje się znak ' (apostrof), tymczasem u mnie w kodzie nie ma takiego znaku. Błąd jest gdzieś po Twojej stronie.
co odpowiada za "{"


Nie wiem o co Tobie z tym chodzi. Jeżeli liczba nawiasów się nie zgadza, to sprawdź i popraw, by każdy nawias otwierający miał nawias zamykający. Takimi szczegółami to już nie powinieneś nikomu zawracać głowy na forum.

swoją drogą: Czym się różni


:shock: :evil:

Funkcja LoadFromFile oczekuje jako argumentu ścieżki dostępu do pliku który ma być wczytany do listy. Funkcja ExtractFilePath zwraca ścieżkę dostępu do katalogu, w którym znajduje się plik podany jako argument tej funkcji. Funkcja ParamStr(0) zwraca pierwszy parametr programu, którym zawsze jest ścieżka dostępu do aplikacji wraz z nazwą pliku aplikacji. Połączenie tych trzech funkcji zawsze zwraca ścieżkę dostępu do katalogu w którym znajduje się aplikacja, np. aplikacja znajduje się w lokalizacji: c:\my_program\aplikacja.exe po wywołaniu kodu: ExtractFilePath(ParamStr(0)) program zwróci ścieżkę: c:\my_program\ jeżeli teraz dodam do tego wartość "plik.txt", to otrzymam ścieżkę dostępu: c:\my_program\plik.txt, czyli ListBox wczyta plik znajdujący się w katalogu programu. Funkcja OpenDialog->FileName zawsze zwraca ścieżkę dostępu do pliku wybranego w oknie dialogowym typu TOpenDialog.
Użycie OpenDialog wymaga jednak więcej kodu niż tutaj napisałeś, np:


KOD cpp:     UKRYJ  
if( OpenDialog1->Execute() )
{
  ListBox1->Items->LoadFromFile(OpenDialog1->FileName);
}

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
swiezak
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

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 9 gości

cron