HOME ПРИМЕРЫ THANKS НОВИЧКАМ ДОКИ LINKS JavaScript Mail


 
В этот день много лет назад...
26 ноября. В 1580 году (444 года назад) - Гражданская война во Франции завершается признанием права гугенотов на вероисповедание.
 
 

Turbo Pascal Examples.
Работа со словами в предложении с разделителями

Графика:
Построение графика функции
Прыгающий по экрану мячик.
Качание маятника.
Вложенные цветные круги.
Броуновское движение. Использование объектов.
Матрицы и массивы:
Сортировка элементов массива.
Удаление одинаковых элементов.
Простой пример на поворот матрицы.
Сортировка методом Шелла. +функции измерения временных интервалов.
Проверка выпуклости многоугольника.
Перемоножение матриц
Вычисление определителя матрицы. Рекурсия.
Нахождение обратной матрицы.
Задача об автостоянке.
Рекурсия. Подземелье сокровищ.
Численные методы:
Задачка на определение угла между стрелками часов.
Проверка на принадлежность точки многоугольнику.
Нахождение точки пересечения двух отрезков на плоскости.
Сортировка методом Шелла. +функции измерения временных интервалов.
Сортировка методом "пузырька". Пример на динамические структуры данных. Связанные списки.
Нахождение корня функции методом половинного деления.
Вычисление арккосинуса
Нахождение суммы цифр натурального числа.
Работа с фалами:
Рекурсивное сканирование директорий.
Работа со строками:
Работа со словами в предложении с разделителями.
Простейший синтаксический анализатор для распознавания и вычисления многчлена.
Синтаксический анализатор для распознавания и вычисления многчлена.
Работа со строками: смена кодировки, удаление тегов из HTML текста, обработка
Переименование файлов из кириллицы в латиницу.
Выдача контекстной подсказки.
Частотный словарь символов.
Подсчет повторяющихся символов в строке.
Ссылочные переменные:
Моделирование стека.
Пасьянс "Косынка".
Игры:
Пасьянс "Косынка".
Игра "Питон"
Игра "Анацефал". Пример использования объектов.
Игра "Минное поле"
Большие проекты:
Электронная картотека (без исходника)


 
Работа со словами в предложении с разделителями.
Разделитель — один из символов « ,.;:!?"'» (начиная с пробела и заканчивая апострофом). Буква — любой символ, отличный от разделителя. Слово — последовательность букв, ограниченная с каждой стороны разделителем или концом строки.
Требуется удалить все слова, которые начинаются и заканчиваются одной и той же буквой, и продублировать все остальные слова (при всех манипуляциях со словами разделители сохранять без изменений).

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


var delim,sent,result,tmps:string;
    dArr : array[1..100] of byte; { delimeters in sentence }
    i,p,k,w:byte;
begin
delim := ' ,.;:!?"''';
sent:= 'Let''s say, there is a test, simple: example. Clear? Sure! Next; aga well.';
sent:= ' '+sent+' '; { should do it to not to worry about begin and end of the sentence }
w:=0;
{ find all delimeters }
for i:=1 to 100 do dArr[i]:=0;
for i:=1 to length(delim) do
  begin
  tmps:=sent;
  k:=pos(delim[i],tmps); p:=0;
  while (k>0) do
    begin
    p:=p+k;
    w:=w+1;
    dArr[w]:=p;
    Delete(tmps,1,k);
    k:=pos(delim[i],tmps);
    end;
  end;
{ sorting array dArr}
for i:=1 to w-1 do
for k:=i+1 to w do
  if (dArr[i]>dArr[k]) then
     begin
     p:=dArr[i];
     dArr[i]:=dArr[k];
     dArr[k]:=p;
     end;
result:='';
for i:=1 to w-1 do
  if (dArr[i+1]-dArr[i]>1) then { there is a word between delimeters }
    begin
    tmps := copy(sent,1+dArr[i],dArr[i+1]-1-dArr[i]); { word }
    if (tmps[1]=tmps[length(tmps)]) then { first letter matches the last one }
      result:=result+sent[dArr[i+1]] { just add delimeter }
    else
      result:=result+tmps+' '+tmps+sent[dArr[i+1]] { add word twice, then delimeter }
    end
  else { just 2 delimeters, no words in between }
    result:=result+sent[dArr[i+1]];
writeln(' Original: '+sent);
writeln(' Result: '+result);
end.




 

 

 

 

 

 

 


HOME