Алгоритмы обработки символьной информации



  Символьная информация — это информация, отображаемая
с помощью символов (букв, цифр, знаков операций и др.).

IBM-совместимые компьютеры обрабатывают 256 различных символов, каждый из которых кодируется одним байтом.   Соответствие символов и байтов задается таблицей кодировки, в которой для каждого символа указывается соответствующий байт.

Символы с кодами от 0 до 127 построены по стандарту ASCII (American Standard Code for Information Interchange — Американский стандартный код обмена информацией,  читается  "аски"). Вторая половина таблицы (коды 128 ... 255) в нашей стране содержит русские буквы (кириллицу) и символы псевдографики.
 
Коды 0...127
(кодировка ASCII)
Коды 128...255
(модифицированный
альтернативный вариант)

Для того, чтобы определить по этим таблицам код того или иного символа, нужно сложить номер строки с номером столбца, в которых он расположен. Так, код цифры 5 равен 05+048 = 053.

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

 
Типы данных, используемые для обработки символьной информации
 
Язык
Тип, ключевое слово
Примеры использования
Школьный 
АЯ
Символьный 
сим
  a := "f " ;    b := "+" ;    c := "5" 
  If  a = "  " then k := k + 1 
Литерный 
лит
 t := "Литерная величина" 
 s := "" (пустая строка) 
Turbo Pascal
Символьный 
Char
 a := ' f ' ;     b := '+' ;     c := '5' ; 
 If   a = ' ' then k := k + 1  
Литерный 
String
 t := 'Литерная величина' ; 
 f := ' ' ; (пустая строка) 
QBasic
Литерный
 t$ := "Литерная величина" 
 f$ := "" (пустая строка)

Для данных символьного и литерного типов применимы операции сцепки (соединения, конкатенации) и сравнения (<,   >,   <=,   >=,  =,   <>). Сравнивать можно строки разной длины. Сравнение осуществляется слева направо в соответствии с ASCII-кодами соответствующих символов.   Так, строка   "стол"   меньше строки   "стул",   строка   "teacher"  больше строки   "pupil"  , а строка   "пар"   меньше строки "парад".
 


Функции и команды обработки строк

Школьный АЯ

Функция длин(S) Возвращает количество символов в строке S.

Операция вырезка позволяет "вырезать" из строки группу соседних символов. Вырезка из строки S подстроки, начинающейся с i-ой и кончающейся j-ой позицией, обозначается S [ i : j]. Вырезка из строки S одного i-го символа обозначается S[i].

Команда присваивания вырезке S[N : M] := SubS. Часть строки S, начиная с позиции N и кончая позицией M, заменяется на подстроку SubS такой же длины.
 

Turbo Pascal

Процедуры

Delete ( Var S : String; N, M : Integer ) Удаляет M символов из строки S, начиная с позиции N.

Insert ( SubS : String; Var S : String; N : Integer ) Вставляет подстроку SubS в строку S, начиная с позиции N.

Str ( X : Integer; Var S : String ) Возвращает представление числа X в его символьной форме S.

Val ( S : String; Var X, Code : Integer ) Возвращает представление символов строки S в ее числовой форме X. Параметр Code содержит признак ошибки преобразования (если Code = 0, ошибки нет).

Функции

Chr ( X : Byte ) : Char Возвращает символ с заданным порядковым номером X.

Сoncat ( S1 [ , S2 , ... , SN ] ): String Выполняет сцепку (конкатенацию) последовательности строк.

Copy ( S : String; N , M : Integer ) : String Возвращает подстроку из строки S, начиная с позиции N и длиной M символов.

Length ( S : String ) : Byte Возвращает количество символов в строке S.

Ord ( X : Char ) : LongInt Возвращает порядковый номер символа X в таблице кодов символов.

Pos ( SubS , S : String ) : Byte Возвращает номер позиции, начиная с которой в строке S располагается подстрока SubS (если значение функции равно нулю, то S не содержит SubS).
 

QBasic

Функции

ASC ( X$ ) Возвращает порядковый номер символа X$ в таблице кодов символов.

