|
Вопрос # 5 570/ вопрос решён / |
|
Приветствую, уважаемые эксперты!
Подскажите пожайлуста,как в тексте(загруженом в Memo) найти предложения содержащие более 30 сим. и вывести в соседний компонент Memo?
Не пойму в чем ошибка...
Приложение: Переключить в обычный режим- 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 then begin s1:=copy(s,1,j);
- delete(s,1,j);
- end
- else delete(s,1,j);
- memo1.lines.Add(s1);
- until j<1;
- end;
- end;
 |
Вопрос задала: 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™ (статус: Доктор наук), 12 августа 2011, 13:43 [#1]:
Цитата (Sheran):
вывести в соседний компонент Memo?
А зачем в такой задаче процедура Delete()?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
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 (статус: Посетитель), 12 августа 2011, 14:41 [#3]:
Как мне казалось,для того,чтобы одно и тоже предложение не копировалось.Если честно,подсказали такой вариант,как по-другому не знаю...
|
|
min@y™ (статус: Доктор наук), 12 августа 2011, 14:52 [#4]:
Цитата (Sheran):
Если честно,подсказали такой вариант,как по-другому не знаю...
Похоже, что программирование - это не твоё. Тут мозг нужен, однако! А ты скопипастил какую-то чужую хрень и не можешь разобраться, как она работает и для чего нужна.
Особенно умиляет то, что предложения в тексте могут занимать не одну строку, а две, три, стопицот и т.д. И заканчиваться они (предложения) могут не только на ".", но и на "!", "?", "...".
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Sheran (статус: Посетитель), 12 августа 2011, 15:41 [#5]:
Я просила совет,а не критику.И на том спасибо.
|
|
ierihon1 (статус: 1-ый класс), 12 августа 2011, 15:51 [#6]:
если не секрет - зачем это нужно? если лабораторный практикум какой нибудь то могу просто написать код и дать тебе, если же что то нужное именно тебе то могу дать пару подсказок.
|
|
Sheran (статус: Посетитель), 12 августа 2011, 15:59 [#7]:
Вообще это лабораторная работа,буду очень благодарна если подскажите код,но также не помешало бы пару советов на будущее,ну кроме того чтобы бросить это дело)))
|
|
ierihon1 (статус: 1-ый класс), 12 августа 2011, 16:00 [#8]:
тогда в коде сделаю побольше коментариев
|
|
ierihon1 (статус: 1-ый класс), 12 августа 2011, 17:10 [#9]:
ещё такой вопрос - по заданию пробелы считать за символы.. если нет то задание очень сильно может усложниться..
|
|
Sheran (статус: Посетитель), 12 августа 2011, 17:27 [#10]:
да,пробелы считать как символы
|
|
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 (статус: 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;
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|