Скачиваний:
288
Добавлен:
04.03.2014
Размер:
4.99 Кб
Скачать
Задача:
Пользователь вводит набор слов (предложений). Необходимо сформировать из встречающихся в предложении слов их массив. При этом повторяющиеся слова не должны входить в массив дважды.

Например:
Предложение: «I am going at home. They are going at home too.»
Массив строк: [‘i’, ‘am’, ‘going’, ‘at’, ‘home’, ‘they’, ‘are’, ‘too’]

Алгоритм решения задачи:
Пусть предложение(я) вводит пользователь, и то, что он ввел, хранится в строковой переменной u (как бы сокращение от слова user). При вводе предложений следует иметь в виду, что в языке программирования Паскаль длина строки не может превысить 255 символов.
u: string;
Назовем массив, в котором будут сохраняться отдельные слова, ws (сокращение от слова words). Какую задать длину этого массива? Точно сказать трудно, но можно придти к определенному значению рассуждением. Если в том, что ввел пользователь, вообще не будет пробелов и знаков препинания, то массив будет состоять из одного элемента. Если пользователь будет вводить слова в среднем по 40 символов, то массив будет состоять где-то из 6 элементов. Если же пользователь будет каждую букву отделять от другой пробелом или каким-либо знаком, то получится 128 элементов и 127 всего остального, которое не учитывается. Конечно, трудно представить словарь из 128 различных элементов. А вот если слова будут состоять из двух букв, то получится 85 слов (256 / 3, т.к. две буквы + иной знак). Все! Не будем гадать. Пусть будет так:
ws: array[1..100] of string;
Понадобится переменная, в которой будет храниться текущее слово, перед его занесением в массив.
w: string;
Предстоит проанализировать каждый символ предложения, введенного пользователем. Поэтому требуется узнать, какова его длина. Для этого можно использовать встроенную функцию Паскаля length. Она определит количество символов в строке, что можно будет присвоить какой-нибудь целочисленной переменной.
len: integer;
Понадобится три счетчика: для просмотра исходной строки (предложения пользователя), просмотра массива с целью исключения записи в него одинаковых слов и счетчик текущего количества этих слов.
i, j, q: byte;
С данными разобрались. Теперь сам алгоритм решения задачи. Сначала нужно данные считать и измерить их длину.
writeln('Введите текст: ');
read(u);
len := length(u);
Основной цикл, анализирующий каждый введенный символ пользовательской строки:
i := 1;
while i <= len do
Символ должен быть проверен на то, что он является символом буквы. В данном случае буквами считаются только английские строчные буквы, хотя это условие можно и расширить. Также извлекаемый из пользовательской строки знак должен быть преобразован в символьный тип данных с помощью функции lowercase. Обычно эта функция применяется для преобразования прописных букв в строчные.
if (lowercase(u[i]) >= 'a') and (lowercase(u[i]) <= 'z') then begin
Если символ все-таки буква, то она должна быть записана в переменную w, и сформировать начало слова. Счетчик должен быть увеличен на единицу с тем, чтобы далее рассматривать следующий символ.
w := lowercase(u[i]);
i := i + 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;
Как только попадется «небуква» предыдущий цикл прерывается. Далее следует проверить, нет ли только что сформированного слова в массиве. Если нет, то следует его туда записать.
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;
Если первый или два и больше последующих за словом символов «небуквы», то требуется лишь перейти к следующему символу.
else
i := i + 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.
Соседние файлы в папке Строки в комбинации с другими типами задач