CHR$ ( N ) Возвращает символ с заданным порядковым номером N.

INSTR ( [ N , ] X$ , Y$ ) Возвращает номер позиции строки X$, начиная с которой в ней размещается подстрока Y$. Если подстрока не найдена, то значение функции равно нулю. Поиск подстроки ведется с позиции N, а если N не задано, то с начала строки.

LEFT$ ( X$ , N ) Возвращает подстроку, составленную из первых N символов строки X$.

LEN ( X$ ) Возвращает количество символов в строке X$.

MID$ ( X$, N [ , M ] ) Возвращает подстроку, составленную из M символов строки X$, начиная с позиции N (если параметр М опущен, то возвращаются  все символы, начиная с позиции N).

RIGHT$ ( X$ , N ) Возвращает подстроку, составленную из последних N символов строки X$.

STR$ ( N ) Возвращает представление числа N в символьной форме.

VAL ( X$ ) Возвращает представление символов строки X$ в числовой форме.

Операторы

MID$ ( X$ , N , M ) = Y$ Часть строки X$, начиная с позиции N, длиной M позиций заменяется на строку Y$. Длина X$ не изменяется.

SWAP X$ , Y$ Строки X$ и Y$ обмениваются своими значениями.

Пример 7.1. Определить количество слов в заданном тексте.

Если слова в тексте разделены одним пробелом, то задача сводится к подсчету числа пробелов. Количество слов при этом равно числу пробелов плюс 1. Если же число пробелов между соседними словами произвольное, как обычно и бывает, то алгоритм усложняется. Рассмотрим оба варианта решения этой задачи.

Вариант 1. Слова в тексте разделены одним пробелом.

Тест

Данные
Результат
"Кот на крыше"
N=3

Демонстрация
Школьный АЯ 
алг Число слов (арг лит Text, рез цел N) 
  дано | В непустом тексте Text слова 
       | разделены одним пробелом 
  надо | N — количество слов 
нач цел i 
  N:=1 
  нц для i от 1 до длин(Text) 
             | цикл по буквам текста 
    если Text[i] = " " 
      то N:=N+1 
    все
  кц
кон 
Исполнение алгоритма
i
Text[i]
Text[i]='' ''
N
1
2
3
4
5
6
7
8
9
10
11
12
К
о
т
_
н
а
_
к
р
ы
ш
е
+
-
-
-
+
-
-
+
-
-
-
-
1
 
 
 2
 
 3
 
 Turbo Pascal
Program Probel; 
  Uses Crt; 
  Var Text      : String;  {заданный непустой текст}
      i, Number : Integer; {Number — количество слов в тексте}
      Letter    : Char;    {текущая буква }
BEGIN ClrScr;
  WriteLn('Введите текст :'); ReadLn(Text);
  Number:=1;
  For i:=1 to Length(Text) do {цикл по буквам текста}
   begin
     Letter:=Text[i];
     If (Letter = ' ' ) then Number:=Number+1;
   end;
  WriteLn('О т в е т : количество слов в тексте равно ', Number);
END.

Вариант 2. Слова в тексте разделены произвольным количеством пробелов.

Тест

Данные
Результат
"Кот на   крыше"
N=3

Демонстрация

 Школьный АЯ

алг Число слов (арг лит Text, рез цел N)
  дано | В тексте Text слова могут быть разделены
       | произвольным количеством пробелов
  надо | N — количество слов в тексте Text
нач цел i, лог Flag
  N:=0; Flag:=да
  нц для i от 1 до длин(Text)      | цикл по буквам текста
     если (Text[i]<>" ") и (Flag=да) | это условие выполняется только 
       то N:=N+1                     | для первой буквы каждого слова
     все
     Flag := (Text[i]=" ")    | Flag=да, если очередная буква — пробел,
  кц                          | в противном случае Flag = нет
кон

