Планирование уроков на учебный год



Уроки 58 - 61
Работа с символьной информацией
Практикум
Практическая работа № 3.8
"Программирование обработки строк символов"












Символьный тип данных


Величина типа «символ» может принимать значения любых символов компьютерного алфавита. Символьная величина занимает 1 байт памяти, в котором хранится код этого символа, соответствующий используемой кодовой таблице. Заметим, что в Delphi наряду с однобайтовой кодировкой символов используется и двухбайтовая.

Символьная константа записывается между апострофами. Например: 1R', ' + ', '9', 'j'.

imageСимвольной тип называется Char. Пример описания символьных переменных:

Var c1, с2: Char;

imageСимвольный тип относится к порядковым типам данных. Из этого следует:

• символы — упорядоченное множество;

• у каждого символа в этом множестве есть свой порядковый номер;

• между символами работает соотношение «следующий — предыдущий ».

imageПорядковый номер символа — это его десятичный код, который лежит в диапазоне от 0 до 255. Например, в кодовой таблице ASCII десятичный код латинской буквы 'А' равен 65, а цифры '5' — 53. О стандартах кодирования символов рассказывалось на уроках 13 - 16 "Представление текста, изображения и звука в компьютере".

Функция Ord(x)


Ord(x) — функция от аргумента порядкового типа, которая возвращает порядковый номер значения х в этом типе данных. Если х — символьная величина, то результатом функции будет десятичный код х в кодовой таблице. Например:

Ord('А')= 65, Ord('5')= 53

Функция Chr (х)


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

Chr(65)='A', Chr(53)='5'

Поскольку коды символов лежат в диапазоне от 0 до 255, желательно тип х определять либо как byte, либо как интервальный тип 0..255.

imageПример 1. Составить программу на Паскале, по которой на экран будет выводиться таблица кодировки в диапазоне кодов от 32 до 255. Напомним, что символы с кодами, меньшими 32, являются управляющими (не экранными).

image

Значения выводятся парами: символ — код. В одной строке располагается 10 таких пар. Вся таблица разместится в 24 строках на экране.

Принцип последовательного кодирования алфавитов


imageВ любой кодовой таблице выполняется принцип последовательного кодирования латинского (английского) алфавита и алфавита десятичной системы счисления. Это важное обстоятельство, которое часто учитывается в программах обработки символьной информации.

При выполнении операций отношений, применительно к символьным величинам, учитываются коды этих величин. Чем больше значение кода, тем символ считается больше. Истинными являются следующие отношения: 'А' с 'В', 'Z' > 'Y', 'а' > 'А'. Значение символьной переменной С является прописной (заглавной) латинской буквой, если истинно логическое выражение:

(С >= 'А') and (C <= 'Z')

Значение символьной переменной С является цифрой, если истинно логическое выражение:

