Предисловие дорогие друзья !

Вид материалаДокументы

Содержание


Глава 6 символы и строки
36.2. Вывод значений символьных данных
Write(b1,’ ‘, b2, ‘ ‘, b3)
Write(b1:3, b2:4, b3:4)
§37. Строки символов и операции над ними.
1) Ñêëåèâàíèå (конкатенация).
Var Str1, Str2, Str3: String[20]; Begin
§38. Процедуры и функции обработки строк символов.
Insert (str1, Str2, n) –
Concat (Str1, Str2,… , Str N)
Var Str1, Str2, Str3: String[20]; Begin
А, в, с: byte; {k: byte;}
Для любознательных
Ввод: слово (из букв которого составляли новые слова). Затем число K
§39. Базовые алгоритмы обработки строк.
Program Ex108_1; Var
39.2. Перестановка символов.
39.3. Уплотнение текста.
End; Возможен и другой вариант решения этой задачи: Procedure
39.4. Замена одного символа на другой.
...
Полное содержание
Подобный материал:
1   ...   14   15   16   17   18   19   20   21   ...   29

ГЛАВА 6 СИМВОЛЫ И СТРОКИ

§36. Символы и операции над ними. Процедуры и функции обработки символов.


36.1.Литерный или символьный тип величин. Операции над символами.
     Слово "литера" переводится как буква, символ. Обычно "литерой" называют очень нежное металлическое приспособление - металлический брусочек с выпуклым изображением печатного знака на тоненькой ножке с буковкой или литерой на конце, с помощью которого отбивается символ или знак на обыкновенной пишущей машинке или в типографии. Известно, что каждый символ клавиатуры имеет определенный код согласно принятой во всем мире кодовой таблице ПЭВМ, получившей название кодовой таблицы ASCII.
     Важнейшей особенностью этой таблицы является тот факт, что каждый ее символ (знак) или литера для своего изображения использует один байт памяти персонального компьютера. Для указания на то, что величина имеет литерный (символьный) тип в языке Паскаль применяется специальное обозначение "char".
Например:
В разделе описания переменных величин "Var" некоторой учебной программы на Паскале следующие переменные являются литерными величинами:
var
    ch: char;
    letter, symbol: char;

     Это значит, что каждой из них в памяти компьютера для хранения отводится отдельный байт. Если в программе используются величины типа char, например, 'A' или 'B', обозначающие букву A или букву B, то соответствующие им значения должны заключаться в одиночные кавычки, называемые апострофами. Поэтому пробел, как символ, обозначающий пустое место, также должен записываться в апострофах: ' '.
Чтобы представить апостроф, его повторяют дважды и заключают в апострофы, например, ‘’’’.

Символьные константы описываются в разделе констант CONST.

Например,

CONST

SIM=’F’;

A= ‘!’;

S=’+’;

D1=’5’;

Использование символьных величин допускается в операторе присваивания, например:

BUKWA:=’*’;

R:=BUKWA;

пример. Даны натуральное число N, символы A1, A2, …, An. Подсчитать, сколько раз среди данных символов встречается символ ‘*’.

На языке Паскаль этот алгоритм может быть записан следующим образом:

program PR96;

{ Эта программа демонстрирует обработку последовательности символов}

Const

N=100;

ch='*’;

Var

i : Integer;

count: Integer; { количество символов}

A : Array [1 .. N] of char ;

Begin

writeln (‘введите последовательность символов’);

for i:=l to n do read(A[i]);

count:=0;

for i:=l to N do if A[i]=ch then count:=count +1;

writeln ('символ ' , ch, ' встречается в заданной последовательности ' ,

count, ' раз');

end.


Символьные величины можно использовать в известных вам операциях отношения (сравнения):

<, <=, =, <>, >, >=

Как известно, в русском языке используется лексикографический способ сравнения слов по расположению букв в алфавите. Например, буква Б лежит в алфавите дальше буквы А, поэтому символ ‘A’<’Б’. На основе этого и построена кодовая таблица ASCII: чем дальше буква расположена в алфавите, тем больше её код.

Результатом вычисления выражения отношения является логическая величина TRUE (истина) либо FALSE (ложь). Например, в результате вычисления выражения отношения ‘А’<’Б’ является логическая величина TRUE, а операции ‘К’<’В’ – FALSE.

Для обработки символов можно использовать встроенные функции языка программирования Паскаль:

ORD(X) — определяет порядковый номер символа Х в кодовой таблице. Например, результатом вычисления функции ORD(‘R’) является число 82;

CHR(N) — определяет символ, стоящий в кодовой таблице под номером N. Например, результатом вычисления функции ORD(68) является символ ‘D’;

PRED(X) — определяет в кодовой таблице символ, стоящий перед символом Х. Например, результатом вычисления функции PRED(‘N’) является символ ’M’;

SUCC(X) — определяет в кодовой таблице символ, стоящий после символа Х. Например, результатом вычисления функции SUCC(‘R’) является символ ’S’.

upcase(õ) —зíà÷åíèåì ôóíêöèè ÿâëÿåòñÿ áîëüøàÿ áóêâà õ, åñëè îíà ñóùåñòâóåò (â ïðîòèâíîì ñëó÷àå õ îñòàåòñÿ íå­èçìåííûì)

Следует заметить, что при использовании функции PRED(X) должен быть определён предыдущий символ по отношению к Х, а при использовании функции SUCC(X) — последующий символ по отношению к Х, иначе значение этих функций будет не определено.

Ввод символов имеет свои особенности. Поскольку символ «пробел» относится к символьным величинам, поэтому все символы вводятся с клавиатуры сплошной строкой (подряд). Одной символьной переменной можно присвоить значение только одного символа.

Например, VAR S1, S2, S3:CHAR;

……………………

READ(S1, S2, S3);

Если при выполнении программы с клавиатуры введены

АВС 

где  — признак конца строки, то переменные S1, S2, S3 получат следующие значения:

S1=’A’, S2=’B’, S3=’C’.

При вводе символов через пробел

А В С 

переменные получат следующие значения:

S1=’A’, S2=’ ’, S3=’В’. Все остальные символы будут игнорированы.

Во избежание ошибок, целесообразно ввод каждого символа осуществлять с новой строки.

36.2. Вывод значений символьных данных можно организовать с помощью формата и без него. При бесформатном выводе отводится одна позиция для одного значения, например, вывод значений символьных переменных B1=’W’, B2=’*’, B3=’R’ с помощью оператора WRITE(B1, B2, B3), имеет вид:

W*R

Поскольку пробел есть символьное данное, то его можно использовать в качестве константы. Например, оператор

