Тип «Множество»
<Объявление типа «Множество»> :: =
type
<Имя типа «Множество»> =
Set Of <Список (перечисление) или диапазон значений>;
<Объявление переменной типа «Множество»> :: =
var
<Имя переменной> : Set Of <Список (перечисление) или диапазон значений>;
//или
<Имя переменной> : <Имя типа «Множество»>;
Операции над множествами:
+ Объединение
- Вычитание
* Пересечение
Проверка отношения двух множеств:
= Равно
<> Не равно
<= Левое множество содержится в правом
>= Левое множество содержит в себе правое
Проверка принадлежности элемента множеству:
in Левый элемент принадлежит правому множеству
Пример
type
EnglishLetterType = 'A' .. 'z'; // Все английские буквы
EnglishLettersSetType = set of EnglishLetterType;
SetOfDigitsType = set of 0 .. 9; // Все десятичные цифры
MonthesType = (June, July, August); // Все летние месяцы
var
EnglishLetters: EnglishLettersSetType;
P: SetOfDigitsType;
A, B, C: set of 0 .. 9;
M: MonthesType;
// procedure ShowElementsOfSet(Tittle: string; z: set of 0..9);
procedure ShowElementsOfSet(sTittle: string; z: SetOfDigitsType);
var
i: integer;
begin
Write('Set "', sTittle,'" Containes: ');
for i := 0 to 9 do
if i in z then Write(i:2);
writeln;
end;
begin
if EnglishLetters = [] then
writeln('EnglishLetters Is Empty')
else
writeln('EnglishLetters Is Not Empty');
A := [2,4,5,6,7,8];
B := [1,3,5,7];
C := A * B;
if C = [] then
writeln('c Is Empty')
else
writeln('c Is Not Empty');
if 4 in C then
writeln(' 4 Is in C')
else
writeln('4 Is Not in C');
if 4 in B then
writeln(' 4 Is in B')
else
writeln('4 Is Not in B');
ShowElementsOfSet('A', A);
ShowElementsOfSet('B', B);
P := A + B;
ShowElementsOfSet('A+B', P);
P := A - B;
ShowElementsOfSet('A-B', P);
ShowElementsOfSet('A*B', A * B + [0]);
readln;
end.
Тип Variant
var
V1, V2, V3, V4: Variant;
I: Integer; D: Double; S: string;
begin
V1 := 1; // integer value, integer type
V2 := 1234.5678; // real value, real type
V3 := ‘1000’; // string value, string type
V4 := V1 + V2 + V3; // double value 2235.5678, double type
I := V1;
D := V2;
S := V3; // S=’1000’
I := V4; // I = 2236
end;
Delphi: Help, “Variant type conversions”
VB6, VBA-MS/Office: Тип Variant разрешен.
VBScript: Все переменные есть переменные типа Variant.
VB.Net: Тип Variant запрещен.
Тип «Денежный»
var
x: Currency;
Диапазон изменения: –922337203685477.5808 . . 922337203685477.5807
Объем памяти: 8 байт.
Метод динамического программирования
Пример. Найти наиболее «дешевый» путь от элемента матрицы размера до элемента . Второй способ решения задачи.
Проект ProjectBoth прилагается. В нём реализованы оба подхода к решению задачи.
Идея метода динамического программирования состоит в следующем. Для каждого элемента строится оптимальный путь от него до конца пути. Сначала это делается для всех элементов, которые в одном шаге от конца пути. Затем для всех элементов, которые в двух шагах от конца пути. Затем для всех элементов, которые в трёх шагах от конца пути. И так далее.
Пусть матрица цен имеет размер и выглядит так:
Пусть есть цена оптимального пути от элемента до конца пути.
Множество предпоследних элементов (1-я волна):
, двигаться можно только вниз;
, двигаться можно только вправо.
Множество «предпредпоследних» элементов (2-я волна):
, двигаться можно только вниз;
, двигаться лучше вправо;
, двигаться можно только вправо.
Множество «предпредпредпоследних» элементов (3-я волна):
, двигаться можно только вниз;
, двигаться лучше вниз;
, двигаться лучше вправо;
, двигаться можно только вправо. Таким образом, можно найти цены и начальное направления оптимального пути для всех «волн», а значит, и для всех элементов матрицы, заканчивая элементом . Результат поиска показан в виде постановки при каждом элементе матрицы двух индексов: цена оптимального пути от этого элемента до конца (нижний индекс), направление оптимального пути от этого элемента (верхний индекс).