Вторая группа операций над множествами реализует математические действия над ними: объединение (сумма), разность (дополнение) и пересечение множеств. Результатом операций всегда будет множество. В табл. 7.2 указаны два множества в записи, но их может быть и больше. Некоторые примеры операций приведены на рис. 7.3. Операции объединения и пересечения не зависят от мест операндов, но

[1, 2, 3, 4, 4 ] + [ 3, 4, 4, 5, 6] даст [1, 2, 3, 4, 5, 6] ([1..6])

[ '1', '2' ] + [ '8', '9' ] даст [ '1', '2', '8', '9' ]

[ X ] + [] даст [X]

[ X ] + [ Х+1 ] + [ Х+2 ] даст [ X .. Х+2 ]

[ 1, 2, 3, 4, 4] - [3, 4, 4, 5, 6] даст [ 1, 2 ]

[ '1', '2' ] - ['8', '9'] даст [ '1', '2' ]

[ X ]-[] даст [ X ]

[] - [ X ] даст []

[ 1, 2, 3, 4, 4 ] * [3, 4, 4, 5, 6] даст [ 3, 4 ]

[ '1', '2'] * [ '8', '9' ] даст []

[ X ] * [] даст []

[ A ] * [ A, B ] * [ A, B, С ] даст [ А ]

Рис. 7.3

- 147 -

результат операции дополнения чувствителен к порядку следования, и S1-S2 не будет в общем случае равно S2-S1. Поэтому результат выражений типа S1-S2-S3 будет зависеть от порядка вычислений (слева направо или наоборот), устанавливаемых компилятором. Обычно принято вычислять слева направо, но лучше не закладывать так явно в программу особенности компиляторов, в том числе не искать «многоместных» разностей. Их лучше вычислять через промежуточные переменные.

Достоинства множеств очевидны: гибкость представления наборов значений (правда, ограниченных типов и размеров), удобство их анализа. Механизм работы с множествами Турбо Паскаля соответствует базовым математическим действиям с конечными множествами. Значения типа «множество» очень компактно кодируются, и множество из 256 элементов займет всего лишь 32 байта. Множества хорошо работают там, где нужно проводить анализ однотипных выборок значений или накапливать произвольно поступающие значения.

Недостатки множеств — это обратная сторона их достоинств. За компактность представления приходится платить невозможностью вывода множеств на экран, хотя отладчик это проделывает. Причем, эта проблема трудноразрешима, ибо отсутствует механизм изъятия элемента из множества. Довод, что и в математике такое действие не определено, малоутешителен. Можно только убедиться в его наличии в множестве. Ввод множеств возможен только по элементам, как на рис. 7.4.

| VAR

| S : Set of Char; { переменная-множество }

| C : Char; { элемент множества }

| BEGIN

| S := []; С := #0; { обнуление значений }

| while C<> '.' do begin

| { цикл до ввода '.' : }

| ReadLn( C ); { чтение символа в C и }

| S := S + [ С ] { добавление его к S }

| end; {while}

| S := S - [ '.' ] { можно выбросить точку }

| ...

| END.

Рис. 7.4

Несмотря на эти недостатки, множества — удобный инструмент обработки данных и оптимальный для некоторых приложений способ хранения данных.

- 148 -

<p>Глава 8. Обработка символов и строк</p>

В этой главе подробно рассматривается работа с символьной информацией. Турбо Паскаль, вводя в обращение очень гибкий тип данных – строковый тип – открывает возможность составлять программы с развитыми алгоритмами обработки текстовой информации.

<p>8.1. Символьный и строковый типы (Char и String)</p>

Язык Турбо Паскаль поддерживает стандартный символьный тип Char и, кроме того, динамические строки, описываемые типом String или String[ n ].

Значение типа Char — это непустой символ из алфавита ПЭВМ, заключенный в одинарные кавычки, например, ' ', 'А', '7' и т.п. Кроме этой, классической, формы записи символов, Турбо Паскаль вводит еще две. Одна из них — представление символа его кодом ASCII с помощью специального префикса # :

#97 = Chr(97) = 'а' (символ 'а'),

#0 = Chr(0) (нулевой символ),

#32 = Chr(32) = ' ' (пробел).

Символы, имеющие коды от 1 до 31 (управляющие), могут быть представлены их «клавиатурными» обозначениями — значком «^» и буквой алфавита с тем же номером (для диапазона кодов 1...26) или служебным знаком (для диапазона 27...31):

^A = #1 = Chr(1) – код 1,

^B = #2 = Chr( 2) – код 2,

...

^ = #26 = Chr(26) – код 26.

^[ = #27 = Chr(27) – код 27,

^_ = #31 = Chr(31) – код 31,

в том числе ^G — звонок (7), ^I — TAB (код 9), ^J — LF (код 10), ^M — CR (код 13) и т.п.

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

- 149 -

VAR

S32 : String[ 32];

S255 : String[255];

мы можем хранить в S32 строчные значения, длиной не более 32 символов, а в S255 — не более 255. Описание String без указания длины отводит место, как и описание String[255].

Тип String без длины является базовым строковым типом, и он совместим со всеми производными строковыми типами.

Перейти на страницу:

Поиск

Похожие книги