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

Тема в разделе "Pascal and Delphi", создана пользователем a9x, 27 ноя 2012.

Статус темы:
Закрыта.
  1. a9x

    a9x Гость

    Помогите пож написать программу на 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.
     
  2. Senset

    Senset Well-Known Member

    Регистрация:
    11 сен 2006
    Сообщения:
    136
    Симпатии:
    0
    всё, что в коде выше = полезно +
    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) <-- цикл до конца файла

    Вперед, и с песней!
     
  3. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Если на Delphi, то вот.
    Коментарии в комментариях :D
    Код (Delphi):
    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
    Нужны файлы исходники - пиши в личку.
     
Загрузка...
Похожие Темы - Словарный Запас Delphi
  1. Allexei
    Ответов:
    4
    Просмотров:
    4.616
Статус темы:
Закрыта.

Поделиться этой страницей