WRITE(B1,’ ‘, B2, ‘ ‘, B3);

Выведет строку

W * R

Вывод с форматами позволяет оформлять результаты в более наглядном виде. формат для символьных данных имеет вид

х: m

где х — символ (константа, переменная),

m — поле выводимого значения.

В качестве m может быть константа, переменная или выражение целого типа. Если значение m больше единицы, то перед символом выводится соответствующее число пробелов, например при выводе рассмотренных значений B1, B2, B3 с помощью оператора

WRITE(B1:3, B2:4, B3:4);

получим

W * R

Для вывода нескольких пробелов символ пробела также можно указывать с форматом, например ‘ ‘:7 для вывода 7 пробелов.


Вопросы и задания.
  1. Какие величины называют литерными или символьными?
  2. Опишите использование формата вывода символьной информации в операторе Write.
  3. Как сравниваются символьные переменные?
  4. Перечислите стандартные процедуры и функции работы с символами.
  5. Верно ли, что succ(c) = chr(ord(с)+1), где с — переменная символьного типа?
  6. Составьте программу, которая по заданному символу определяет его порядковый номер в тексте , а также предыдущий и последующий символы.
  7. Составьте программу, которая выведет на экран все буквы латинского алфавита.
  8. Составьте программу, которая определит среди n введенных с клавиатуры символов количество заданных символов к.
  9. Пусть даны целое число п, символы s1, s2,.... sn. Составьте программу, которая определит, имеются ли среди этих символов такие, что si — запятая, a si+1 — тире.


Для любознательных

Выведите в одну строку ABBCCCDDDD...ZZ...Z.

§37. Строки символов и операции над ними.


37.1. Строки. Рассмотренный нами тип char не совсем удобен, так как позволяет в переменной хранить лишь один символ. Хотелось бы иметь инструмент для задания целых последовательностей литер. Таким инструментом и являются строки – переменные и константы типа STRING.

Ñòðîêîé íàçûâàåòñÿ ïîñëåäîâàòåëüíîñòü символов çàäàíîé äëèíû.

Ñòðîêè (ïåðåìåííûå òèïà String) ìîãóò áûòü îáúÿâëåíû, íàïðè­ìåð, ñëåäóþùèì îáðàçîì:

Var Str1: String[30];

Str2:String;

Переменная типа STRING, содержит от 0 до N символов, но не может превышать 255. При îáúÿâëåíèè ñòðîêîâîé ïåðåìåííîé â êâàäðàòíûõ ñêîáêàõ ìîæåò óêàçûâàòüñÿ äëèíà ñòðîêè. Åñëè äëèíà ñòðîêè íå óêàçàíà, òî îíà ïðèíèìàåòñÿ ðàâíîé 255.  äàííîì ñëó÷àå â ïåðâîé ñòðîêå ìîæåò ñîäåðæàòüñÿ ìàêñèìóì 30 ñèì­âîëîâ, à âî âòîðîé — максимум 255. Íàäî çàìåòèòü, ÷òî ñòðîêà ïîõîæà íà îäíî­ìåðíûé ìàññèâ ñèìâîëîâ: îíà èìååò îïðåäåë¸ííóþ äëèíó (íå áîëüøå íåêîòîðîãî ÷èñëà), ê êàæäîìó ñèìâîëó ìîæíî îáðàòèòüñÿ ïî åãî íîìå­ðó (êàê â ìàññèâå) — Str1[i] — ýòî îáðàùåíèå ê i-ìó ýëåìåíòó ñòðîêè Str1.

Самый первый байт в строке имеет индекс равный нулю и содержит текущую длину строки.

Ïåðåìåííûå òèïà String âûâîäÿòñÿ íà ýêðàí ïîñðåäñòâîì ñòàí­äàðòíûõ ïðîöåäóð Write è Writeln è ââîäÿòñÿ ñ ïîìîùüþ ñòàíäàðòíûõ ïðîöåäóð Readln è Read. Òî åñòü, ââîäÿòñÿ íå ïîýëåìåíòíî êàê ìàññè­âû, à цåëèêîì.

Ïðèìå÷àíèå. Åñëè ïðè ââîäå çàäàòü ñèìâîëîâ áîëüøå, ÷åì ìàêñè­ìàëüíî äîïóñòèìî, òî ëèøíèå ñèìâîëû áóäóò ïðîèãíîðèðàâàíû.

37.2. Îïåðàöèè ñî ñòðîêàìè. Â Ïàñêàëå èìååòñÿ äâà îñíîâíûõ ñïîñîáà îáðàáîòêè ïåðåìåííûõ òèïà String. Ïåðâûé ñïîñîá ïðåäïîëîãàåò îáðàáîòêó âñåé ñòðîêè êàê åäèíîãî öåëîãî, ò.å. åäèíîãî îáúåêòà. Êðîìå òîãî (ýòî âòîðîé ñïî­ñîá), ìîæíî ðàññìàòðèâàòü ñòðîêó êàê ñîñòàâíîé îáúåêò, ñîñòîÿùèé èç îòäåëüíûõ ñèìâîëîâ, òî åñòü ýëåìåíòîâ òèïà Char, êîòîðûå ïðè îáðàáîòêå äîñòóïíû êàæäûé â îòäåëüíîñòè.

1) Ñêëåèâàíèå (конкатенация). Ïîä ñêëåèâàíèåì (сцеплением) ïîíèìàåòñÿ ïîñëåäîâàòåëüíîå îáúåäèíåíèå íåñ­êîëüêèõ ñòðîê. Склеивание осуществляется с помощью оператора «+». Склеивать (сцеплять) можно как строковые константы, так и переменные. Например:

Var Str1, Str2, Str3: String[20];

Begin

Str1:='Ó Åãîðêè';

Str2:='âñåãäà îòãîâîðêè';

Str3:=Str1+' '+Str2;

Write(Str3)

End.

Ñòðîêà Str3 èìååò çíà÷åíèå 'Ó Еãîðêè âñåãäà îòãîворки'.  äàííîì ïðèìåðå ìàêñèìàëüíàÿ äëèíà ñòðîêè Str3 ðàâíà 20 ñèìâîëàì, ïîýòîìó áóäóò âçÿòû òîëüêî ïåðâûå 20 ñèìâîëîâ ñóììû ñòðîê, à îñòàëüíûå ðàññìàòðèâàòüñÿ íå áóäóò. Ïàñêàëü ïîçâîëÿåò âûïîëíÿòü îïåðàöèè îáúåäèíåíèÿ (ñöåïëåíèÿ) íåñêîëüêèõ ñòðîê â ïðîöåññå èõ ïðèñâîåíèÿ êàêîé-ëèáî ïåðåìåííîé: Str3:= 'Ó Åãîðêè'+' âñåãäà '+'îòãîâîðêè'.  ðåçóëüòàòå òàêîé îïåðàöèè â ïåðåìåííîé Str3 áóäåò òî æå ñàìîå ñî­äåрæèìîå, ÷òî è â ïðåäûäóùåì ïðèìåðå.