Исполнение алгоритма
Обозначение проверяемого условия:
(Text[i]<>" ") и (Flag = да)=>(1)
i
Text[i]
(1)
N
Flag
1
2
3
4
5
6
7
8
9
10
11
12
13
14
К
о
т
_
н
а
_
_
_
к
р
ы
ш
е
+
-
-
-
+
-
-
-
-
+
-
-
-
-
0
1
 
 
2
 
 
 
3
да
нет
нет
нет
нет
да
нет
нет
нет
нет
да
нет
нет
нет
нет
 
Turbo Pascal
Program KolSlov;
  Uses Crt;
  Var Text      : String;  {заданный текст}
      i, Number : Integer; {Number - количество слов в тексте}
      Flag      : Boolean;
      Letter    : Char;    {текущая буква }
BEGIN
  ClrScr;
  WriteLn('Введите текст :');
  ReadLn(Text);
  Number := 0; Flag := TRUE;
  For i := 1 to Length(Text) do {цикл по буквам текста}
    begin
      Letter := Text[i];        {текущая буква текста }
      If (Letter <> ' ') and Flag
        then Number := Number+1;
      Flag := (Letter=' ')     {(Letter=' ') — логическое выражение,}
    end;                       {принимающее значения TRUE или FALSE }
  WriteLn;
  WriteLn('О т в е т : количество слов в тексте равно ', Number); ReadLn
END.
 
QBasic
CLS
PRINT "Введите текст, отделяя слова пробелами."
PRINT "Если в тексте есть запятые, заключите его в кавычки."
INPUT Text$ : PRINT
Number = 0 : Flag = 0
FOR i = 1 TO LEN(Text$)               'цикл по буквам текста
    Letter$ = MID$(Text$, i, 1)       'текущая буква текста
    IF (Letter$ <> " ") AND (Flag = 0) THEN Number=Number+1
    IF (Letter$ = " ") THEN Flag = 0 ELSE Flag = 1
NEXT i
PRINT "О т в е т : количество слов в тексте равно "; Number
END
 

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

Система тестов

N теста
Данные
Результат
1
Slovo = ''казак''
Otvet = ''Перевертыш''
2
Slovo = ''коза''
Otvet = ''Не перевертыш''

Демонстрация

Школьный АЯ

алг Перевертыш (арг лит Slovo, рез лит Otvet)
  надо | Otvet = "Перевертыш", если Slovo совпадает с собой
       | после переворачивания
нач цел Dlina, i, лог Flag
  Dlina:=длин(Slovo)
  i:=1; Flag:=да
  нц пока (i<=Dlina/2) и Flag          | цикл пока с прерыванием до
    Flag:=(Slovo[i]=Slovo[Dlina-i+1])  | первой несовпавшей пары букв,
    i:=i+1                             | если такая имеется в слове
  кц
  если Flag
    то Otvet:="Перевертыш"
    иначе Otvet:="Не перевертыш"
  все
кон
Исполнение алгоритма
  Обозначения проверяемых условий:
  (i<=Dlina/2) и Flag   => (1)
  Slovo[i]=Slovo[Dlina-i+1]  => (2)
 
Номер теста
i
(1)
(2)
Flag
Otvet
1
1 
2 
3
+ 
+ 
-(кц)
+ 
+
да 
да 
да
"Перевертыш"
2
 
2
 
-(кц)
-
да 
нет
"Не перевертыш"
 
Turbo Pascal
Program TurnOver;
  Uses Crt;
  Var Slovo    : String;
      Dlina, i : Integer;
      Flag     : Boolean;
BEGIN
  ClrScr;
  Write('Введите слово : ');  ReadLn(Slovo);
  Dlina:= Length(Slovo);
     {Сравниваются пары букв: первая буква с последней, }
     {вторая буква с предпоследней и т.д. } 
  i:=1;  Flag := TRUE;  
  While (i <= Dlina/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.
 
QBasic
CLS : INPUT "Введите слово : ", SLOVO$ 
Dlina = LEN(SLOVO$) 
  ' Сравниваются пары букв: первая буква с последней, 
  ' вторая буква с предпоследней и т.д. 
i = 1 : Flag = 0 
WHILE (i<=Dlina/2) AND (Flag=0) 'цикл до первой несовпавшей пары букв 
  Letter1$ = MID$(SLOVO$, i, 1)          'первая буква пары 
  Letter2$ = MID$(SLOVO$, Dlina-i+1, 1)  'вторая буква пары 
  IF Letter1$ = Letter2$ THEN i=i+1 ELSE Flag=1 
WEND 
PRINT : PRINT "О т в е т : слово "; SLOVO$; 
IF Flag = 0 THEN PRINT " — перевертыш." ELSE PRINT " — не перевертыш." 
END
 

Пример 7.3. B заданном тексте одно заданное слово везде заменить на другое заданное слово
такой же длины.

Тест

Данные
Результат
Текст
Слово1
Слово2
''2sinx+siny''
''sin''
''cos''
''2cosx+cosy''

Демонстрация

Школьный АЯ

алг Замена (арг рез лит Текст, арг лит Слово1, Слово2)
  дано | длины Слово1 и Слово2 совпадают
  надо | в строке Текст подстрока Слово1 везде
       | заменена на подстроку Слово2
нач цел i, DS
  DS:=длин(Слово1)
  нц для i от 1 до длин(Текст)-DS+1
    если Текст[i : i+DS-1] = Слово1 | если вырезка равна Слово1, 
      то Текст[i : i+DS-1] :=Слово2 | то вырезке присваиваем Слово2
         i:=i+DS                    | и продвигаемся на длину слова

    все
  кц
кон

Исполнение алгоритма
Обозначение проверяемого условия:
Текст[i : i+DS-1] = Слово1 => (1)
Для тестовых данных имеем: DS=3, длин (Текст)-DS+1= 8.
i
Текст[i : i+2]
(1)
Текст
1 
2 
5 
6 
7 
10
"2si" 
"sin" 
"x+s" 
"+si" 
"sin"
- 
+ 
- 
- 
+
"2sinx+siny" 
"2cosx +siny" 
 
 "2cosx+cosy" 
 
 
Turbo Pascal
(эта программа, использующая стандартную функцию  Pos , не требует,  чтобы длины  заменяемого и вставляемого слов были одинаковыми)
Program Replace;
  Uses Crt;
  Var Text, Slovo1, Slovo2 : String;
      i, DlinaSlova, P     : Integer;
BEGIN ClrScr;
  Write('Введите строку : '); ReadLn(Text);
  Write('Какое слово заменить ? '); ReadLn(Slovo1);
  Write('На какое слово заменить ? '); ReadLn(Slovo2);
  WriteLn; WriteLn('О т в е т : ');
  WriteLn('Исходный текст: ', Text); DlinaSlova:=Length(Slovo1);
  DlinaSlova:=Length(Slovo1);
  P:=Pos(Slovo1,Text); {номер позиции, с которой в строке Text     }
                       {в первый раз встречается подстрока Slovo1  }
  While P>0 do         {цикл продолжается до тех пор,пока подстрока}
                       {Slovo1 встречается в строке Text           }
   begin                
     Delete(Text, P, DlinaSlova); {удаление подстроки Slovo1, начинаю-}
                                  {щейся с позиции P, из строки Text  }  
     Insert(Slovo2, Text, P);  {вставка подстроки Slovo2  }
                               { в строку Text с позиции Р}
     P:=Pos(Slovo1, Text); {номер позиции, с которой подстрока Slovo1} 
                           {встречается в строке Text в очередной раз}
   end;
  WriteLn('Новый текст: ', Text); 
  ReadLn
END.
 
QBasic
CLS : INPUT "Введите текст : " , Text$
INPUT "Какое слово заменить ? " , Slovo1$
INPUT "На какое слово заменить ? " , Slovo2$
PRINT : PRINT "О т в е т"
PRINT "Исходный текст : " ; Text$
DlinaText = LEN(Text$) : DlinaSlova = LEN(Slovo1$)
FOR i = 1 TO DlinaText-DlinaSlova+1
  IF MID$(Text$, i, DlinaSlova) = Slovo1$ THEN
       MID$(Text$, i) = Slovo2$ : i=i+DlinaSlova
  END IF
NEXT i
PRINT "Новый текст : " ; Text$
END
 
Пример 7.4. Заданную последовательность слов переупорядочить в алфавитном порядке (то есть выполнить лексикографическое упорядочение).

Тест

Данные
Результат
Words=(''стул'', ''гора'', ''яма'', ''стол'')
  Words=("гора", "стол", "стул",  "яма")

Демонстрация

Школьный АЯ   (АЯ расширен добавлением типа данных лит таб   и операций отношения для литерных  переменных)

алг Расположить по алфавиту(арг цел NWords, арг рез лит таб Words[1:NWords])
  надо | Таблица Words упорядочена лексикографически
нач цел i, j, лит Tmp
  нц для i от 1 до NWords-1
    нц для j от i+1 до NWords
      если Words[i]>Words[j]       | условие перестановки слов
        то Tmp:=Words[i]; Words[i]:=Words[j]; Words[j]:=Tmp
      все
    кц
  кц
кон

Исполнение алгоритма
i
j
Words[i]>Words[j]
Массив Words
     
''стул'', ''гора'', ''яма'', ''стол''
1
2
3
4
+
-
-
''гора'', ''стул'', ''яма'', ''стол''
2
3
4
-
+
''гора'', ''стол'', ''яма'', ''стул''
3
4
+
''гора'', ''стол'' , ''стул'', ''яма''
 
Turbo Pascal
Program LexOrder;
  Uses Crt;
  Var Words        : Array[1..10] of String; {массив слов}
      Tmp          : String;       {Tmp — вспомогательная переменная}
      i, j, NWords : Integer;      {NWords — количество слов}
BEGIN
  ClrScr;
  Write('Количество слов в тексте — ');
  ReadLn(NWords);
  For i := 1 to NWords do
    begin Write(i, '-ое слово : ');    
          ReadLn(Words[i])
    end;
  For i := 1 to NWords-1 do {лексикографическое упорядочение слов}
    For j := i+1 to NWords do
      If Words[i]>Words[j] then
        begin
           Tmp := Words[i]; Words[i]:=Words[j]; Words[j]:=Tmp
        end;
  WriteLn;  WriteLn('О т в е т');
  WriteLn('Лексикографически упорядоченный массив слов:');
  For i := 1 to NWords do Write(Words[i], ' ');
  WriteLn; ReadLn
END.
 
QBasic
CLS : INPUT "Количество слов в тексте — ", NWords
DIM Words(NWords) AS STRING
FOR i = 1 TO NWords
  PRINT i; "-ое слово " ; : INPUT Words(i)
NEXT i
FOR i = 1 TO NWords - 1     'лексикографическое упорядочение слов
  FOR j = i + 1 TO NWords
    IF Words(i) > Words(j) THEN SWAP Words(i), Words(j)
  NEXT j
NEXT i
PRINT : PRINT "О т в е т"
PRINT "Лексикографически упорядоченный массив слов:"
FOR i = 1 TO NWords
  PRINT Words(i); " " ;
NEXT i
PRINT
END
 

Пример 7.5. Проверить, имеется ли в линейной записи заданной математической формулы баланс открывающих и закрывающих скобок.

Система тестов

Номер 
теста
Проверяемый 
случай
Данные
Результат
1
При просмотре линейной записи слева направо первой встречается закрывающая скобка
''a)b+1(''
''Нет баланса''
2
Первой встречается открывающая скобка, но число открывающих и закрывающих скобок не совпадает
''(a+b))''
''Нет баланса''
3
Есть баланс скобок
''(a+b/(c*d))''
''Есть баланс''

