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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2009, 21:06   #1
Schutze
Пользователь
 
Регистрация: 25.05.2009
Сообщений: 10
Вопрос Сортировка текста в компоненте TMemo (Delphi 7)

Уважаемые программисты, прошу вашей помощи в решении следующей задачи:
Цитата:
Дан фрагмент текста. Получить другой текст по такому принципу: в первом абзаце все предложения исходного текста, которые содержат одно слово, во второму - все предложения, которые содержат два слова и т.д. Полученный текст вывести на экран и при нажатии на кнопку сохранять в текстовый файл. Включить в окно диалога выбора шрифтов только шрифты, которые масштабируются.
Мои наработки:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Memo1: TMemo;
    Memo2: TMemo;
    OpenButton: TButton;
    CreateButton: TButton;
    SaveButton: TButton;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    FontButton: TButton;
    FontDialog1: TFontDialog;
    procedure OpenButtonClick(Sender: TObject);
    procedure SaveButtonClick(Sender: TObject);
    procedure FontButtonClick(Sender: TObject);
    procedure CreateButtonClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.OpenButtonClick(Sender: TObject);{процедура открытия файла}
var
FName:string;
begin
if OpenDialog1.Execute then
begin
  FName:=OpenDialog1.FileName;
  Memo1.Lines.LoadFromFile(FName);
end;
end;

procedure TForm1.SaveButtonClick(Sender: TObject);{процедура сохранения}
var
FName:string;
begin
SaveDialog1.FileName := FName;
if SaveDialog1.Execute then
 begin
  FName := SaveDialog1.FileName;
  Memo1.Lines.SaveToFile(FName);
 end;
end;

procedure TForm1.FontButtonClick(Sender: TObject); {процедура работы со шрифтом}
begin
if FontDialog1.Execute then
  Memo1.Font.Assign(FontDialog1.Font);
end;

procedure TForm1.CreateButtonClick(Sender: TObject); {процедура формирование отсортированного текста}
var
t,temp:string;
s,i,j,index,a,b,c,d,min,minpos:integer;
begin
Memo2.Lines.Clear;
Memo2.Lines.Assign(Memo1.Lines);
t:=Memo2.Lines.Text;
a:=0;
d:=0;
for i:=0 to Memo2.Lines.Count-1 do
 begin
 for b:=0 to Length(Memo2.Lines.Strings[i]) do
  begin
  if t[b]=' ' then
   begin
   a:=a+1;
   end;
  end;
  min:=a;
  minpos:=i;
for j:=i+1 to Memo2.Lines.Count-1 do
   for c:=0 to Length(Memo2.Lines.Strings[j]) do
    begin
     if t[c]=' ' then
      begin
      d:=d+1;
      end;
     end;
   if d>min then
    begin
    min:=d;
    minpos:=j;
    end;
  temp:=Memo2.Lines.Strings[i];
  Memo2.Lines.Strings[i]:=Memo2.Lines.Strings[minpos];
  Memo2.Lines.Strings[minpos]:=temp;
  a:=0;
  d:=0;
 end;
end;
end.
И еще одно, хотел бы спросить, а если текст будет размещен не построчно (1 строка = 1 предложение), а сплошным текстом, то какой алгоритм сортировки необходим в этом случае?! Заранее спасибо за любые подсказки!
Schutze вне форума Ответить с цитированием
Старый 25.05.2009, 21:21   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

1. Сначала ищем слово (слова) функцией POS (в цикле по строкам).
2. Если нашли - аналогично рядышком ищем точки - конец предыдущего предложения и конец нашего. Все, что между ними - искомое предложение. Переносим его в соответствующий новый абзац.
mihali4 вне форума Ответить с цитированием
Старый 25.05.2009, 21:42   #3
Schutze
Пользователь
 
Регистрация: 25.05.2009
Сообщений: 10
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
1. Сначала ищем слово (слова) функцией POS (в цикле по строкам).
2. Если нашли - аналогично рядышком ищем точки - конец предыдущего предложения и конец нашего. Все, что между ними - искомое предложение. Переносим его в соответствующий новый абзац.
Слова искать по кол-ву пробелов в предложении?!
Schutze вне форума Ответить с цитированием
Старый 25.05.2009, 23:16   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
в первом абзаце все предложения исходного текста, которые содержат одно слово
Я эту фразу понял так - все предложения, которые содержат одно некое заданное слово.
Или следует понимать как "предложения, состоящие из одного слова"?
mihali4 вне форума Ответить с цитированием
Старый 27.05.2009, 17:48   #5
Schutze
Пользователь
 
Регистрация: 25.05.2009
Сообщений: 10
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
Или следует понимать как "предложения, состоящие из одного слова"?
Да, да именно так. Тоесть есть текст, что состоит из множества предложений, в одном предложении может быть от 1-го до n-го кол-ва слов. Вот этот весь сплошной текст мне и нужно отсортировать таким образом, что в 1-м абзаце были все предложения которые содержат только 1 слово, во 2-м абзаце только 2 слова и т.д.

Да, да именно так. Тоесть есть текст, что состоит из множества предложений, в одном предложении может быть от 1-го до n-го кол-ва слов. Вот этот весь сплошной текст мне и нужно отсортировать таким образом, что б в 1-м абзаце были все предложения которые содержат только 1 слово, во 2-м абзаце только 2 слова и т.д.

Подскажите пожалуйста, что не так, уже все мозги запарил в єтой задачкой.....
Вот еще один исходник (хотел чтоб хотя бы отбирал только предложения с одним словом, но чет никак =():
Код:
procedure TForm1.CreateButtonClick(Sender: TObject);
var
t:String;
x,y,a,i:integer;
begin
ListBox1.Items.Clear;
t:=Memo1.Text;
x:=0;
y:=0;
a:=0;
repeat
t:=copy(t,a,Length(Memo1.Text)-a+1);
x:=Pos('.',t);
if x>0 then
begin
for i:=0 to x do
 begin
  if t[i]=' ' then
   begin
   y:=y+1;
   end;
  end;
if y=0 then
 begin
 ListBox1.Items.Add(Copy(t,a,x+a));
 end;
a:=x+1;
y:=0;
end;
until Length(t)<1;
end;
end.

Последний раз редактировалось KORN; 29.05.2009 в 04:05. Причина: пользуемся правкой
Schutze вне форума Ответить с цитированием
Старый 28.05.2009, 23:38   #6
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Вот, набросал для предложений из одного слова:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var tmp,tmpstr,out_abzac: string;
    i,p,pt,pp: integer;
begin
out_abzac:='';
tmp:=Memo1.SelText;
pt:=1;
p:=pt;
while (p<=Length(tmp)) and (p>0) do
begin
p:=PosEx('.',tmp,pt);
if p>0 then
begin
pp:=PosEx(' ',tmp,pt);
if (pp>p) or (pp=0) then
begin
tmpstr:=Copy(tmp,pt-1,p);
out_abzac:=out_abzac+tmpstr;
ShowMessage('Найдено предложение из 1 слова='+tmpstr);
end;
pt:=p+2;
end;
end;
ListBox1.Items.Add(out_abzac);
end;

Последний раз редактировалось mihali4; 29.05.2009 в 00:25.
mihali4 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка Delphi Apollion Помощь студентам 0 30.04.2009 17:55
Импорт и сортировка текста zander Microsoft Office Excel 4 20.02.2009 09:26
Проверка нажатия клавиш в компоненте Мемо|Delphi GAGARIN-NEW Помощь студентам 4 09.12.2007 19:59
Как сменить регистр текста в TMemo? Алексей_C Общие вопросы Delphi 3 30.10.2007 15:29