Ïðèìå÷àíèå 1. "Ñêëåèòü" ñòðîêè ìîæíî òàêæå ïðè ïîìîùè ôóíêöèè Concat (Str1, Str2, ..., StrN).

Ïðèìå÷àíèå 2. от перемены мест слагаемых сумма в операции склеивания МЕНЯЕТСЯ. Проверьте чему равно Str2+' '+Str1?

2) Ñðàâíåíèå. Ïàñêàëü ïîçâîëÿåò âûïîëíÿòü îïåðàöèè ñðàâíåíèÿ äâóõ ñòðîê. Ñðàâíåíèå ïðîèñõîäèò ïîñèìâîëüíî ñëåâà íàïðàâî: ñðàâíèâàþòñÿ êîäû ñîîòâåòñòâóþùèõ ñèìâîëîâ äî òåõ ïîð, ïîêà íå íàðóøèòñÿ ðàâåíñòâî èëè íå êîí÷èòñÿ îäíà èç ñòðîê (èëè îáå ñðàçó), ïðè ýòîì ñðàçó äå­ëàåòñÿ âûâîä î çíàêå íåðàâåíñòâà. Äâå ñòðîêè íàçûâàþòñÿ ðàâíûìè, åñëè îíè ðàâíû ïî äëèíå è ïîñèìâîëüíî. Если строки имеют различную длину, но в общей части символы совпадают, считается, что более короткая строка меньше, чем более длинная.

Ïðèìåðы:

'Balkon'<'balkon' (Ord('B')<(Ord('b'));

'balkon'>'balken' (Ord('o')>Ord('e'));

'balkon'>'balk' (äëèíà ïåðâîé ñòðîêè áîëüøå);

'êîò'='êîò' (ðàâíû ïî äëèíå è ñîâïàäàþò ïîñèìâîëüíî).

При работе со строками мîæíî èñïîëüçîâàòü ëþáûå îïåðàöèè îòíîøåíèÿ (>, <, =, <>, >=, =<) è èõ êîìáèíàöèè â óñëîâíûõ îïåðàòîðàõ. Èõ ðåçóëüòàò — ýòî îäíî èç äâóõ çíà÷åíèé: True èëè False.

Äëÿ äîñòóïà ê îòäåëüíîìó ñèìâîëó â ñòðîêå íåîáõîäèìî óêàçàòü èìÿ строки è â êâàäðàòíûõ ñêîáêàõ íîìåð ïîçèöèè ýëåìåíòà (ñèìâîëà) â ñòðî­êå. Ïðè ýòîì ïî îòíîøåíèþ ê îòäåëüíîìó ñèìâîëó ñòðîêè âîçìîæíû âñå òå æå îïåðàöèè, ÷òî è ê ïåðåìåííîé òèïà Char.

Вопросы и задания.
  1. Что такое строка символов?
  2. Как в программе описываются строки символов?
  3. Какова максимальная длина строки символов?
  4. Как обратиться к отдельному символу строки?
  5. Составить программу, которая, используя операцию сцепления получит из заданного слова:
  1. «вертикаль» слова «тир» и «ветка»;
  2. «программа» слова «ром» и «рампа»;
  3. «трос» слова «сорт», «рост», и «торс»;
  4. «клоун» слова «уклон», «кулон» и «колун»;
  5. «апельсин» слово «спаниель».

§38. Процедуры и функции обработки строк символов.


Язык программирования Ïàñêàëü ïðåäîñòàâëÿåò пользователю ðÿä стандартных ïðîöåäóð и ôóíêöèé, ïðåäíàçíà÷åííûõ äëÿ îáðàáîòêè ñòðîê символов. Ðàññìîòðèì некоторые èç íèõ.

Dele­te(Str1,n,m) – ïðîöåäóðà, êîòîðàÿ удаляет èç ñòðîêè Str1 m ñèìâîëîâ, íà÷èíàÿ ñ n-ãî. В результате выполнения процедуры Dele­te уменьшается текущая длина строки Str1.



Например:

Исходное значение str1 Оператор Конечное значение str1

'abcdefg' Delete (Str1,3,2) 'abefg'

'abcdefg' Delete (Str1,2,6) 'a’

В результате выполнения процедуры уменьшается текущая длина строки в переменной Str.

Insert (str1, Str2, n) – процедура, которая вставляет строку str1 в строку Str2, начиная с n-го символа. В результате выполнения процедуры Insert строка символов Str2 получает новое значение.



Например:

Исходное значение str2 Оператор Конечное значение str2

'ЭВМ PC' Insert('IBM-',STR2,5) 'ЭВМ IBM-PC'

'Рис. 2’ Insert('N',STR2,6) 'Рис. N2'

’abcdefgh’ Insert(’ABCDEFGH’,Str2,3) ’abABCDEFGHcdefgh’

Str(N, Str1) – процедура, которая переводит число N в строку символов Str1. Процедура переводит не только целые числа, но и вещественные, представленные как в естественной, так и в стандартной формах.



Например:

Str(1234, Str1) - после выполнения Str1=‘1234’;

Str (452.567, Str1) -после выполнения Str1=‘452.567’;

Str(4.52567e+2, Str1) - после выполнения Str1=‘4.52567e+2’.

Val(Str1, N, K)) – процедура, которая выполняет обратное действие процедуре Str, которая переводит строку символов Str1 в число N. Если строка символов Str1 действительно является записью числа, то переменная К (код) равен 0, а переменная N принимает числовое значение. В противном случае переменной К будет присвоено значение порядкового номера первого символа строки.



Например:

Val(‘1234’,n, k) - n=1234, k=0;

Val(‘234.56’,n, k) - n=234.56, k=0;

Val(‘2.3456e+2’,n, k) - n =2.3456e+2, k=0;

Val(‘12-45’,n,k) - k=3, так как знак “-" в записи чисел может быть только на первом месте;

Val (‘2,567m’,n,k) - к=2, так как разделительным знаком между целой и дробной частями является точка, а не запятая ;

Val (‘5.87c-5,n,k) - k=5, так как символ c не должен встречаться в записи вещественного или целого числа.


