Разбить слова на строки по наибольшей схожести - 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.
Объяснение кода листинга программы
- В первой функции
GetWord
определяется алгоритм разбиения строки на слова по наибольшей схожести. Функция принимает на вход строкуs
, переменнуюr
для хранения результата и переменнуюi
для отслеживания текущего индекса в строке. - В цикле
while
происходит проверка условияi<=Length(s)
иs[i] in Blank
. Если условие выполняется, то значение переменнойi
увеличивается на единицу, а переменнаяj
устанавливается равнойi
. Затем происходит проверка условияi<=Length(s)
иnot (s[i] in Blank)
. Если условие выполняется, то значение переменнойi
увеличивается на единицу. - После выполнения цикла
while
переменнаяr
устанавливается равной подстрокеs
отj
доi
. ПеременнаяGetWord
устанавливается равнойTrue
, если цикл завершился, иначе она устанавливается равнойFalse
. - Во второй функции
var
определяются переменныеs
,s1
,s2
иt
для хранения строк. - В цикле
while
происходит разбиение строкиs
на слова с помощью функцииGetWord
. - Если длина слова
t
меньшеmx
, то значение переменнойmx
устанавливается равным длинеt
. Если длина словаt
большеmn
, то значение переменнойmn
устанавливается равным длинеt
. - После завершения цикла
while
переменныеs1
иs2
инициализируются пустыми строками. - Далее происходит разбиение строки
s
на слова с помощью функцииGetWord
. Если длина словаt
меньшеmx
, то слово добавляется в начало строкиs1
. Если длина словаt
большеmn
, то слово добавляется в начало строкиs2
. - В конце функция
WriteLn
используется для вывода результатов на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д