Подраздел FAQ (ЧАВО, ЧАстые ВОпросы) предназначен для размещения готовых рабочих программ, реализаций алгоритмов. Это нечто вроде справочника, он наполнялся в течение 2000х годов. Ваши вопросы, особенно просьбы решить задачу, не пройдут предмодерацию. Те, кто наполнял раздел, уже не заходят на форум, а с теми, кто на форуме сейчас, лучше начинать общение в других разделах. В частности, решение задач — здесь.
Предлагаю в теме собрать все способы разбиения строки на слова. (рекурсивные, итерационные, с использованием массивов, без использования массивов, с ДСД, с чем-то еще... вобщем программы и алгоритмы преобразования предложения в набор слов )
СОБИРАЕМ!
--------------------
Помогая друг другу, мы справимся с любыми трудностями! "Не опускать крылья!" (С)
Эмулирование стандартных классов в Delphi Еще один вариант с ООП и ДСД (односвязные списки). Процедура очень легко портируется на Delphi с использованием класса Tstrings
const Delimiters:set of char = [',', ';', ':', ' ']; Type TElem = string; TList = ^TNode; TNode = record Info: TElem; Next: TList end; TStrings = Object private data:tlist; public count:integer; procedure INIT; procedure ADD(e:String); procedure print; procedure Clear; End; procedure Tstrings.INIT; begin data:=nil; end;
Procedure Tstrings.ADD(e:string); var N: TList; P: TList; Begin new(N); N^.Info :=E; N^.Next :=nil; if data= nil then data:=N else begin P:=data; while P^.Next <> nil do P:=P^.Next; P^.Next:=N end; inc(count); End;
Procedure Tstrings.print; begin write('[ '); while data <> nil DO begin write( data^.Info ); If data^.Next <> nil then write(' | '); data := data^.Next end; writeln(' ]') end;
procedure TStrings.clear; var N: TList; begin while data <> nil do begin N :=data; data:=data^.Next; dispose(N) end end;
function GetWords(const S: string; var L: TStrings): integer; var len, idx1, idx2: integer; begin Result := 0; if Length(S) = 0 then Exit; L.clear; len := Length(S); idx2 := 1; repeat while (idx2 <= len) and (S[idx2] in Delimiters) do inc(idx2); idx1 := idx2; if (idx2 <= len) and not (S[idx2] in Delimiters) then while (idx2 <= len) and not(S[idx2] in Delimiters) do inc(idx2); if idx1 < idx2 then L.Add(Copy(S, idx1, idx2-idx1)); until idx2 > len; Result := L.Count;
end;
var S: string; L:TStrings; begin S := 'str1,str2;str3;;: str4,,,,,'; L.INIT; writeln(GetWords(S, L)); L.print; L.clear;
reADLN; end.
Функция разбивает строку S на слова, используя набор символов Delimiters в качестве разделителей и заносит их в список L. Результат функции - количество найденных слов.
--------------------
Помогая друг другу, мы справимся с любыми трудностями! "Не опускать крылья!" (С)