Словарный Запас Delphi

  • Автор темы a9x
  • Дата начала
Статус
Закрыто для дальнейших ответов.
A
#1
Помогите пож написать программу на Delphi, которая считывала txt файл и считала словарный запас - считала кол-во всех слов из файла, те слова которые повторяются считала за одно.
Я находил проги которые считаю слова, но как сделать чтоб повторяющиеся считала за одно не знаю(

Если поможет - вот прога считает просто кол-во слов. Тока через мемо(

procedure TForm1.Button1Click(Sender: TObject);
const
//Множество разделителей.
D = ['.', ',', ':', ';', '!', '?', '-', ' ', #9, #10, #13];
var
S : String;
i, Len, LenW, Cnt : Integer;
begin
S := Memo1.Text;
Len := Length(S);
LenW := 0;
Cnt := 0;
//Перебор символов строки слева - направо.
for i := 1 to Len do begin
//Пропускаем разделители.
if S in D then Continue;
//Очередной символ учитываем в длине слова.
Inc(LenW);
//Отслеживаем конец слова.
if (i = Len) or (S[i + 1] in D) then begin
//Подсчёт общего количества слов.
Inc(Cnt);
//Сброс длины слова.
LenW := 0;
end;
end;
//Ответ:
ShowMessage('Словарный запас: ' + IntToStr(Cnt));
end;
end.
 

Senset

Well-known member
11.09.2006
136
0
#2
всё, что в коде выше = полезно +
var f:textfile;
assignfile(f,path) - связывание файла с физическим путем path
{$I-}reset(f);{$I+} <-- открыть файл
if ioresult=0 then ошибки не было (файл существует)
closefile(f) <--закрыть файл
readln(f,s); <-- прочесть из файла строку
while not eof(f) do readln(f,s) <-- цикл до конца файла

Вперед, и с песней!
 

sinkopa

Well-known member
17.06.2009
344
4
#3
Помогите пож написать программу на Delphi, которая считывала txt файл и считала словарный запас - считала кол-во всех слов из файла, те слова которые повторяются считала за одно.
Если на Delphi, то вот.
Коментарии в комментариях :D
Код:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Label1: TLabel;
Memo1: TMemo;
Button1: TButton;
OpenDialog1: TOpenDialog;
Label2: TLabel;
Label3: TLabel;
LabelStat: TLabel;
LabelTotal: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

const //Множество разделителей.
D = ['.', ',', ':', ';', '!', '?', '-', ' ', '(', ')', '"', '*', #9, #10, #13];
var
Form1: TForm1;
Tool,Stat: TStringList;
S: string;
implementation

{$R *.dfm}

// Вспомогательная Функция обратной сортировки стринглиста
function ASort(List: TStringList; Index1, Index2: Integer): Integer;
begin
Result := Integer(Pointer(List.Objects[Index2])) - Integer(Pointer(List.Objects[Index1]))
end; 

procedure TForm1.Button1Click(Sender: TObject);
var
i,n: Integer;
TotalCount: Integer;
P: Pointer; // Pointer - 4 байта. Легко кастуется к Integer и обратно.
// Легко "укладывается" в Objects TStringList-а
begin
// очищаем статистику
TotalCount := 0;
LabelStat.Caption :='';
LabelTotal.Caption :='';
Memo1.Clear;

if not OpenDialog1.Execute then
Exit;

Tool := TStringList.Create;  // StringList для чистки входного текста

Stat := TStringList.Create;	// StringList для сбора статистики
Stat.Sorted := True;		  // автоматическая сортировка
Stat.Duplicates := dupIgnore; // при добавлении новой строчки дубликаты игнорируются (не добавляются)


Tool.LoadFromFile(OpenDialog1.FileName); // Загружаем текст из файла

S := AnsiLowerCase(Tool.Text); // Получаем текст в нижнем регистре
Tool.Clear;					// Очищаем, чтобы не занимал память


for i := 1 to Length(S) do // чистим текст
begin
if (S[i] in D) then	 // все разделители меняем на символ перехода на новую строку
S[i] := #13;
end;

Tool.Text := S;  // Кладем в стринглист.
// При этом каждое слово будет в отдельном элементе листа.
// Все #13 "рождают" пустой элемент

S := '';
// Перекладываем слова в Stat StringList (считаем статистику)

for i := 0 to Tool.Count-1 do
begin
if (Tool[i] <> '') then
begin
n := Stat.Add(Tool[i]); // добавили слово. n - индекс по которому слово добавилось,
// либо где уже лежит такое (если дубликат)

P := Stat.Objects[n];		// Pointer - Это адрес. То есть число... :-)
// Как число мы его и будем использовать.
Integer(P) := Integer(P)+1; // Увеличиваем счетчик повторений для текущего слова
Stat.Objects[n] := P;

Inc(TotalCount);			 // Увеличиваем счетчик слов документа
end;
end;

Tool.Clear;					// Очищаем, чтобы не занимал память

// Выводим статистику
LabelTotal.Caption := IntToStr(TotalCount); // Всего слов в документе
LabelStat.Caption := IntToStr(Stat.Count);  // Словарный запас (уникальные слова)


// Теперь можно отсортировать Stat StringList по частоте встречаемости слов
Stat.Sorted := False;
Stat.CustomSort(@ASort);

// Выкладываем словарный запас в Memo
Memo1.Lines.BeginUpdate;			  // "Замораживаем" что бы не тормозило на перерисовках при каждом добавлении новой строчки
for i := 0 to Stat.Count-1 do
begin
n := Integer(Pointer(Stat.Objects[i]));
Memo1.Lines.Add(Stat[i] + #9#9 + ' ('+ IntToStr(n) + ')'); // слово (<сколько раз встретилось в тексте>)
end;
Memo1.Lines.EndUpdate;

// Освобождаем память
Stat.Free;
Tool.Free;
end;

end.
Пойдет так? :D
Нужны файлы исходники - пиши в личку.
 
Статус
Закрыто для дальнейших ответов.