(С >= ’0') and (С <= '9')

В латинском алфавите 26 букв. Поэтому разница между кодами букв 'Z' и 'А', а также 'z' и 'а' равна 25.

imageПример 2. С помощью датчика случайных чисел заполнить массив Sim[0. .10] строчными английскими буквами. Затем массив отсортировать в алфавитном порядке.

image

При тестировании программы было получено:

Исходный массив: 
gnkbeqgmsin
Отсортированный массив: 
beggikmnnqs

image

Вопросы и задания


1. Как в программе на Паскале обозначаются символьные константы и переменные?

2. С помощью какой стандартной функции определяется код символа?

3. С помощью какой стандартной функции можно определить символ по его коду?

4. Что такое принцип последовательного кодирования алфавитов? Приведите примеры алгоритмов, где он может быть использован.

5. Определите результаты вычисления выражений (типы и значения):

image

6. Выполните на компьютере программы из примеров 1 и 2 данного параграфа. Протестируйте их работу.

Строки символов


Рассмотрим еще один структурный тип данных — строковый тип. Строковый тип данных был введен в Турбо Паскале. Он позволяет программировать обработку слов, предложений, текстов.

imageСтрока — это последовательность символов. Каждый символ занимает 1 байт памяти (код ASCII). Количество символов в строке называется ее длиной. Длина строки может находиться в диапазоне от 0 до 255. Строковые величины могут быть константами и переменными.

Строковая константа записывается как последовательность символов, заключенная в апострофы. Например:

' Язык программирования ПАСКАЛЬ'

' IBM PC - computer'

'33-45-12'

Строковая переменная описывается в разделе описания переменных следующим образом:

Var <идентификатор>: String[<максимальная длина строки>]

Например:

Var Name: String[20]

Параметр длины может и не указываться в описании. В таком случае подразумевается, что он равен максимальной величине — 255. Например:

Var slovo: String

Строковая переменная занимает в памяти на 1 байт больше, чем указанная в описании длина. Дело в том, что один (нулевой) байт содержит значение текущей длины строки. Если строковой переменной не присвоено никакого значения, то ее текущая длина равна нулю. По мере заполнения строки символами ее текущая длина возрастает, но она не должна превышать максимальной по описанию величины.

Символы внутри строки индексируются (нумеруются), начиная с единицы. Каждый отдельный символ идентифицируется именем строки с индексом, заключенным в квадратные скобки. Например:

Name[5], Name[i], slovo[k+1].

Значение индекса может быть задано положительной константой, переменной, выражением целочисленного типа. Оно не должно выходить за границы описания.

Тип String и стандартный тип Char совместимы: строки и символы могут употребляться в одних и тех же выражениях.

Строковые выражения строятся из строковых констант, переменных, функций и знаков операций. Над строковыми данными допустимы операция сцепления и операции отношения.

Операция сцепления (+) применяется для соединения нескольких строк в одну результирующую строку. Сцеплять можно как строковые константы, так и переменные.

Например:

'ЭВМ'+' 1ВМ'+' PC'

В результате получится строка:

'ЭВМ IBM PC'

Длина результирующей строки не должна превышать 255.

Операции отношения: =, <, >, <=, >=, < > производят сравнение двух строк, в результате чего получается логическая величина (true или false). Операции отношения имеют более низкий приоритет, чем операция сцепления. Сравнение строк производится слева направо до первого несовпадающего символа, и та строка считается больше, в которой первый несовпадающий символ имеет больший номер в таблице символьной кодировки.

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

image

Функции и процедуры


Функция Copy(S, Poz, N) выделяет из строки S подстроку длиной N символов, начиная с позиции Poz. N и Роz — целочисленные выражения.

image

Функция Concat (SI, S2, . . ., SN) выполняет сцепление (конкатенацию) строк S1,..., SN в одну строку.

image

Функция Length (S) определяет текущую длину строки S. Результат — значение целочисленного типа.

image

Функция Pos (SI, S2) обнаруживает первое появление в строке S2 подстроки S1. Результат — целое число, равное номеру позиции, где находится первый символ подстроки S1. Если в S2 не обнаружена подстрока S1, то результат равен 0.

image

Процедура Delete (S, Poz, N) удаляет N символов из строки S, начиная с позиции Poz.

image

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

Процедура Insert (SI, S2, Poz) выполняет вставку строки S1 в строку S2, начиная с позиции Poz.

image

Примеры программ обработки строк


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

image

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

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

image

В этой программе переменная К играет роль счетчика цифр, а переменная I — роль параметра цикла. Цикл закончит выполнение при первом же выходе на символ ' ! ' или если в строке такого символа нет, то при выходе на конец строки. Символ S[I] является цифрой, если истинно отношение: 'O’ ≤ S[I] ≤ '9'.

image

Вопросы и задания


1. Как в программе обозначается строковая константа, как определяется строковая переменная?

2. Какой может быть максимальная длина строки?

3. Составьте программу получения из слова «дисковод» слова «воск», используя операцию сцепления и функцию Сору.

4. Составьте программу получения слова «правило» из слова «операция», используя процедуры Delete, Insert.

5. В данном слове замените первый и последний символы на символ '*'.

6. В данном слове произведите обмен первого и последнего символов.

7. К данному слову присоедините столько символов '!', сколько в нем имеется букв (например, из строки 'УРА' надо получить 'УРА!!!').

8. В данной строке вставьте пробел после каждого символа.

9. Переверните введенную строку (например, из 'ДИСК' должно получиться 'КСИД').

10. В данной строке удалите все пробелы.

11. Строка представляет собой запись целого числа. Составьте программу ее перевода в соответствующую величину целого типа.



Практикум


Работа 3.8. Программирование обработки строк символов


Задание


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

Уровень 1


1. Дана строка, заканчивающаяся точкой. Подсчитать, сколько слов в строке.

2. Дана строка, содержащая английский текст. Найти количество слов, начинающихся с буквы «b».

3. В строке заменить все двоеточия (:) точкой с запятой (;). Подсчитать количество замен.

4. Дана строка. Преобразовать ее, заменив звездочками все двоеточия (:), встречающиеся среди первых n/2 символов, и заменив точками все восклицательные знаки, встречающиеся среди символов, стоящих после n/2 символов. Здесь n - длина строки.

5. В строке удалить символ двоеточие (:) и подсчитать количество удаленных символов.

6. Дана строка символов, среди которых есть одна открывающаяся и одна закрывающаяся скобки. Вывести на экран все символы, расположенные внутри этих скобок.

7. Дана строка, содержащая текст. Найти длину самого короткого и самого длинного слов.

8. Дана строка, содержащая текст, заканчивающийся точкой. Вывести на экран все слова, содержащие три буквы. Если таких слов нет, то вывести сообщение об этом.

9. Дана строка. Преобразовать ее, удалив каждый символ * и повторив дважды подряд каждый символ, отличный от *.

10. Дана строка текста. Подсчитать количество букв «k» в последнем слове.

11. Определить, сколько раз в тексте встречается заданное слово.

Уровень 2


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

13. Дана строка. Подсчитать, сколько различных символов встречается в ней. Вывести их на экран.

14. Дана строка. Подсчитать самую длинную последовательность подряд идущих букв «а».

15. Имеется строка, содержащая буквы латинского алфавита и цифры. Вывести на экран длину наибольшей последовательности цифр, идущих подряд.

16. Дана строка. Указать те слова, которые содержат хотя бы одну букву «k».

17. Дана строка. Найти в ней те слова, которые начинаются и оканчиваются одной и той же буквой.

18. Строка содержит одно слово. Проверить, будет ли оно читаться одинаково справа налево и слева направо (т. е. является ли оно палиндромом).

19. В записке слова зашифрованы — каждое из них записано наоборот. Расшифровать сообщение.

20. Статистика. Дан текст. Написать программу, определяющую процентное отношение строчных и прописных букв к общему числу символов в нем.

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

Уровень 3


22. Из заданной символьной строки выбрать те символы, которые встречаются в ней только один раз, в том порядке, в котором они встречаются в тексте.

23. Расстояние между двумя словами равной длины — это количество позиций, в которых эти слова различаются. В заданном предложении найти пару слов заданной длины с максимальным расстоянием.

24. Форматирование текста. Дан текст, состоящий из предложений, разделяемых точками. Напишите программу, производящую следующее форматирование: после каждой точки в конце предложения должен стоять хотя бы один пробел; первое слово в предложении должно начинаться с прописной буквы.

Замечание. Текст может быть как на русском, так и на английском языке.

25. Лишние пробелы. Дана строка, состоящая из слов, разделенных пробелами. Напишите программу, удаляющую лишние пробелы. Пробел считается лишним, если он:

• стоит в начале строки;
• стоит в конце строки;
• следует за пробелом.

26. Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Вывести строку, содержащую эти же слова (разделенные одним пробелом), но расположенные в обратном порядке.

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

28.
а) Дана строка-предложение. Зашифровать ее, поместив вначале все символы, расположенные на четных местах, а затем, в обратном порядке, все символы, расположенные на нечетных местах. (Например, строка 'Программа' превратится в 'ргамамроП'.)
б) Запрограммировать решение обратной задачи (расшифровки).







Наверх