Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 11 odgovora
  • 4.085 pregleda

Najnovija ↓

zadatak sa AnsiStringovima 05.09.2005. u 00:20 · pre 257 meseci
izmenjeno 1 put, poslednji put dart_vejder 05.09.2005. u 00:22
  1. dart_vejder05.09.2005. u 00:22zapis iz teksta poruke
#1
imam RichEdit1 i 2.
trebam uraditi da iz ta dva Ansi Stringa dobijem Ansi String a i b koji ce zapravo predstavljati ona dva ali bez znakova razmaka i uporediti jesu li isti

uradio sam kod ali nece da radi. zasto?

String a,b;
int k=1,f=1;

for(int i=1; i<=RichEdit1->Text.Length(); i++)
{
if(RichEdit1->Text!=' ')
{
a[k]=RichEdit1->Text;
k++;
}
}

for(int j=1; j<=RichEdit2->Text.Length(); j++)
{
if(RichEdit2->Text[j]!=' ')
{
b[f]=RichEdit2->Text[j];
f++;
}
}

if(a==b)
ShowMessage("isti su");
else
ShowMessage("nisu isti");
Potpis
kod žorža ti je ka' u banku!!
oko? sto ce ti oko??
Re: zadatak sa AnsiStringovima 05.09.2005. u 08:09 · pre 257 meseci #2
Sada nemam puno vremena da gledam jer treba da vodim dete u vrtic ;) ali onako
odokativno vidim par gresaka:

Citat:

for(int i=1; i<=RichEdit1->Text.Length(); i++)


Mislim da treba:
Code:

for(int i=0; i<RichEdit1->Text.Length(); i++)


Takodje:

Citat:

a[k]=RichEdit1->Text;
k++;


Treba:
Code:

a = a + RichEdit1->Text[i];


E sad, ja bih ipak sve ovo radio malo drugacije, a ti probaj i ovako, pa kad budem
imao vremena poggledacemo...

P.S.
TRichEdit ima property Lines koji opet ima indeksni operator Strings[], cisto da
razmislis...

Evo kako (NETESTIRANO!!!) mozes da 'prodjes' kroz linije i sve karaktere
pojedinacne linije TRIchEdit-a.

Code:

for ( int i=0; i<RichEdit1->Lines->Count; i++ )
{
   for ( int j=1; j<=Lines->Strings[i].Length(); j++ )
      RichEdit1->Lines->Strings[j];
}



Bolje resenje bi ti bilo da napravis funkciju koja uzima po jedan element iz
jednog pa iz drugog RichEdit-a (a ako je ' ' onda ga preskoci), pa izadji ODMAH
iz funkcije i vrati FALSE ako pronadjes da se ne slaze...

A ne ovako da sve prvo stavis u AnsiString...
Re: zadatak sa AnsiStringovima 05.09.2005. u 09:51 · pre 257 meseci #3
kad vec programiras, podsisteme stavljaj u funkcije...

Probaj ovaj kod /NETESTIRANO!!!/ :

--- H ---
Code:

// ...
bool __fastcall IsRichEditEqualWithoutSpaces(TRichEdit*, TRichEdit*); 
// ...


--- CPP ---
// ...
#include <StrUtils.Hpp>
// ...
Code:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   if ( IsRichEditEqualWithoutSpaces( RichEdit1, RichEdit2 ) )
      ShowMessage( "Isti su!" );
   else
      ShowMessage( "Nisu isti!" );

}

bool __fastcall TForm1::IsRichEditEqualWithoutSpaces(TRichEdit *R1, TRichEdit *R2)
{
   if ( R1->Lines->Count != R2->Lines->Count )
      return ( false );

   for ( int i=0; i<R1->Lines->Count; i++ )
   {
      AnsiString A1 = AnsiReplaceStr( R1->Lines->Strings[i], " ",  "" );
      AnsiString A2 = AnsiReplaceStr( R2->Lines->Strings[i], " ",  "" );

      if ( A1 != A2 )
         return ( false );
   }


   return ( true );
}
Re: zadatak sa AnsiStringovima 05.09.2005. u 13:17 · pre 257 meseci
izmenjeno 1 put, poslednji put dart_vejder 05.09.2005. u 13:35
  1. dart_vejder05.09.2005. u 13:35zapis iz teksta poruke