Copy(Str1,n,m) – функция, которая копирует m символов, начиная с n-го строки Str1. При этом исходная строка Str1 не меняется.




Например:

Значение str1 Выражение Результат

'ABCDEFG’ Copy(Str1,2,3) 'BCD'

'ABCDEFG' Copy(Str1,4, 4) 'DEFG'

Length (Str1) – функция, которая вычисляет длину строки символов Str1. Результатом вычисления функции Length является целое число, равное количеству символов строки Str1.

Например:

Значение str1 Выражение Результат

'test-5' Length (Str1) 6

'(А+В)*С' Length (Str1) 7

Pos(Str1, Str2) – функция, которая определяет первое появление (позицию) подстроки в строке. Результатом вычисления этой функции является целое число, определяющее порядковый номер символа, с которого начинается первое появление подстроки Str1 в строке Str2. В случае если подстрока не найдена, то значение функции равно 0.



Например:

Значение Str2 Выражение Результат

'abcdef ‘ Pos('cd',STR2) 3

'abcdcdef’ Pos('cd',STR2) 3

'abcdef’ Pos('k',STR2) 0


Concat (Str1, Str2,… , Str N) функция, которая сцепляет строки Str1, Str2,… , Str N в одну строку.

Приведенную в предыдущем параграфе программу можно записать следующим образом:

Var Str1, Str2, Str3: String[20];

Begin

Str1:='Ó Åãîðêè';

Str2:='âñåãäà îòãîâîðêè';

Str3:=concat(str1, ‘ ‘, str2);

Write(Str3)

End.


Рассмотрим несколько простейших примеров работы со строками символов.

Пример 103. Следующая программа получает из слова «ВЕЛИЧИНА» слово «НАЛИЧИЕ»:

Program Ех103;

Var S1,S2: String[10];

Begin

S1:='ВЕЛИЧИНА';

S2:=Copy(S1,7,2)+Copy(S1,3,4)+ S1[2];

WriteLn(S2)

End.


Пример 104. В следующей программе из слова «СТРОКА» будет получено слово «СЕТКА».

Program Ех104;

Var S1: String[10];

Begin

S1:='CTPOKA';

Delete(Sl,3,2);

Insert('E',Sl,2);

WriteLn(Sl)

End.

Пример 105. Составим программу, которая формирует символьную строку, состоящую из n звездочек (n — целое число, 1 < n < 255).

Program Ех105;

Var A: String;

N,I: Byte;

Begin

Write ('Введите число звездочек');

ReadLn(N);

A:=’’;

For I:=l To N Do A:=A+'*';

WriteLn(A)

End.

Здесь строковой переменной А вначале присваивается значение пустой строки (' '). Затем к ней присоединяются звездочки.

Пример 106. В символьной строке подсчитать количество цифр, предшествующих первому символу «!».

Program Ех106;

Var S: String;

К,I: Byte;

Begin

WriteLn(«Введите строку»);

ReadLn(S) ;

K:=0;

I:=l;

While (K<=Length(S)) And (S[I]<>'!') Do

Begin

If (S[I]>='0') And (S[i]<='9') Then K:=K+1;

I:=I+1

End;

WriteLn ('Количество цифр до символа «!» равно', К)

End.

В этой программе переменная К играет роль счетчика цифр, а переменная I — роль параметра цикла. Цикл закончит выполне­ние при первом же выходе на символ «!» или, если в строке такого символа нет, то при выходе на конец строки. Символ s [ I ] является цифрой, если истинно отношение: 0<=S[i]<=9.

Пример 107. Дана символьная строка, которая задаёт арифметическое выражение. На первом месте в нём стоит однозначное число. На втором месте один из знаков операций: «+», «-», «*». На третьем месте ещё одно однозначное число. На четвёртом месте — знак равенства. Иначе говоря, записано ариф­метическое выражение с двумя однозначными числами и знак равенства, например: '5 + 7 ='. Нужно, чтобы машина вычислила это выражение и после знака равенства вывела результат.

Решение. Программу решения такой задачи назовем интерпретатором. Интерпретатор должен расшифровать содержание строки и выпол­нить соответствующую арифметическую операцию. От исходной сим­вольной информации он должен перейти к работе с числовой ин­формацией. Если предположить, что строка составлена только из четырех символов в соответствии с указанным форматом, то задача решается довольно просто. Вот программа такого интерпретатора:

Program Ех107;

Var Str1: String[4];

А, В, С: BYTE; {K: BYTE;}

Begin

{ввод исходной строки)

Write('Введите выражение!:');

ReadLn (Str1);

{преобразование цифровых символов в числа}

A:=Ord(Str1[l])-Ord('0'); {возможный вариант VAL(STR1[1],A,K);}

B:=Ord(Str1[3])-Ord('0'); {возможный вариант VAL(STR1[3],B,K);}

{выполнение арифметической операции)

Case Str1[2] Of

'+': C:=A+B;

'-': C:=A-B;

'*': C:=A*B

End;

{вывод результата)

WriteLn(С:2)

End.

Вопросы и задания.
  1. Что такое строка?
  2. Как объявляются переменные для хранения строк?
  3. Какова максимальная длина строки?
  4. Как обратиться к отдельному элементу строки?
  5. Перечислите стандартные процедуры и функции работы со строками.
  6. Строку символов часто называют динамическим (не имеющим постоянного размера) массивом. Объясните почему.
  7. Дано название футбольного клуба. Определить количество символов в нём.
  8. Даны две фамилии. Определить какая из них длиннее.
  9. Путём вырезок и склеек получить:
  1. из слова «вертикаль» слова «тир» и «ветка»;
  2. из слова «программа» слова «ром» и «рампа»;
  3. из слова «трос» слова «сорт», «рост», и «торс»;
  4. из слова «клоун» слова «уклон», «кулон» и «колун»;
  5. из слова «апельсин» слово «спаниель».
  1. Дано слово. Перенести первые К его букв в конец слова.
  2. составить программу, которая печатает заданное слово, начиная с последней буквы (в обратном порядке).
  3. Дано слово. Получить «перевёртыш», т.е. слово, буквы которого записаны в обратном порядке.

Для любознательных

Петя и Вася решили поиграть в одну очень интересную игру. Они выбрали слово и потом из букв этого слова составляли новые слова, причем каждая буква в новом слове встречается не большее количество раз, чем оно встречается в исходном. Слово состоит из маленьких латинских букв и его длина не превышает 50 символов. Выигрывает тот, кто составит большее количество слов. Но Петя решил схитрить. Он взял у себя на полке словарь, который состоял из K слов и выписал эти все слова. Но Вася заметил, что некоторые слова записаны не по правилам игры и он засчитал только те, которые записаны правильно. Но подсчитать их количество он самостоятельно не смог. Поэтому он обратился к вам за помощью.

