Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.10.2011, 12:51   #1
axell24
 
Регистрация: 21.01.2011
Сообщений: 3
По умолчанию Поиск предложений в текстовом файле (Delphi)

Умные люди помогите, не как не могу до думать алгоритм, перепробовал всё мозгов видать не хватает.
Текст задачи такой:
Цитата:
Приложение содержит многострочный редактор TMemo, метку TLabel и две кнопки "Открыть файл" и "Сколько предложений?". При нажатии на кнопку "Открыть файл" пользователь загружает в редактор любой текстовый файл.
Щелчок по кнопке "Сколько предложений?" подсчитывает количество предложений в тексте и отображает в компоненте TLabel.
Предложения в тексте разделены знаками !, ?, ., … и пробелами после них.
Создать обработчик события, который будет подготавливать окно к новой работе.
Визуально всё сделал, а алгоритм нахождения предложений глючит сразу говорю в дельфи я новичок.
Вот до чего додумался:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Memo: TMemo;
    LabelNum: TLabel;
    BbOpenFile: TButton;
    BbWhatPro: TButton;
    Panel: TPanel;
    OpenDialog: TOpenDialog;
    procedure BbOpenFileClick(Sender: TObject);
    procedure BbWhatProClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BbOpenFileClick(Sender: TObject);
begin
With  OpenDialog  Do
If  Execute  Then
Begin
Memo.Lines.LoadFromFile(Filename);
Memo.Modified := False;
end;
end;

function prol (const z : string; x : string) : integer;
var
sim : integer;

begin
sim := ansipos(z, x);
if sim = 0 then result :=0
Else
result :=length(IntToStr(sim));

end;

procedure TForm1.BbWhatProClick(Sender: TObject);
var
sum : integer;

begin
sum := prol('. ', Memo.Lines.text) + prol('... ', Memo.Lines.text) + prol('! ', Memo.Lines.text);

LabelNum.Caption := IntToStr(sum);

end;

end.


___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось axell24; 21.10.2011 в 21:04.
axell24 вне форума Ответить с цитированием
Старый 21.10.2011, 13:22   #2
Neobrat
Форумчанин
 
Регистрация: 10.12.2007
Сообщений: 124
По умолчанию

поясню что вы тут делаете

Цитата:
function prol (const z : string; x : string) : integer;
var
sim : integer;

begin
sim := ansipos(z, x); // ansipos найти первую позицию вхождения подстроки z в строку x
if sim = 0 then result :=0 // если позиция равно нулю, то вхождений нет, значит предложений нет
Else //иначе
result :=length(IntToStr(sim));
//1. IntToStr получить строковое представление числа sim(а это число содержит позицию первого вхождения строки Z)
//2. получить длину строки которое равно строковому представлению числа sim

end;
Русский язык не мой конёк
Neobrat вне форума Ответить с цитированием
Старый 21.10.2011, 13:25   #3
Neobrat
Форумчанин
 
Регистрация: 10.12.2007
Сообщений: 124
По умолчанию

надо что то такого(пишу по памяти)..
думаю ход мыслей станет ясен.

Код:
function prol (const z : string; x : string) : integer;
var
xPos, xCount : integer;
xTMP: string;
begin
xPos := ansipos(z, x);
xCount := 0;
while xPos <> 0 do
 begin
   Inc(xCount);
   xTMP := copy(X, xPos, Length(x) - xPos);
   xPos := ansipos(z, xTMP);
 end;

Result := xCount;

end;
Русский язык не мой конёк
Neobrat вне форума Ответить с цитированием
Старый 21.10.2011, 14:01   #4
Dush
Форумчанин
 
Регистрация: 29.09.2011
Сообщений: 116
По умолчанию

функция взята из JEDI Code Library (функция считает слова в строке S разделенные WordDelims):
Код:
function WordCount(const S:string; const WordDelims:TChartSet):integer
var SLen, I:Cardinal;
begin
  Result:=0;
  i:=1;
  SLen:=Length(s);
  while I<=SLen do
  begin
    while (I<=SLen) and (S[I] in WordDelims) do inc(I);
    if I<=SLen then Inc(Result);
    while (I<=SLen) and not (S[I] in WordDelims) do Inc(I);
  end;
end;
Dush вне форума Ответить с цитированием
Старый 22.10.2011, 08:19   #5
axell24
 
Регистрация: 21.01.2011
Сообщений: 3
По умолчанию

В обоих случаях программа просто зависает, буду думать дальше
axell24 вне форума Ответить с цитированием
Старый 22.10.2011, 16:58   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

или я чего-то не понимаю, или одно из двух..
а в чём проблемы то?!
перебираем все символы текста по одному.
Если встретили символ разделитель и за ним пробел - увеличиваете счётчик предложений.
Единственный знак разделитель длиной 3 "..." - проверять дополнительно + добавить проверочку, что до конца текста больше 4-х символов.
И всё.

не понимаю, что вызывает трудности.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Процедура поиск текста в текстовом файле, Delphi BIG_BO Помощь студентам 5 08.12.2010 13:20
Поиск данных в текстовом файле (в самом файле! а не в Memo и не загружая всю инфу из файла в одну строку glagoff Помощь студентам 1 05.05.2010 13:00
Поиск сторк в текстовом файле на Delphi Alex2009 Помощь студентам 1 09.11.2009 21:07
Поиск в текстовом файле! Straiker Паскаль, Turbo Pascal, PascalABC.NET 2 18.01.2009 10:07