Лабораторная работа № 7 (9 неделя)

Выделение слов и анализ предложений.

Цель: изучение алгоритма выделения слов, стандартных процедур для работы со строками.

Используются объекты классов: TForm, TOpenDialog, TSaveDialog, TMemo, TLabel, TButton.

Пояснения к задаче

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

Пример:

!!!Пример!!! А это второе предложение. Предложение может

быть расположено

на нескольких строках! Еще?!

Конец, однако

Здесь пять предложений:

1.  Пробелы и три восклицательных знака в начале – не предложения.

2.  Первое предложение «Пример!»

3.  Два восклицательных знака не являются предложениями.

4.  На той же строке второе предложение «А это второе предложение.»

5.  На трех строках расположено третье предложение «Предложение может быть расположено на нескольких строках!»

6.  Четвертое предложение «Еще?»

7.  Очередной восклицательный знак не являются предложением.

8.  Последнее предложение «Конец, однако» ограничено концом файла.

До и после знаков препинания и между слов может находиться один или несколько пробелов и концов строк.

НЕ нашли? Не то? Что вы ищете?

Условие задачи по вариантам

1.  Дан текстовый файл с несколькими строками. Найти номер первого предложения, в котором все слова начинаются на букву Д (д), или вывести сообщение, что таких предложений нет. Замечание: после нахождения нужного предложения, дальше просматривать файл бессмысленно.

2.  Дан текстовый файл с несколькими строками. Найти номер последнего предложения, в котором все слова начинаются на букву Б (б), или вывести сообщение, что таких предложений нет.

3.  Дан текстовый файл с несколькими строками. Найти номер первого предложения, где есть слово, начинающееся и заканчивающееся на букву А (а), или вывести сообщение, что таких предложений нет. Замечание: после нахождения нужного предложения, дальше просматривать файл бессмысленно.

4.  Дан текстовый файл с несколькими строками. Найти номер последнего предложения, где есть слово, начинающееся и заканчивающееся на букву К (к), или вывести сообщение, что таких предложений нет.

5.  Дан текстовый файл с несколькими строками. Найти номер первого предложения, где у всех слов первая буква совпадает с последней, или вывести сообщение, что таких предложений нет. Замечание: после нахождения нужного предложения, дальше просматривать файл бессмысленно.

6.  Дан текстовый файл с несколькими строками. Найти номер последнего предложения, где у всех слов первая буква совпадает с последней, или вывести сообщение, что таких предложений нет.

7.  Дан текстовый файл с несколькими строками. Найти номер первого предложения, где первое и последнее слова совпадают (первая буква предложения может быть заглавной), или вывести сообщение, что таких предложений нет. Замечание: после нахождения нужного предложения, дальше просматривать файл бессмысленно.

8.  Дан текстовый файл с несколькими строками. Найти номер последнего предложения, где первое и последнее слова совпадают (первая буква предложения может быть заглавной), или вывести сообщение, что таких предложений нет.

9.  Дан текстовый файл с несколькими строками. Найти первое слово N-го предложения, или вывести сообщение, что такого предложения нет. Замечание: после нахождения нужного предложения, дальше просматривать файл бессмысленно.

10.  Дан текстовый файл с несколькими строками. Найти последнее слово N-го предложения, или вывести сообщение, что такого предложения нет. Замечание: после нахождения нужного предложения, дальше просматривать файл бессмысленно.

11.  Дан текстовый файл с несколькими строками. Найти K-ое слово N-го предложения, или вывести сообщение, что такого предложения или слова в предложении нет. Замечание: после нахождения нужного предложения, дальше просматривать файл бессмысленно.

12.  Дан текстовый файл с несколькими строками. Найти K-ое с конца N-го предложения слово, или вывести сообщение, что такого предложения или слова в предложении нет. Замечание: после нахождения нужного предложения, дальше просматривать файл бессмысленно.

13.  Дан текстовый файл с несколькими строками. Найти номер первого предложения, все слова которого состоят из цифр, или вывести сообщение, что такого предложения нет. Замечание: после нахождения нужного предложения, дальше просматривать файл бессмысленно.

14.  Дан текстовый файл с несколькими строками. Найти номер последнего предложения, все слова которого состоят из цифр, или вывести сообщение, что такого предложения нет.

