Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 570

/ вопрос решён /

Приветствую, уважаемые эксперты!
Подскажите пожайлуста,как в тексте(загруженом в Memo) найти предложения содержащие более 30 сим. и вывести в соседний компонент Memo?
Не пойму в чем ошибка...

Приложение:
  1. procedure TForm1.Button3Click(Sender: TObject);
  2. Var s,s1:string;
  3. i,j:integer;
  4. begin
  5. for i:=0 to memo2.lines.count-1 do
  6. begin
  7. s:=memo2.lines[i];
  8. repeat
  9. j:=pos('.',s);
  10. if j>=30 then begin s1:=copy(s,1,j);
  11. delete(s,1,j);
  12. end
  13. else delete(s,1,j);
  14. memo1.lines.Add(s1);
  15. until j<1;
  16. end;
  17. end;


Sheran Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задала: Sheran (статус: Посетитель)
Вопрос отправлен: 12 августа 2011, 12:44
Состояние вопроса: решён, ответов: 1.

Ответ #1. Отвечает эксперт: ierihon1

Здравствуйте, Sheran!
в принципе это немного изменённая и исправленная версия процедуры что дали вам.. моя же процедура работает только с точкой так как я пока не придумал вариант для остальных знаков окончания предложения.

procedure TForm1.button1Click(Sender: TObject);
var Text:string;
    i,p:Integer;
begin
  text:='';   // На всякий случай инициализируем в ручную
  memo2.Clear;
  for i := 0 to mmeo1.Lines.Count - 1 do
  begin
    Text:=Text+memo1.Lines[i]; // здесь строки из мемо преобразуются в одну строку
  end;
  repeat
    if Pos('.',Text) >=30 then // зачем создавать лишние переменные если и без
      memo2.Lines.Add(Copy(Text,1,i)); // них получаем результат
    Delete(Text,1,Pos('.',Text)); // в вашей процедуре это было в обоих условиях
                                  // Зачем? "Выносим за скобки" и куча лишних
                                  // строк исчезают сами собой))
  until Pos('.',Text) = 0; // здесь мы проверяем равенство нулю так как
                          //роцедура Pos возвращает ноль если не нашёл заданную
                         //cтроку или симовл
end;

Ответ отправил: ierihon1 (статус: 1-ый класс)
Время отправки: 12 августа 2011, 18:31
Оценка за ответ: 5

Комментарий к оценке: Спасибо большое!Теперь наконец-то все понятно.

Мини-форум вопроса

Всего сообщений: 12; последнее сообщение — 12 августа 2011, 20:42; участников в обсуждении: 3.
min@y™

min@y™ (статус: Доктор наук), 12 августа 2011, 13:43 [#1]:

Цитата (Sheran):

вывести в соседний компонент Memo?

А зачем в такой задаче процедура Delete()?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 12 августа 2011, 13:52 [#2]:

procedure TForm1.Button3Click(Sender: TObject);
var
  s, s1: string;
  i, j: integer;
begin
  for i:= 0 to memo2.lines.count - 1 do
    begin
      s:= memo2.lines[i];
 
      repeat
        j:=pos('.', s); // ищу "точку" в строке
 
        if j >= 30  // если "точка" стоит на 30-м или более месте...
          then begin
                 s1:= copy(s, 1, j); // копирую всё до точки в переменную s1
                 delete(s, 1, j);    // удаляю скопированное вместе с точкой (индусы нервно курят)
               end
                    // ИНАЧЕ!!!...
          else delete(s, 1, j);      // удаляю скопированное вместе с точкой (индусы нервно курят)
 
        memo1.lines.Add(s1); // добавляю скопированный кусок строки в мемо вместе с "точкой"
      until j < 1; // и так, пока "точки" в строке не кончатся!
    end;
end;
 
// Вопрос: а нахрена всё это, а?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Sheran

Sheran (статус: Посетитель), 12 августа 2011, 14:41 [#3]:

Как мне казалось,для того,чтобы одно и тоже предложение не копировалось.Если честно,подсказали такой вариант,как по-другому не знаю...
min@y™

min@y™ (статус: Доктор наук), 12 августа 2011, 14:52 [#4]:

Цитата (Sheran):

Если честно,подсказали такой вариант,как по-другому не знаю...

Похоже, что программирование - это не твоё. Тут мозг нужен, однако! А ты скопипастил какую-то чужую хрень и не можешь разобраться, как она работает и для чего нужна.
Особенно умиляет то, что предложения в тексте могут занимать не одну строку, а две, три, стопицот и т.д. И заканчиваться они (предложения) могут не только на ".", но и на "!", "?", "...".
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Sheran

Sheran (статус: Посетитель), 12 августа 2011, 15:41 [#5]:

Я просила совет,а не критику.И на том спасибо.
ierihon1

ierihon1 (статус: 1-ый класс), 12 августа 2011, 15:51 [#6]:

если не секрет - зачем это нужно? если лабораторный практикум какой нибудь то могу просто написать код и дать тебе, если же что то нужное именно тебе то могу дать пару подсказок.
Sheran

Sheran (статус: Посетитель), 12 августа 2011, 15:59 [#7]:

Вообще это лабораторная работа,буду очень благодарна если подскажите код,но также не помешало бы пару советов на будущее,ну кроме того чтобы бросить это дело)))
ierihon1

ierihon1 (статус: 1-ый класс), 12 августа 2011, 16:00 [#8]:

тогда в коде сделаю побольше коментариев
ierihon1

ierihon1 (статус: 1-ый класс), 12 августа 2011, 17:10 [#9]:

ещё такой вопрос - по заданию пробелы считать за символы.. если нет то задание очень сильно может усложниться..
Sheran

Sheran (статус: Посетитель), 12 августа 2011, 17:27 [#10]:

да,пробелы считать как символы
ierihon1

ierihon1 (статус: 1-ый класс), 12 августа 2011, 18:36 [#11]:

ох совсем забыл в ответе нужно заменить строку:
memo2.Lines.Add(Copy(Text,1,i));
на:
memo2.Lines.Add(Copy(Text,1,Pos('.',Text)));

12 августа 2011, 18:38: Статус вопроса изменён на решённый (изменил автор вопроса — Sheran)

ierihon1

ierihon1 (статус: 1-ый класс), 12 августа 2011, 20:42 [#12]:

а вот и процедура для остальных символов окончания предложения))
procedure TForm1.btn1Click(Sender: TObject);
var text:string;
    i,p:Integer;
    b:Boolean;
const symbols: set of Char = ['.','!','?']; // сюда при надобности добавить символы
begin
  text:='';
  memo2.Clear;
  for i := 0 to memo1.Lines.Count - 1 do
    Text:=Text+memo1.Lines[i];
  repeat
    b:=True;
    for i := 0 to Length(text)  do //вручную перебираем символы всесто pos
      if b = true then // это нужно чтобы после  удаления части строки не вылетала ошибка переполнения массива так как
количество символов в строке меняется
        if text[i] in symbols then // проверяем наличие символа окончания предложения
        begin
          if i >= 30 then
            memo2.Lines.Add(Copy(Text,1,i));
          Delete(text,1,i);
          b:=False;
        end;
  until (Pos('.',text) = 0) and (Pos('!',text) = 0) and (Pos('?',text) = 0);
end;

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 16:30
Выполнено за 0.04 сек.