Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Найти самое короткое слово


Автор: Гость_Dmitriy 15.12.2005, 20:19
Помогите пожалуйста с алгоритмом. Есть массив с количеством эл-тов, равным N. Элемент массива - строка (т.е. текст). Нужно:
1. Найти самое короткое слово в массиве (не в отдельной строке, а именно в массиве)
2. заменить этим словом последние слова всех строк (строка = элемент массива, т.е. последние слова всех элементов массива)

Автор: Zero 15.12.2005, 21:33
Цитата
1. Найти самое короткое слово в массиве (не в отдельной строке, а именно в массиве)

Размер строки, определяется с помощью функции Length
Цитата
2. заменить этим словом последние слова всех строк (строка = элемент массива, т.е. последние слова всех элементов массива)

А тут, типа такого:
Код

a[Nmax] := a[m];

где Nmax ─ количество элементов в массиве;
m ─ элемент массива, с минимальным количеством букв.

Автор: Гость_Dmitriy 15.12.2005, 22:01
Цитата
Размер строки, определяется с помощью функции Length

это понятно... Но как разбить эту же самую строку и поместить в массив слова, т.е. элемент массива - одно слово..? Дело в том, что между словами могут быть как пробелы, так и знаки препинания.

Автор: Zero 15.12.2005, 23:40
Цитата
это понятно... Но как разбить эту же самую строку и поместить в массив слова, т.е. элемент массива - одно слово..? Дело в том, что между словами могут быть как пробелы, так и знаки препинания.

Эх, ладно..., проще показать:
Код

program pr;
Const
  N=5;
var
  a:array[1..N] of string;
  i,j:integer;
  S:string;
  Nmin:integer;
  Smin:string;
Begin
  for i:=1 to n do
    begin
      write('a[',i,'] >');
      readln(a[i]);
    end;

  Nmin := 255;
  for i:=1 to n do
    begin
      j:=0;
      repeat {цикл по элементам массива}

        {выбор слов из отдельного элемента массива}
        s:='';
        repeat
          j:=j+1;
          if a[i][j] in ['A'..'z'] then
            s := s + a[i][j]
        until (j=length(a[i])) or not(a[i][j] in ['A'..'z']);

      {определение минимального слова}
      if Nmin>length(s) then
        begin
          Nmin := length(s); {размер минимального слова}
          Smin := s; {текст минимального слова}
        end;
      until j=length(a[i]);

      {далее делай цикл по каждому элементу массива,
      находи в нём позицию последнего слова
      и вставляй туда Smin}
    end;
End.

Я думаю со второй частью ты сам справишся, там алгоритм чуть-чуть другой но принцип тот же... smile

Автор: Гость_Dmitriy 15.12.2005, 23:52
спасибо smile

Автор: Гость_Dmitriy 16.12.2005, 01:13
Я пошёл немного другим путём.
Создал процедуру, которой передаётся массив строк. В самом начале программы объявил множество SEMI, которое содержит знаки препинания (точка, двоеточие, точка с запятой, запятая, вопросительный знак, восклицательный знак).

Вот сама процедура:
Код

procedure WorkStrs(A:mm);
var sStr,eStr,lStr:integer; minStr,tempStr,tStr:string;
begin
clrscr;
minStr:='';
  for i:=1 to N do begin
    tempStr:=A[i];
    lStr:=Length(tempStr);
    sStr:=1;
    for j:=1 to lStr do begin
      if tempStr[j] in SEMI then begin
        tStr:='';
        for k:=sStr to (j-1) do begin
          tStr:=tStr+tempStr[k];
        end; {for}
        if (minStr='') then minStr:=tStr;
        if (tStr<minStr) then minStr:=tStr;
        sStr:=j+1;
      end; {if}
    end; {for}
  end; {for}
writeln('Самое короткое слово: ',minStr,'.');

writeln;textattr:=3;writeln('Нажмите любую клавишу...');
repeat until keypressed;
end; {WorkStrs}

Автор: Гость_Dmitriy 16.12.2005, 01:16
Забыл добавить. Не работает! smile Ошибку никак не найду smile

Автор: Гость_Dmitriy 16.12.2005, 01:23
Так. Работает. Это я просто забыл в множество пробел добавить. smile
но работает неправильно =(( буду искать ошибку.

Автор: Гость_Dmitriy 16.12.2005, 01:28
Всё! разобрался! smile

Автор: Zero 17.12.2005, 00:16
Цитата
Всё! разобрался!

Молодец.

PS: кстати в слудующий раз, если у тебя не работает что-либо, то пиши о конкретной ошибки, чтобы нам было понятно, о чём речь... smile Ведь мы же не телепаты. smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)