Программа на Delphi
Помогите пожалуйста составить не большую програмку на Delphi (я только начал познавать основы программирования, а друзей, которые могут направить меня на путь истиный нет (я имею в виду программистов)). Вобщем задачка такая:
Программа должна находить одинаковые сочетания букв в разных словах из текста, например "Масленное масло"- масл являетс общей частью, или "перелом переносицы носа"- пере являетс общей частью.
Я пока не мугу написать такую прогу, поэтому прошу помощи.
Приветствую всех тех, кто посетил эту страничку.
Помогите пожалуйста составить не большую програмку на Delphi (я только начал познавать основы программирования, а друзей, которые могут направить меня на путь истиный нет (я имею в виду программистов)). Вобщем задачка такая:
Программа должна находить одинаковые сочетания букв в разных словах из текста, например "Масленное масло"- масл являетс общей частью, или "перелом переносицы носа"- пере являетс общей частью.
Я пока не мугу написать такую прогу, поэтому прошу помощи.
На чем конкретно ты застрял? Что не представляешь, как зделать? Если за тебя кто-то напишет все прогу и ты не приложишь никаких усилий - на пользу тебе не пойдет.
На чем конкретно ты застрял? Что не представляешь, как зделать? Если за тебя кто-то напишет все прогу и ты не приложишь никаких усилий - на пользу тебе не пойдет.
Иногда идет ))
Нужно каждый символ в строке читать типа:
for I := 1 to Length(Str) do
// делаем что-нибудь с символом Str
У тебя в этом вроде проблема
Приветствую всех тех, кто посетил эту страничку.
Помогите пожалуйста составить не большую програмку на Delphi (я только начал познавать основы программирования, а друзей, которые могут направить меня на путь истиный нет (я имею в виду программистов)). Вобщем задачка такая:
Программа должна находить одинаковые сочетания букв в разных словах из текста, например "Масленное масло"- масл являетс общей частью, или "перелом переносицы носа"- пере являетс общей частью.
Я пока не мугу написать такую прогу, поэтому прошу помощи.
по сколько символов сравнивать хочешь? из примера видно, что по 4, но это могло выйти случайно. определись для начала с эти, потом записывай в массив все сочетания (рядом стоящих) по N символов и смотри, есть ли одинаковые
Программа должна находить одинаковые сочетания букв в разных словах из текста, например "Масленное масло"- масл являетс общей частью, или "перелом переносицы носа"- пере являетс общей частью.
Есть word1 и word2.
Нужны 2 вложенных цикла.
Внешний по буквам word1, а внутренний ищет в word2 букву совпадающую с текущей буквой из word2.
Если есть такая, тогда в третьем цикле проверяется совпадает ли хотя бы одна буква, следующая за этими буквами.
Если да, тогда одно подслово найдено.
P.S. В цикл не нужно включать последние буквы word1 и word2.
Я не могу сделать перебор слов (а не букв в отдельности). Допустим мне надо "загнать" каждое слово текста в динамический массив (т.е. массив слов), чтобы обращаться к каждому слову, как к отдельному элементу массива.
Вот таким образом можно загрузить текст из файла пословесно в TStringList.
var
StrList : TStringList;
implementation
//ищем отдельные слова в текущей строке
Procedure CheckString (str : string);
Var
i: integer;
newstr : string;
Begin
newStr := '';
for i:=1 to length(str) do begin
if not (str in delim)
then newStr := newStr+ str
else if newStr <> '' then begin
StrList.Add(newStr); //добавляем новое слово
newStr := '';
end;
end;
if newStr <> '' then StrList.Add(newStr);
End;
//грузим текст построчно из файла
procedure LoadFromFile (const filename : string);
Var
f : textFile;
tmpstr : string;
Begin
assignFile(f, Filename);
reset(f);
while not eof(f) do begin
readln(f, tmpStr);
CheckString(tmpStr);
end;
CloseFile(f);
End;
Теперь от i := 0 to StrList.count-1 в StrList.strings находяться слова из текста.
Дальше я бы посоветовал брать из каждого слова из этого списка то колличество букв что тебе нужно и сверять со всеми словами от начала до конца или у них такие же буквы в той же позиции. т.е поиск подстроки в строке.
Mongoose привел нормальный алгоритм, по нему и пиши
Может тебе лучше пропускать все символы где Ord(Ch) < 33? ))
Mongoose привел нормальный алгоритм, по нему и пиши
А может лучше их в текстовый файл не вставлять...
---
Человек вроде не знал как перебор слов устроить, а не букв в слове ..... :???:
А может лучше их в текстовый файл не вставлять...
---
Человек вроде не знал как перебор слов устроить, а не букв в слове ..... :???:
Спасибо за код, но это не совсем то, что мне нужно. Пример: У меня имеется какой-то текст в Memo, допустим, в нем встретилось
словосочетание "масленное масло". Программа должна найти общее между этими словами "масл" и выделить это общее другим цветом.
Если брать в рассмотрение StrList, то как можно будет осуществить вышесказанное. В данном случае слова выстраиваются в список
строк (StrList), а мне нужен массив слов (Array of string); Что-то вроде этого:
_____________________________
procedure TForm1.Button1Click(Sender: TObject);
var i, k: integer;
M: Array of string;
begin
k:=Memo1.Lines.Count; {k - принимает значение числа строк в Memo1}
SetLength(M,k);
i:=1;
while i<=k do
begin
M:=Copy(Memo2.Lines,1,length(Memo2.Lines)); {Здесь что-то не проходит}
Memo3.Text:=Memo3.Text+#13#10+M; {А эта строчка просто для проверки того, что записалось а массив}
inc(i);
end;
M:=nil;
end;
_____________________________
Этот пример не совсем работает.
Так как записать в массив (M: Array of string;) слова из текста?
Спасибо за код, но это не совсем то, что мне нужно. Пример: У меня имеется какой-то текст в Memo, допустим, в нем встретилось
словосочетание "масленное масло". Программа должна найти общее между этими словами "масл" и выделить это общее другим цветом
В TMemo нельзя форматировать отдельные фрагменты текста, можно только весь
Для этого юзай TRichEdit
Если брать в рассмотрение StrList, то как можно будет осуществить вышесказанное. В данном случае слова выстраиваются в список строк (StrList), а мне нужен массив слов (Array of string)
Какая разница?
TStringList.Strings
procedure TForm1.Button1Click(Sender: TObject);
var i, k: integer;
M: Array of string;
begin
k:=Memo1.Lines.Count; {k - принимает значение числа строк в Memo1}
SetLength(M,k);
i:=1;
while i<=k do
begin
M:=Copy(Memo2.Lines,1,length(Memo2.Lines)); {Здесь что-то не проходит}
Memo3.Text:=Memo3.Text+#13#10+M; {А эта строчка просто для проверки того, что записалось а массив}
inc(i);
end;
M:=nil;
end;
Этот пример не совсем работает.
Так как записать в массив (M: Array of string;) слова из текста?
for I := 0 to SL.Count - 1 do
M := SL.Strings
Спасибо за код, но это не совсем то, что мне нужно. Пример: У меня имеется какой-то текст в Memo, допустим, в нем встретилось
словосочетание "масленное масло". Программа должна найти общее между этими словами "масл" и выделить это общее другим цветом.
Если брать в рассмотрение StrList, то как можно будет осуществить вышесказанное. В данном случае слова выстраиваются в список
строк (StrList), а мне нужен массив слов (Array of string); Что-то вроде этого:
_____________________________
procedure TForm1.Button1Click(Sender: TObject);
var i, k: integer;
M: Array of string;
begin
k:=Memo1.Lines.Count; {k - принимает значение числа строк в Memo1}
SetLength(M,k);
i:=1;
while i<=k do
begin
M:=Copy(Memo2.Lines,1,length(Memo2.Lines)); {Здесь что-то не проходит}
Memo3.Text:=Memo3.Text+#13#10+M; {А эта строчка просто для проверки того, что записалось а массив}
inc(i);
end;
M:=nil;
end;
_____________________________
Этот пример не совсем работает.
Так как записать в массив (M: Array of string;) слова из текста?
Зачем тебе этот гемор с динамическим массивом???
с помощью StrList ты смог бы легко найти повторяемые символы... потом, как сказал Proger_XP, юзай TRichEdit.
-- M:=Copy(Memo2.Lines,1,length(Memo2.Lines) --
Почему не выходит?
потому что Lines в даном случае не есть ни <dinamic array> ни <string>..что должно быть первым аргументом функции Copy. Lines - это класс TStrings. Чтоб это все заработало нужно так:
M := Copy(Memo2.Lines.Strings,1,length(Memo2.Lines.Strings))
хотя это все равно через .... одно место. намного проще будет так:
M := Memo2.Lines.Strings;
---
Proger_XP, ты бы посты лучше редактировал ;) а то повторяешься немного. :)
Proger_XP, ты бы посты лучше редактировал ;) а то повторяешься немного
Бывает ))
Зачем тебе этот гемор с динамическим массивом???
с помощью StrList ты смог бы легко найти повторяемые символы... потом, как сказал Proger_XP, юзай TRichEdit.
-- M:=Copy(Memo2.Lines,1,length(Memo2.Lines) --
Почему не выходит?
потому что Lines в даном случае не есть ни <dinamic array> ни <string>..что должно быть первым аргументом функции Copy. Lines - это класс TStrings. Чтоб это все заработало нужно так:
M := Copy(Memo2.Lines.Strings,1,length(Memo2.Lines.Strings))
хотя это все равно через .... одно место. намного проще будет так:
M := Memo2.Lines.Strings;
---
Proger_XP, ты бы посты лучше редактировал ;) а то повторяешься немного. :)
Спасибо за советы, TRichEdit уже используется вместо Memo. Пойдем дальше. ""с помощью StrList ты смог бы легко найти повторяемые символы..."" Здесь-то и начинается вся основная работа.
Metalslave как-то писал ""Теперь от i := 0 to StrList.count-1 в StrList.strings находяться слова из текста.
Дальше я бы посоветовал брать из каждого слова из этого списка то колличество букв что тебе нужно и сверять со всеми словами от начала до конца или у них такие же буквы в той же позиции. т.е поиск подстроки в строке.""
Я не знаю, как начать нормально выполнять вышесказанное. Help!
Спасибо за советы, TRichEdit уже используется вместо Memo. Пойдем дальше. ""с помощью StrList ты смог бы легко найти повторяемые символы..."" Здесь-то и начинается вся основная работа.
Metalslave как-то писал ""Теперь от i := 0 to StrList.count-1 в StrList.strings находяться слова из текста.
Дальше я бы посоветовал брать из каждого слова из этого списка то колличество букв что тебе нужно и сверять со всеми словами от начала до конца или у них такие же буквы в той же позиции. т.е поиск подстроки в строке.""
Я не знаю, как начать нормально выполнять вышесказанное. Help!
Что-то вроде:
for J := 0 to SL.Count - 1 do
for I2 := 0 to SL.Count - 1 do
if SL.Strings[I2] = SL.Strings[J][I2] then
....
Конечно это можно оптимизировать ))
Смотри SysUtils.pas и StrUtils.pas
Что-то вроде:
for J := 0 to SL.Count - 1 do
for I2 := 0 to SL.Count - 1 do
if SL.Strings[I2] = SL.Strings[J][I2] then
....
Конечно это можно оптимизировать ))
Смотри SysUtils.pas и StrUtils.pas
Я так понял, что здесь ты сравниваешь первые две буквы первого слова с первыми двумя буквами второго слова (pardon за
вынужденную товталогию). Так? Что дальше? Как организовать полный цикл перебора всех букв всех слов со всеми условиями
нахождения повторений... У меня уже голова пухнет... Help ещё раз!!!
begin
Result := Length(Str1);
if Result > Length(Str2) then
Result := Length(Str2)
end;
for I := 0 to SL.Count - 1 do
for J := 0 to SL.Count - 1 do
for I2 := 0 to Lengths(SL.Strings[I2], SL.Strings[J][I2]) do
if SL.Strings[I2] = SL.Strings[J][I2] then
....
Я так понял, что здесь ты сравниваешь первые две буквы первого слова с первыми двумя буквами второго слова (pardon за
вынужденную товталогию)
Почему первые 2 буквы? Посмотри на исправленную версию
У меня ошибка:
begin
Result := Length(Str1);
if Result > Length(Str2) then
Result := Length(Str2)
end;
for I := 0 to SL.Count - 1 do
for J := 0 to SL.Count - 1 do
for I2 := 0 to Lengths(SL.Strings[I2], SL.Strings[J][I2]) do
if SL.Strings[I2] = SL.Strings[J][I2] then
....
Я так понял, что здесь ты сравниваешь первые две буквы первого слова с первыми двумя буквами второго слова (pardon за
вынужденную товталогию)
Почему первые 2 буквы? Посмотри на исправленную версию
Если не трудно, прокомментируй подробно каждую строчку, а то я мало что понял (I2 - что это).
Если не трудно, прокомментируй подробно каждую строчку, а то я мало что понял (I2 - что это)
function Lengths(Str1, Str2: String): Byte;
begin
Result := Length(Str1);
if Result > Length(Str2) then
Result := Length(Str2)
end;
// это ты можешь написать в любой обработчик например при шелчке на кнопке
for I := 0 to SL.Count - 1 do
for J := 0 to SL.Count - 1 do
for I2 := 0 to Lengths(SL.Strings[I2], SL.Strings[J][I2]) do // берем каждую букву в двух строках
if SL.Strings[I2] = SL.Strings[J][I2] then // если символ I2 первой строки = символу I2(на той же позиции) второй строки значит делаем какие-то действия
....
function Lengths(Str1, Str2: String): Byte;
begin
Result := Length(Str1);
if Result > Length(Str2) then
Result := Length(Str2)
end;
// это ты можешь написать в любой обработчик например при шелчке на кнопке
for I := 0 to SL.Count - 1 do
for J := 0 to SL.Count - 1 do
for I2 := 0 to Lengths(SL.Strings[I2], SL.Strings[J][I2]) do // берем каждую букву в двух строках
if SL.Strings[I2] = SL.Strings[J][I2] then // если символ I2 первой строки = символу I2(на той же позиции) второй строки значит делаем какие-то действия
....
В принципе, все понятно с началом. И все-таки мне больше нравится мой вариант с массивом слов (Array of string). Я переделал
все на свой лад и получилось тоже, только с массивом. Я попытался как-то продвинуться дальше, и вот что получилось:
var M: Array [1..10] of string;
i,j,k1,k2,q1,q2: integer;
w:integer; // количество повторяющихся букв
begin
w:=0; h:=0; // h- количество повторений за одну итерацию; w- количество найденых повторяющихся букв
for i:= 1 to 10 do
k1:=length M; // узнаем колличество букв в слове
for j:= 1 to 10 do
begin
k2:=length M[j];
if M=M[j] then continue else // если слово равняется самомк себе, то пропускаем его
for q1:=1 to k1 do // цикл для перебора букв в слове
for q2:=1 to k2 do
{здесь начинается самое сложное, можно предлагать свои варианты с пояснением}
if w>=3 then // если найденых совпадений не <3-х, то
begin
{выделяем найденые буквы другим цветом}
w:=0; // обнуляем количество совпадающих букв
end else
if {если q1 буква = q2 букве} then
begin
w:=inc(w); // + один повтор буквы найден
{запоминаем позицию этой буквы, для того, чтобы в дальнейшем ее выделить};
end;
Это самый черновой, примерный вариант. Здесь есть куча недочетов, но всеже. Может предложишь свои надумки-наброски.
Каждому свое
Так что делать дальше?
Так что делать дальше?
Что дальше?
Что дальше?
Я в плане написания программы. Что-то я не очень-то и продвигаюсь в нужом направлении. Вот и спрашиваю очередного совета-помощи.
Я в плане написания программы. Что-то я не очень-то и продвигаюсь в нужом направлении. Вот и спрашиваю очередного совета-помощи
Тебе же уже и алгоритм и код дали чего еще-то ))
Дальше сам думай
Тебе же уже и алгоритм и код дали чего еще-то ))
Дальше сам думай
Ну ладно, спасибо за советы. У меня тут уже есть парочку наработок по продолжению программы. А не мог ли бы ты мне дать свой E-mail, на тот случай, если у меня возникнут какие-нибудь конструктивные вопросы по поводу моей програмки, если конечно я тебя еще не совсем достал.
Как можно интегрировать иконку моей программы в панель инструментов Microsoft Word (причем во все версии), и
соответственно, при нажатии на ней программа должна запускаться.
У меня к Вам ещё вопрос:
Как можно интегрировать иконку моей программы в панель инструментов Microsoft Word (причем во все версии), и
соответственно, при нажатии на ней программа должна запускаться
Этого я не знаю
[email]mailme@smtp.ru[/email]
ICQ: 314779389