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

Задача: 

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

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

Комментарии

Анаграмма

Одно слово является анаграммой другого, если оно может быть получено перестановкой всех букв данного(колос=сокол). Помогите составить программу, которая находит все анаграммы в данном наборе слов и подсчитывает их число.

сделать проверку по другому

if (lowercase(u[i]) >= 'a') and (lowercase(u[i]) <= 'z') можно заменить строкой
if u[i] in ['a'..'z','A'..'Z'] then
я думаю так будет на много понятнее

еще проще if lowercase(u[i])

еще проще

if lowercase(u[i]) in ['a'..'z'] then

не применима

Нельзя применять in в строках