Jak to zliczyc...

0

Jak wyswietlic na Labelu ile w Memo znajduje sie znaków "a".
Proszę o przykład a nie teorię :)
Pozdro!

0

var
Ile: Integer;
Text: string;
begin
Text := Memo1.Lines.Text;
Ile := 0;
while Pos('a', Text) > 0 do
begin
Delete(Text, Pos('a', Text), 1);
Inc(Ile);
end;
Label1.caption := IntToStr(Ile);
end;

chyba tak to bedzie wygladac :-)
---=-=[ Delphi 3, 6 ]=-=-
-=-=-==[ LKS ]==-=-=-
-=[ [email protected] ]=-

0

var
Ile: Integer;
Text: string;
Lt: Integer;
i :integer;

begin
Text := Memo1.Lines.Text;
Ile := 0;
lt:=Pred(Length(Text));
for i:=0 to lt do
if Text[i]='A' then inc (ile);
Label1.caption := IntToStr(Ile);

end;

ten kod jest moze brzydszy, ale dziala szybciej, dla dlugich Memo ZNACZNIE szybciej.

Przyklad:
memo generowane losowo nastepujacym kodem (bez Randomize dla powtarzalnosci):

SetLength(text,textlen);
for i:=0 to Pred(textlen) do
if Random(10)=0 then
text[i]:=#32
else
text[i]:=char(65+random(26));
memo1.Text:=text;

a nastepnie liczenie 'A'

czasy wykonania w ms (Duron 850Mhz)

textlen liczba 'A' kod LKS moj kod
100 2 0.04 0.036
1000 28 0.16 0.046
10000 351 13.2 0.133
64000 2229 560 0.94

pozdrawiam, Pawel--Pawel

Delphi6

0

to fakt, kod jest brzydszy ale dziala duzo szybciej :-)

a teraz maly zabieg kosmetyczny i kod wyglada troszke lepiej :-)

var
Ile, Lt, i: Integer;
Text: string;
begin
Text := Memo1.Lines.Text;
Ile := 0;
Lt := Pred(Length(Text));

for i:=0 to lt do
if Text[i] = 'A' then Inc(Ile);

Label1.Caption := IntToStr(Ile);

end;

ahi i jeszcze jedno: powyzszy kod wyswietli na labelu liczbe znakow 'A' (duzych), natomiast aby wyswietlal liczbe wszystkich znakow 'a' (malych i duzych) trzeba zamiast:
Text := Memo1.Lines.Text;
wpisac:
Text := AnsiUpperCase(Memo1.Lines.Text);

caly kod bedzie wygladac nastepujaco:
var
Ile, Lt, i: Integer;
Text: string;
begin
Text := AnsiUpperCase(Memo1.Lines.Text);
Ile := 0;
Lt := Pred(Length(Text));

for i:=0 to lt do
if Text[i] = 'A' then Inc(Ile);

Label1.Caption := IntToStr(Ile);

end;

no i to by bylo na tyle :-)
---=-=[ Delphi 3, 6 ]=-=-
-=-=-==[ LKS ]==-=-=-
-=[ [email protected] ]=-

0

pq w twoim kodzie jest blad w linijce:
Lt := Pred(Length(Text)); powinno byc: Lt := Length(Text);

caly kod moze by troszke krotszy :-)

var
Ile, i: Integer;
Text: string;
begin
Text := AnsiUpperCase(Memo1.Lines.Text);
Ile := 0;

for i:=0 to Length(Text) do
if Text[i] = 'A' then Inc(Ile);

Label1.Caption := IntToStr(Ile);

end;

mysle ze to juz wszystko na ten temat :-)---=-=[ Delphi 3, 6 ]=-=-
-=-=-==[ LKS ]==-=-=-
-=[ [email protected] ]=-

0

dzieki LKS, ciagle mi sie myli ze tablice dynamiczne sa numerowane od 0 a lancuchy od 1. Balaganiarskie to Delphi :). Ale w Twojej poprawce tez jest blad: powinno byc:

for i:=1 to Length(Text) do

ze zrezygnowaniem ze zmiennej lt masz tez racje: myslalem ze bedzie szybciej niz wywolywac za kazdym razem funkcje Length, ale to Delphi dobrze to optymalizuje i nie ma roznicy. Zreszta nawet przy wylaczonej optymalizacji roznica jest niewielka.

No to juz chyba wszystko :)))))--Pawel

Delphi6

0

nom fakt powinno byc od jedynki

i caly kod po wszystkich poprawkach i bez bledow wyglada tak:

var
Ile, i: Integer;
Text: string;
begin
Text := AnsiUpperCase(Memo1.Lines.Text);
Ile := 0;

for i:=1 to Length(Text) do
if Text[i] = 'A' then Inc(Ile);

Label1.Caption := IntToStr(Ile);

end;---=-=[ Delphi 3, 6 ]=-=-
-=-=-==[ LKS ]==-=-=-
-=[ [email protected] ]=-

1 użytkowników online, w tym zalogowanych: 0, gości: 1