Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Наименьшая длина слова

Автор: 18192123 7.01.2007 16:59

Преобразовать данную строку, удалив из неё три слова наименьшей длины.

Слова могут разделяться только пробелами. Для строк использовать только length, chr, ord.

Вопрос такой: как задать условие, чтобы избавиться именно от трёх слов наименьшей длины и как такие слова искать?

Автор: Lapp 7.01.2007 17:07

Цитата(18192123 @ 7.01.2007 13:59) *

как задать условие, чтобы избавиться именно от трёх слов наименьшей длины и как такие слова искать?

Найти слово наменьшей длины.
Удалить его.
Повторить с начала еще два раза.
smile.gif
А для поиска придется пройтись по всем словам, запомниная их длину и начало, а также параллельно отыскивая минимальное.

Не совсем ясно выразился:
пройтись по строке, отслеживая длину и начало минимального слова.

Автор: 18192123 7.01.2007 18:07

вот всё , что смогла... однако так и не поняла про длину 3-х наименьших...


uses crt;
function Slovo ( s : string; n :integer ) : string;
const lim = [' ', ',', '!'] ;
var ss : string;
k, c, i : integer;
begin
ss := ''; c := 1; k := 1;
while k <= length(s) do begin
while not (s[k] in lim) and (k <= length(s)) do begin
if c = n then ss: =ss + s[k];
inc (k); end;
inc ( c );
while (s[k] in lim) and (k <= length(s)) do inc (k);
end;
Slovo := ss;
end;

var
s1, s2 : string;
n1, min, i, kol : integer;

begin
clrscr;
writeln ( ' vvedite stroky' );
readln ( s1 );
n1 := 1;
while slovo ( s1, n1 ) <> '' do inc ( n1 );
min := length (slovo ( s1, i ));
kol := 0;
repeat
for i := 2 to n1 do
begin
if length ( slovo (s1, i)) < min then
begin
min := length (slovo (s1, i))

{ ??????????????}




Автор: volvo 7.01.2007 18:31

Основа будет выглядеть так:

...
s1 := '123 1234567 12 12345 123456 123 12 123456';
for kol := 1 to 3 do begin
min := 255; n1 := 1;
while slovo ( s1, n1, start ) <> '' do begin
if min > length(slovo(s1, n1, start)) then begin
i := start;
min := length(slovo(s1, n1, start));
end;
inc(n1);
end;

delete(s1, i, min);
end;
writeln(s1);
...


Правда, придется немного подкорректировать функцию Slovo, чтобы она возвращала еще и позицию начала текущего слова в строке:
function Slovo(s: string; n: integer; var start: integer): string;
const lim = [' ', ',', '!'] ;
var
ss: string;
k, c, i: integer;
begin
start := 0;
ss := ''; c := 1; k := 1;
while k <= length(s) do begin
while not (s[k] in lim) and (k <= length(s)) do begin
if c = n then begin
if start = 0 then start := k;
ss:=ss + s[k];
end;
inc(k);
end;
inc( c );

while (s[k] in lim) and (k <= length(s)) do inc (k);
end;
Slovo := ss;
end;

Использована не стандартная Delete, взята отсюда: http://forum.pascal.net.ru/index.php?s=&showtopic=2361&view=findpost&p=87638

Автор: 18192123 7.01.2007 19:36


procedure _Delete(var s: String; start, len: Word);
var
i: Integer;
begin

if (start <= 0) or (start >= 255) or (len <= 0) then exit;

if start + len - 1 > Length(s) then
len := Length(s) - start + 1;

for i := start to Length(s) - len do
s[i] := s[i + len];

dec(s[0], len);

end;



Объясните пожалуйста, что значит
dec(s[0], len);

и что такое len.

Автор: volvo 7.01.2007 19:47

dec(s[0], len);
- уменьшить длину строки на Len, а само по себе Len - это параметр, передаваемый в функцию, и показывающий, сколько символов надо удалить, начиная с позиции Start (посмотри на заголовок функции - поймешь, что к чему)...