#4
razmisljao sam i tako da uradim
ali tu se cini mi se moze javiti nekoliko problema:

sta ako je jedan String veci od Drugog, tj ima vise slova.
tu bi trebalo pogledati prvo koji je manji, pa za njegovu duzinu da "predjemo" preko veceg, pa kasnije provjeriti da li su sva slova u ostatku veceg jednaka razmaku...
pa i nije bas tako jednostavno i brzo uraditi funkciju koja ce uzeti jedan element prvog stringa, pa cekati da se naidje na element drugog koji nije razmak...normalno to se sve moze uraditi,ali sam razmisljao zar nije ovako lakse i brze, a uradice istu stvar

prostudiracu tvoje predloge pa cu uraditi kako mi bude lakse

kad provjerim javicu kako sam uradio (koju sam ideju prihvatio) tj. radi li
Potpis
kod žorža ti je ka' u banku!!
oko? sto ce ti oko??
Re: zadatak sa AnsiStringovima 05.09.2005. u 13:52 · pre 257 meseci #5
evo, obecao sam javiti

uradio sam ovako

Code:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String a,b;
for(int i=1; i<=RichEdit1->Text.Length(); i++)
{
if(RichEdit1->Text[i]!=' ')
{
a = a + RichEdit1->Text[i];
}
}
for(int j=1; j<=RichEdit2->Text.Length(); j++)
{
if(RichEdit2->Text[j]!=' ')
{
b = b + RichEdit2->Text[j];
}
}
if(a==b)
ShowMessage("Isti su!");
else
ShowMessage("Nisu isti!");


i to radi, ali samo ako se iste rijeci nalaze u istim redovima (bez obzira na razmake) a ako se neka rijec lomi izmedju redova, ovo ne radi.

kako da napravim da mi ne vodi racuna ni o novim redovima
(gledao sam kako izgledaju Stringovi a i b i vidio da se prelazak izmedju redova teksta obiljezava sa neke dvije uspravne linije.kako to da maknem??)
Potpis
kod žorža ti je ka' u banku!!
oko? sto ce ti oko??
Re: zadatak sa AnsiStringovima 05.09.2005. u 18:35 · pre 257 meseci
izmenjeno 2 puta, poslednji put X Files 05.09.2005. u 18:50
  1. X Files05.09.2005. u 18:50zapis iz teksta poruke
  2. X Files05.09.2005. u 18:35zapis iz teksta poruke
#6
Jesi li pogledao resenje koje sam ti dao sa funkcijom:
IsRichEditEqualWithoutSpaces()

Ono ide red po red i uporedjuje...


One uspravne crte su \r\n ili samo \n, nisam siguran... Toga se mozes resiti
preko funkcije koju sam ti vec predstavio u primeru koji pomenuh: AnsiReplaceStr():

Code:

AnsiReplaceStr( R1->Lines->Strings[i], "\r",  "" );
AnsiReplaceStr( R1->Lines->Strings[i], "\n",  "" );


...slicno ti moze zatrebati i za:

Code:

AnsiReplaceStr( R1->Lines->Strings[i], "\t",  "" );


P.S. Jesi li siguran da indeksi za Text[] idu od JEDINICE a ne od NULE???
To jest, ti si stavio:
Code:

for(int i=1; i<=RichEdit1->Text.Length(); i++)

Mozda treba:
Code:

for(int i=0; i<RichEdit1->Text.Length(); i++)

???
Re: zadatak sa AnsiStringovima 05.09.2005. u 21:35 · pre 257 meseci #7
cini mi se da je sa

for(int i=0; i<RichEdit1->Text.Length(); i++)

uporno javljao gresku....

