Программа на Delphi
Множество – это совокупность однотипных элементов. Во многом оно похоже на
типизованную константу, однако имеет от него принципиальное отличие. Это
отличие состоит в том, что значениями множества являются все его допустимые
подмножества.
Как и в массивах, следует различать множество-тип и множество-переменную.
Множество-тип. Синтаксис множества-типа:
= Set of ;
Пример:
Type
TSomeInts = 1..250;
TIntSet = set of TSomeInts;
создает тип множества с именем TIintSet, которое содержит множество целых
чисел в диапазоне от 1 до 250. Это же множество могло быть описано явно:
type TIntSet = set of 1..250;
Множество-переменная. Синтаксис множества-переменной:
: Set of ;
В соответствии с вышеописанными типами можно объявить множества:
Var Set1, Set2: TIntSet;
а затем в операторной части задать эти множества:
...
Set1 := [1, 3, 5, 7, 9];
Set2 := [2, 4, 6, 8, 10];
Можно объявить множество явно, перечислив его элементы:
Var
MySet1 : set of 'a' .. 'z';
MySet2 : set of Byte
MySet3 : set of (Club, Diamond, Heart, Spade)
MySet4 : set of Char;
...
MySet 1:= ['a','b','c']; {оператор определения множества}
Операции над множествами. Допустимые операции над множествами приведены в
следующей табл. 6:
Таблица 6
|Опера-|Наименование |Тип операндов|Тип |Пример |
|ция |операции | |результата | |
|+ |Объединение |set |set |Set1 + Set2 |
|– |Вычитание |set |set |S - T |
|* |Пересечение |set |set |S * T |
|= |Не больше |set |boolean |S1 >= S2 |
|= |Равенство |set |boolean |S2 = MySet |
|<> |Неравенство |set |boolean |MySet <> S1 |
|in |Принадлежание |элемент set |boolean |A in Set1 |
Объединение, вычитание и пересечение множеств.
Результатом любой из операций будет также множество.
Пример:
Var
S1, S2,S3 : set of Byte;
...
S1:= [1, 2 , 3, 4]; {оператор определения множества}
S2:= [3, 4, 5, 6, 78]; {оператор определения множества}
S3:= S1 + S2; {объединение множеств}
{результат S3 = [1, 2, 3, 4, 5, 6, 78] }
S3:= S2 - S1; {вычитание множеств}
{результат S3 = [1, 2, 5, 6, 78] }
S3:= S2 * S1; {пересечение множеств}
{результат S3 = [3, 4] }
Операции сравнения множеств.
Результатом любой из операций будет логическая константа True (истина) или
False (ложь).
Пример:
Var
S1, S2, S3 : set of Byte;
B: boolean;
...
S1:= [3, 4]; {оператор определения множества}
S2:= [1, 3, 4]; {оператор определения множества}
S3:= [3, 4, 5, 6, 78]; {оператор определения множества}
B:= S1 = S2; {False, т. к. S2 не является подмножеством S2}
B:= S3 = S2; {False, т. к. мн-ва S2 и S3 не равны друг другу }
B:= S3 <> S2; {True, т. к. мн-ва S2 и S3 не равны друг другу }
Проверка вхождения элемента во множество. Результатом операции in будет
логическая константа True (истина) или False (ложь). Пример:
Var
S1 : set of Integer;
B: boolean;
...
S1:= [3, 4, 18 .. 178, 3101, 4427]; {оператор определения множества}
B:= ( 4 in S1); {True, т. к. 4 является элементом множества S1}
B:= (200 in S1); {False, т. к. 200 не является элементом S1}
7.4. Файловые типы
В языке Object Pascal есть три типа файлов:
. текстовые файлы,
. файлы с типом,
. файлы без типа.
Связь с файлом может быть установлена через файловую переменную, которая
после описания, но до использования в программе должна быть связана с
внешним файлом с помощью процедуры AssignFile.
Текстовой файл – это последовательность символьных строк перемен-ной длины.
Всякая такая строка завершается маркером конца строки CR/LF. Текстовые
файлы можно обрабатывать только последовательно. Ввод и вывод нельзя
производить для открытого файла, используя одну файловую переменную.
Текстовой файл имеет тип TextFile, или просто Text. Пример описания
файловой переменной текстового типа:
Var Fi: TextFile;
Файлы без типа состоят из компонент одинакового размера, структура которых
не известна или не имеет значения. Допустим прямой доступ к любой
компоненте файла. Пример объявления файловой переменной файла без типа:
Var F: File;
Файлы c типом состоят из однотипных компонент известной структуры. Допустим
прямой доступ к любой компоненте файла. Пример объявления файловых
переменных для файлов с типом:
Type
TRec = Record
A: Real;
B: Integer;
C: Char;
End;
Var
F : File of Real;
Q : File of String[100];
Fr: File of TRec;
В этом примере F объявлена как файловая переменная вещественного типа. Это
означает, что компонентами файла могут быть только вещественные значения.
Файловая переменная Q предназначена для доступа к файлам, которые состоят
из символьных строк длины 100. Файловая переменная Fr предназначена для
работы с файлами, которые состоят из записей типа TRec, объявленного в
секции Type.
8. Совместимость типов
Необходимым условием корректного вычисления выражений или выполнения
операторов присваивания является совместимость типов входящих в них
компонент.
Суть совместимости типов удобнее пояснить на примере простейших выражений,
которые состоят из одного (для одноместных операций) или двух (для
двухместных операций) компонент (операндов) и одной операции.
8.1. Совместимость по вычислению
Вычисление выражений возможно только при соблюдении следующих условий.
1. Типы операций и операндов эквивалентны.
Например, нельзя применять арифметические операции к логическим
переменным и, наоборот, логические операции – к арифметическим
переменным:
Type
R1, R2 : Real;
L1, L2 : Integer;
B1, B2: boolean;
...
Not (R1 + R2) B1 + B2 'Иванов' + ' ' + 'Петр' {недопустимые выражения}
2. Типы операндов эквивалентны.
3. Типы операндов целые или вещественные, например:
R1 + R2 L1 + R2 L2 / R1 / L1 {допустимые выражения}
4. Один тип является базовым, а второй – ограниченным типом этого же
базового типа.
Type
L11, L12 : Integer;
K : -199 .. 199;
1. Типы являются множествами, причем их базовые типы совместимы.
Type
L : set of 21 .. 2141;
K : set of -199 .. 199;
1. Один тип является строковым, а другой – также строковым либо
символьным.
Type
L : String [34]; Q : String [23]; K: Char;
2. Один тип является ссылочным, а другой – также ссылочным либо
безтиповым указателем.
3. Оба типа являются упакованными символьными массивами с одинаковым
числом элементов.
4. Один тип является строковым, а другой – также строковым типом, либо
упакованным символьным массивом, либо символьным типом.
5. Один имеет тип Variant, а другой – тип integer, real, string,
character или Boolean.
6. Оба типа операндов являются процедурными типами с одинаковым
количеством параметров и идентичными порядковыми типами этих
параметров. Для функций должны быть идентичны и типы результата.
8.2. Совместимость по присваиванию
Оператор присваивания считается корректным, если тип переменной,
расположенной в его левой части, совместим с типом выражения, располо-
женного в правой части. Выражение T2 может быть присвоено переменной T1,
если будут соблюдены следующие условия.
1. Оба типа T1 и Т2 идентичны. Недопустимо присваивание файловых типов
или структур, содержащих файловые типы (о файловых типах подробнее см.
гл. 17).
2. T1 и Т2 имеют совместимые простые типы.
3. T1 и Т2 имеют вещественные типы.
4. T1 и Т2 имеют целые типы.
5. T1 и Т2 имеет тип PChar или другой строковый тип, и выражение
представляет строковую константу.
6. T1 и Т2 имеют строковые типы.
7. T1 имеет строковый тип, а Т2 – символ или упакованная строка.
8. T1 – длинная строка, а Т2 имеет тип PChar.
9. T1 и Т2 имеют совместимые типы упакованных строк.
10. .T1 и Т2 имеют совместимые множественные типы.
11. .T1 и Т2 имеют совместимые Pointer-типы.
12. .T1 имеет тип PChar или PWideChar, а T2 есть символьный массив вида
array[0 .. n] of Char.
13. .T1 и T2 имеют совместимые процедурные типы.
14. .T1 имеет тип Variant, а T2 – один из типов integer, real, string,
character или Boolean.
15. .T1 имеет тип integer, real, string, character или Boolean, а Т2 – тип
Variant.
9. Выражения
Вычислительная система выполняет вычислительные и управляющие операции по
командам, которые представлены в программе с помощью операторов.
Большинство таких операторов строится с использованием выражений, которые в
практике программирования играют большую роль, определяя способ и порядок
преобразования данных. Выражения состоят из операндов (значений, констант,
переменных, функций), соединенных с помощью операций. Для изменения порядка
выполнения операций могут быть использованы круглые скобки. Наиболее важную
роль играют арифметические, логические и строковые выражения.
9.1. Арифметические выражения
При описании арифметических выражений для простоты типом Integer обозначен
любой целый тип, а типом Real – любой вещественный тип. Выражение строится
с помощью арифметических значений, констант, переменных, функций,
арифметических операций. В выражениях можно применять круглые открывающие и
закрывающие скобки. При этом количество открывающих скобок должно быть
равно количеству закрывающих скобок.
При вычислении выражения операции выполняются в строго определенной
последовательности в соответствии с их приоритетом. Порядок выполнения
операций можно изменить применением блоков, включающих подвыражения,
заключенные в круглые скобки.
В языке Object Pascal существует шесть арифметических операций. Учитывая,
что арифметические операции образуют подмножество множества всех операций
языка, в табл. 7 показано абсолютное значение приоритета каждой операции.
Таблица 7
|Операция |Наименование |Приоритет |
|+ |Сложение |2 |
|- |Вычитание |2 |
|* |Умножение |1 |
|/ |Деление |1 |
|div |Деление нацело |1 |
|mod |Остаток от деления |1 |
При вычислении выражения его тип определяется типами операндов. Операндом
называется любая компонента, к которой применяется операция. Операндом
может быть, например, значение, константа, переменная или выражение,
заключенное в скобки. Типы элементарных выражений показаны в табл. 8.
Таблица 8
|Операция|Тип операндов |Тип результата |Пример |
|+ |Integer, real |integer, real |X + Y |
|– |Integer, real |integer, real |Result - 1 |
|* |Integer, real |integer, real |P * InterestRate |
|/ |Integer, real |real |X / 2 |
|div |Integer |integer |Total div UnitSize |
|mod |Integer |integer |Y mod 6 |
Примеры:
4*5 = 20, 6/5 = 1.2, 8+7 = 15, 7-3 = 4, 16 div 5 = 3, 16 mod 5 = 2.
Порядок выполнения операций определяется приоритетом операций и
расположением внутренних выражений, заключенных в круглые скобки. Все
операции в арифметическом выражении выполняются слева направо.
Пример:
|Выражение: |15 * ((25/5-5*9 + (j-8) * 7.55) / |
| |8.67) |
|Порядок выполнения операций: | 8 2 5 3 6 1 4|
| | 7 |
9.2. Логические выражения
Результатом вычисления логического выражения может быть одно из двух
логических значений: True (истина ) или False (ложь).
Логическое выражение строится с помощью других выражений, (арифметических,
строковых и др.), значений, констант, переменных, функций, логических
операций и логических отношений.
В языке существует четыре логических операций. Приоритет операций показан в
табл. 9.
Таблица 9
|Операция |Наименование |Приоритет |
|Not |Отрицание |3 |
|And |Конъюнкция |4 |
|Or |Дизъюнкция |5 |
|Xor |Спец. дизъюнкция |6 |
Значения элементарных логических выражений, поясняющих назначе-ние этих
операций, приведены в табл. 10.
Таблица 10
|A |B |not A |A and B|A or B|A xor B|
|True |True |False |True |True |False |
|True |False |False |False |True |True |
|False |True |True |False |True |True |
|False |False |True |False |False |False |
В табл. 11 представлены логические отношения.
Таблица 11
|Отношение |Наименование |
|> |Больше |
|< |Меньше |
|>= |Больше или равно |
| |Не равно |
Все отношения равноприоритетны.
Порядок выполнения операций при вычислении логического выра-жения
следующий:
. сначала вычисляются арифметические выражения;
. затем – отношения;
. в последнюю очередь вычисляются логические операции.
Примеры (для x=12, z = 0, y=1):
Таблица 12
|Выражение |Результат |
|5 > 8 |True |
|(5 < 3) and (z = 0) |False |
|((4 + 8) < 0) or not (y = |True |
|0) |True |
|not ((x < y) and (z > y)) |False |
|('ab' = 'ac') and (x=z) |True |
|(4 in [ 2 .. 23 ]) | |
Пример, демонстрирующий порядок выполнения операций при вычислении
логического выражения:
|Выражение: |Not ((x > 6 + 8 * 2) and (y < 7) or (z > 7)) and (x <> |
| |y) |
|Порядок: | 9 3 2 1 6 4 |
| | 7 5 10 8 |
9.3. Строковые выражения
Строковые выражения, частными случаями которых могут быть пустой символ ''
или одиночный символ (например 'A'), строятся из строковых или символьных
значений, констант, переменных и строковых функций при помощи строковой
операции конкатенации (присоединения). Эта операция обозначена символом +
(плюс). Скобки в строковых выражениях не применяются.
Пример:
|Выражение: |'Object '+'Pascal '+' для Delphi' |
|Результат: |'Object Pascal для Delphi' |
10. Операторы
Оператор – языковая конструкция, представляющая описание команды или
комплекса команд по обработке и преобразованию данных.
Все операторы делятся на две части – простые операторы и структурные
операторы.
11. Простые операторы
К их числу относятся: оператор присваивания, оператор безусловного
перехода, составной оператор, оператор процедур, специальные операторы.
11.1. Оператор присваивания
В параграфе 1.4 было дано краткое определение этого оператора – одного
самых простых и наиболее часто используемых операторов. Напомним, что его
синтаксис имеет вид
x := y;
где x – имя переменной или функции; y – совместимое по типу выражение (о
совместимости типов см. гл. 8). Символы ":=" обозначают операцию
присваивания, в соответствии с которой вычисленное значение выражения y
присваивается переменной x.
Примеры операторов присваивания (комментарии показывают присвоенные
значения):
Var
Ch: Char;
S: String[5];
Q: String[18];
L, J: Integer;
P: Byte;
R: Real;
B: Boolean;
Rec: Record
A: Word;
B: String[20];
End;
…
Таблица 13
|Оператор присваивания |Значение |
|Q:= 'd:\Dir1\Word\a.txt'; |'d:\Dir1\Word\a.txt' |
|S:= Q; |'d:\Di' |
|Q:= S+'r\'; |'d:\Dir\' |
|Ch:=Q[2]; |':' |
|L:= 450; |450 |
|P:= L; |Ошибка, т. к. max P = 255 |
|J:= 100; |100 |
|R:= -L / J; |-4.5 |
|J:=-L / J; |Ошибка. Несоответствие типов |
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
|