Ваша задача состоит в том, чтобы определить количество слов, записанных Петей по правилам игры.

Ввод: слово (из букв которого составляли новые слова).

Затем число K – количество выписанных Петей слов. (1<=K<=30)

Затем идет K строк, в каждой из которых записаны слова.

Вывод: единственное число – количество правильно записанных слов.

Пример:

input.txt output.txt

ananas 3

6

ananasa

asan

sanaa

posan

a

aaaans

§39. Базовые алгоритмы обработки строк.


39.1. Подсчёт числа заданных символов. Эту задачу можно решать двумя способами. Первый — перебирая все элементы строки и считая нужные символы. второй — используя функцию POS.

Пример 108. Сколько раз в данной строке встречается символ ‘a’?

Решение. 1-й вариант. будем просматривать символ за символом и сравнивать его с ‘a’. Результат выполнения функции — целое число. Программа будет выглядеть так:

Program Ex108_1;

Var

St: string;

K: Byte; {К — счётчик числа букв «а»}

i:Byte;

Begin

Write(‘Введите строку: ’);

Readln(st);

K :=0; {Просматриваем все символы строки, их количество равно длине строки; если оче- редной символ равен ’а’, то увеличиваем счетчик}

For i:=1 To Length(st) do

If st[i] =’a’ then inc(k);

Writeln(‘Всего букв «а» — ’,k);{выводим на экран количество букв}

Readln;

end.

2-й вариант. Воспользуемся функцией POS. Функция в этом случае будет выглядеть так:

Program Ex108_2;

Var

St: string;

K : Byte; {К — счётчик числа букв «а»}


Begin

Write(‘Введите строку: ’);

Readln(st);

K:=0; {Просматриваем строку, пока значение функции не равно нулю}

While pos(‘a’,st)<>0 do {пока в строке есть ещё буква ‘a’}

inc(k); {увеличиваем счётчик}

Writeln(‘Всего букв «а» — ’,k);{выводим на экран количество букв}

Readln;

end.

39.2. Перестановка символов.


Пример 109. Поменять местами первый и последний символы строки. Строка содержит не менее двух символов.

Решение. Решение задачи такое же, как и при обмене элементов массива.

Procedure Obmen (var st : String);

Var k: Char;

Begin

K:= st[1]; {Сохраняем значение первого символа}

st[1] := st[Lenght(st)] {Переносим последний символ на первое место}

st[Lenght(st)] :=K; {Первый символ — на последнее место}

End;

39.3. Уплотнение текста.


Пример 110. Задано значение литерной переменной. Удалить из текста все пробелы.

Решение. Будем удалять пробелы, начиная с конца текста.

Procedure Udal (var st : String);

Var k:Byte;

Begin

K:= Lenght(st); {Сохраняем длину строки}

While K>0 do begin {пока не просмотрели всю строку}

If str[k]=’ ‘ then delete(st,k,1); {если встретился пробел, удаляем его}

Dec(k); {переходим к просмотру следующего символа}

End;

End;

Возможен и другой вариант решения этой задачи:

Procedure Udal_2 (Var st : String);

Begin

While pos(' ',st)>0 do Delete(st,pos(' ',st),1)

End;

Пример 111. Задано значение литерной переменной. Если подряд стоят два (или несколько) одинаковых символов, то оставить только один.

Решение. Будем удалять символы, начиная с конца текста.

Procedure Udal_Dv (var st : String);

Var k:Byte;

Begin

K:= Lenght(st); {Сохраняем длину строки}

While K>1 do begin {пока не просмотрели всю строку}

If st[k-1]= st[k] then delete(st,k,1); {если встретились двойные, удаляем один}

Dec(k); {переходим к просмотру следующего символа}

End;

End;

39.4. Замена одного символа на другой.


Пример 112. Задано значение литерной переменной. Заменить один символ на другой. Оба символа вводятся с клавиатуры.

Решение. Будем заменять символы, перебирая все элементы строки.

Procedure Zamena_1 (var st:String; a,b:char); { a — символ, который нужно заменить, b — символ, на который нужно заменить }

Var i:Byte;

Begin

For i:=1 To Length(st) do

If st[i] =a then st[i]:=b;

End;

39.5. Замена одного слова на другое.


Пример 113. Заменить все вхождения подстроки ‘del’ на ‘insert’.

Решение. Решить эту задачу также можно двумя способами.

Первый способ. Пока такая подстрока встречается, необходимо находить номер первого символа очередного вхождения подстроки ‘del’, удалять ‘del’ и вставлять ‘insert’.

Procedure Ins1 (Var st:String);

Var k: Byte;

Begin

While Pos(‘del’,st)<>0 do

Begin

K:= Pos(‘del’,st);

Delete(St,k,3);

Insert(‘Insert’,st,k);

End;

End;

Второй способ. Будем копировать в новую строковую величину B те символы, которые не являются началом слова ‘del’. Если же натолкнемся на слово ‘del’, то добавим в строку B вместо него слово ‘insert’, не забудем при этом «перепрыгнуть» через 2 другие буквы найденного слова ‘del’. Результат работы процедуры возвратим в той же переменной ST.

Procedure Ins2(Var st: String;);

Var k: Byte; B:String;

Begin

B:=’’; {начальное значение результирующей строки}

k:=1; {начинаем работу с первого символа}

While k<=Length(St)-3 do {пока можно обнаружить слово’del’}

Begin

If Copy(St,k,3)=’del’ {если обнаружили слово ‘del’ c позиции k}

then begin B:=B+’insert’; {то в B добавляем ‘insert’}

k:=k+2; end {пропускаем 2 следующие буквы слова ‘del’}

else B:=B+St[k]; {иначе в B добавляем только один текущий символ}

k:=k+1; {переход к следующему символу}

end;

St:=B; {результат работы процедуры}

end;

39.6. Определение числа слов в тексте, удовлетворяющих заданному условию.


Пример 114. Дана строка, состоящая из нескольких слов, между которыми один пробел, в конце строки — точка. Подсчитать количество слов и вывести на экран только те из них, которые начинаются с буквы ‘а’.

Решение. Припишем в начало текста ещё один пробел, и заменим точку пробелом. будем проверять два соседних символа. Условию задачи удовлетворяет ситуация, когда первый символ пробел, а второй — буква «а». тогда выведем на экран все символы до следующего пробела.