pa, evo...uzmi jedan String i stavi da ti na Label-u 1 ispise RichEdit1->Text[1], a na Label-u 2 RichEdit->Text[0], prvi ce ispisati prvo slovo, a drugi ce prijaviti gresku

(moguce(??) da sam pogrijesio, ali sam tako nesto jednom izveo, i cini mi se da je bas ovako bilo...)
ma nije to tesko ponovo provjeriti...

nisam provjerio onaj drugi nacin...
pa i to cu uraditi vjerovatno
Potpis
kod žorža ti je ka' u banku!!
oko? sto ce ti oko??
Re: zadatak sa AnsiStringovima 06.09.2005. u 14:24 · pre 257 meseci
izmenjeno 2 puta, poslednji put fucking voodoo 06.09.2005. u 14:27
  1. fucking voodoo06.09.2005. u 14:27zapis iz teksta poruke
  2. fucking voodoo06.09.2005. u 14:25zapis iz teksta poruke
#8
meni ovo nije radilo...
mislim da sam otkrio sta je...
evo ovako...

x files, kao prvo, cini mi se da si malo pogrijesio u onome kodu...

o funkciji AnsiReplaceStr pise da se stavlja tekst, i kazes koji string u tom tekstu da zamijenis sa kojim stringom, prema tome, ne bih rekao da je trebalo staviti

AnsiReplaceStr( R1->Lines->Strings[I], "\r", "" );
vec
AnsiReplaceStr( R1->Text, "\r", "" ); , znaci ne jedno slovo vec cirav tekst ??
pa prema tome ne bi trebala ni ona for petlja...
sama funkcija predje preko teksta....

e, onda...nije trebalo ni ono

if ( R1->Lines->Count != R2->Lines->Count )
return ( false );

jer npr.

elite sec u ri
ty

i

elitesecurity

su po ovome kodu jednaki tekstovi, a ti im onim kodom nisi dozvolio da budu....

prepravljen kod sada izgleda ovako:

bool __fastcall TForm1::IsRichEditEqualWithoutSpaces(TRichEdit *R1, TRichEdit *R2)
{
AnsiString A1,A2;
AnsiString B1,B2; //trenutno ne trazim optimizaciju vec samo da proradi, kasnije treba optimizovati...


A1 = AnsiReplaceStr( R1->Text, " " , "" );
A2 = AnsiReplaceStr( R2->Text, " " , "" );

B1 = AnsiReplaceStr( A1, "\r" , "" );
B2 = AnsiReplaceStr( A2, "\r" , "" );

A1 = AnsiReplaceStr( B1, "\n" , "" );
A2 = AnsiReplaceStr( B2, "\n" , "" );


if ( A1 != A2 )
return ( false );
else
return ( true );
}

sada ukucah par raznih mogucnosti i radilo je fino...
e sada...moguce da i ja nesto grijesim...???

dart_vejder, pokusaj, pa javi je li to to...

e, samo da i ja nesto pitam u vezi ovoga...
treba li , tj. da li je pozeljno, nakon sto je odradjena radnja koja je odradjena,da "otpustimo" memoriju zauzetu stringovima A1, A2, B1 i B2, jer... mozda bi program trebao jos nesto odraditi pa se ponovo vratiti na istu radnju za neke druge stringove, pa da bezveze ne "drzimo" memoriju (pod uslovom da nam ovi stringovi vise ne trebaju)???
Potpis
there's something out there
waiting for us,
and it ain't no man...
Re: zadatak sa AnsiStringovima 06.09.2005. u 18:12 · pre 257 meseci #9
Citat:

[...] ne bih rekao da je trebalo staviti

AnsiReplaceStr( R1->Lines->Strings[I], "\r", "" );
vec
AnsiReplaceStr( R1->Text, "\r", "" ); , znaci ne jedno slovo vec cirav tekst ??
pa prema tome ne bi trebala ni ona for petlja...
sama funkcija predje preko teksta....


Ne, nisam nigde pogresio... Zadatak NIJE BIO U POTPUNOSTI DEFINISAN, a ja
sam dao jedno orjentaciono resenjene na osnovu PRVOBITNOG teksta zadatka,
koje kasnije mozes da prilagodis svojim potrebama.

