Работа со строками

С помощью текстового редактора создать файл, содержащий текст, длина которого не превышает 1000 символов (длина одной строки не должна превышать 70 символов). Написать программу, которая: • выводит текст на экран; • определяет количество предложений в тексте и количество слов в каждом предложении; • по нажатию произвольной клавиши выделяет поочередно каждое предложение текста, а в выделенном предложении – поочередно все слова.Первые два пункта сделаны,но проблему вызывает третий.Прошу помощи в конкретном пункте и если что не так в первых двух можно и их поправить.Спасибо.
procedure TForm1.Button1Click(Sender: TObject);
var f1:TextFile;
    a:string;
    pr:char;
    i, k:integer;
begin
  AssignFile(f1,'Путь\abc.txt');
  Memo1.Lines.LoadFromFile('Путь\abc.txt');
  k:=0;
  a := Memo1.Text;
  i := 1;
  while i <= Length(a) do
  begin
    if a[i] in ['.', '?', '!'] then k:=k+1;
    inc(i)
  end;
  Label2.Caption:='Количество предложений в тексте: '+IntToStr(k);
end;
procedure TForm1.Button2Click(Sender: TObject);
const DelSym = ' .,!?';//символы разделители
var Text,Word: string; i: integer;
begin
  Text:=Memo1.Lines.Text;//переносит введенный в Memo текст в переменную
  for i := 1 to Length(Text) do      //от 1 до длины строки текста
    if Pos(Text[i],DelSym) > 0 then  //ищем явл. ли встречаемый симв. разделителем
      Text[i]:=',';                  //если да то заменяем их на запятую
  if Text[1] = ',' then       //если первый символ запятая то удаляем его
    Delete(Text,1,1);
  while Pos(',,',Text) > 0 do  //если идут несколько запятых то заменяем на одну
    Delete(Text,Pos(',,',Text),1);
  while Pos(#13,Text) > 0 do  //если идут несколько запятых то заменяем на одну
    Delete(Text,Pos(#13,Text),1);
  while Pos(#10,Text) > 0 do  //если идут несколько запятых то заменяем на одну
    Delete(Text,Pos(#10,Text),1);
  repeat
    Word:=Copy(Text,1,Pos(',',Text)-1);//находим первую запятую,копируем слово
    Delete(Text,1,Length(Word)+1);    //от начала текста до запятой,после чего
                                      //удаляем это слово из текста вместе с запятой
    ListBox1.Items.Add(Word);
  until Length(Text) = 0;    //пока не вырежем все слова
Label1.Caption:='Количество слов в тексте: '+IntToStr(ListBox1.Items.Count);
end;
end.
ааа)ребята,что никто не поможет(((Хоть чем нибудь
3 ответа

Вот код, который извлекает из текста все предложения и из каждого предложения извлекает все слова. Функция GetOfferInfo() возвращает массив, каждый элемент которого представляет собой пару: текст предложения + список всех слов этого предложения.
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
type
  TArrWords = array of String;
 
  TOffer = record
    //Строка, содержащая предложение.
    Offer : String;
    //Список всех слов данного предложения.
    ArrWords : TArrWords;
  end;
 
  TArrOffer = array of TOffer;
 
//Функция возвращает динамический массив, содержащий сведения по всем
//предложениям заданного текста. Возвращаемый массив состоит из элеметов
//типа TArrOffer. Каждый такой элемент содержит текст всего предложения в поле
//TArrOffer.Offer и список всех слов этого предложения в поле TArrOffer.ArrWords.
function GetArrOffer(const aStr : String) : TArrOffer;
const
  //Разделители предложений.
  DmOffer = ['.', '!', '?'];
  //Разделители слов и предложений.
  DmWord = DmOffer + [' ', ',', ':', ';', #9, #10, #13];
  //Величина приращения динамического массива.
  Capacity = 10;
var
  i, j, k, Pw1, Pw2, Po1, Po2 : Integer;
  ArrWords : TArrWords;
begin
  Pw1 := 0;
  Pw2 := 0;
  Po1 := 0;
  Po2 := 0;
  j := 0;
  k := 0;
  for i := 1 to Length(aStr) do begin
    //Отслеживаем начало предложения.
    if i = 1 then
      Po1 := i
    else if aStr[i - 1] in DmOffer then
      Po1 := i
    ;
    //Отслеживаем конец предложения.
    if i = Length(aStr) then
      Po2 := i
    else if aStr[i] in DmOffer then
      Po2 := i
    ;
    //Если текущий символ не является разделителем.
    if not ( aStr[i] in DmWord ) then begin
      //Отслеживаем начало слова.
      if i = 1 then
        Pw1 := i
      else if aStr[i - 1] in DmWord then
        Pw1 := i
      ;
      //Отслеживаем конец слова.
      if i = Length(aStr) then
        Pw2 := i
      else if aStr[i + 1] in DmWord then
        Pw2 := i
      ;
    end;
 
    //Если найден конец слова.
    if Pw2 > 0 then begin
      //Если требуется, увеличиваем длину массива слов.
      if k = Length(ArrWords) then SetLength(ArrWords, k + Capacity);
      //Добавляем слово в массив.
      ArrWords[k] := Copy(aStr, Pw1, Pw2 - Pw1 + 1);
      //Индекс следующего элемента.
      Inc(k);
      //Сброс индекса конца слова.
      Pw2 := 0;
    end;
 
    //Если найден конец предложения.
    if Po2 > 0 then begin
      //Если требуется, увеличиваем длину массива предложений.
      if j = Length(Result) then SetLength(Result, j + Capacity);
      //Добавляем предложение в массив.
      Result[j].Offer := Copy(aStr, Po1, Po2 - Po1 + 1);
      //Добавляем в массив список слов данного предложения.
      Result[j].ArrWords := Copy(ArrWords, 0, k);
      //Сброс индекса массива слов.
      k := 0;
      //Индекс следующего элемента массива.
      Inc(j);
      //Сброс индекса конца предложения.
      Po2 := 0;
    end;
  end;
 
  //Корректируем длину массива в соответствии с количеством добавленных в него элементов.
  SetLength(Result, j);
 
  //Удаляем массив слов.
  Finalize(ArrWords);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  ArrOffer : TArrOffer;
  i, j : Integer;
begin
  Memo2.Clear;
  Memo2.Lines.Add('Список предложений и содержащихся в них слов:');
 
  ArrOffer := GetArrOffer(Memo1.Text);
  for i := 0 to High(ArrOffer) do begin
    Memo2.Lines.Add('--------------------------------------------------');
    Memo2.Lines.Add('Предложение №' + IntToStr(i + 1) + ':');
    Memo2.Lines.Add(ArrOffer[i].Offer);
    Memo2.Lines.Add('Список слов данного предложения:');
    for j := 0 to High(ArrOffer[i].ArrWords) do begin
      Memo2.Lines.Add(ArrOffer[i].ArrWords[j]);
    end;
  end;
 
  //Удаляем дин. массив из памяти. Уделяем внимание удалению строк, записанных
  //в компонентах массива.
  for i := 0 to High(ArrOffer) do begin
    Finalize( ArrOffer[i].ArrWords );
    Finalize( ArrOffer[i].Offer );
  end;
  Finalize(ArrOffer);
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  if OpenDialog1.InitialDir = '' then begin
    OpenDialog1.InitialDir := ExtractFilePath( Application.ExeName );
  end;
  if not OpenDialog1.Execute then Exit;
 
  if not FileExists(OpenDialog1.FileName) then begin
    ShowMessage('Указанный файл не найден. Действие отменено.');
    Exit;
  end;
 
  Memo1.Lines.LoadFromFile( OpenDialog1.FileName );
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
  Memo1.Clear;
end;
 
procedure TForm1.Button4Click(Sender: TObject);
begin
  Memo2.Clear;
end;
 
end.
На форму надо положить 2 Мемо, 4 кнопки и один TOpenDialog. По нажатию на первую кнопку происходит обработка текста из Мемо1 и вывод результатов в Мемо2. --- Соответственно, там присутствует и информация о количестве предложений и количестве слов в каждом из предложений. Количество предложений: = Length(ArrOffer), количество слов в i-ом предложении = Length( ArrOffer[i].ArrWords ).


Mawrat Спасибо что откликнулись.Ваш алгоритм выглядит круто,но боюсь я мало,что в нем понял(на первом курсе к сожалению такого еще не проходим).Да и по выполнению первых двух пунктов у меня уже нет вопросов,а вопрос вызывает пункт три • по нажатию произвольной клавиши выделяет поочередно каждое предложение текста, а в выделенном предложении – поочередно все слова. Прикрепляю файл моей задачи,если кто то захочет помочь можно сделать это прямо в этом файле


Я б сделал... но врмяни нет, подскажу одно, что надо отталкиваться от точек и пробелов, работать с динамическиме одномерными массивали, делать поиск по типизированному файлу, тоесть искать точку, и выводить все что до *******=)) а в предложении, анологично с пробелами
If a[i]:='.' then 
writelen( a[i-1]);
 
If a[i]:=' ' then 
writelen( a[i-1]);
думаю так, но все это еще в цикл по массиву
For i:=1 to m do // m:integer 
и так далее...))
точно не уверен, прост с утра голова только до этого додумалась=))