Program Ex114;

Var

St: string;

K, i : Byte; {К — счётчик слов, начинающихся с «а»}

Begin

Write(‘Введите предложение’);

Readln(st);

K:=0; {Начальные значения счётчика}

St:=’ ‘+st; {Приписываем пробел в начало текста}

St[length(st)]:=’ ‘; {заменяем точку пробелом в конце текста}

i:=1;

While i<= Length(st)-1 do

Begin {Просматриваем весь текст}

If (st[i]=’ ‘) and (st[i+1]=’a’) {Если встретили слово на «а»,}

Then begin inc(k); {то сосчитаем его}

Inc(I); {В i — номер первой буквы слова}

While st[i]<>’ ‘ do {Пока не закончилось слово,}

begin write(st[i]); {выводим на экран символ слова}

inc(i) end; {и увеличиваем счётчик букв}

Writeln;

Dec(i) {возвращаемся на один символ назад}

End; {Конец If}

Inc(i); {Следующий символ }

End; {Конец While}

Writeln(‘Всего слов начинающихся с «а» — ’,k);{выводим на экран количество слов}

Readln;

end.

39.7. Выделение из текста цифр.


Пример 115. Подсчитать сумму цифр, входящих в данную строку.

Решение. Для решения этой задачи используем оператор CASE. Просматривая последовательно все символы строки, будем складывать входящие в неё цифры.

Program Ex115;

Var I,s:integer; St: string;

Begin

Write('Введите строку ');

Readln(st) ;

s:=0; {Начальное значение суммы}

For i:=1 to Length(st) do {Просматриваем все символы строки}

Case st[i] of {В зависимости от значения очередного символа}

‘1’: s:=s+1; {Если это цифра 1, то прибавим к сумме 1}

‘2’: s:=s+2; { Если это цифра 2, то прибавим к сумме 2}

‘3’: s:=s+3; { Если это цифра 3, то прибавим к сумме 3}

‘4’: s:=s+4; { Если это цифра 4, то прибавим к сумме 4}

‘5’: s:=s+5; { Если это цифра 5, то прибавим к сумме 5}

‘6’: s:=s+6; { Если это цифра 6, то прибавим к сумме 6}

‘7’: s:=s+7; { Если это цифра 7, то прибавим к сумме 7}

‘8’: s:=s+8; { Если это цифра 8, то прибавим к сумме 8}

‘9’: s:=s+9; { Если это цифра 9, то прибавим к сумме 9}

end; {Если это не цифра, пропускаем символ}

Writeln(s: 5) ; {Вывод результата}

Readln;

End.

Реализовать алгоритм решения этой задачи можно и несколько иначе. Вместо оператора CASE можно воспользоваться процедурой VAL. Программа в этом случае будет выглядеть так:

Program Ex115a;

Var I,s,c,k:integer;

St:string;

Begin

Write('Введите строку ');

Readln(st) ;

s:=0;

For i:=1 to Length(st) do

Begin

Val(st[i],k,c); {преобразование символа в число}

If c=0 Then s:=s+k; {Проверка кода возврата. Если он равен 0, то прибавляем цифру}

end;

Writeln(s: 5) ; {Вывод результата}

Readln;

End.

Вопросы и задания.
  1. Подсчитать, сколько раз в данной строке встречается данный символ.
  2. Дан текстовый файл. Сколько раз в каждой строке встречается данный символ?
  3. Сколько раз в данной строке встречается гласные буквы?
  4. Из строки удалить среднюю букву, если длина строки нечётная, иначе — удалить две средние буквы.
  5. Заменить все символы Ch1 в строке на Ch2 (Ch1 и Ch2 вводятся с клавиатуры).
  6. Заменить все вхождения подстроки Str1 на подстроку Str2 (Str1и Str2 вв одятся с клавиатуры).
  7. После каждого символа Ch вставить строку Str1.
  8. Удвоить каждое вхождение символа Ch.
  9. Даны две строки. Если они начинаются с одинаковых символов, то напечатать ДА, иначе — НЕТ.
  10. Дана последовательность слов. Напечатать все слова, отличные от слова hello.
  11. Дана последовательность слов. Напечатать все слова в алфавитном порядке.
  12. Дана последовательность слов. Напечатать все слова последовательности, которые встречаются в ней по одному разу.
  13. Дано предложение. Напечатать все различные слова.
  14. Дана последовательность слов. Напечатать все слова, предварительно преобразовав каждое из них по следующему плану:

а) удалить из слова все вхождения последней буквы (кроме неё самой);

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

а) в слове нет повторяющихся букв;

б) буквы слова упорядочены по алфавиту;

в) слово совпадает с начальным отрезком латинского алфавита (a, ab, abc, abcd, …);

г) слово симметрично.
  1. Составить программу вывода самой большой цифры в строковой записи заданного числа.
  2. Найти сумму всех чисел строки.
  3. Дан текст. Найти максимальное из имеющихся в нем чисел.
  4. Дан текст. Найти наибольшее количество идущих подряд цифр.

§40. Составление программ обработки строк и символов.


Пример 116 Составить программу, которая удаляет средний символ в строке с нечетным количеством символов.

Решение.

Program Ех116;

Var k:=byte;

st:Sting;

Begin

Write('Введите строку ');

Readln(st) ;

K:=Lenght(st);

If k mod 2 =1 then Delete (st, k Div 2+1,1);{Если число символов в строке нечётное, то удаляем средний символ}

Writeln(st) ; {Вывод полученной строки для контроля}

Readln;

End.


пример 117. Определить, является ли заданное слово "перевёртышем" (слово называется "перевёртышем", если совпадает с собой после переворачивания), например «казак», «шалаш».

Решение.

Program Ех117;

   Var Slovo   : String;

  Dlina, i : Integer;

  Flag : Boolean;

BEGIN

  Write('Введите слово : ');  ReadLn(Slovo);

  Dlina:= Length(Slovo);

{Сравниваются пары букв: первая буква с последней, }

{вторая буква с предпоследней и т.д. } 

  i:=1;  Flag := TRUE;

  While (i <= Dlina div 2) and Flag do   {цикл до первой несовпавшей }

  begin {пары букв (если такая есть)}

  Flag := (Slovo[i]=Slovo[Dlina-i+1]);

  i := i+1

  end;

  WriteLn; Write( 'О т в е т : слово ', Slovo);

  If Flag then WriteLn(' — перевертыш. ')

  else WriteLn(' — не перевертыш');

  ReadLn

END.

Приведите другие варианты решения этой задачи.

Напишите самостоятельно программу для определения является ли данное предложение перевёртышем. Например, «Аргентина манит негра».

