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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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



Убрать из строки пробелы в начале строки.

Проверяем первый символ строки. Если это пробел, то удаляем его. После чего следующий символ становится первым.

Var s: string;

  i: integer;

Begin

Readln(s);

While s[1]=' ' do Delete(s,1,1);

Writeln(s);

End.

Убрать из строки пробелы в конце строки.

Проверяем последний символ и, если он «пробел», удаляем его.

Var s: string;

    i: integer;

Begin

Readln(s);

{между апострофами один пробел}

While s [length(s)]=' ' do Delete(s,length(s),1);

Writeln(s);

End.

Убрать из строки все пробелы.

Пока в строке есть пробелы, функция Pos будет возвращать позицию (номер) пробела, если пробелов нет, то ноль. Функция Delete удаляет пробел в этой позиции.

Var s: string;

Begin

Readln(s);

While Pos (' ', s)<>0 do

{между апострофами один пробел}

Delete(s, Pos(' ',s),1);

Writeln(s);

End.

Убрать из строки «лишние» пробелы.

Ищем в строке два соседних пробела и удаляем один из них.

Var s: string;

Begin

Readln (s);

While pos (' ', s)<>0 do

{между апострофами два пробела}

Delete(s, pos(' ',s),1);

Writeln (s);

Readln

End.

Подсчитать количество цифр в натуральном числе.

Вспомните как умно и красиво мы решали эту задачу с использованием операций mod и div. Теперь преобразуем число в строку и определим ее длину. И все!

Var x: integer;

   s: string;

Begin

readln (x);

Str(x, s);

Writeln (Length (s));

Readln

End.

Заменить фрагмент R в строке S на фрагмент T.

Идея проста: пока фрагменты вида R в строке есть (pos(R, S) <>0), определяем позицию первого вхождения K, удаляем его и вставляем на его место фрагмент вида T.

While Pos(R, S)<> 0 do Begin

K:=Pos(R, S);

Delete(S, K, Length(R));

Insert(T, S, K);

End;

Обратите внимание, что в каждом цикле дважды обращаемся к функции Pos? Один раз в заголовке цикла и второй при вычислении позиции первого вхождения. Улучшим программу, вычисляя К перед каждым выполнением цикла. Теперь одно вычисление K за циклом, а в цикле только одно.

K:=Pos(R, S);

While K<>0 do Begin

Delete(S,K, Length(R));

Insert(T, S, K);

k:=pos(R, S);

End;

Наберите эту программу на компьютере, добавив описания переменных и ввод – вывод. Придумайте тесты для проверки программы. «Хитрый» тест: программа не сможет выполнить задачу, если во вставляемом фрагменте содержится заменяемый.

Например, R='12' и T='123'. Объясните возникшие проблемы. На соревнованиях такие «хитрые» тесты вполне возможны.

Строка палиндром

Строка, которая читается одинаково в обоих направлениях, называется строкой палиндромом (строка «перевертыш»).

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

В качестве тестовых примеров введите строки с четным и нечетным числом букв.

Var s: String;

Function palindro (s: String): Boolean;

{алгоритм реализован в виде функции}

Var n, i: Byte;

Begin

i:=1;

n:=length (s);

While (i<=n div 2) and(s[i]=s[n-i+1]) Do inc(i);

If i>n div 2 Then palindro:=true Else palindro:=false;

End;

Begin{основная программа}

Readln(s);

If palindro(s) Then write('yes') Else write('no');

Readln

End.

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

Под словами будем понимать последовательности символов разделенных пробелами (кроме, соответственно, первого и последнего слов).

Пусть s='мама мыла раму'. Признаком конца слова можно считать пробел, кроме последнего слова. Чтобы не обрабатывать последнее слово специальным образом, добавим в конец строки оператором S:=s+' ' символ «пробел».

Просмотрим все элементы строки и если символ не пробел, то добавляем его к строке t. Если пробел, то в t уже целое слово. Выдаем его на экран, и начинаем формировать в t новое слово. Перед формированием «очищаем» слово t (t:=''- пустая строка).

 

Var s, r, t: string;

         i: integer;

Begin

Readln(s);

s:=s+' '; t:=''; {t пустая строка}

For i:=1 to length(s) do

If s[i]<>' ' then t:=t+s[i]

else Begin

        Writeln(t);

         t:='';

     End;

readln

End.

Используем эту идею для решения более сложной задачи: найти в строке самое длинное слово – палиндром. Для этого формируем как прямое слово t:=t+s[i], так и обратное r:=s[i]+r. Кроме того, последовательно проверяем длины слов и ищем самое длинное.

Var s, r, t, wmax: string;

        i, lmax, l: integer;

Begin

Readln(s); s:=s+' ';

r:='';{"обратное" слово-пустая строка}

t:='';{"прямое" слово-пустая строка }

wmax:='';{искомое слово – пустая строка}

For i:=1 to length(s) do

If s[i]<>' ' then {символ не равен пробелу}

  Begin

       r:=s[i] + r; t:=t + s[i]

  End

else Begin

      If r = t then

        If length(r)>length (wmax)

        then wmax:=r;

      r:=''; t:=''; {готовимся формировать новые слова}

      End;

Write(wmax);

Readln

End.

Теперь представим, что «очень много» символов последовательно записано в текстовом файле (на олимпиадах обычно бывает именно так). Тогда последним символом окажется код #26 (признак конца файла). Но, если при создании файла в конце строки будет нажата клавиша «Enter», то в конце файла могут появиться и символы #13 (CR) или (и) #10 (LF). Не забудьте об этом при участии в соревнованиях, именно из этого символа команда СГАУ на четвертьфинале чемпионата мира сдала программу только с третьей попытки, заработав 40 минут штрафного времени. Обязательно закрывайте выходной файл, иначе результат в нем может не появиться.

Используем стандартные файлы ввода и вывода. Тогда их можно не описывать и не указывать их имена в операторах ввода и вывода

Будем считывать символы из файла последовательно и по алгоритму, изложенному выше, решим задачу.

Var r, t, wmax: string;

                  ch: char;

Begin

Assign (input, 'input.txt'); Reset(input);

Assign (output, 'output.txt'); Rewrite(output);

r:=''; t:=''; wmax:='';

Repeat

Read (ch);

If (ch<>' ')and(ch<>#26)and(ch<>#10)and(ch<>#13) then

  Begin r:=ch+r; t:=t+ch End

else Begin

      If r=t then

        If length (r)>length (wmax) then wmax:=r;

       r:=''; t:='';

      End;

Until (ch=#26) or (ch=#10) or (ch=#13);

Write (wmax);

Close (output);

End.

Множества

Предлагаем изучить множества самостоятельно по [1, 2]. При изучении обратите внимание на типы данных в множествах и организации ввода и вывода множеств. Дадим лишь краткие пояснения и рекомендации. Практика программирования показывает, что наиболее полезным видом множеств является множество символов.

Появляется новая для вас операция In (проверка принадлежности элемента множеству), операции объединения множеств (+), пересечения множеств (*) и вычитания (-).

Все остальные пояснения в примерах.

Множество символов в строке

Множество символов, принадлежащих строке легко получить по следующей программе:

Var M:set of char;

S:string;

i: integer;

Begin

S:='мама мыла раму';

For i:=1 to Length(S) do M:=M+[s[i]];

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

{нужно построить из него множество []}

{и объединить его с множеством М}

End.



Поделиться:


Последнее изменение этой страницы: 2019-12-25; просмотров: 114; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.220.178.207 (0.022 с.)