15.  Дан текстовый файл с несколькими строками. Найти номер первого предложения, где есть слово, которое состоит только из цифр, или вывести сообщение, что такого предложения нет. Замечание: после нахождения нужного предложения, дальше просматривать файл бессмысленно.

16.  Дан текстовый файл с несколькими строками. Найти номер последнего предложения, где есть слово, которое состоит только из цифр, или вывести сообщение, что такого предложения нет.

17.  Дан текстовый файл с несколькими строками. Найти номер самого длинного по количеству слов предложения, или вывести сообщение, что предложений в файле нет.

18.  Дан текстовый файл с несколькими строками. Найти номер самого длинного по количеству слов предложения, или вывести сообщение, что предложений в файле нет.

19.  Дан текстовый файл с несколькими строками. Найти номер первого предложения, в котором все слова не длиннее K символов, или вывести сообщение, что таких предложений нет. Замечание: после нахождения нужного предложения, дальше просматривать файл бессмысленно.

20.  Дан текстовый файл с несколькими строками. Найти номер последнего предложения, в котором все слова длиннее K символов, или вывести сообщение, что таких предложений нет.

21.  Дан текстовый файл с несколькими строками. Найти номер первого предложения, в котором есть слова не длиннее K символов, или вывести сообщение, что таких предложений нет. Замечание: после нахождения нужного предложения, дальше просматривать файл бессмысленно.

22.  Дан текстовый файл с несколькими строками. Найти номер последнего предложения, в котором есть слова длиннее K символов, или вывести сообщение, что таких предложений нет.

23.  Дан текстовый файл с несколькими строками. Проверить, что количество слов в каждом предложении равно порядковому номеру этого предложения, или указать номер первого предложения с неправильным числом слов. Замечание: после нахождения некорректного предложения, дальше просматривать файл бессмысленно.

24.  Дан текстовый файл с несколькими строками. Проверить, что количество слов в каждом предложении равно порядковому номеру этого предложения, или указать номер последнего предложения с неправильным числом слов.

25.  Дан текстовый файл с несколькими строками. Проверить, что в каждом предложении есть слово, состоящее из одних только цифр, или указать номер первого предложения без такого слова. Замечание: после нахождения некорректного предложения, дальше просматривать файл бессмысленно.

26.  Дан текстовый файл с несколькими строками. Проверить, что в каждом предложении есть слово, состоящее из одних только цифр, или указать номер последнего предложения без такого слова.

27.  Дан текстовый файл с несколькими строками. Проверить, что в каждом предложении есть слово, первая и последняя буква которого совпадают, или указать номер первого предложения без такого слова. Замечание: после нахождения некорректного предложения, дальше просматривать файл бессмысленно.

28.  Дан текстовый файл с несколькими строками. Проверить, что в каждом предложении есть слово, первая и последняя буква которого совпадают, или указать номер последнего предложения без такого слова.

29.  Дан текстовый файл с несколькими строками. Проверить, что в каждом предложении есть слово, начинающееся и заканчивающееся на букву О(о), или указать номер первого предложения без такого слова. Замечание: после нахождения некорректного предложения, дальше просматривать файл бессмысленно.

30.  Дан текстовый файл с несколькими строками. Проверить, что в каждом предложении есть слово, заканчивающееся на букву Ю(ю), или указать номер последнего предложения без такого слова.

Пример выделения слов из одной строки. Из заданной строки выделить все слова и вывести их в столбик, указав порядковый номер. Также вывести общее количество слов в строке.

Поскольку строка только одна, введем ее из поля редактирования Edit1. Вывод осуществим в расширенное поле редактирования – Memo1, и дадим возможность пользователю сохранить результаты в файл.

Компонент Memo находится на палитре компонентов Стандартная (Standard)

Компонент SaveDialog расположен на палитре Диалогов (Dialogs)

Создадим форму вида:

Свойства объектов

Form1

Caption

Выделить все слова из строки

+Font

|Size

12

Label1

Caption

Строка

Edit1

Text

Слово. Слово, слово и еще раз слово! Конец

Button1

Caption

Найти

(Выделить и вывести все слова и их число)

Button2

Caption

Очистить

(Очистить Memo1)

Button3

Caption

Сохранить

(Сохранить все из Memo1 в файл, узнав сначала его имя)