пример 117.1 Составить программу, определяющую является ли заданное натуральное число N палиндромом. (Палиндромом называется натуральное число, которое читается справа налево и слева направо одинаково, все однозначные числа по определению палиндромы)

Решение.

Для решения задачи необходимо воспользоваться процедурой преобразования числа в строку STR и идеей предыдущего примера. Программу для решения этой задачи напишите самостоятельно.

пример 118. Составить программу, которая из строки, содержащей n символов, выведет на экран монитора все пары одинаковых соседних символов, если такие имеются.

Решение.

Program Ех118;

Var

T : string;

i, n : integer;

flag : boolean;

Begin

Write(‘Введите строку символов: ’);

Readln(Т)

f := false; {Указатель того, что пока нет одинаковых пар}

for i := 1 to n-1 do {Просматриваем всю строку}

if T[i]=T[i+1] then {Если соседние символы равны,}

begin {то}

flag := true;

Writeln(T[i], ‘–‘, T[i+1]) {выводим на экран пару соседних чисел}

end;

if not flag then {Если одинаковые пары отсутствуют, то }

Writeln(‘В заданной строке отсутствуют пары одинаковых соседних символов!’);

Readln

End.


пример 119. Данно натуральное число n и символы S1, S2, …, Sn, среди которых есть двоеточие. Получить все символы, которые размещены после первого двоеточия.

Program Ех119;

Var

st1, st2 : string[100];

i, n : byte;

Begin

Write(‘Введите строку символов: ’);

readln(st1);

n := Length(st1); {Определяем длину строки}

i := Pos(‘:’, st1); {Находим первое вхождение «:» в строку}

if (i>0) and (i
begin {то}

st2 := Copy(st1, i+1, n-i); {выделяем нужные символы}

Writeln(‘Получилась строка ’, st2); {и выводим на экран}

End {}

else if i = n {Иначе, если «:» последний символ}

then Writeln(‘Символ “:” – последний в строке’) {сообщанм об этом}

else Writeln(‘В данной строке нет символа “:”’); {Если «:» вообще нет в строке}

Readln

End.

пример 120. Заменить в данном арифметическом выражении все вхождения “int” на “trunc”.

Program Ех120;

Const

vr1 = ‘int’;

vr2 = ‘trunc’;

Var

st1, st2 : string[80];

i : byte;

f : boolean;

Begin

Write(‘Введите строку символов, в которой содержится некоторое арифметическое выражение: ’);

Readln(st1);

st2 := st1;

f := false;

repeat

i := Pos(vr1, st2);

if i > 0 then

begin

f := true;

Delete(st2, i, 3);

Insert(vr2, st2, i)

end

until i=0;

Writeln;

if f then

begin

Writeln(‘Исходная строка – ’, st1);

Writeln(‘Полученная строка – ’, st2);

end

else

Writeln(‘В данном выражении нет слова int!’);

Readln

End.

пример 121. С клавиатуры вводится текст телеграммы и стоимость одного слова. При вводе текста запятые обозначаются словом ЗПТ, а точки - словом ТЧК, другие знаки препинания не используются.

Необходимо:

а) определить стоимость телеграммы;

б) вывести все слова телеграммы в порядке невозрастания их длины;

в) подсчитать количество слов в тексте, какие имеют удвоенную гласную букву.

Program Ех121;

Const

gl = ‘аеиоуыэюяАЕИОУЫЭЮЯ’;

Type

wrd=string[20];

Var

st : string[255]; {Телеграмма}

slv : wrd; {Слово}

M : array[1..12] of wrd; {Массив слов}

D : array[1..12] of integer; {Массив длин слов}

i, j, kd, ksl, ls, l : integer;

c, s : real;

Function Udv_gl (dst :wrd):Byte; {функция проверки слов на наличие удвоенной гласной}

Var y:Byte;

Begin

Udv_gl:=0;{Результат работы функции: 0 - если нет двойных гласных, 1 - если есть}

For y:=1 To Length(dst)-1 Do

if (Pos(dst[y], gl)<>0) and (Pos(dst[y+1], gl) <>0) and

(dst[y]=st[y+1]) then Udv_gl:=1;

End;

Begin

Write(‘Введите текст телеграммы: ’);

Readln(st);

Write(‘Введите стоимость одного слова: ’);

Readln(c);

s := 0; {стоимость телеграммы}

j := 1; {Индекс массива слов и их длин}

kd := 0; {Количество слов с удвоенной гласной}

slv := ‘’; {Очередное слово текста телеграммы}

ls := 0; {Длина очередного слова}

l := length(st); {Длина телеграммы}

if st[l]=‘ ’ then {Если последний символ телеграммы пробел}

begin {Чтобы обработать последнее слово}

st := st+‘*’; {Припишем «*»}

Inc(l) {и увеличим длину телеграммы на 1}

end

else begin {Иначе, если не пробел}

st := st+‘ *’; {то припишем и пробел и «*»}

Inc(l, 2); { и увеличим длину телеграммы на 2}

end;

for i := 1 to l-1 do {}

begin

if (st[i]=‘ ’) and (st[i+1]<>‘ ’) then {Если началось новое слово}

begin {между словами могут случайно быть два и больше пробелов}

s := s+c; {Увеличиваем стоимость телеграммы}

Inc(kd, Udv_gl(slv)); {Проверка удвоенной гласной в предыдущем слове}

M[j] := slv; {Очередное слово помещаем в массив М}

D[j] := ls; {Длину слова — в массив D}

Inc(j); {Указатель свободного места на следующую ячейку}

slv := ‘’; {Готовим к работе переменные для нового слова}

ls := 0; {и его длины}

end

else {Если не началось новое слово}

if st[i] <> ‘ ’ then {А продолжается текущее}

begin

slv := slv + st[i]; {То приписываем к нему очередной символ}

ls := ls+1; {Увеличиваем счётчик букв на 1}

end

end;

ksl := j-1; {Определяем число занятых ячеек}

Writeln(‘стоимость телеграммы – ’, s:8:2);

Writeln(‘слов с удвоенной гласной – ’, kd);

{Вывод слов телеграммы в порядке невозрастания их длин}

for p := 2 to ksl do {Сортируем массив слов по их длине}

for i := ksl downto p do

if D[i-1] <= D[i] then

begin

l := D[i-1];

D[i-1] := D[i];

D[i] := l;

slv := M[i-1];

M[i-1] := M[i];

M[i] := slv

end;

for i := 1 to ksl do {Выводим слова в порядке возрастания их длин}

Writeln(M[i]);

