процедурку одну помогите подправить:
Добавлено: 07 апр 2008, 18:21
ниже описана процедура, котарая находит среднее слово с номером (n+1)div2 , но в ней есть ошибка,помогите исправить ее, она заключается в чем: она сбивается, работает некорректно в случае если за последним словом идет пробел, как избавиться от этого?
спасибо:
procedure TFrmText.BuildRFile;
const
// множество разделителей
seps = [#0..#$1F, ' ', '.', ',', '?', ':', ';', '(', ')', '/', '\'];
var
i, k : integer; // счетчики циклов
b, e : integer; // номера начала и конца слова
s : string; // рабочая строка
workList : TStrings; // рабочий список
begin
rfile.Clear;
workList := TStringList.Create;
// проходим по всем строкам в файле
for k := 0 to GlMemo.Lines.Count-1 do
begin
workList.Clear;
s := GlMemo.Lines.Strings[k];
// заполняем список словами из текущий строки
i:=1;
while i<=length(s) do
begin
// поиск первого разделителя для слова
//while (i<=length(s))and(seps(s)) do i:=i+1;
while (i<=length(s))and(s in seps) do i:=i+1;
b:=i;
// поиск последнего разделителя для слова
if i <= length(s) then
begin
while (i<=length(s)) and (not (s in seps)) do i:=i+1;
e:=i;
end;
// добавляем найденное слово
workList.Add(copy(s,b,e-b));
end;
// ищем в каждой строке слово с индексом (n+1) div 2
if workList.Count > 0 then
rfile.Add(workList.Strings[(workList.Count + 1) div 2 - 1])
else
rfile.Add('');
end;
LBox.Items.Assign(rfile);
workList.Free;
end;
спасибо:
procedure TFrmText.BuildRFile;
const
// множество разделителей
seps = [#0..#$1F, ' ', '.', ',', '?', ':', ';', '(', ')', '/', '\'];
var
i, k : integer; // счетчики циклов
b, e : integer; // номера начала и конца слова
s : string; // рабочая строка
workList : TStrings; // рабочий список
begin
rfile.Clear;
workList := TStringList.Create;
// проходим по всем строкам в файле
for k := 0 to GlMemo.Lines.Count-1 do
begin
workList.Clear;
s := GlMemo.Lines.Strings[k];
// заполняем список словами из текущий строки
i:=1;
while i<=length(s) do
begin
// поиск первого разделителя для слова
//while (i<=length(s))and(seps(s)) do i:=i+1;
while (i<=length(s))and(s in seps) do i:=i+1;
b:=i;
// поиск последнего разделителя для слова
if i <= length(s) then
begin
while (i<=length(s)) and (not (s in seps)) do i:=i+1;
e:=i;
end;
// добавляем найденное слово
workList.Add(copy(s,b,e-b));
end;
// ищем в каждой строке слово с индексом (n+1) div 2
if workList.Count > 0 then
rfile.Add(workList.Strings[(workList.Count + 1) div 2 - 1])
else
rfile.Add('');
end;
LBox.Items.Assign(rfile);
workList.Free;
end;