![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
доработка в программе [D7, XP]
flunkkkk © (2008-12-21 15:12:00)программа открывает .txt файл, вывожу файл в мемо1 программа анализирует текст и в мемо2 указывает сколько раз каждое слово употребляется в тексте!
хочу создать еще кнопку чтобы в мемо2 программа упорядочила мне слова по частоте употребления в тексте. А она мне просто показывает по порядку каждое слово сколько раз встречается!
вот мне подсказали ето:
TStringList(Memo2.Lines).Sort;
Memo2.Update;
Но чтото оно не работает! подскажите где ошибка???
{RASkov} (2008-12-22 10:37:00) [1]> [19] Сергей М. © (22.12.08 10:30)
Его условия:
> чтобы в мемо2 программа упорядочила мне слова по частоте употребления в тексте.
А в "его" Мемо2 такого не сделать)
{RASkov} (2008-12-22 10:35:00) [2]> [18] flunkkkk © (22.12.08 10:24)
Ну и писАл бы чего-нибудь попроще.... а зачем для непрограммера такие "сложности"???
> просто после 6 лекций препод сказал что мы сможем написать что угодно в делфи . .
В чем-то препод и прав. Я вот вообще ни на одной лекции не был...
С другой стороны, ты что тут хочешь, что бы твой курсач за тебя сделали?
Вот ты нашел код "выдирания" слов из текста... даже с их подсчетом, да еще и с процентным соотношением - повезло?)
А вот сортировку в том коде не предусмотрели :( Тут нужно переписывать.... А ты даже после 6 или сколько там лекций, нифика не можешь даже готовое переделать для себя) Я могу тебе написать CustomSort для StringList'а, но что тебе это даст? Тыж не сможешь его прикрутить куда нужно, тогда зачем тебе это писать?
Сергей М. (2008-12-22 10:30:00) [3]
> flunkkkk
var
sl: TStringList;
..
sl := TStringList.Create;
try
sl.Assign(Memo.Lines);
sl.Sort;
Memo.Lines := sl;
finally
sl.Free;
end;
flunkkkk (2008-12-22 10:24:00) [4]я не на программера учусь, у меня просто курсач в делфи и все я про него забуду . . . ..
просто после 6 лекций препод сказал что мы сможем написать что угодно в делфи . . .
Германн (2008-12-22 01:31:00) [5]
> Так что, ...копи-пасты тебя отчислят с учебы.... немного
> сам соображай что делаешь.... Мы поможем, не волнуйся
Ага. Поможем с превеликим удовольствием. Когда демобилизуешься. Если тогда ещё захочешь продолжать заниматься программированием. :)
{RASkov} (2008-12-22 01:24:00) [6]> [5] flunkkkk © (21.12.08 15:24)
http://forum.ishodniki.ru/index.php?topic=15424.0
> подсчет мне не надо! у менявыводит подсчитаные слова, мне только надо их отсортировать
Ну ну :) ...у тебя)
Сортировать в Мемо2 хочешь? Надеюсь тебе по кол-ву не нужно сортировку, ибо после
Memo2.Lines.Add( r^.str + ' - ' + IntToStr( r^.col ) + ' (' + Format( '%.2f%%', [r^.col/StringCount*100] ) + ')' );
уже не будет такой возможности. Только заново наполнять текст Мемо2 но перед этим сортировать по кол-ву нужно L, а он у тебя был локальным и уничтожен...
Так что, ...копи-пасты тебя отчислят с учебы.... немного сам соображай что делаешь.... Мы поможем, не волнуйся, но все делать за тебя - это не верно.
Вот подсказка:
Тип
TRec = record
str: String;
col: Integer;
end;
PRec = ^TRec;
прекрасно заменится TStringList'ом... А уже его данные отоброжать в виртуальном ЛистБоксе...
Так же подсчет можно вести уже при Екстракте слов... ни к чему кучу циклов делать...
Leonid Troyanovsky (2008-12-21 15:49:00) [7]
> flunkkkk © (21.12.08 15:37) [13]
> можно поподробнее с листбоксом?
Можешь взглянуть на пример с TStringGrid
http://groups.google.com/group/fido7.ru.delphi/msg/8c27f707490716b2
Это как идея. Просто тогда стиль, скажем, lbVirtual
не был широко распространен.
--
Regards, LVT.
Leonid Troyanovsky (2008-12-21 15:40:00) [8]
> {RASkov} © (21.12.08 15:34) [12]
> Сортировать можно как по словам, так и по кол-ву....
> Но можно и табличный компонент какой-нибудь использовать.
> .. но, имхо, достаточно ЛистБокса...
Для сортировать - достаточно TStringList.
А показывать - любой контрол с virtual, в т.ч. и ЛистБокс.
--
Regards, LVT.
flunkkkk (2008-12-21 15:37:00) [9]мне это не очень дошло, вот я и пишу в форум начинающим. ..
можно поподробнее с листбоксом?
{RASkov} (2008-12-21 15:34:00) [10]Достаточно 1 Мемо и 1 Листбокс...
В мемо текст, а в ЛистБоксе Слова с их кол-вом...
Листбокса достаточно - Strings - Сами слова Objects - Кол-во данного слова...
Сортировать можно как по словам, так и по кол-ву....
Но можно и табличный компонент какой-нибудь использовать... но, имхо, достаточно ЛистБокса...
Leonid Troyanovsky (2008-12-21 15:33:00) [11]
> {RASkov} © (21.12.08 15:30) [10]
Спасибо. Жалко, что закрыли.
Мне есть что им сказать [ДВ] :)
--
Regards, LVT.
{RASkov} (2008-12-21 15:30:00) [12]> [8] Leonid Troyanovsky © (21.12.08 15:26)
http://www.delphimaster.ru/cgi-bin/forum.pl?n=0&id=1229791957
{RASkov} (2008-12-21 15:28:00) [13]> [5] flunkkkk © (21.12.08 15:24)
Ё-мое.... нафик тут указатели, нафик TList непосредственно???
У Мемо есть свойство Текст, где и есть весь текст - в нем и считай сколько слов....
Что такое PRec?....
В общем слишком все сложно, для простой задачи...
Leonid Troyanovsky (2008-12-21 15:26:00) [14]
> {RASkov} © (21.12.08 15:21) [3]
> > Небось, двоешники посоветовали?
> Да нет, посоветовал это Сергей М.)
Я пропустил, дай ссыл, плиз.
--
Regards, LVT.
flunkkkk (2008-12-21 15:25:00) [15]"Да нет, посоветовал это Сергей М.) Но этот совет, т.н. подсказка, был на вопрос автора об сортировке, а никак не о подсчете)"
подсчет мне не надо! у меня выводит подсчитаные слова, мне только надо их отсортировать
{RASkov} (2008-12-21 15:25:00) [16]> [4] Leonid Troyanovsky © (21.12.08 15:24)
ст ёр:)
flunkkkk (2008-12-21 15:24:00) [17]var
StringCount: Word;
sl: TStringList;
l: TList;
i, j: integer;
s, tmp: string;
r: PRec;
f: boolean;
begin
StringCount := 0;
sl := TStringList.Create;
// Выделяем из текста все слова
for i := 0 to Memo1.Lines.Count-1 do
begin
s := Memo1.Lines[i];
while Length( s ) > 0 do
begin
if Pos( ' ', s ) > 0 then
begin
tmp := Copy( s, 1, Pos( ' ', s )-1 );
Delete( s, 1, Pos( ' ', s ) );
tmp := TrimEx( tmp );
end
else
begin
tmp := s;
s := '';
tmp := TrimEx( tmp );
end;
if Trim( tmp ) <> '' then
sl.Add( tmp );
end;
end;
StringCount := sl.Count;
// Производим подсчет
l := TList.Create;
for i := 0 to sl.Count-1 do
begin
if l.Count = 0 then
begin
New( r );
r^.str := sl[i];
r^.col := 1;
l.Add( r );
end
else
begin
f := false;
for j := 0 to l.Count-1 do
begin
r := l[j];
if r^.str = sl[i] then
begin
r^.col := r^.col + 1;
l[j] := r;
f := true;
Break;
end;
end;
if not f then
begin
New( r );
r^.str := sl[i];
r^.col := 1;
l.Add( r );
end;
end;
end;
// Выводим результат
for i := 0 to l.Count-1 do
begin
r := l[i];
Memo2.Lines.Add( r^.str + ' - ' + IntToStr( r^.col ) + ' (' + Format( '%.2f%%', [r^.col/StringCount*100] ) + ')' );
end;
l.Free;
sl.Free;
Leonid Troyanovsky (2008-12-21 15:24:00) [18]
> {RASkov} © (21.12.08 15:19) [2]
> стре все нафик.
Это как?
--
Regards, LVT.
{RASkov} (2008-12-21 15:21:00) [19]> [1] Leonid Troyanovsky © (21.12.08 15:18)
> Небось, двоешники посоветовали?
:)
Да нет, посоветовал это Сергей М.) Но этот совет, т.н. подсказка, был на вопрос автора об сортировке, а никак не о подсчете)
{RASkov} (2008-12-21 15:19:00) [20]> [0] flunkkkk © (21.12.08 15:12)
Ты решил, что двумя строчками кода написал всю программу? :)
Я начал было в этом посте рассказывать как тебе поступить, но оказалось, что тут много нужно тебе рассказывать.... стре все нафик.
Давай спрашивай конкретно, что тебе не ясно.
Покажи код, где ты подсчитываешь кол-во уникальных(?) слов в тексте.
Подсказка: тут рядом ветка, там есть решение по нахождению общего кол-ва слов в тексте, может пригодится чем нибудь...