Тема: Строковый тип данных. Обработка строк Строковый тип данных Строка представляет собой особую форму одномерного массива символов, которая имеет существенное отличие. Массив символов имеет фиксированную длину (количество элементов), которая определяется при описании. Строка имеет две разновидности длины: Общая длина строки, которая характеризует размер памяти, выделяемый строке при описании; Текущая длина строки (всегда меньше или равна общей длине), которая показывает количество смысловых символов строки в каждый конкретный момент времени. Строка – упорядоченная последовательность символов. Количество символов в строке называется ее длиной. Длина строки может лежать в диапазоне от 0 до 255. Каждый символ строковой величины занимает 1 байт памяти и имеет числовой код в соответствии с таблицей кодов ASCII. Код ASCII (American Code for Information Interchange – Американский стандартный код для обмена информацией) имеет основной стандарт и его расширение. Основной стандарт использует шестнадцатеричные коды 00-7F, расширение стандарта – 80-FF. Основной стандарт является международным и используется для кодирования управляющих символов, цифр и букв латинского алфавита; в расширении стандарта используются символы псевдографики и буквы национальных алфавитов. Базовая таблица кодировки ASCII 32 пробел 48 0 64 @ 80 P 96 ` 112 p 33 ! 49 1 65 A 81 Q 97 a 113 q 34 " 50 2 66 B 82 R 98 b 114 r 35 51 3 67 C 83 S 99 c 115 s 36 $ 52 4 68 D 84 T 100 d 116 t 37 % 53 5 69 E 85 U 101 e 117 u 38 & 54 6 70 F 86 V 102 f 118 v 39 ‘ 55 7 71 G 87 W 103 g 119 w 40 ( 56 8 72 H 88 X 104 h 120 x 41 ) 57 9 73 I 89 Y 105 i 121 y 42 58 : 74 J 90 Z 106 j 122 z 43 + 59 ; 75 K 91 [ 107 k 123 { 44 , 60 < 76 L 92 \ 108 l 124 | 45 - 61 = 77 M 93 ] 109 m 125 } 46 . 62 > 78 N 94 ^ 110 n 126 ~ 47 / 63 79 O 95 _ 111 o 127 Строковая константа – последовательность символов, заключенная в апострофы. Например, ‘строковая константа’, ‘243’. Два следующих друг за другом апострофа (‘’) обозначают пустую строку, т.е. строку с нулевой длиной. Описание строковой переменной Для описания строковых переменных в Паскале существует предопределенный тип string. В общем виде описание строковой переменной будет выглядеть следующим образом: Var <имя_переменной>: string [<максимальная длина строки>] Например: Var s1: string[10]; s2: string[20]; smax: string; В приведенном выше описании строковая переменная s1 может содержать не более 10 символов, переменная s2 – не более 20 символов. Если же при описании строки ее максимальная длина не указывается, то по умолчанию принимается максимально допустимая длина, равная 255 символам (переменная smax). Символы в строке упорядочены, каждый из них имеет порядковый номер, начиная с первого. Имеется возможность обратиться к любому элементу строки, указав его номер, так же как это делается в одномерных массивах. Например, s1[2] позволяет обратиться ко второму символу в строке s1, при этом мы можем поменять это значение, выполнив оператор присваивания s1[2]:= ‘r’, можем вывести на экран это значение или присвоить его другой переменной. Действия со строками Операция слияния (сцепления, конкатенации) применяется для соединения нескольких строк в одну, обозначается знаком «+». Операция слияния применима для любых строковых выражений, как констант, так и переменных. Операции отношения позволяют сравнивать строки на отношение равенства (=), неравенства (<>), больше (>), меньше (<), больше или равно (>=), меньше или равно (<=). В результате сравнения двух строк получается логическое значение (true или false). Сравнение строк производится слева направо посимвольно до первого несовпадающего символа, большей считается та строка, в которой первый несовпадающий символ имеет больший код в таблице кодировки. Если строки имеют различную длину, но в общей части символы совпадают, считается, что короткая строка меньше. Строки равны, если они имеют равную длину и соответствующие символы совпадают. Например: ‘строка’<>’строки’ (верно, т.к. не совпадают последние символы); ‘Abc’<’abc’ (отношение истинно, т.к. код символа ‘A’ равен 65 в десятичной системе счисления, а код символа ‘a’ – 97); ‘год’>’век’ (отношение верно, т.к. буква ‘г’ в алфавите стоит после буквы ‘в’, а, следовательно, имеет больший код). Стандартные функции для работы со строками Copy(S, poz, n) выделяет из строки S, начиная с позиции poz, подстроку из n символов. Здесь S – любое строковое выражение, poz, n – целочисленные выражения. Значение S Выражение Результат ‘строка символов’ Copy(S,3,3) ‘рок’ Concat(s1, s2,...,sn) выполняет слияние строк s1, s2,...,sn в одну строку. Выражение Результат Concat(‘язык’, ‘ ‘, ‘Pascal’) ‘язык Pascal’ Length(S) определяет текущую длину строкового выражения S. Результат – значение целого типа. Значение S Выражение Результат ‘(а+в)*с’ Length(s) 7 Pos(subS, S) определяет позицию первого вхождения подстроки subS в строку S. Результат – целое число, равное номеру позиции, где находится первый символ искомой подстроки. Если вхождение подстроки не обнаружено, то результат функции будет равен 0. Значение S Выражение Результат ‘предложение’ Pos(‘е’, S) 3 ‘предложение’ Pos(‘а’, S) 0 Стандартные процедуры для работы со строками Delete(S, poz, n) удаляет из строки S, начиная с позиции poz, подстроку из n символов. Здесь S – строковая переменная (в данном случае нельзя записать никакое другое строковое выражение, кроме имени строковой переменной, т.к. только с именем переменной связана область памяти, куда будет помещен результат выполнения процедуры); poz, n – любые целочисленные выражения. Исходное значение S ‘abcdefg’ Оператор процедуры Delete(s, 2, 3) Конечное зн-е S ‘aefg’ Insert(subS, S, poz) вставляет в строку S, начиная с позиции poz, подстроку subS. Здесь subS – любое строковое выражение, S – строковая переменная (именно ей будет присвоен результат выполнения процедуры), poz – целочисленное выражение. Исходное значение S ‘рис. 2’ Оператор процедуры Insert(‘№’, S, 6) Конечное зн-е S ‘рис. №2’ Процедуры преобразования типов Str(x, S) преобразует число x в строковый формат. Здесь x – любое числовое выражение, S – строковая переменная. В процедуре есть возможность задавать формат числа x. Например, str(x: 8: 3, S), где 8 – общее число знаков в числе x, а 3 – число знаков после запятой. Оператор процедуры Str (sin(1):6:4, S) Str (3456, S) Значение S ‘0.0175’ ‘3456’ Val (S, x, kod) преобразует строку символов S в число x. Здесь S – строковое выражение, x – числовая переменная (именно туда будет помещен результат), kod – целочисленная переменная (типа integer), которая равна номеру позиции в строке S, начиная с которой произошла ошибка преобразования, если преобразование прошло без ошибок, то переменная kod равна 0. Тип x Real Integer Оператор процедуры Val(’12.34’, x, kod) Val(’12.34’, x, kod) Значение x 12.34 12 Значение kod 0 3 Лабораторная работа №7 Тема: Строковый тип данных. Обработка строк. Задание 1 Задание: составить программу решения задачи. Указание к выполнению: перед составлением программы необходимо выполнить следующие этапы: 1. Определить сколько и каких переменных потребуется для решения задачи. 2. Определить входные данные и способ их задания. 3. Определить, что должно быть получено в результате выполнения программы. 4. Записать словами по шагам ход решения задачи. Образец выполнения задания Задача: С/Pascal. Дана строка символов. Заменить все вхождения символа '{' на 'begin', а каждое вхождение символа '}' — на 'end'. 1. Для решения данной задачи мне потребуются следующие переменные: S для ввода строки, тип переменной - string; k, h целочисленные переменные для определения позиции соответственно ‘{‘ и ‘}’. 2. Входными данными в данной задаче является строка S, ввод строки буду осуществлять с клавиатуры. 3. В результате выполнения программы на экран должна быть выведена преобразованная строка S. 4. Ход решения задачи: - ввод строки S; - определю первую позицию символа ‘{‘ в строке S с помощью следующего оператора: k:= pos(‘{‘, S); - т.к. символ ‘{‘ может встречаться в строке S несколько раз, организую цикл, который можно записать следующим образом: пока k<>0 повторять а) удалить из строки S, начиная с позиции k один символ; б) вставить в строку S подстроку ‘begin’, начиная с позиции k в) определить следующую позицию символа ‘{‘ - определю первую позицию символа ‘}‘ в строке S с помощью следующего оператора: h:= pos(‘}‘, S); - т.к. символ ‘}‘ может встречаться в строке S несколько раз, организую цикл, который можно записать следующим образом: пока h<>0 повторять а) удалить из строки S, начиная с позиции h один символ; б) вставить в строку S подстроку ‘end’, начиная с позиции h в) определить следующую позицию символа ‘}‘ - вывести на экран преобразованную строку S. Текст программы Program zadacha6_1; Var S: string; k,h: integer; Begin Writeln(‘введите строку’); Readln( S); k:=pos(‘{‘, S); While k<>0 do Begin Delete(S, k, 1); Insert(‘begin’, S, k); K:=pos(‘{‘, S); End; h:=pos(‘}‘, S); While h<>0 do Begin Delete(S, h, 1); Insert(‘end’, S, h); h:=pos(‘}‘, S); End; Writeln( S); End. Дальнейшие действия: откомпилировать и запустить программу, ввести данные, записать полученный результат. При необходимости использовать пошаговый режим выполнения программы с отслеживанием значений переменных. Вариант 1 Байты. Дана строка символов. Определить, является ли она последовательностью байтов. Байт — две идущие подряд шестнадцатеричные цифры. Примечание. Незначащие нули, если они имеются, также указываются при записи байтов. Примеры: Введите строку: Ответ: Введите строку: Ответ: FF0976 является 567FA не является Вариант 2 Системы счисления. Вводится строка символов. Если она является изображением целого числа в восьмеричной системе счисления, то перевести ее в целое число в десятичной системе счисления, иначе выдать сообщение о некорректном вводе. Вариант 3 Системы счисления. Вводится строка символов. Если она является изображением целого числа в шестнадцатеричной системе счисления, то перевести ее в целое число в десятичной системе счисления, иначе выдать сообщение о некорректном вводе. Вариант 4 Системы счисления. Вводится строка символов. Если она является изображением целого числа в двоичной системе счисления, то перевести ее в целое число в десятичной системе счисления, иначе выдать сообщение о некорректном вводе. Вариант 5 ANSI C & Borland C. Согласно стандарту ANSI С, при задании пути к файлу в программе на языке С, каталоги разделяются символом "/", а в стандарте фирмы Borland для разделения каталогов используется последовательность символов "\\". Написать программу, которая переводит строку, содержащую путь к файлу в стандарте ANSI С, в строку, содержащую путь к файлу в стандарте фирмы Borland. Пример: Путь в ANSI C > C:/MYDOCS/TEX/DOC1.TEX Путь в Borland C > C:\\MYDOCS\\TEX\\DOC1.TEX Вариант 6 Расстановка длинных тире. Символ &#151; в HTML-документе представляет собой длинное тире, которое при просмотре страницы выглядит гораздо привлекательней обычного ‘-‘ . Поэтому эстеты Веб-дизайна предпочитают использовать именно его. Дан текст, содержащий символы ‘-‘. Заменить их на символы ‘&#151;’. Вариант 7 DOS-Unix. Дана строка, содержащая путь к файлу или каталогу, записанный по соглашениям, принятым в ОС MS DOS. Преобразовать данную строку таким образом, чтобы она содержала путь в формате ОС Unix, то есть заменить каждый символ "\" на символ "/". Пример: Путь DOS: С:\WINDOWS\SYSTEM Путь Unix: C:/WINDOWS/SYSTEM Вариант 8 Тэг курсива. Дан текст, в котором встречаются структуры ‘<i>’ и ‘</i>’. Заменить каждое вхождение ‘<i>’ на ‘<курсив>’, а каждое вхождение ‘</i>’ на ‘<конец курсив>’. Замечание. В программе следует учесть, что буква ‘i’ может быть как строчной, так и прописной. Вариант 9 Форматированный вывод числа. С клавиатуры вводится целое число в десятичной системе счисления. Написать программу, реализующую вывод его представления с разделением на триады цифр. Пример: Число: 100000 Форматированный вывод: Число: Форматированный вывод: 100 000 1000000 1 000 000 Вариант 10 Форматирование текста. Дан текст, состоящий из предложений, разделяемых точками. Напишите программу, производящую следующее форматирование: после каждой точки в конце предложения должен стоять хотя бы один пробел; первое слово в предложении должно начинаться с прописной буквы. Замечание. Текст должен быть на русском языке. Вариант 11 Лишние пробелы. Дана строка, состоящая из слов, разделенных пробелами. Напишите программу, удаляющую лишние пробелы. Пробел считается лишним, если он - стоит в начале строки; - стоит в конце строки; - следует за пробелом. Вариант 12 FTP-Connection. Пользователю, зарегистрированному на FTP-сервере, для получения доступа к файлам на нем нужно набрать в FTP-браузере команду вида: ftp://логин:пароль@адрес_сервера. Написать программу, которая из введенной строки выделяет логин, пароль и адрес FTP-сервера и печатает эту информацию. Пример: Входная строка: ftp://CoolUser:[email protected] Вывод: Адрес сервера: ftp.erunda.ru Логин: CoolUser Пароль: parol Вариант 13 Шифрация. Один из методов шифрации называется наложением гаммы. Делается это следующим образом: берется некоторое случайное число в диапазоне от 127 до 255 — гамма, и код каждого символа строки заменяется кодом, получающимся в результате операции: новый код=старый код XOR гамма. Написать программу, реализующую а) данный метод шифрации; б) дешифрацию строки при заданной гамме. Вариант 14 Системы счисления. Вводится строка символов. Если она является изображением целого числа в двоичной системе счисления, то вывести его шестнадцатеричное представление, иначе выдать сообщение о некорректном вводе. Примечание. Использовать промежуточный перевод в десятичную систему счисления не разрешено. Вариант 15 Системы счисления. Вводится строка символов. Если она является изображением целого числа в двоичной системе счисления, то вывести его восьмеричное представление, иначе выдать сообщение о некорректном вводе. Примечание. Использовать промежуточный перевод в десятичную систему счисления не разрешено. Задание 2 Задание: составить программу решения задачи. Указания к выполнению: выполнить все этапы лабораторной работы самостоятельно. Вариант 1 Создание шаблона электронного письма. Некая почтовая программа при создании письма использует следующую технологию. Она берет имя получателя и помещает его после приветствия. Затем следует место для текста сообщения, после него — подпись отправителя. Имена получателя и отправителя программа берет из их электронных адресов. Напишите программу, реализующую данное действие. Входные данные: электронный адрес адресата; электронный адрес отправителя. Выходные данные: шаблон сообщения. Пример: Входные данные: Кому: [email protected] От кого: [email protected] Текст сообщения: Поздравляю тебя с совершеннолетием! Желаю здоровья и долголетия. Вывод на экран: Здравствуй, Bilbo! Поздравляю тебя с совершеннолетием! Желаю здоровья и долголетия. С уважением, Gandalf. Вариант 2 Вычисление арифметического выражения. Дан массив строк, в которых записаны арифметические выражения. Арифметическое выражение вводится в виде строки вида A op B, где А и В — целые числа, а op — знак арифметической операции: +, -, *, /. Написать программу, вычисляющую значение выражения и дописывающую результат в конце каждой строки. Вариант 3 "Поставил begin — поставь и end." (из высказываний студентов). Дан массив строк, представляющий собой фрагмент программы на языке Pascal. Напишите программу, проверяющую правильность вложения операторных скобок begin ... end — каждому begin должен соответствовать end. Вариант 4 Удаление комментариев. Дан массив строк, представляющий собой текст программы на языке Паскаль. Требуется написать программу удаления комментариев. Комментарий — последовательность символов, заключенная между "{" и "}" или между “(*” и “*)”. Комментарий может быть многострочным, т.е. начинаться в одной строке, а заканчиваться в другой. Вариант 5 Оптимизатор исходного кода. Для увеличения значения целочисленной переменной на 1 в языках программирования можно использовать операции сложения, а можно операцию инкремент. Известно, что операция инкремент выполняется гораздо быстрей, чем сложение, поэтому их использование часто предпочтительней. Дан массив строк, представляющий фрагмент текста программы на языке Паскаль. Известно, что данный фрагмент оперирует только с целочисленными переменными. В каждой строке — одна команда. Преобразовать данный текст, заменив каждую строку вида: <переменная> := <переменная> + 1; на строку вида: Inc(<переменная>). Пример Исходный текст: Begin ReadLn(a, b); a := a + 1; c := b + 1; writeLn('a = ', a); WriteLn('с =', с) End. Преобразованный текст: Begin ReadLn(a, b); Inc(a); c := b + 1; writeLn('a = ', a); WriteLn('c = ', c) End. Вариант 6 Оптимизатор исходного кода. Для уменьшения значения целочисленной переменной на 1 в языках программирования можно использовать операции вычитания, а можно операцию декремент. Известно, что операция декремент выполняется гораздо быстрей, чем вычитание, поэтому их использование часто предпочтительней. Дан массив строк, представляющий фрагмент текста программы на языке Паскаль. Известно, что данный фрагмент оперирует только с целочисленными переменными. В каждой строке — одна команда. Преобразовать данный текст, заменив каждую строку вида: <переменная> := <переменная> – 1; на строку вида: Dec(<переменная>); Пример Исходный текст: Begin ReadLn(a, b); c := b - 1; b := b - 1; WriteLn('с = ', с); WriteLn('b =', b) End. Преобразованный текст: Begin ReadLn(a, b); c := b - 1; Dec(b); WriteLn('с = ', с); WriteLn('b = ', b) End. Вариант 7 Выравнивание по ширине. Дан массив строк. Выровнять длины строк массива по самой длинной строке вставляя дополнительные пробелы между словами. Пример Исходный массив: Наша Таня громко плачет, Уронила в речку мячик. Тише, Танечка, не плачь, Не утонет в речке мяч. Результат: Наша Таня громко плачет, Уронила в речку мячик. Тише, Танечка, не плачь, Не утонет в речке мяч. Вариант 8 Выравнивание по центру. Дан массив строк. Выровнять строки массива по центру экрана (считать, что на экране помещается 80 символов) добавляя недостающие пробелы в начало и конец строки. Пример Исходный массив: Наша Таня громко плачет, Уронила в речку мячик. Тише, Танечка, не плачь, Не утонет в речке мяч. Результат: Наша Таня громко плачет, Уронила в речку мячик. Тише, Танечка, не плачь, Не утонет в речке мяч. Вариант 9 Шифрование перестановкой. При шифровании перестановкой сами символы остаются неизменными, но меняют свою позицию. При таком шифре нельзя прочитать первоначальный текст, не зная ключа. Рассмотрим один из самых простых типов шифров перестановки с помощью таблицы. Для примера возьмем известные строки А.С. Пушкина: О сколько нам открытий чудных Готовит просвещенья дух И опыт – сын ошибок трудных, И гений – парадоксов друг, И случай – бог-изобретатель Запишем их в виде таблицы в порядке следования символов в фразе о с к о л ь к о н а м о т к р ы т и й ч у д н ы х г о т о в и т п р о с в е щ е н ь я д у х и о п ы т - с ы н о ш и б о к т р у д н ы х , и г е н и й - п а р а д о к с о в д р у г , и с л у ч а й - б о г - и з о б р е т а т е л ь А теперь выпишем этот текст, только не по строкам, а по столбцам, слева направо, получится шифрованное сообщение: Очнодг уько-сдя кикн тсзоыдроолхуувбь хд ркг ндеооиырт т хуаноо,гтавпи,емиы ил ттг ьо –ес тпснл крыиу ронйч ыс –а твопй иеша- йщирб ебао Прочесть такое сообщение затруднительно. Его нелегко взломать, даже если известен принцип: шифрование перестановкой с помощью таблицы. Ключом в данном случае является размерность таблицы, а также принцип составления слов (столбцы можно было читать и справа налево или «змейкой»). Составить программу, шифрующую исходный текст перестановкой с помощью таблицы. Вариант 10 Дизассемблер. Некая ЭВМ имеет 8 регистров (R0–R7) и умеет выполнять три операции — останов, сложение и пересылку из регистра в регистр. Команда останова: 00 00 00. Формат команд сложения и пересылки: КОП РегИ, РегН КОП: код операции — 01 для пересылки и 02 для сложения РегИ — регистр-источник — из него данные извлекаются при выполнении операции; РегН — регистр-назначение — в него записывается результат выполнения операции. Машинная команда записывается в восьмеричном виде, где: первые две цифры – КОП; 3-4 цифры – РегИ (0-7); 5-6 цифры – РегН (0-7). Например: 01 02 05 – переслать число из регистра 2 в регистр 5; 02 01 03 – сложить числа, находящиеся в регистрах 1 и 3, результат поместить в регистр 3. Дан массив, содержащий команды на машинном языке в восьмеричном коде. В каждой строке массива — одна команда. Написать программудизассемблер, которая для каждой команды, введенной в машинном коде, выводит ее изображение в мнемокоде. Для команды останова использовать мнемонику HALT; для пересылки — мнемонику MOV, а для команды сложения — ADD. Дизассемблирование продолжается до первой встреченной команды останова. Если введена некорректная машинная команда, то должно выдаваться соответствующее сообщение об ошибке. Вариант 11 Выравнивание по левому краю. Дан массив строк. Преобразовать массив так, чтобы при выводе на экран строки были выронены по левому краю экрана (на экране помещается 80 символов). Пример Исходный массив: Наша Таня громко плачет, Уронила в речку мячик. Тише, Танечка, не плачь, Не утонет в речке мяч. Результат: Наша Таня громко плачет, Уронила в речку мячик. Тише, Танечка, не плачь, Не утонет в речке мяч. Вариант 12 Шифрование текста. Дан исходный открытый текст. К нему применяется следующий ключ замены (см. таблицу): А Б Т Т В Г Д Е Ж З И Й К Л М Н О П У Ф Х Ц Ч Ш Щ Ъ А Б В Г У Ф Х Й К Л Ц Ч Ш Щ Ъ Ы Ь М Н О П Р С Ь Э Д Е Э Ж З И Ю Я Ю Я Р С _ Ы _ К полученному тексту вновь применяется ключ замены и т.д. Через сколько таких замен появится исходный текст? Вариант 13 Шифрование текста. Дан исходный открытый текст (Т). Необходимо зашифровать его с бесконечным ключом (К). В качестве ключа примем произвольный текст такой же длины как и шифруемый текст. Воспользуемся таблицей шифров для букв русского алфавита: А Б В Г Д Е Ж З И Й К Л М Н О П Р С 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я _ 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 Для получения самого шифротекста (Е) применим следующее правило: код(Еi)=(код(Тi)+код(Кi)) mod 33 Пример Т (исходный текст): ШИФРОВАНИЕ К (ключ): СВЕТИЛЬНИК Е (шифротекст): (26+18) mod 33 = 11 соответствует букве К (09+03) mod 33 = 12 соответствует букве Л (21+06) mod 33 = 28 соответствует букве Ы (17+19) mod 33 = 03 соответствует букве В (15+09) mod 33 = 24 соответствует букве Ч (03+12) mod 33 = 15 соответствует букве О (01+29) mod 33 = 30 соответствует букве Э (14+14) mod 33 = 28 соответствует букве Ы (09+09) mod 33 = 18 соответствует букве С (06+11) mod 33 = 17 соответствует букве Р Е= КЛЫВЧОЭЫСР Вариант 14 Дан массив строк, содержащий результаты табулирования функции на отрезке: каждая строка содержит два числа, соответственно значения X и Y; числа разделены пробелом. Преобразовать данный массив так, чтобы на экране он выводился в виде таблицы, перед выводом массива напечатать заголовок, в заголовке указать, на каком отрезке произведено табулирование функции и с каким шагом (данные получить из массива). Пример: Исходный массив: -1 2.34 -0.8 2.567 -0.6 2.87 -0.4 3.0 -0.2 3.12 0 3.06 Вывод на экран: Заголовок: Таблица значений функции на отрезке [-1, 0] с шагом 0.2 Шапка таблицы: X | Y ---------------Массив: -1 | 2.34 -0.8 | 2.567 -0.6 | 2.87 -0.4 | 3.0 -0.2 | 3.12 0 | 3.06 Тема: Множества Еще одним фундаментальным классом данных являются данные, структурированные в виде множеств. О перечисляемых типах Мы уже рассматривали три скалярных типа, которые, в принципе, являются перечисляемыми типами, – это boolean, char и integer. В самом деле, ведь каждый из этих типов можно задать следующим образом: type Boolean= (false, true); char= #0..#255; integer= -32768..32767; (Представление #xxx означает, что должен быть взят символ, чей код в таблице ASCII равен xxx). Это базовые типы, которые не требуется задавать каждый раз, уже определены в системе именно таким образом. Кроме них имеется еще несколько интервальных типов, с некоторыми из которых мы знакомы: shortint= -128..127; longint= -2147483648..247483647; byte= 0..255; word= 0..65535; Переменные, имеющие эти типы, могут принимать значения, лежащие в границах соответствующих интервалов. Для работы с перечисляемыми типами существуют следующие функции, которые хранятся в библиотеке системных функций, и программист имеет к ним доступ: ord(N) – возвращает номер элемента N в множестве; succ(N) – возвращает следующее значение для N; pred(N) – возвращает предыдущее значение для N. Пользователь имеет возможность описать собственный перечисляемый тип данных. В общем виде это описание выглядит так: type <имя_типа>=(<идентификатор1>,<идентификатор2>, ..,<идентификаторN>); В скобках перечисляются все возможные значения, которые может принимать переменная данного типа. Следует запомнить, что названия значений нельзя давать по-русски (это важно!). Например, мы можем описать тип данных color и перечислить семь основных цветов: type color=(red, orange, yellow, green, blue, magenta); При этом значения получают номера в порядке их перечисления, начиная с 0. Поэтому для данного типа справедливыми будут отношения элементов: red< orange< yellow< green< blue< magenta; ord(red)=0; succ(blue)= magenta; pred(green)=yellow; Множества Тип данных множество напоминает перечислимый тип данных. Вместе с тем множество – набор элементов не организованных в порядке следования. В математике множества – любая совокупность элементов произвольной природы. Операции, которые производятся над множествами, по существу заключаются во включении и исключении элементов из множества. Понятие множества в языке программирования значительно уже математического понятия. В Паскале под множеством понимается конечная совокупность элементов, принадлежащих некоторому базовому типу данных. В качестве базовых типов могут использоваться: - перечислимые типы; - символьный; - байтовый; - диапазонные на основе вышеперечисленных. Такие ограничения связаны с формой представления множества в языке и могут быть сведены к тому, чтобы функция ord() для используемого базового типа лежала в пределах от 0 до 255. После того, как базовый тип задан, совокупность значений соответствующего множественного типа определяется автоматически. В нее входят все возможные множества, являющиеся произвольными комбинациями значений базового типа. Все эти множества являются отдельными значениями определенного множественного типа. Описание типа множество Type <имя_типа>= set of <базовый_тип> Например: Type symbol= set of char;{описан множественный тип symbol из букв} Var letter, digits, sign: symbol; {описаны три переменные множественного типа} Для того чтобы придать переменной типа множества значение, используют конструктор множества – перечисление элементов множества через запятую в квадратных скобках. Например, sign:= [‘+’, ‘-‘]; Конструктор множества может содержать диапазон значений базового типа. Тогда во множество включаются все элементы диапазона. Например, digits:= [‘0’ .. ‘9’]; letter:= [‘a’ .. ‘z’]; Обе формы конструирования множеств могут сочетаться. Например, letter:= [‘a’ .. ‘z’, ‘A’ .. ‘Z’]; Конструктор вида [] обозначает пустое множество. В программе можно использовать множества как константы, в этом случае их определяют следующим способом: Const YesOrNo= [‘Y’, ‘y’, ‘N’, ‘n’]; Множество можно определить как типизированную константу: Const digits: set of char= [‘0’ .. ‘9’]; При описании множеств как констант допускается использование знака “+” (слияние множеств). Например, Const Yes= [‘Y’, ‘y’]; No= [‘N’, ‘n’]; YesOrNo= Yes+ No; Операции над множествами С множествами можно выполнять действия объединения, исключения и пересечения. Объединение множеств содержит элементы, которые принадлежат хотя бы одному множеству, при этом каждый элемент входит в объединение только один раз. Операция объединения множеств обозначается знаком ‘+’. Например: Type symbol= set of char; Var small, capital, latin: symbol; ……………… small:= [‘a’ .. ‘z’]; capital:= [‘A’ .. ‘Z’]; latin:= small + capital; {образовано множество латинских букв путем объединения множеств small и capital} Возможно объединять множества и отдельные элементы. Например, small:= [‘c’ .. ‘z’]; small:= small + [‘a’] +[‘b’]; Исключение определяется как разность множеств, в котором из уменьшаемого исключаются элементы, входящие в вычитаемое. Если в вычитаемом есть элементы, отсутствующие в уменьшаемом, то они никак не влияют на результат. Операция исключения обозначается знаком ‘-‘. Например: letter:= [‘a’ .. ‘z’]; {множество букв латинского алфавита} glasn:= [‘a’, ‘e’, ‘o’, ‘u’, ‘i’, ‘y’]; {множество гласных букв} soglasn:= letter- glasn; {образовано множество согласных букв путем исключения из множества всех букв множества гласных букв} Пресечение множеств – множество, содержащее элементы, одновременно входящие в оба множества. Операция пересечения множеств обозначается знаком ‘*’. Например: Type chisla= set of byte; Var z,x,y: chisla; ……….. x:= [0..150]; y:= [100..255]; z:= x*y {получено множество чисел из диапазона 100..150 в результате пересечения двух множеств} Операции отношения Наряду с рассмотренными выше операциями, над значениями множественного типа определены и некоторые операции отношения. Операндами операций над множественными значениями в общем случае являются множественные выражения. Среди операций отношения над значениями множественного типа особое место занимает специальная операция проверки вхождения элемента во множество, обозначаемая служебным словом in. В отличие от остальных операций отношения, в которых значения обоих операндов относятся к одному и тому же множественному типу значений, в операции in первый операнд должен принадлежать базовому типу, а второй – множественному типу значений, построенному на основе этого базового типа. Результатом операции отношения, как обычно, является логическое значение (true или false). Например: ‘a’ in glasn значение операции true; ‘o’ in soglasn значение операции false. Операция сравнения на равенство. Множества считаются равными (эквивалентными), если все элементы одного множества присутствуют в другом и наоборот. Для операции сравнения на равенство или неравенство используются символы ‘=’ и ‘<>’. Например: A:= [2,1,3]; D:= [1,3,2]; Тогда операция A=D имеет значение true, а операция A<>D имеет значение false. Проверка включения. Одно множество считается включенным в другое (одно множество является подмножеством другого), если все его элементы содержатся во втором множестве. Обратное утверждение может быть и несправедливым. Операции проверки включения обозначаются ‘<=’ и ‘>=’. Например: letter >= glasn; soglan <= letter; Следует отметить, что применение операций < и > над операндами множественного типа недопустимо. Лабораторная работа №8 Тема: Множества Задание 1 Задание: используя множества А, В, С, состоящие из больших латинских букв, заполненные с клавиатуры, составить программу, находящую: Вариант 1 (AB)\C Вариант 6 (B\A)(C\A) Вариант 2 (AB)C Вариант 7 (B\C)A Вариант 3 (A\B)C Вариант 8 (B\C)A Вариант 4 (A\B)C Вариант 9 C(B\A) Вариант 5 (AC)B Вариант 10 (AC)\B Вариант 11 ABC Вариант 13 B\(AC) Вариант 12 A(BC) Вариант 14 C\(AB) Задание 2 Задание: составить программу решения задачи. Вариант 1 В массиве А записаны различные символы. Записать в массив В все гласные буквы, а в массив С – согласные (использовать множества всех букв алфавита и гласных букв). Вариант 2 Подсчитать количество различных цифр в записи натурального числа N (использовать множество цифр данного числа). Вариант 3 Найти все цифры, не входящие в запись данного натурального числа N (использовать множество цифр данного числа). Вариант 4 Проверить, является ли данный символьный массив записью числа в 16ричной системе счисления (использовать множество, содержащее символы 16-ричной системы счисления). Вариант 5 Проверить, является ли данный символьный массив полностью состоящим из букв (использовать множества цифр и знаков препинания). Вариант 6 Проверить, является ли данный символьный массив записью арифметического выражения (использовать множество цифр и знаков арифметических операций). Вариант 7 Определить количество русских букв в данном символьном массиве, содержащем только малые буквы (использовать множество латинских букв). Вариант 8 Определить количество больших латинских букв в данном символьном массиве (использовать множества латинских букв). Вариант 9 Найти сумму всех цифр, входящих в символьный массив (использовать множество цифр). Вариант 10 Дан символьный массив А. Поместить все цифры из этого массива в массив В, а буквы – в массив С. Вариант 11 Дана строка символов. Вывести на экран все знаки препинания, встречающиеся в этой строке. Вариант 12 Дана строка символов. Определить процентное соотношение гласных и согласных букв в данной строке. Вариант 13 Дана строка символов латинского алфавита. Вывести на экран все буквы латинского алфавита, не содержащиеся в данной строке. Вариант 14 Дана строка, содержащая слова на русском и английском языках. Сформировать две строки, одна из которых будет содержать русские слова, а другая – английские слова. ЛИТЕРАТУРА 1. Грызлов В.И., Грызлова Т.П. Турбо Паскаль 7.0 – М.: ДМК, 1998. 2. Фаронов В.В. Турбо Паскаль 7.0. Начальный курс. Учебное пособие. – М.: «Нолидж», издатель Молгачева С.В., 2001. 3. Марченко А.И., Марченко Л.М. Программирование в среде Turbo Pascal 7.0. – К.: ВЕК+, М.: ДЕСС, 1999. 4. Семакин И.Г., Шестаков А.П. Основы программирования: Учебник. – М.: Мастерство; НМЦ СПО; Высшая школа, 2001. 5. Румянцев Дмитрий, Монастырский Леонид. Путь программиста: Опыт созидания личности программиста. – М.: «Издательский Дом ИНФРА-М», 2000. 6. Культин Н. Б. Turbo Pascal в задачах и примерах. – СПб.: БХВ-Петербург, 2000. 7. Потопахин В. В. Turbo Pascal. Освой на примерах. – СПб.: БХВПетербург, 2005. 8. Пильщиков В. Н. Сборник упражнений по языку Паскаль: учебное пособие для вузов. – М.: Наука, 1989.