U prvobitnom tekstu zadatka NIGDE SE NISU POMINJALI redovi, vec samo blankovi!

Citat:

e, onda...nije trebalo ni ono
if ( R1->Lines->Count != R2->Lines->Count )
return ( false );
jer npr.
elite sec u ri
ty

i

elitesecurity

su po ovome kodu jednaki tekstovi, a ti im onim kodom nisi dozvolio da budu....


Naravno da im nisam dozvolio, jer niko nije pominjao redove, a to i nisu jednaki
tekstovi jer u prvom slucaju radi se o:

"elite sec u ri\r\nty"

a u drugom o:

"elitesecurity"

... sto NIJE ISTO! Tek kasnije, pojavila se 'potreba' za izbacivanje specijalnih
karaktera, sto svako na osnovu koda koji sam dao moze za sebe da prilagodi.

Citat:

e, samo da i ja nesto pitam u vezi ovoga...
treba li , tj. da li je pozeljno, nakon sto je odradjena radnja koja je odradjena,da "otpustimo" memoriju zauzetu stringovima A1, A2, B1 i B2, jer... mozda bi program trebao jos nesto odraditi pa se ponovo vratiti na istu radnju za neke druge stringove, pa da bezveze ne "drzimo" memoriju (pod uslovom da nam ovi stringovi vise ne trebaju)???


Naravno da NE TREBA! Objekti za koje je memorija zauzeta na steku AUTOMATSKI
se uklanjaju kada izadju iz oblasti vazenja (vidljivosti).


Dakle:

Code:

NEKI BLOK 
{
   TNekaKlasa OBJEKAT;

   // AUTOMATSKI SE POZIVA NJEGOV DESTRUKTOR I UKLANJA IZ MEMORIJE (STEKA)
}


Ali:

Code:

NEKI BLOK
{
   TNekaKlasa *OBJEKAT;
   OBJEKAT = new TNekaKlasa;
   // itd ...

   // MORAS OBJEKAT UKLONITI SA delete OBJEKAT;
}


Ovo je izuzetno vazan koncept za C++ jezik na kome se zasnima takozvani RAII
projektni sablon... ali otom potom...

Re: zadatak sa AnsiStringovima 06.09.2005. u 20:13 · pre 257 meseci #10
pa ok, mozda sam i ja pogrijesio sta se tu trazi...mozda je zapravo trebalo napraviti ono sto si ti pravio...uglavnom, sto god da je trebalo-ima i jedno i drugo sad rijesenje....



ok, znaci ne treba "rucno" oslobadjati memoriju...hvala, to mi je bilo malko diskutabilno...

Potpis
there's something out there
waiting for us,
and it ain't no man...
Re: zadatak sa AnsiStringovima 06.09.2005. u 20:50 · pre 257 meseci #11
super mi je dosao kod i od jednog i od drugog


zahvaljujem
Potpis
kod žorža ti je ka' u banku!!
oko? sto ce ti oko??
Re: zadatak sa AnsiStringovima 07.09.2005. u 08:00 · pre 257 meseci #12
Pogledaj letimicno i ovaj thread (moze da te zanima):

http://tinyurl.com/9e573

... tu je covek trazio *najbrze* resenje za manipulaciju podacima koji se nalaze
u RichEdit-u. Moja malenkost mu je uradila kod koji se bazira na prethodnom
ucitavanju podataka u TMemoryStream, i on tvrdi da je procedura koju sam mu
uradio radila brze nego ista procedura na SQL serveru. Poredjenja radi, slicna
procedura je kada se radilo DIREKTNO sa '->Text[]'-om radila oko 40sec a moja
procedura 0.42sec!!!

Ovo ti sve govorim iz razloga sto ceo sadrzaj RichEdit text-a mozes ucitati u
TMemoryStream objekat (umesto u neki tvoj buffer) i tu radis sa njime, jer je
TMemroyStream mnogo fleksibilniji za rad...

Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme