Длинна слов 6-8
Количество слов 10
По найденным урокам не особо смог ориентироваться, нужен наглядный пример

Буду признателен за помощь... Спасибо заранее.
uses crt;
const razd:set of char=[' ','.',',',':',';','!'];
var st,buf:string;
l:integer;
begin
clrscr;
write('Длина -> ');
readln(l);
write('Строка -> ');
readln(st);
repeat
if (st[1] in razd) or (length(st)=0) then while st[1] in razd do delete(st,1,1)
else
begin
while (not (st[1] in razd)) and (length(st)>0) do
begin
buf:=buf+st[1];
delete(st,1,1);
end;
if length(buf)=l then
begin
buf[1]:='*';
buf[2]:='*';
buf[3]:='*';
write(buf,' ');
end;
buf:='';
end;
until (length(st)=0) and (length(buf)=0);
readln;
end.
const razd: set of char=[' ','.',',',':',';','!'];
var
st, buf:string;
L: integer;
begin
write('длина -> '); readln(L);
write('строка -> '); readln(st);
repeat
{ для начала проверяем, первый символ - разделитель или нет? }
if (length(st)=0) or (st[1] in razd) then { СНАЧАЛА проверяем длину, только потом - st[1] !!! }
while (length(st) > 0) and (st[1] in razd) do
begin
write(st[1]); delete(st,1,1); { не теряем символы - разделители, выводим из перед удалением }
end
else begin
{ нет, не разделитель, составляем слово: }
while (length(st)>0) and (not (st[1] in razd)) do { Еще раз - СНАЧАЛА длина, потом первый символ }
begin
buf:=buf+st[1]; delete(st,1,1);
end;
if length(buf) = L then
begin
delete(buf, 1, 3); insert('*', buf, 1); { <--- Удалили три символа, вставили один }
end;
write(buf); { слово печатается в любом случае, не только при каком-то условии }
buf:='';
end; { else закончился }
until (length(st)=0) and (length(buf)=0);
readln;
end.
Теперь - зачем все это делается: а затем, что если ты ввел строку, и тебя попросили заменить в ней первые символы четырех(например)-буквенных слов на звездочку, это не значит, что тебе надо вывести измененные огрызки этих самых четырехбуквенных слов. Тебе надо получить строку, полную, в которой части слов нужной длины заменены звездочками, а все остальное - сохранено (другие слова, разделители, это не должно пострадать).const razd: set of char=[' ','.',',',':',';','!'];
var
st, buf:string;
L: integer;
begin
write('длина -> '); readln(L);
write('строка -> '); readln(st);
repeat
{ для начала проверяем, первый символ - разделитель или нет? }
if (length(st)=0) or (st[1] in razd) then { СНАЧАЛА проверяем длину, только потом - st[1] !!! }
while (length(st) > 0) and (st[1] in razd) do
begin
write(st[1]); delete(st,1,1); { не теряем символы - разделители, выводим из перед удалением }
end
else begin
{ нет, не разделитель, составляем слово: }
while (length(st)>0) and (not (st[1] in razd)) do { Еще раз - СНАЧАЛА длина, потом первый символ }
begin
buf:=buf+st[1]; delete(st,1,1);
end;
if length(buf) = L then
begin
delete(buf, 1, 3); insert('*', buf, 1); { <--- Удалили три символа, вставили один }
end;
write(buf); { слово печатается в любом случае, не только при каком-то условии }
buf:='';
end; { else закончился }
until (length(st)=0) and (length(buf)=0);
readln;
end.
Теперь - зачем все это делается: а затем, что если ты ввел строку, и тебя попросили заменить в ней первые символы четырех(например)-буквенных слов на звездочку, это не значит, что тебе надо вывести измененные огрызки этих самых четырехбуквенных слов. Тебе надо получить строку, полную, в которой части слов нужной длины заменены звездочками, а все остальное - сохранено (другие слова, разделители, это не должно пострадать).
Fatal: Syntax error, "UNTIL" expected but "ELSE" found
Fatal: Compilation aborted
Running "f:\programs\pascal\test.exe"
длина -> 4
строка -> this is a test of string. some words...
*s is a *t of string. *e words...
Running "f:\programs\pascal\test.exe"
длина -> 4
строка -> this is a test of string. some words...
*s is a *t of string. *e words...