Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Программа на Delphi

11K
04 июля 2005 года
gibson85
11 / / 04.07.2005
Приветствую всех тех, кто посетил эту страничку.
Помогите пожалуйста составить не большую програмку на Delphi (я только начал познавать основы программирования, а друзей, которые могут направить меня на путь истиный нет (я имею в виду программистов)). Вобщем задачка такая:

Программа должна находить одинаковые сочетания букв в разных словах из текста, например "Масленное масло"- масл являетс общей частью, или "перелом переносицы носа"- пере являетс общей частью.

Я пока не мугу написать такую прогу, поэтому прошу помощи.
6.7K
05 июля 2005 года
Metalslave
37 / / 24.08.2004
Цитата:
Originally posted by gibson85
Приветствую всех тех, кто посетил эту страничку.
Помогите пожалуйста составить не большую програмку на Delphi (я только начал познавать основы программирования, а друзей, которые могут направить меня на путь истиный нет (я имею в виду программистов)). Вобщем задачка такая:

Программа должна находить одинаковые сочетания букв в разных словах из текста, например "Масленное масло"- масл являетс общей частью, или "перелом переносицы носа"- пере являетс общей частью.

Я пока не мугу написать такую прогу, поэтому прошу помощи.


На чем конкретно ты застрял? Что не представляешь, как зделать? Если за тебя кто-то напишет все прогу и ты не приложишь никаких усилий - на пользу тебе не пойдет.

253
05 июля 2005 года
Proger_XP
1.5K / / 07.08.2004
Цитата:
Originally posted by Metalslave
На чем конкретно ты застрял? Что не представляешь, как зделать? Если за тебя кто-то напишет все прогу и ты не приложишь никаких усилий - на пользу тебе не пойдет.


Иногда идет ))
Нужно каждый символ в строке читать типа:
for I := 1 to Length(Str) do
// делаем что-нибудь с символом Str
У тебя в этом вроде проблема

11K
05 июля 2005 года
gibson85
11 / / 04.07.2005
Я не могу сделать перебор слов (а не букв в отдельности). Допустим мне надо "загнать" каждое слово текста в динамический массив (т.е. массив слов), чтобы обращаться к каждому слову, как к отдельному элементу массива.
9.1K
06 июля 2005 года
net
15 / / 22.06.2005
Цитата:
Originally posted by gibson85
Приветствую всех тех, кто посетил эту страничку.
Помогите пожалуйста составить не большую програмку на Delphi (я только начал познавать основы программирования, а друзей, которые могут направить меня на путь истиный нет (я имею в виду программистов)). Вобщем задачка такая:

Программа должна находить одинаковые сочетания букв в разных словах из текста, например "Масленное масло"- масл являетс общей частью, или "перелом переносицы носа"- пере являетс общей частью.

Я пока не мугу написать такую прогу, поэтому прошу помощи.



по сколько символов сравнивать хочешь? из примера видно, что по 4, но это могло выйти случайно. определись для начала с эти, потом записывай в массив все сочетания (рядом стоящих) по N символов и смотри, есть ли одинаковые

488
06 июля 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by gibson85
Программа должна находить одинаковые сочетания букв в разных словах из текста, например "Масленное масло"- масл являетс общей частью, или "перелом переносицы носа"- пере являетс общей частью.

Есть word1 и word2.
Нужны 2 вложенных цикла.
Внешний по буквам word1, а внутренний ищет в word2 букву совпадающую с текущей буквой из word2.
Если есть такая, тогда в третьем цикле проверяется совпадает ли хотя бы одна буква, следующая за этими буквами.
Если да, тогда одно подслово найдено.

P.S. В цикл не нужно включать последние буквы word1 и word2.

6.7K
06 июля 2005 года
Metalslave
37 / / 24.08.2004
Цитата:
Originally posted by gibson85
Я не могу сделать перебор слов (а не букв в отдельности). Допустим мне надо "загнать" каждое слово текста в динамический массив (т.е. массив слов), чтобы обращаться к каждому слову, как к отдельному элементу массива.


Вот таким образом можно загрузить текст из файла пословесно в TStringList.

Код:
const     delim : set of char =[' ',',', #13, #0, #9, #10];  // здесь указуем какие символы мы будем пропускать при поиске слова в строке
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 находяться слова из текста.
Дальше я бы посоветовал брать из каждого слова из этого списка то колличество букв что тебе нужно и сверять со всеми словами от начала до конца или у них такие же буквы в той же позиции. т.е поиск подстроки в строке.
253
06 июля 2005 года
Proger_XP
1.5K / / 07.08.2004
Может тебе лучше пропускать все символы где Ord(Ch) < 33? ))
Mongoose привел нормальный алгоритм, по нему и пиши
6.7K
06 июля 2005 года
Metalslave
37 / / 24.08.2004
Цитата:
Originally posted by Proger_XP
Может тебе лучше пропускать все символы где Ord(Ch) < 33? ))
Mongoose привел нормальный алгоритм, по нему и пиши


А может лучше их в текстовый файл не вставлять...
---
Человек вроде не знал как перебор слов устроить, а не букв в слове ..... :???:

11K
14 июля 2005 года
gibson85
11 / / 04.07.2005
Цитата:
Originally posted by Metalslave
А может лучше их в текстовый файл не вставлять...
---
Человек вроде не знал как перебор слов устроить, а не букв в слове ..... :???:




Спасибо за код, но это не совсем то, что мне нужно. Пример: У меня имеется какой-то текст в 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;) слова из текста?

253
15 июля 2005 года
Proger_XP
1.5K / / 07.08.2004
Цитата:
Originally posted by gibson85
Спасибо за код, но это не совсем то, что мне нужно. Пример: У меня имеется какой-то текст в 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