Readln

End.

пример 122. С клавиатуры вводится длинное натуральное число n (число знаков не больше 30). Если в этом числе количество цифр нечётное, то среднюю цифру нужно заменить на ноль (применить процедуры Val и Str).

Program Ех122;

Var

chs, chsn : string[30];

l, i, c, cod : integer;

d : string[1];

Begin

Write(‘Введите длинное натуральное число: ’);

Readln(chs);

l := length(chs);

chsn := ‘’;

if Odd(l) then

begin

i := (l+1) div 2;

Val(chs[i],c,cod);

if cod <> 0

then writeln(‘В центральной позиции - не цифра!’)

else if c <> 0 then

begin

str(0,d);

chsn := Copy(chs,1,i-1)+d+Copy(chs,i+1,l-i);

Writeln(‘Получилось число – ’, chsn)

end

else Writeln(‘Введенная средняя цифра - нуль!’);

end

else Writeln(‘Введено чётное количество цифр!’);

End.

пример 123. Сформировать новый текст из данного текста, в котором необходимо вставить пробел после знаков препинания “,”, “:”, “.”, “;”, “!”, “?”, если он отсутствует. Вывести текст на экран строками, длина которых не должна превышать указанное число символов (не больше 50). Перенос на новую строку осуществлять на месте пробела (слова не переносить).

Program Ех123;

Type

slw = string[30];

Var

txt1, txt2 : string;

Msl : array [1..10] of slw;

Dl : array [1..10] of byte;

i, j, k, t, l, p, m, n, lzp, max : integer;

zp : string[10];

x : slw;

st : string[50];

Begin

Write(‘Введите текст: ’);

Readln(txt1);

Write(‘Введите длину строки (<=50): ’);

Readln(n);

txt2 := txt1 + ‘*’;

zp := ‘,.:!;?’;

j := 0; {Номер позиции вставляемого пробела}

p := 0; {0 – в тексте нет указанных знаков препинания}

i := 1;

l := length(txt2);

k := 1; {k – номер следующего символа в txt2}

t := 0; {Количество вставленных пробелов}

while k <= l do

begin

i := pos(txt2[k], zp);

if i > 0 then

begin

p := 1; {Вставка пробела в txt1 после знака препинания }

if txt2[k+1] <> ‘ ’ then

begin

j := k+t+1;

t := t+1;

Insert(‘ ’, txt1, j)

end

end;

k := k+1

end;

if p = 0 then Writeln(‘В тексте нет знаков препинания’)

else begin

Writeln(‘ Текст со вставленными пробелами:’);

Writeln(txt1)

end;

{Чтобы разбить текст на строки, слова занесём в массив слов Msl, а их длины – в массив длин Dl}

i := 1;

if txt1[length(txt1)] <> ‘ ’ then txt1 := txt1+‘ ’;

txt2 := txt1;

k := 0;

max:=0; {Переменная для определения максимальной длины слова}

while i > 0 do

begin

i := pos(‘ ’, txt2);

if i > 0 then

begin

x := Copy(txt2, 1, i);

k := k+1;

Msl[k] := x;

Dl[k] := i;

If i>max then max:=I; {Ищем длину самого длинного слова в тексте}

Delete(txt2, 1, i)

end

end;

m := k;

st := ‘’;

l := 0;

Writeln;

If n>=max then begin {Если длина строки позволяет вывести самое длинное слово}

Writeln(‘ Текст, выведенный строками: ’);

k := 1;

while k <= m do

begin

l := l+Dl[k];

if l <= n then st := st+Msl[k]

else begin

Delete(st, length(st), 1);

{Удалить последний пробел}

Writeln(st);

l := 0;

st := ‘’;

k := k-1

end;

k := k+1

end;

if st <> ‘’ then Writeln(st);

end

else Writeln(‘Нет возможности разбить текст на строки’);

Readln

End.

решение задач
  1. Дано слово. Определить, сколько различных букв в нём.
  2. В слове имеются только две одинаковые буквы. Найти их.
  3. даны два слова. Для каждой буквы первого слова (в том числе и для повторяющихся в этом слове букв) определить, входит ли она во второе слово. Например, если заданные слова «информация» и «процессор», то для букв первого из них ответом должно быть: «нет нет нет да да нет нет да нет нет».
  4. даны два слова. Напечатать только те буквы слов, которые есть только в одном из них (в том числе повторяющиеся). Например, если заданные слова «информация» и «процессор», то ответом должно быть: «п е с с и ф м а и я».
  5. даны два слова. Напечатать только те буквы слов, которые встречаются в обоих словах только один раз. Например, если заданные слова «информация» и «процессор», то ответом должно быть: «п е ф м а я».
  6. даны два слова. Определить, можно ли из букв первого из них получить второе. Рассмотреть два варианта:
  1. повторяющиеся буквы второго слова могут в первом не повторяться;
  2. повторяющиеся буквы второго слова должны входить в первое слово столько же раз, сколько и во второе.
  1. Дано предложение. В нём только два слова одинаковые. Найти эти слова.
  2. Дана строка, содержащая текст, заканчивающийся точкой. Вывести на экран слова, содержащие три буквы.
  3. Дана строка. Преобразовать её, удалив каждый символ «*» и повторив каждый символ, отличный от «*».
  4. Дана строка. Подсчитать, сколько различных символов встречается в ней. Вывести их на экран.
  5. Дана строка. Подсчитать самую длинную последовательность подряд идущих букв а.
  6. Дана строка символов, среди которых есть одна открывающаяся и одна закрывающаяся скобка. Вывести на экран все символы, расположенные внутри этих скобок.
  7. Дана строка. Найти вней те слова, которые начинаются и заканчиваются одной и той же буквой.
  8. В записке слова зашифрованы — каждое из них записано наоборот. Расшифровать сообщение.
  9. Строка, содержащая произвольный русский текст, состоит не более чем из 200 символов. Написать, какие буквы и сколько раз встречаются в тексте. Ответ должен приводиться в грамматически правильной форме, например: а — 25 раз, к — 3 раза и т.д.
  10. Даны две строки А и В. Составьте программу, проверяющую, можно ли из букв, входящих в А, составить В (буквы можно использовать не более одного раза и можно переставлять). Например: А=ИНТЕГРАЛ; В=АГЕНТ — составить можно; В=ГРАФ — составить нельзя.


Для любознательных

Написать программу, реализующую сдвиг по ключу (ключ задается) только для больших русских букв (буква Ё не используется).
Пример:
Входные данные:
АБЯ - строка, 2 - ключ.
Выходные данные:
ВГБ