1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
1. Для задаваемой строки найти все содержащиеся в ней слова и распечатать наибольшую общую часть этих слов. Пример: Для строки мирный примирить перемирие мирить Общая часть слов - мир. 2. Найти в задаваемой строке содержащиеся в ней корни и распечатать для каждого корня однокоренные с ним слова. Пример: Для строки народ мирный родник мир родина род мирить Корни____Однокоренные слова мир______мирный мирить род______народ родник родина
По п.1 примерно ясно. Задачка неплохая. Вот, я набросал решение.. Ищется самая большая общая подстрока. Если таковых больше одной, найдена будет первая. Как сделать нахождение всех - надо подумать.. Регистр (большие-маленькие буквы) не приводится. Разделителем слов считаю пробел, но это легко исправить, если нужно - достаточно добавить нужные символы в множество Dividers.
;
var s,w,r,t:string; i,j,k,kx,n:integer;
function GetWord(s:string; var i:integer; var w:string):boolean; var j:integer; begin while (i<Length(s))and(s[i] in Dividers) do Inc(i); j:=i; while (j<Length(s))and not(s[j+1] in Dividers) do Inc(j); w:=Copy(s,i,j-i+1); GetWord:=i<=Length(s); i:=j+1; end;
begin s:='смирение примирить перемирие мирный мирить'; n:=1; GetWord(s,n,w); while GetWord(s,n,t) do begin kx:=0; r:='-Nothing-in-common-'; for i:=1 to Length(w) do begin j:=1; while j<=Length(t) do begin k:=0; while (i+k<=Length(w))and(j+k<=Length(t))and(w[i+k]=t[j+k]) do Inc(k); if k>kx then begin r:=Copy(t,j,k); kx:=k end; j:=j+k+1 end end; w:=r end; WriteLn('Root is: ',r); ReadLn end.
А вот с пунктом 2 не знаю, как быть. Одновременно отыскивать корни, как-то разделяя слова на группы однокоренных?.. это задача неслабая.. Или же список корней задан? Если да, тогда нет проблем.
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой