Delphi. Pascal
Урок 7. Множества и записи
Множества
Тип множества | Описание множества | Пример |
Постоянное множество (константа) | [ тип-элемента ] | const a = [ 0..100 ]; |
Переменное множество (переменная) | set of [ тип-элемента ] | var a: set of [ '0'..'9', '+', '-' ]; |
Пример описания постоянного множества | Элементы множества |
const A = [ 'A'..'Z', 'a'..'z' ]; | Буквы латинского алфавита |
const B = [ 'a'..'z' ]; | Малые буквы латинского алфавита |
const C = [ 'А'..'Я', 'а'..'п', 'р'..'я', 'Ё', 'ё' ]; | Буквы алфавита-кириллицы |
const D = [ 'А'..'Я' ]; | Большие буквы алфавита-кириллицы |
const M = [ '0'..'9' ]; | Цифровые символы от 0 до 9 |
const N = [ 0..100 ]; | Целые числа от 0 до 100 |
Пример описания переменного множества | Элементы множества |
var a set of [ 'A'..'Z', 'a'..'z' ]; | Буквы латинского алфавита |
var b set of [ 'a'..'z' ]; | Малые буквы латинского алфавита |
var c set of [ 'А'..'Я', 'а'..'п', 'р'..'я', 'Ё', 'ё' ]; | Буквы алфавита-кириллицы |
var d set of [ 'А'..'Я' ]; | Большие буквы алфавита-кириллицы |
var m set of [ '0'..'9' ]; | Цифровые символы от 0 до 9 |
var n set of [ 0..100 ]; | Целые числа от 0 до 100 |
Операция | Результат операции | Пример |
М1 + М2 | Объединение множеств М1 и М2 | ['0'..'9'] + ['+'] |
М1 - М2 | Разность множеств М1 и М2 | ['a'..'z'] - ['x'..'z'] |
М1 * М2 | Пересечение множеств М1 и М2 | ['a'..'m'] * ['c', 'i', 'n'] |
Операция | Когда результат операции равен true | Пример |
значение in множество | Значение является элементом множества | not (s[i] in ['a'..'z']) |
М1 = М2 | Множества М1 и М2 равны между собой | |
М1 <> М2 | Множества М1 и М2 не равны | |
М1 < М2 | Множество М1 является подмножеством множества М2 | |
М1 <= М2 | Множество М1 является подмножеством множества М2 или равно М2 | |
М1 > М2 | Множество М1 является надмножеством множества М2 | |
М1 >= М2 | Множество М1 является надмножеством множества М2 или равно М2 | |
Множества и записи являются специфичными для Pascal'я типами. Сначала разберемся со множествами.
С общей точки зрения множество представляет из себя некоторый набор (на самом деле это тавтология, но на это мы не будем обращать внимания) чего-либо. Для такого набора действуют два правила - во-первых, в нем не должно быть поторяющих элементов (вернее, повторяющийся элемент защитывается ттолько один раз) и, во-вторых, во множество порядок элементов не существенен. Два множества мы можем пересекать, объединять, вычитать из одного другое, проверать, не есть одно множество частью (подмножеством) другого и др. Кроме того, мы можем определять, является ли или нет некоторый конкретный элемент элементом данного множества.
Для определения множества мы должны написать что-то вроде:
type
Color = (Red, Green, Yellow, Blue, Black);
Colors = set of Color;
var
c1, c2, res: Colors; //Переменная c типа Colors
Как вы видите, сначала мы в разделе type модуля оперделяем новый тип Color (название может быть любым). Тип Color мы определяем через набор возможных значений (красны, зеленый, желтый, синий и черный). Затем мы опеределяем новый тип Colors (название тоже может быть любым) как множество, состоящее из элементов типа Color. Colors мы объявляем множеством с помошью ключевых слов set of:
Colors = set of Color;
После того, как мы опеределили новый тип Colors, мы можем заводить переменные такого типа. Это м и делаем в разделе var модуля:
var
c1, c2, res: Colors; //Переменные типа Colors
Теперь рассмотрим основные операции с множествами. Это суть:
Объединение множеств. Обозначается как "+" . Получаем в результате множество, состоящее из элементов, которые входят или в первое, или во второе множества:
c1:=[Red, Green, Yellow];
c2:=[Green, Blue];
//Теперь множество res состоит
//из элементов Red, Green, Yellow и Blue
res:=c1 + c2;
Пересечение множеств. Обозначается как "*". Получаем в результате множество, состоящее из элементов, которые входят и в первое, и во второе множества:
c1:=[Red, Green, Yellow];
c2:=[Green, Blue];
//Теперь множество res состоит
//из элемента Green
res:=c1 * c2;
Разность множеств. Обозначается как "-" . Получаем в результате множество, состоящее из элементов первого множества, за исключением тех элементов, которые входят во второе:
c1:=[Red, Green, Yellow];
c2:=[Green, Blue];
//Теперь множество res состоит
//из элементов Red и Yellow
res:=c1 - c2;
Кроме того, для множеств существуют операции для определения, не является ли одно множество частью другого. Это операции "<=" (возвращает true, если каждый элемент первого множества является элементом и второго, и false в противоположном случае) и ">=" (возвращает true, если каждый элемент второго множества является элементом и первого, и false в противоположном случае). Вот пример использования:
c1:=[Red, Green, Yellow];
c2:=[Green, Red];
if c1>=c2 then
//c1 есть подмножество c2
Writeln('c1 is a subset of c2')
else
//c1 не есть подмножество c2
Writeln('c1 is not a subset of c2');
Если в программе надо определить, входит ли некоторый элемент в множество или нет, то мы доджны использовать операцию in. Вот пример ее использования:
c1:=[Red, Green, Yellow];
if Red in c1 then
//Элемент Red принадлежит множеству c1
...
else
//Элемент Red не принадлежит множеству c1
...
Еще для множеств имееются операции "=" и "<>". Их использование вполне очевидно - первая возвращает true, если два множества равны, и false - если не равны, вторая: наоборот - true, если два множества не равны, и false - если равны.
В Delphi для множеств есть ограничение - в множестве не может больше 256 элементов.
Типы и записи
Описание типа записи | Пример |
имя типа = record | type data = record |
имя-1: тип-1; | x:integer; |
имя-2: тип-2; | y:integer; |
имя-N: тип-N; | t:string; |
end; | end; |
var a1, a2, a3: data; |
Теперь поговорим кратко о записях. Запись представляет из себя новый, определенный пользователем, тип данных. Запись объединяет в себе некоторое (фиксированное) число переменных (которые официально наываются полями). Эти переменные могут быть разного типа. Например, вы можете создать новый тип для хранения данных о книге. В этот тип вы можете включить такие поля как Author (Автор), Title (Название), Pages (Количество страниц) и др. Доступ к отдельным полям мы получаем через точку, которую ставим после имени соответствующий переменной. Вот пример:
var
//Определяем переменную book как запись
book: Record
Title: String;
Author:String;
Pages: Integer;
end;
//Конец записи
...
//Задаем название
book.Title:='De machina computativa firmicis fundata.';
//Задаем автора
book.Author:='Osco do Casco';
//Задаем количество страниц
book.Pages:=212;
Как вы видите, для задания записи используются ключевые слова Record и End.