Демонстрация

Школьный АЯ

алг Баланс скобок(арг лит S, рез лит Otvet)
нач цел Dlina, Flag, i
  i:=1; Flag:=0; Dlina:=длин(S)
  нц пока (Flag>=0) и (i<=Dlina)
     если S[i] = "("
       то Flag:=Flag+1
     все
     если S[i] = ")"
       то Flag:=Flag-1
     все
     i:=i+1
  кц
  если Flag=0
     то Otvet := “Есть баланс     иначе Otvet := “Нет баланса  все
кон
 
Turbo Pascal
Program Balance;
  Uses Crt;
  Var S              : String;
      Dlina, Flag, i : Integer;
BEGIN ClrScr;
  GotoXY(15, 5);
  Write('Введите линейную запись математической формулы :'); 
  GotoXY(32,7); ReadLn(S);
  i:=1; Flag:=0; Dlina:=Length(S);
  While (Flag>=0) and (i<=Dlina) do
    begin
      If S[i] = '(' then Flag:=Flag + 1;
      If S[i] = ')' then Flag:=Flag - 1;
      i:=i+1
    end;
  GotoXY(32, 9); WriteLn('О т в е т');
  GotoXY(15,11);
  If Flag=0 then Write('Есть баланс ') else Write('Нет баланса ');
  WriteLn('открывающих и закрывающих скобок');
  ReadLn
