c++ builder 6
Jack: Hej,
potrzebuje znalezc w jednym stringu innego.
Znalazlem w Internecie, że sluzy do tego funkcja LastDelimiter.
W wypadku poszukiwania chara działa dobrze − znajduje ostatnie wystąpienie danego znaku.
Ale gdy ma znalezc stringa, to go nie szuka.
Tylko szuka ostatniego wystapienia chara z ktorych sklada sie poszukiwany string.
np:
String tresc = "ooolo";
String tmp = "ala";
pozycja=tresc.LastDelimiter(tmp);
pozycja zwroci 4, bo "l" jest na czwartym miejscu,
a nie 0, choc "ala" nie znajduje sie w "ooolo"
Znacie inna funkcje ktorej moge uzyc?
Albo co mam zrobic?
Ostatecznie, znacie dobry interfejs graficzny do napisania tego w Javie?
4 lut 12:04
Benny: Chodzi Ci o to, że jak masz dwa słowa, sprawdzić czy jedno słowo jest podsłowem drugiego?
4 lut 12:09
Jack:
tak
4 lut 12:10
Benny: Pisałem sobie ostatnio taką funkcję.
Spróbuj, nie jest trudne
4 lut 12:14
Jack: Na pewno istnieje inny sposob niz pisanie specjalnej funkcji do takich rzeczy
4 lut 12:16
jc: Benny, jeśli chcemy to robić możliwie szybko, to już nie jest takie proste.
Przykład.
aaacabcbbcba
Szukasz abc, patrzysz na koniec tekstu. Widzisz a, możesz więc przesunąć się o 3.
aaacabcbb
Widzisz b. Możesz przesunąć się o 2.
aaacabc
A teraz już masz.
Coś koło tego, ale można to lepiej dopracować.
4 lut 12:30
Mariusz:
string find
4 lut 12:31
Jack: @jc
oba stringi co chwila beda inne, wiec i tak musialbym porownywac char do chara
@Mariusz
w builderze nie ma funkcji find
4 lut 12:43
Metis: Przejdź na char i
pusc petle po wszystkich znakach tekstu, jesli napotka twój pierwszy znak wtedy niech sprawdzi
kolejny itd.
4 lut 13:07
Jack: ech
@Metis
Wlasnie zaczynam to pisac
Choc nie ukrywam że pomysl byl taki by znalezc funkcje ktora zrobi to za mnie
4 lut 13:10
Benny: @Metis, to nie wszystko.
Masz słowo ana.
Drugie słowo chebakana.
Znajdzie literę 'a', ale kolejna nie będzie pasowała. Jednak w tym słowie znajduje się ana.
4 lut 13:18
Mariusz:
W szukanym łańcuchu weź sobie podłańcuch długości równej długości drugiego danego łańcucha
i porównuj podłańcuch pierwszego łańcucha z tym drugim podłańcuchem
4 lut 13:20
Mariusz:
W każdej iteracji pętli zmieniasz początkowy znak pdłańcucha kopiowanego z pierwszego łańcucha
4 lut 13:23
Dziadek Mróz:
std::string tresc = "ooolo";
std::string tmp = "ala";
pozycja = tresc.find(tmp);
if (pozycja != std::string::npos)
{
std::cout << "Znaleziono wystapienie " << tmp << " w " << tresc << " na pozycji " << pozycja;
}
4 lut 13:24
Mariusz:
Tak ale czy jest to dostępne w builderze bo z tego on korzysta
4 lut 13:26
Mariusz:
<cstring>
strstr()
4 lut 13:32
Mariusz:
Dziadek zajrzałbyś do tematu
https://matematykaszkolna.pl/forum/317193.html
Znalazłem jakiś algorytm ale nie wiem jak go zapisać w języku programowania
Cormen w swoich książkach miał łatwiejsze do zapisania algorytmy jednak ograniczył się
do sortowania tablic
4 lut 13:36
Dziadek Mróz:
String tresc = "ooolo";
String tmp = "ala";
pozycja = tresc.Pos(tmp);
if (pozycja != 0)
{
//nie wiem czego w BCB sie uzywa do pisania na ekran
std::cout << "Znaleziono wystapienie " << tmp << " w " << tresc << " na pozycji " << pozycja;
}
4 lut 13:39
Mariusz:
Możliwe że BCB ma tylko c łańcuchy czyli tablice znaków skoro find mu nie działa
4 lut 13:41
Jack: ok, ku potomnym:
napisalem te funkcje
int findfirst(AnsiString atego,AnsiString awtym)
{
//blok konieczny by zmienic stringi na lancuchy charow
int a = atego.Length();
int b = awtym.Length();
char *tego = new char[a];
char *wtym = new char[b];
sprintf(tego, "%s", atego.cstr());
sprintf(wtym, "%s", awtym.cstr());
int dlugosc=0;
int index =0;
for (int i=0; i<b; i++)
{
if(wtym[i]==tego[0])
{
dlugosc = 1;
int ii=++i;
for( int j=1; (j<a && ii<b) ; j++)
{
if(wtym[ii]!=tego[j]) break;
dlugosc++;
ii++;
}
}
if (dlugosc == a)
{
index =i;
break;
}
}
delete []tego;
delete []wtym;
return index;
}
4 lut 13:52
Jack: A tak w ogóle to pozdrawiam.
Jestem starszą siostrą "Jacka"
i (oczywiście za jego zgodą) użyłam tego konta do zadania pytania
@Benny @Metis
Dzięki. Zmotywowaliście mnie by samemu to napisać
@Mariusz @Dziadek Mróz
C++ Builder 6 rządzi się swoimi prawami.
nawet petlę for ma inną, bo w czystym cpp mogłabym ją zapisać tak:
for( int ii=i, int j=1; (j<a && ii<b) ; j++, i++)
4 lut 13:59
Jack: * for( int ii=++i, int j=1; (j<a && ii<b) ; j++, ii++)
4 lut 14:01
Metis:
4 lut 14:01
Mariusz:
Sprawdzałeś(aś) czy działa ta funkcja ?
Ja mam Borland C++ 3.1 , Dev C++ , Code::Blocks
W Builderze się nie bawię
Code::Blocks jest dość kiepsko napisany , w Dev C++ czasami debugger źle działa
Jest też opcja aby pisać kod w notatniku a kompilować z linii poleceń
4 lut 14:11