Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник.docx
Скачиваний:
36
Добавлен:
21.12.2018
Размер:
2.15 Mб
Скачать

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

Задача:

Пользователь вводит набор слов (предложений). Необходимо сформировать из встречающихся в предложении слов их массив. При этом повторяющиеся слова не должны входить в массив дважды.

Например:

Предложение: «I am going at home. They are going at home too.»

Массив строк: [‘i’, ‘am’, ‘going’, ‘at’, ‘home’, ‘they’, ‘are’, ‘too’]

Алгоритм решения задачи:

  1. Пусть предложение(я) вводит пользователь, и то, что он ввел, хранится в строковой переменной u (как бы сокращение от слова user). При вводе предложений следует иметь в виду, что в языке программирования Паскаль длина строки не может превысить 255 символов.

u: string;

  1. Назовем массив, в котором будут сохраняться отдельные слова, ws (сокращение от слова words). Какую задать длину этого массива? Точно сказать трудно, но можно придти к определенному значению рассуждением. Если в том, что ввел пользователь, вообще не будет пробелов и знаков препинания, то массив будет состоять из одного элемента. Если пользователь будет вводить слова в среднем по 40 символов, то массив будет состоять где-то из 6 элементов. Если же пользователь будет каждую букву отделять от другой пробелом или каким-либо знаком, то получится 128 элементов и 127 всего остального, которое не учитывается. Конечно, трудно представить словарь из 128 различных элементов. А вот если слова будут состоять из двух букв, то получится 85 слов (256 / 3, т.к. две буквы + иной знак). Все! Не будем гадать. Пусть будет так:

ws: array[1..100] of string;

  1. Понадобится переменная, в которой будет храниться текущее слово, перед его занесением в массив.

w: string;

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

len: integer;

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

i, j, q: byte;

  1. С данными разобрались. Теперь сам алгоритм решения задачи. Сначала нужно данные считать и измерить их длину.

writeln('Введите текст: ');

read(u);

len := length(u);

  1. Основной цикл, анализирующий каждый введенный символ пользовательской строки:

i := 1;

while i <= len do

  1. Символ должен быть проверен на то, что он является символом буквы. В данном случае буквами считаются только английские строчные буквы, хотя это условие можно и расширить. Также извлекаемый из пользовательской строки знак должен быть преобразован в символьный тип данных с помощью функции lowercase. Обычно эта функция применяется для преобразования прописных букв в строчные.

if (lowercase(u[i]) >= 'a') and (lowercase(u[i]) <= 'z') then begin

  1. Если символ все-таки буква, то она должна быть записана в переменную w, и сформировать начало слова. Счетчик должен быть увеличен на единицу с тем, чтобы далее рассматривать следующий символ.

w := lowercase(u[i]);

i := i + 1;

  1. Далее продолжается анализ каждого символа внутри внешнего цикла while. Если символ удовлетворяет условию буквы, и счетчик еще не показал конец пользовательской строки, то буквы будут последовательно записываться за первой, формируя слово.

while (i <= len) and

((lowercase(u[i]) >= 'a') and

(lowercase(u[i]) <= 'z')) do begin

w := w + lowercase(u[i]);

i := i + 1;

end;

  1. Как только попадется «небуква» предыдущий цикл прерывается. Далее следует проверить, нет ли только что сформированного слова в массиве. Если нет, то следует его туда записать.

j := 1;

while (j <= q) and (w<>ws[j]) do

j := j + 1;

if j > q then begin

q := q + 1;

ws[q] := w;

end;

  1. Если первый или два и больше последующих за словом символов «небуквы», то требуется лишь перейти к следующему символу.

else

i := i + 1;

  1. Ну и в конце неплохо бы вывести слова на экран.

for i := 1 to q do

writeln(ws[i]);

Программа на языке Паскаль:

Полностью программа выделения слов из строки выглядит так:

var u: string;

ws: array[1..100] of string;

w: string;

len: integer;

i, j, q: integer;

begin writeln('Введите текст: ');

read(u);

len := length(u);

i := 1;

while i <= len do

if (lowercase(u[i]) >= 'a') and (lowercase(u[i]) <= 'z') then begin

w := lowercase(u[i]);

i := i + 1;

while (i <= len) and

((lowercase(u[i]) >= 'a') and

(lowercase(u[i]) <= 'z')) do begin

w := w + lowercase(u[i]);

i := i + 1;

end;

j := 1;

while (j <= q) and (w<>ws[j]) do

j := j + 1;

if j > q then begin

q := q + 1;

ws[q] := w;

end;

end

else

i := i + 1;

for i := 1 to q do

writeln(ws[i]);

end.