Mam jakis ciąg znaków(string) podany przez uzytkownika, jak policzyc jego dlugosc bez spacji? Jak zrobic aby wypisyal kolejne wyrazy w nastepnej linii? Jak posortowac te wyrazy np. w kolejnosci alfabetycznej?? Dzieki!!
var
i, Count: Integer;
Count := Lenght(String);
for i := 0 to Lenght(String) do
if String[i] = ' ' then Count := Count -1;
Count to dlugosc twojego stringa bez spacji
dzielenie na linie:
function TMainForm.ParseCmd(Commands: String; Dot: Char): TStringList; //PRZETESTOWANE
var
Cmd: String;
begin
Result := TStringList.Create; //Wyniki beda trzymane w TStringList
Cmd := Commands; //Tymczasowy string
while Pos(Dot, Cmd) <> 0 do begin //<ort>Dopuki </ort>w komendach znajduje sie dzielnik
Result.Add(Copy(Cmd, 1, Pos(Dot, Cmd) - 1)); //Dodaj do listy kawalek od poczatku do dzielnika
Cmd := Copy(Cmd, Pos(Dot, Cmd) + 1, Length(Cmd) - Pos(Dot, Cmd)); //Usun ze stringa dodany kawalek
end;
if Length(Cmd) > 0 then Result.Add(Cmd); //Jezeli za odtatnim dzielnikiem cos zostalo, umiesc to na liscie
end;
i tu za Dot podstawiasz ' '
PS Dodajcie ta funkcje do FAQ ;) Prosze tez o tuningi :D
no i sortowanie:
o ile sie nie myle to TStringList ma taka procedure jak Sort; :P
O tym drugim mozesz napisac w zwyklym pascalu?, bo tego troche nie jarze!
przykro mi ale ne bardzo potrafie w czystym pascalu, ale dam ci porade:
mozesz tez pozamieniac wszystkie spacje na #13, czyli znacznik lamania tekstu
a co do tej funkcji to:
ty podajesz string i dzielnik, a funkcja dzieli stringa i podaje TStringList, ktory mozesz wrzucic np do Memo -
Memo1.Lines.Assing(ParseCmd(String, ' '));
Ok. Dzieki. A moze wiesz jak posortowac wyrazy w kolejnosci np. alfabetycznej??
To z liczeniem bez spacji jest <ort>zdeczka </ort>wolne lepsza by była taka procka:
var
s:string;
len:integer;
begin
while ( pos( ' ', s ) > 0 )
delete( s, pos( ' ', s ), 1);
len := length( s );
end;
jezeli chodzi o podzielenie textu na linie z pojedynczym wyrazem w kazdej, to powyszymi funkcjami pomanipuluj tak aby program zamieniał ' ' na #13+#10 Możesz także usunąć zbędne spacje, jeżeli np jest ich kilka koło siebie, wtedy w pierwszym parametrze funkcji pos musisz umieścić dwie spacje.
A co do sortowania to poszukaj sobie algorytmu sortowania bąbelkowego
// chyba raczej QuickSorta, przecież bąbelkowe to porażka, podobnie jak propozycja zliczania bez spacji poprzez ich wycięcie - ŁF
W procedurach TStringListy jest cos takiego jak Sort; ;)
Czyli np Memo1.Lines.Sort; spowoduje posortowanie tekstu znajdujacego sie w Memo1
var
s:string;
len:integer;
begin
while ( pos( ' ', s ) > 0 )
delete( s, pos( ' ', s ), 1);
len := length( s );
end;
hmmm jestes pewien? moge sie mylic, ale pos samo w sobie przeszukuje pojedynczo stringa, wiec robi petle, a w Twim pzykladzie pos jest wykorzystywane Ilosc Spacji*2 v 1, wiec chyba moj sposob jest troche szybszy - oczywiscie moge sie mylic ;)
var
tekst,wyraz:string;
tablica:array of string;
ile:integer;
begin
ile:=0;
wyraz:='';
for i:=1 to length(tekst) do
begin
if (ord(tekst[i])=32)and(i<>1)and(ord(tekst[i+1]<>32) then //sprawdza czy literka jest spacją, czy nie jest to pierwsza litera ciągu i czy następna też nie jest spacją
begin
inc(ile);
setlength(tablica,ile);
tablica[ile-1]:=wyraz;
wyraz:='';
end
else wyraz:=wyraz+tekst[i];
end;
end.
I masz te wyrazy w tablicy, następnie możesz sobie je posortować (poszukaj o algorytmach sortowania - jest tego mnóstwo na sieci i tutaj również) no i oczywiście wyświetlić.
//do postu poniżej - proponuje uruchomić Delphi i sprawdzić
for i:=1 to length(tekst) do
begin
if (ord(tekst[i])=32)and(i<>1)and(ord(tekst[i+1]<>32) then //sprawdza czy literka jest spacją, czy nie jest to pierwsza litera ciągu i czy następna też nie jest spacją
A co będzie gdy "i" będzie równe Length(tyekst) ?
Acces Violation? ;-)
Nie, gdyż string jest traktowany jako tablica charów liczona od 1.
for i:=1 to length(slowo) do
if slowo[i]=' ' then inc(spacje);
// ilosc spacji
for i:=1 to length(slowo) do
if slowo[i]=' ' then delete(slowo,i,1);
dlugosc_bez_spacji:=length(slowo);
// dlugosc zdania bez spacji
Jak podzielic taki ciag znakow(zdanie) na wyrazy w czystym Pascalu nie uzywajac tablic?
[???] http://4programmers.net/Forum/viewtopic.php?id=47173&p=0
We własnym topicu masz rozwiązanie. Wyrazów tych przecież nikt nie karze przechowywać Ci w tablicy - to tylko taki pomysł, aby je później posortować (pamiętasz - prosiłes o to ;) ). Lecz jeśli nie chcesz ich sortować, to możesz je od razu wyrzucać np na ekran, albo nie wiem co z nimi robić.
A co do unikania tablic jeszcze - to string też jest tablicą (tyle, że specyficzną).