Алгоритмы обработки символьной информацииВ Паскале используют следующие типы данных для работы с текстом: 1. Символьный тип Char. Значением переменной этого типа может быть один символ: буква, цифра, знак препинания. 2. Строковый String[количество символов] . Значением переменной этого типа может быть последовательность символов. Значения переменных задаются в апострофах. a:=' f ' ; b:='+' ; c:='5' t:='Литерная величина' ; f:=' ' ; (пустая строка) Для данных символьного и литерного типов применимы операции сцепки (соединения, конкатенации) и сравнения (, =, =, ). Сравнивать можно строки разной длины. Сравнение осуществляется слева направо в соответствии с ASCII-кодами соответствующих символов. Так, строка "стол" меньше строки "стул", строка "teacher" больше строки "pupil", а строка "А" меньше строки "АВ".Процедуры Delete(Str, N,M) Удаляет M символов из строки Str, начиная с позиции N. Insert(SubS, S, N) Вставляет подстроку SubS в строку S, начиная с позиции N. Str(X, S) Переводит число Х в строку символов S содержащую цифры. Val(S , X, Code) Переводит строку S содержащую цифры в целое число. Параметр Code содержит признак ошибки преобразования (если Code = 0, ошибки нет). Функции A:=Chr(X) присваивает переменной А символ с порядковым номером Х. A:=Copy(S , N, M) присваивает переменной А фрагмент строки S, начиная с позиции N и длиной M символов. N:=Length(S) Присваивает переменной N количество символов в строке S. N:=Ord(X) Присваивает переменной N порядковый номер символа X в таблице кодов символов. N:=Pos(SubS, S) Присваивает переменной N номер позиции, начиная с которой в строке S располагается подстрока SubS (если значение функции равно нулю, то S не содержит SubS). ^ Пример 1. Составить программу осуществляющую вырезку из слова ИНТЕГРАЛ букв так, что бы из них получилось слово ТОРТ.Program n1;Uses crt;var a,b,c,d:string;BeginClrscr;a:='информатика';b:='';c:=copy(a,8,1);d:=copy(a,4,2);b:=c+d+c;writeln(b);readln;End.(Самостоятельно) 2. Получите из слова "ИНТЕГРАЛ" слова "ГАНТЕЛИ" , "РЕНТГЕН", "ТИГР" , "АГЕНТ".^ Пример 3. Сравнить длину двух строк введенных с клавиатуры.Program n2;Uses crt;var a,b:string;m,n:Integer;BeginClrscr;Writeln('ВВеди первую строку ');Readln(a);Writeln('ВВеди вторую строку ');Readln(b);m:=Length(a);n:=length(b);if (m=n) then writeln('Строки равны');if (m>n) then writeln('Первая больше');if (mreadln;End.Пример 4. Составить программу, подсчитывающую количество букв «А» в слове (слово ввести с клавиатуры)Program n4;Uses crt;var a,b,c:string;i,k:Integer;BeginClrscr;Writeln('ВВеди строку ');Readln(a);b:='А';k:=0;for i:=1 to length(a) dobeginc:=copy(a[i],1,1);if (c=b) then k:=k+1;end;Writeln(k);readln;End.Пример 5. Составить программу, осуществляющую переворот слов.Program n5;Uses crt;var a,b,c:string;i,k:Integer;BeginClrscr;Writeln('ВВеди строку ');Readln(a);b:='';for i:=length(a) downto 1 dobeginc:=copy(a[i],1,1);b:=b+c;end;a:=b;Writeln(a);readln;End.Пример 6. Составить программу заменяющую все буквы "А" на "О" в слове, введенном с клавиатуры.Program n6;Uses crt;var a,с,d:string;i,k:Integer;BeginClrscr;Writeln('ВВеди строку ');Readln(a);d:='';for i:=1 to length(a) dobeginс:=copy(a[i],1,1);if (с'A') then d:=d+с else d:=d+'O';end;a:=d;Writeln(a);readln;End.Пример 7. Составить программу , удаляющую букву «А» из данного текста(текст ввести с клавиатуры )Program n7;Uses crt;var a,b:string;i,n:Integer;BeginClrscr;Writeln('ВВеди слово ');Readln(a);n:=length(a);for i:=1 to n dobeginb:=copy(a[i],1,1);if (b='A') and (n>0) then begindelete(a,i,1);if (i>0) then i:=i-1;n:=n-1;end;end;Writeln(a);readln;End.(Самостоятельно) 8. Дан текст , представляющий собой алгебраическое выражение, проверить в нем парность скобок . Результат сообщить .9. Составить программу, подсчитывающую количества парных букв. Результат сообщить .^ 10. Составить программу исправляющую ошибки в правописании "ЖИ" и "ШИ" .11. Для оформления заголовков и логически важных слов , символы текста при печати чередуют с пробелами , т.е. раздвигают текст. Написать программу, которая выполняет такую операцию.12. По общим правилам оформления машинописных работ и служебных документов после знака препинания (. , : ;) ставится пробел. Составьте программу добавляющую недостающие пробелы.^ 13. Из данного текста удалить все буквы "С" которые предшествуют букве "Т"14. Составьте программу подсчитывающую количество слогов в слове. (Подсчитайте количество гласных букв , это и будет кол-во слогов)^ Пример 15. Вычислите сумму цифр натурального числа N.Program n15;Uses crt;var a,b:string;s,i,x,code:Integer;n:longint;BeginClrscr;Writeln('ВВеди число ');Readln(n);str(n,a);s:=0;for i:=1 to length(a) dobeginb:=copy(a[i],1,1);val(b,x,code);s:=s+x;end;Writeln(s);readln;End.(Самостоятельно) 16. Дан текст, содержащий две цифры меньше 10 и знак + (- , * , /) между ними. Составить программу находящую значение этого арифметического выражения. ^ 17. Вычеркните из слова все буквы стоящие на четных местах.18. Выясните, какая из букв "А" или "B" встречается в слове раньше.Program n18;Uses Crt;var a,c:string;i:integer;Flag:boolean;beginClrscr;Writeln('ВВеди строку ');readLn(a);Flag:=false;i:=1;while (ibeginc:=copy(a,i,1);if (c='A') or (c='B') then flag:=true;i:=i+1;end;if (c='A') then writeln('Раньше А') else writeln('Раньше В');readln;end.^ 19. Определить количество слов в заданном тексте.Если слова в тексте разделены одним пробелом, то задача сводится к подсчету числа пробелов. Количество слов при этом равно числу пробелов плюс 1. Если же число пробелов между соседними словами произвольное, как обычно и бывает, то алгоритм усложняется. Вариант 1Program n19; 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 {цикл по буквам текста}beginLetter:=Text[i];If (Letter = ' ' ) then Number:=Number+1;end; WriteLn('О т в е т : количество слов в тексте равно ', Number);END.^ 20. Заданную последовательность слов переупорядочить в алфавитном порядке (то есть выполнить лексикографическое упорядочение). Program N20; Uses Crt; Var W : Array[1..10] of String; {массив слов} Tmp : String; {Tmp - вспомогательная переменная} i, j, N : Integer; {NWords - количество слов}^ BEGIN ClrScr; Write('Количество слов в тексте - '); ReadLn(N); For i := 1 to N do begin Write(i, '-ое слово : '); ReadLn(W[i]); end; For i := 1 to N-1 do {лексикографическое упорядочение слов} For j := i+1 to N do If W[i]>W[j] then beginTmp := W[i]; W[i]:=W[j]; W[j]:=Tmp end; WriteLn; WriteLn('О т в е т'); WriteLn('Лексикографически упорядоченный массив слов:'); For i := 1 to N do Write(W[i], ' '); ^ WriteLn; ReadLnEND.Задачи для самостоятельного решения.7.1. Подсчитать количество запятых в заданном тексте. 7.2. Подсчитать, сколько раз в заданном тексте встречается заданный символ. 7.3. Определить долю пробелов в заданной строке. 7.4. Проверить, является ли заданное слово названием времени года на русском языке. 7.5. Заменить в заданном тексте буквосочетание "min" на "max". 7.6. В заданном тексте подсчитать общее количество букв "x" и "y". 7.7. В заданном тексте везде букву "а" заменить на букву "б", а букву "б" - на букву "а". 7.8. Удвоить каждую букву в заданном тексте. 7.9. В заданном слове каждую букву "б" заменить буквосочетанием "ку". 7.10. Вычеркнуть из заданного слова все буквы "а". 7.11. Подсчитать, сколько раз в заданном слове встречается буквосочетание "аб". 7.12. Заданную строку А переписать в обратном порядке в строку В. 7.13. Выяснить, есть ли в заданном предложении буква "ы". 7.14. Выяснить, верно ли, что в заданном предложении P есть все буквы, входящие в заданное слово S. 7.15. Определить количество предложений в заданном тексте (предложение заканчивается либо точкой, либо вопросительным или восклицательным знаком). 7.16 Определить долю гласных букв в заданном тексте на русском (английском) языке. 7.17. Определить, является ли одно заданное слово обращением другого заданного слова. 7.18. Из заданного текста удалить те его части, которые заключены в кавычки (вместе с кавычками). 7.19. Каждые n символов во введенном тексте отделить знаком "!". 7.20. Выяснить, верно ли, что в заданном предложении есть пара соседствующих одинаковых символов. 7.21. Найти хотя бы одно слово, которое встречается в каждом из трех заданных предложений. 7.22. Отредактировать заданное предложение, удаляя из него все слова с чётными номерами. 7.23. В заданном предложении указать слово, в котором доля гласных (A, E, I, O, U - строчных или прописных) максимальна. 7.24. Дан текст из цифр и строчных латинских букв, за которым следует точка. Определить, каких букв - гласных (A, E, I, O, U) или согласных - больше в этом тексте. 7.25. В заданную упорядоченную в лексикографическом (алфавитном) порядке последовательность слов вставить новое заданное слово так, чтобы лексикографический порядок сохранился. 7.26. В заданной последовательности слов найти все слова, начинающиеся с заданной приставки. 7.27. В заданной последовательности слов найти все слова, имеющие заданное окончание. 7.28. Найти самое длинное и самое короткое слово в заданном предложении. 7.29. В заданном тексте подсчитать наибольшее количество подряд идущих пробелов. 7.30. Для каждого из слов заданного предложения указать, сколько раз оно встречается в предложении. 7.31. Найти самое длинное симметричное слово заданного предложения. 7.32. Из заданного текста выбрать и напечатать те символы, которые встречаются в нём ровно один раз. 7.33. Определить частоту вхождения в текст каждой буквы русского алфавита. 7.34. Дана последовательность слов, в которой слова разделены запятыми, а за последним словом - точка. Напечатать: а) эту же последовательность слов, но в обратном порядке; б) все различные слова, указав для каждого из них число его вхождений в последовательность. 7.35*. Отредактировать заданное предложение, удаляя из него все лишние пробелы. 7.36*. Из заданного предложения удалить те слова, которые уже встречались в предложении раньше. 7.37*. Преобразовать заданное десятичное, натуральное число в римскую систему счисления. 7.38*. Преобразовать число, заданное в римской системе счисления, в число десятичной системы.