Работа со строками (Как удалить пробелы слева и справа в строке? Как определить количество слов в строке? Как в строке найти слово с заданным номером?), страница 2

Как определить количество слов в строке?
(предполагается, что строка уже нормализована, т.е. в ней убраны пробелы слева и справа и оставлено только по одному пробелу между словами. Если это не так, то сначала исходную строку надо нормализовать) 
 
// Способ первый (более сложный) Исходная строка портится !
{Смысл алгоритма: подсчитывается количество пробелов в нормализованной строке и  – количество слов на 1 больше, чем количество пробелов. После того, как найден очередной пробел, он из строки удаляется. Вот из-за этого исходная строка и портится. Если это недопустимо, то необходимо работать с ее копией. }
 
procedure TForm1.Button5Click(Sender: TObject);
//Определение количества слов
var
  k:integer; //количество слов
  st:string; //анализируемая строка
begin
   //получаем исходную строку
   st:=Edit1.Text; 
   //нормализуем полученную строку
   st:=Trim(st);
   while Pos( '  ', st ) > 0 do
      Delete( st, Pos( '  ', st ), 1 );
 
   //подсчитываем количество слов в нормализованной строке
   if Length(st)>0 then begin
    k:=1;
    repeat
      if pos(' ',st)>0 then begin  //если встретился пробел, то ... 
         k:=k+1;                   //увеличиваем счетчик слов 
         delete(st,pos(' ',st),1); //и удаляем пробел
      end;
    until pos(' ',st)=0;
  end
  else k:=0;
 
  //выводим результаты в Мемо
  Memo1.Lines.Add('');
  Memo1.Lines.Add('Количество слов в строке = '+ IntToStr(k));
end; 
 
 
// Способ второй (самый простой)  Здесь уже исходная строка не портится !
{Смысл алгоритма: также подсчитывается количество пробелов в нормализованной строке и  – количество слов на 1 больше, чем количество пробелов. После того, как найден очередной пробел, он из строки не удаляется. Таким образом, исходная строка остается без изменения. }
 
procedure TForm1.Button5Click(Sender: TObject);
//Определение количества слов
var
  k,i:integer;
  st:string;
begin
   //получаем исходную строку
   st:=Edit1.Text; 
   //нормализуем полученную строку
   st:=Trim(st);
   while Pos( '  ', st ) > 0 do
      Delete( st, Pos( '  ', st ), 1 );
 
   //подсчитываем количество слов в нормализованной строке
   k:=0;
   for i:=1 to Length(St) do
     if (St[i]=' ') or (i=Length(St)) then
       k:=k+1;
  //выводим результаты в Мемо
  Memo1.Lines.Add('');
  Memo1.Lines.Add('Количество слов строки = '+ IntToStr(k));
end;
Как в строке найти слово с заданным номером ?
(предполагается, что строка уже нормализована, т.е. в ней убраны пробелы слева и справа и оставлено только по одному пробелу между словами. Если это не так, то сначала исходную строку надо нормализовать) 
 
// Способ первый (более простой)
procedure TForm1.Button1Click(Sender: TObject);
//Определение слова с заданным номером
var
  i,k,number:integer;
  St,st1:string;  
begin
  //получаем исходную строку 
  St:=Edit1.Text;
  //нормализуем полученную строку
  st:=Trim(st);
  while Pos( '  ', st ) > 0 do
      Delete( st, Pos( '  ', st ), 1 );
  //получаем заданный номер слова
  number:=StrToInt(Edit2.Text); 
 
  //начинаем поиск слова с заданным номером  
  k:=0;
  st1:='';
  for i:=1 to Length(St) do    //просматриваем исх.строку с начала и до конца
     if (St[i]=' ') or (i=Length(St)) then begin//если нашли очередн.слово,то...
       if i=Length(St) then st1:=st1+st[i];//если слово последнее,то доб.посл.с.
       k:=k+1;                 //запоминаем номер найден. слова
       if k=number then begin  //если номер совпадает с заданным, то...
          Memo1.Lines.Add(''); //выводим найденное слово в Мемо
          Memo1.Lines.Add('Слово с номером '+IntToStr(number)+' = '+st1);
          Memo1.Lines.Add('(его длина = '+IntToStr(k)+')');
          EXIT;                //и полностью выходим из процедуры
       end 
       else        //иначе ...(номер слова не совпадает с заданным)
          st1:=''; //очищаем строку для следующего слова
     end 
     else              //иначе...(слово еще не закончилось)
       st1:=st1+St[i]; //добавляем очередной символ в слово
end; 
 
// Способвторой (более сложный)
procedure TForm1.Button8Click(Sender: TObject);
//Определение слова с заданным номером
var
    i:integer;
    st1:string;
    number:integer;//номер отыскиваемого слова (вводится)
    Adr,           //адрес слова
    k,             //счетчик количества символов в слове
    nn:integer;    //счетчик номеров слов
Label PDSTR;
begin
  //получаем исходную строку 
  St:=Edit1.Text;
  //нормализуем полученную строку
  st:=Trim(st);
  while Pos( '  ', st ) > 0 do
      Delete( st, Pos( '  ', st ), 1 );
  //получаем заданный номер слова
  number:=StrToInt(Edit2.Text); 
 
  //начинаем поиск слова с заданным номером  
  nn:=1;   //берем 1-е слово
  Adr:=1;  //адрес 1-го слова
 PDSTR:
   k:=0;   //очищаем счетчик количества символов в слове
   //определяем число символов nn-го слова
   for i:=Adr to Length(St) do
     if St[i]<>' ' then k:=k+1 //если не пробел, то увел.число симв.nn-го слова
     else break;               //нашли nn-е слово с k симв. - выход из цикла
 
   if nn=number then begin     //если слово с номером "number" найдено, то...
     st1:=copy(St,Adr,k);      //копируем это слово (длиной k симв.) в "st1"
     Memo1.Lines.Add('');      //выводим его в Мемо
     Memo1.Lines.Add('Слово с номером '+IntToStr(number)+' = '+st1);
     Memo1.Lines.Add('(его длина = '+IntToStr(k)+')');
     EXIT;                     //и выходим из процедуры
   end;
   //берем следующее слово и определяем его адрес
   nn:=nn+1;
   Adr:=Adr+k+1; //адрес следующ.слова=(нач.адрес)+(к-во симв.слова)+(1 проб.)
   goto PDSTR;
 
end;