6.7K
15 июля 2005 года
Metalslave
37 / / 24.08.2004
Цитата:
Originally posted by gibson85
Спасибо за код, но это не совсем то, что мне нужно. Пример: У меня имеется какой-то текст в 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, ты бы посты лучше редактировал ;) а то повторяешься немного. :)

253
15 июля 2005 года
Proger_XP
1.5K / / 07.08.2004
Цитата:
Originally posted by Metalslave
Proger_XP, ты бы посты лучше редактировал ;) а то повторяешься немного


Бывает ))

11K
16 июля 2005 года
gibson85
11 / / 04.07.2005
Цитата:
Originally posted by Metalslave
Зачем тебе этот гемор с динамическим массивом???
с помощью 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!

253
16 июля 2005 года
Proger_XP
1.5K / / 07.08.2004
Цитата:
Originally posted by gibson85
Спасибо за советы, TRichEdit уже используется вместо Memo. Пойдем дальше. ""с помощью StrList ты смог бы легко найти повторяемые символы..."" Здесь-то и начинается вся основная работа.
Metalslave как-то писал ""Теперь от i := 0 to StrList.count-1 в StrList.strings находяться слова из текста.
Дальше я бы посоветовал брать из каждого слова из этого списка то колличество букв что тебе нужно и сверять со всеми словами от начала до конца или у них такие же буквы в той же позиции. т.е поиск подстроки в строке.""
Я не знаю, как начать нормально выполнять вышесказанное. Help!


Что-то вроде:

 
Код:
for I := 0 to SL.Count - 1 do
  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
11K
17 июля 2005 года
gibson85
11 / / 04.07.2005
Цитата:
Originally posted by Proger_XP
Что-то вроде:
 
Код:
for I := 0 to SL.Count - 1 do
  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 ещё раз!!!

253
17 июля 2005 года
Proger_XP
1.5K / / 07.08.2004
У меня ошибка:
Код:
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
  ....

Я так понял, что здесь ты сравниваешь первые две буквы первого слова с первыми двумя буквами второго слова (pardon за

вынужденную товталогию)

Почему первые 2 буквы? Посмотри на исправленную версию
11K
19 июля 2005 года
gibson85
11 / / 04.07.2005
Цитата:
Originally posted by Proger_XP
У меня ошибка:
Код:
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
  ....

Я так понял, что здесь ты сравниваешь первые две буквы первого слова с первыми двумя буквами второго слова (pardon за

вынужденную товталогию)

Почему первые 2 буквы? Посмотри на исправленную версию




Если не трудно, прокомментируй подробно каждую строчку, а то я мало что понял (I2 - что это).

253
20 июля 2005 года
Proger_XP
1.5K / / 07.08.2004
Цитата:
Originally posted by gibson85
Если не трудно, прокомментируй подробно каждую строчку, а то я мало что понял (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(на той же позиции) второй строки значит делаем какие-то действия
  ....
11K
21 июля 2005 года
gibson85
11 / / 04.07.2005
Цитата:
Originally posted by Proger_XP
Код:
// эта функция определяет какая строка короче и возвращает ее длинну(самой короткой)
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;


Это самый черновой, примерный вариант. Здесь есть куча недочетов, но всеже. Может предложишь свои надумки-наброски.

253
21 июля 2005 года
Proger_XP
1.5K / / 07.08.2004
Каждому свое
11K
22 июля 2005 года
gibson85
11 / / 04.07.2005
Цитата:
Originally posted by Proger_XP
Каждому свое



Так что делать дальше?

253
22 июля 2005 года
Proger_XP
1.5K / / 07.08.2004
Цитата:
Originally posted by gibson85
Так что делать дальше?


Что дальше?

11K
23 июля 2005 года
gibson85
11 / / 04.07.2005
Цитата:
Originally posted by Proger_XP
Что дальше?



Я в плане написания программы. Что-то я не очень-то и продвигаюсь в нужом направлении. Вот и спрашиваю очередного совета-помощи.

253
23 июля 2005 года
Proger_XP
1.5K / / 07.08.2004
Цитата:
Originally posted by gibson85
Я в плане написания программы. Что-то я не очень-то и продвигаюсь в нужом направлении. Вот и спрашиваю очередного совета-помощи


Тебе же уже и алгоритм и код дали чего еще-то ))
Дальше сам думай

11K
23 июля 2005 года
gibson85
11 / / 04.07.2005
Цитата:
Originally posted by Proger_XP
Тебе же уже и алгоритм и код дали чего еще-то ))
Дальше сам думай



Ну ладно, спасибо за советы. У меня тут уже есть парочку наработок по продолжению программы. А не мог ли бы ты мне дать свой E-mail, на тот случай, если у меня возникнут какие-нибудь конструктивные вопросы по поводу моей програмки, если конечно я тебя еще не совсем достал.

11K
01 августа 2005 года
gibson85
11 / / 04.07.2005
У меня к Вам ещё вопрос:
Как можно интегрировать иконку моей программы в панель инструментов Microsoft Word (причем во все версии), и

соответственно, при нажатии на ней программа должна запускаться.
253
04 августа 2005 года
Proger_XP
1.5K / / 07.08.2004
Цитата:
Originally posted by gibson85
У меня к Вам ещё вопрос:
Как можно интегрировать иконку моей программы в панель инструментов Microsoft Word (причем во все версии), и

соответственно, при нажатии на ней программа должна запускаться


Этого я не знаю

[email]mailme@smtp.ru[/email]
ICQ: 314779389

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог