IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Нахождение общей части слов, Пара задач
Patam
сообщение 18.04.2007 16:44
Сообщение #1





Группа: Пользователи
Сообщений: 3
Пол: Мужской
Реальное имя: Алексей

Репутация: -  0  +


1. Для задаваемой строки найти все содержащиеся в ней слова и распечатать наибольшую общую часть этих слов.
Пример:
Для строки
мирный примирить перемирие мирить
Общая часть слов - мир.
2. Найти в задаваемой строке содержащиеся в ней корни и распечатать для каждого корня однокоренные с ним слова.
Пример:
Для строки
народ мирный родник мир родина род мирить
Корни____Однокоренные слова
мир______мирный мирить
род______народ родник родина

Хелп плз. yes2.gif

Сообщение отредактировано: Patam - 19.04.2007 16:08
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Lapp
сообщение 19.04.2007 8:44
Сообщение #2


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


По п.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 не знаю, как быть. Одновременно отыскивать корни, как-то разделяя слова на группы однокоренных?.. это задача неслабая.. Или же список корней задан? Если да, тогда нет проблем.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 25.06.2025 15:48
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"