Button4

Caption

Закрыть

(Завершение работы)

Memo1

Lines(TString)…

(Все удалить)

ScrollBars

ssVertical

SaveDialog1

Filter…

Добавить фильтр:

DefaultExt

txt

Обработчики событий

procedure TForm1.Button2Click(Sender: TObject);

// Очистить Memo1

begin

Memo1.Clear;

end;

procedure TForm1.Button3Click(Sender: TObject);

// Сохранить все из Memo1 в файл, узнав сначала его имя

begin

if SaveDialog1.Execute then

try

Memo1.Lines. SaveToFile(SaveDialog1.FileName);

except

ShowMessage('Ошибка при записи в файл '+SaveDialog1.FileName);

end;

end;

procedure TForm1.Button4Click(Sender: TObject);

// Завершение работы

begin

Close;

end;

procedure TForm1.Button1Click(Sender: TObject);

// Выделить и вывести все слова и их число

var

S: String; {считанная строка}

len: integer; {длина считанной строки}

kol: byte; {номер слова}

p: word; {номер рассматриваемого символа в строке}

Slovo: string; {выделяемое слово}

begin

{считываем строку S}

S:=Edit1.Text;

Memo1.Lines. Add('Введена строка:'); // Добавить строку в Memo1

Memo1.Lines. Add(S);

len:=Length(S); {длина строки S}

kol:=0; {рассмотрено 0 слов}

p:=1; {начнем с первого символа}

{выделяем слова пока не конец строки}

while (p<=len) do

begin

{пропустить все пробелы и знаки препинания }

while (p<=len) and (S[p] in [' ', ',', '.', '!', '?']) do p:=p+1;

{выделяем слово посимвольно до пробела, знака препинания или конца строки}

Slovo:='';

while (p<=len) and not(S[p] in [' ', ',', '.', '!', '?']) do

begin

Slovo:=Slovo + S[p]; {складываем символы в слово}

p:=p+1; {к следующему символу}

end;

if Slovo<>'' then {если слово найдено}

begin

Kol:=Kol+1; {увеличиваем количество найденных слов}

Memo1.Lines. Add(IntToStr(kol)+' '+Slovo); {вывод слова и его номера}

end;

end;

Memo1.Lines. Add('Всего ' + IntToStr(kol) + ' слов');

end;

Этот же алгоритм можно записать с использованием стандартных процедур и функций работы со строками. Но при этом считанная строка не сохранится.

procedure TForm1.Button1Click(Sender: TObject);

var

S: String; {считанная строка}

kol: byte; {номер слова}

p: word; {номер рассматриваемого символа в строке}

Slovo: string; {выделяемое слово}

begin

{считываем строку S}

S:=Edit1.Text;

Memo1.Lines. Add('Введена строка:');

Memo1.Lines. Add(S);

kol:=0; {рассмотрено 0 слов}

{выделяем слова пока в ней остаются символы}

while (Length(S)>0) do

begin

{удалить все пробелы и знаки препинания }

while (Length(S)>0) and (S[1] in [' ', ',', '.', '!', '?']) do

Delete(S,1,1);

{выделяем слово посимвольно до пробела,

знака препинания или конца строки}

Slovo:=''; p:=1;

while (p<=Length(S)) and not (S[p] in [' ', ',', '.', '!', '?']) do

begin

Slovo:=Slovo + S[p]; {складываем символы в слово}

inc(p);

end;

Delete(S,1,Length(Slovo));

if Slovo<>'' then {если слово найдено}

begin

Kol:=Kol+1; {увеличиваем количество найденных слов}

Memo1.Lines. Add(IntToStr(kol)+' '+Slovo); {вывод слова и его номера}

end;

end;

Memo1.Lines. Add('Всего ' + IntToStr(kol) + ' слов');

end;

L:=Length(S) – длина строки S

Delete(S, 1, Length(Slovo)) – удаление из строки S символов в количестве, равном длине строки Slovo, начиная с 1 (первого) символа S

Insert('abc', S, 3) вставить строку 'abc' в строку S, начиная с третьего символа (например, если S='opqrstuv', то из нее получится строка 'opabcqrstuv')

K:=Pos('p', S) – функция возвращает номер первого вхождения символа 'p' в строку S