END.
 
QBasic
CLS
INPUT "Введите линейную запись математической формулы :", S$
i = 1 : Flag = 0 : Dlina = LEN(S$)
WHILE Flag >= 0 AND i <= Dlina
  IF MID$(S$, i, 1) = "(" THEN Flag = Flag + 1
  IF MID$(S$, i, 1) = ")" THEN Flag = Flag - 1
  i = i + 1
WEND
PRINT : PRINT "О т в е т"
IF Flag = 0 THEN PRINT "Есть баланс "; ELSE PRINT "Нет баланса ";
PRINT "открывающих и закрывающих скобок"
END


Задачи для самостоятельного решения

7.1. [Pascal | C | Basic]  Подсчитайте количество запятых в заданном тексте.

7.2. [Pascal | C | Basic]  Подсчитайте, сколько раз в заданном тексте встречается заданный символ.

7.3. [Pascal | C | Basic]  Определите долю пробелов в заданной строке.

7.4. [Pascal | C | Basic]  Проверьте, является ли заданное слово названием времени года на русском языке.

7.5. [Pascal | C | Basic]  Замените в заданном тексте буквосочетание "min" на "max".

7.6. [Pascal | C | Basic]  В заданном тексте подсчитате общее количество букв  "x" и "y".

7.7. [Pascal | C | Basic]  В заданном тексте везде букву "а" замените на букву "б",  а букву "б" — на букву "а".

7.8. [Pascal | C | Basic]  Удвойте каждую букву в заданном тексте.

7.9. [Pascal | C | Basic]  В заданном слове каждую букву "б" замените буквосочетанием "ку".

7.10. [Pascal | C | Basic]  Вычеркните из заданного слова все буквы "а".

7.11. [Pascal | C | Basic]  Подсчитате, сколько раз в заданном слове встречается буквосочетание "аб".

7.12. [Pascal | C | Basic]  Заданную строку А перепишите в обратном порядке в строку В.

7.13. [Pascal | C | Basic]  Выясните, есть ли в заданном предложении буква "ы".

7.14. [Pascal | C | Basic]  Выясните, верно ли, что в заданном предложении P есть все буквы, входящие в заданное слово S.

7.15. [Pascal | C | Basic]  Определите количество предложений в заданном тексте (предложение заканчивается либо точкой, либо вопросительным или восклицательным знаком).

7.16. [Pascal | C | Basic]  Определите долю гласных букв в заданном тексте на русском (английском) языке.

7.17. [Pascal | C | Basic]  Определите, является ли одно заданное слово обращением другого заданного слова.

7.18. [Pascal | C | Basic]  Из заданного текста удалите те его части, которые заключены в кавычки (вместе с кавычками).

7.19. [Pascal | C | Basic]  Каждые n символов во введенном тексте отделите знаком "!".

7.20. [Pascal | C | Basic]  Выясните, верно ли, что в заданном предложении есть пара соседствующих одинаковых символов.

