Разбить слова на строки по наибольшей схожести - Turbo Pascal

Узнай цену своей работы

Формулировка задачи:

Доброго всем времени суток Мне нужна помощь, ибо сам так и не смог это сделать (идей много,а вот по разделу мат.части я - 0 и никак реализовать это не могу). Препод дал задание на зачет и звучало оно примерно так: Пользователь вводит две строки (без различных знаков, слова отделены исключительно пробелами), требуется разбить слова на 2 строки по наибольшей схожести. Немного поясню - насколько я понял, разделение должно быть примерно такое Например - пользователь ввел такую строку "Петя ест зеленые яблоки" (по кол-ву букв в слове строка имеет вид: 4 3 7 и 6 букв соответственно). Наибольшее и наименьшее слова в строке определяют начало двух строк (в данном случае это "ест"(3) и "зеленое"(7)), в дальнейшем слова добавляются в строку 1 или строку 2 по принципу наименьшей разницы, т.е. - после нахождения двух слов (наименьшего и наибольшего) программа начинает проверять все остальные слова в строке и , в случае примера, натыкается на "Петя". Дальше идет проверка - ест(3)-Петя(4)=1 (естественно, что счет идет исключительно по модулю) и зеленое(7)-Петя(4)=3. В нашем случае, в столбце 1(где находиться слово ест,например) разница меньше и соответственно слово "Петя" пойдет в этот столбец. Думаю, что объяснил вполне понятно, если что осталось неясным - пишите, отвечу на все вопросы. п.с желательно, написать не просто программу, а с пояснением, а иначе хрен я докажу преподу, что я сам писал) п.с.с заранее - спасибо п.с.с.с совсем забыл, ответ должен быть дан в виде двух строк со словами(!)

Решение задачи: «Разбить слова на строки по наибольшей схожести»

textual
Листинг программы
const Blank=[#9,' '];
function GetWord(const s: String; var r: String; var i: Integer): Boolean;
var j: Integer;
begin
  while (i<=Length(s)) and (s[i] in Blank) do Inc(i); j:=i;
  while (i<=Length(s)) and not (s[i] in Blank) do Inc(i);
  r:=Copy(s,j,i-j);
  GetWord:=i>j;
end;
var
  s, s1, s2, t: String;
  i, mx, mn: Integer;
begin
  Write('Введите строку: '); ReadLn(s);
  i:=1; mx:=-MaxInt-1; mn:=MaxInt;
  while GetWord(s,t,i) do begin
    if mx<Length(t) then mx:=Length(t);
    if mn>Length(t) then mn:=Length(t);
  end;
  i:=1; {s1:=''; s2:='';}
  while GetWord(s,t,i) do
    if Abs(mn-Length(t))<=Abs(mx-Length(t))
    then s1:=s1+' '+t
    else s2:=s2+' '+t;
  Delete(s1,1,1); Delete(s2,1,1);
  WriteLn('Короткие: ':16,s1);
  WriteLn('Длинные: ':16,s2);
end.

Объяснение кода листинга программы

  1. В первой функции GetWord определяется алгоритм разбиения строки на слова по наибольшей схожести. Функция принимает на вход строку s, переменную r для хранения результата и переменную i для отслеживания текущего индекса в строке.
  2. В цикле while происходит проверка условия i<=Length(s) и s[i] in Blank. Если условие выполняется, то значение переменной i увеличивается на единицу, а переменная j устанавливается равной i. Затем происходит проверка условия i<=Length(s) и not (s[i] in Blank). Если условие выполняется, то значение переменной i увеличивается на единицу.
  3. После выполнения цикла while переменная r устанавливается равной подстроке s от j до i. Переменная GetWord устанавливается равной True, если цикл завершился, иначе она устанавливается равной False.
  4. Во второй функции var определяются переменные s, s1, s2 и t для хранения строк.
  5. В цикле while происходит разбиение строки s на слова с помощью функции GetWord.
  6. Если длина слова t меньше mx, то значение переменной mx устанавливается равным длине t. Если длина слова t больше mn, то значение переменной mn устанавливается равным длине t.
  7. После завершения цикла while переменные s1 и s2 инициализируются пустыми строками.
  8. Далее происходит разбиение строки s на слова с помощью функции GetWord. Если длина слова t меньше mx, то слово добавляется в начало строки s1. Если длина слова t больше mn, то слово добавляется в начало строки s2.
  9. В конце функция WriteLn используется для вывода результатов на экран.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.833 из 5
Похожие ответы