Operacje na łańcuchach

0

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!!

0
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

0

O tym drugim mozesz napisac w zwyklym pascalu?, bo tego troche nie jarze!

0

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, ' '));
0

Ok. Dzieki. A moze wiesz jak posortowac wyrazy w kolejnosci np. alfabetycznej??

0

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

0

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 ;)

0
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ć

0

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? ;-)

0

Nie, gdyż string jest traktowany jako tablica charów liczona od 1.

0
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
0

Jak podzielic taki ciag znakow(zdanie) na wyrazy w czystym Pascalu nie uzywajac tablic?

0

[???] 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ą).

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