7.21. [Pascal | C | Basic]  Найдите хотя бы одно слово, которое встречается в каждом из трех заданных предложений.

7.22. [Pascal | C | Basic]  Отредактируйте заданное предложение, удаляя из него все слова с чётными номерами.

7.23. [Pascal | C | Basic]  В заданном предложении укажите слово, в котором доля гласных (A, E, I, O, U — строчных или прописных) максимальна.

7.24. [Pascal | C | Basic]  Дан текст из цифр и строчных латинских букв, за которым следует точка. Определите, каких букв — гласных (A, E, I, O, U) или согласных — больше в этом тексте.

7.25. [Pascal | C | Basic]  В заданную упорядоченную в лексикографическом (алфавитном) порядке последовательность слов вставьте новое заданное слово так, чтобы лексикографический порядок сохранился.

7.26. [Pascal | C | Basic]  В заданной последовательности слов найдите все слова, начинающиеся с заданной приставки.

7.27. [Pascal | C | Basic]  В заданной последовательности слов найдите все слова, имеющие заданное окончание.

7.28. [Pascal | C | Basic]  Найдите самое длинное и самое короткое слово в заданном предложении.

7.29. [Pascal | C | Basic]  В заданном тексте подсчитайте наибольшее количество подряд идущих пробелов.

7.30. [Pascal | C | Basic]  Для каждого из слов заданного предложения укажите, сколько раз оно встречается в предложении.

7.31. [Pascal | C | Basic]  Найдите самое длинное симметричное слово заданного предложения.

7.32. [Pascal | C | Basic]  Из заданного текста выберите и напечатайте те символы, которые встречаются в нём ровно один раз.

7.33. [Pascal | C | Basic]  Определите частоту вхождения в заданный текст каждой буквы русского алфавита.

7.34. [Pascal | C | Basic]  Дана последовательность слов, в которой слова разделены запятыми, а за последним словом — точка. Напечатайте:
  а) эту же последовательность слов, но в обратном порядке;
  б) все различные слова, указав для каждого из них число его вхождений в последовательность.

7.35*. [Pascal | C | Basic]  Отредактируйте заданное предложение, удаляя из него все лишние пробелы.

7.36*. [Pascal | C | Basic]  Из заданного предложения удалите те слова, которые уже встречались в предложении раньше.

7.37*. [Pascal | C | Basic]  Преобразуйте заданное десятичное натуральное число в римскую систему счисления.

7.38*. [Pascal | C | Basic]  Преобразуйте число, заданное в римской системе счисления, в число десятичной системы.

7.39. [Pascal | C | Basic]  Известны фамилии и имена учеников класса. Напечатайте список класса с указанием для каждого ученика количества его однофамильцев и тезок.

7.40. [Pascal | C | Basic]  В заданном предложении найдите такие слова, которые, не имея приставки, начинаются с заданного корня, содержат или не содержат произвольный суффикс и имеют одно из трех заданных окончаний. Найденные слова распечатайте в алфавитном порядке.

7.41. [Pascal | C | Basic]  Составьте целочисленный массив, элементами которого являются количества слов заданного текста на русском языке, начинающихся с соответствующей шипящей согласной ("ж", "ш", "ч"), прописной или строчной. Слова, содержащие менее трех букв, не учитывайте.

7.42*. [Pascal | C | Basic]  Упорядочьте слова заданного предложения по возрастанию количества букв. Затем слова с одинаковым количеством букв упорядочьте по алфавиту (лексикографически).

7.43*. [Pascal | C | Basic]  Определите, сколько слов заданного текста составлено из букв русского алфавита, а сколько — из букв латинского алфавита. Слова, в которых встречаются буквы обоих алфавитов, замените словом "Error".

7.44*. [Pascal | C | Basic]  В заданном тексте на русском языке найдите структуры, которые могут обозначать фамилии и инициалы упоминаемых в тексте лиц (например, Павлов И.П. или И.П. Павлов), приведите их к стандартной форме <инициалы> <пробел> <фамилия> и занесите в отдельный массив.