В выражениях на языке Паскаль (т. е. в разделах реализации процедур, функций или в теле программы) значения множеств указываются в квадратных скобках: [1,2,3,4], ['a','b','c'], ['a'..'z']. Если множество не имеет элементов, оно называется пустым и обозначается как [].
Внимание! Количество элементов множества не должно превышать 256, соответственно номера значений базового типа, получаемые функцией ord(MyElement) для элемента MyElement нашего множества, должны находиться в диапазоне 0..255.
Объем памяти, занимаемый одним элементом множества, составляет один байт. Объем памяти для переменной типа множество вычисляется по формуле:
Объем памяти = (Max div 8) -(Min div 8) + 1,
где Max и Min — верхняя и нижняя границы базового типа.
При работе с множествами допускается использование операций отношения "=", "<>", ">=", "<=", объединения ”+”, пересечения “*”, разности “-“ множеств и операции in. Результатом выражений с применением этих операций является значение True или False.
Операция "равно" (=).
A=B
Два множества A и B считаются равными, если они состоят из одних и тех же элементов. Порядок следования элементов в сравниваемых множествах значения не имеет.
Операция "не равно" (<>).
A< >B
Два множества A и B считаются не равными, если они отличаются по мощности или по значению хотя бы одного элемента.
Операция "больше или равно" (>=).
A>=B
Используется для определения принадлежности множеств. Результат операции A>=B равен True, если все элементы множества B содержатся в множестве A. В противном случае результат равен False.
Операция "меньше или равно" (<=).
A<=B
Используется аналогично предыдущей операции, но результат операции A<=B равен True, если все элементы множества A содержатся в множестве B. В противном случае результат равен False.
Операция in.
X in A
Используется для проверки принадлежности какого-либо значения выражения x указанному множеству A. Обычно применяется в условных операторах. Не путать с оператором <=, который используется для сравнения двух множеств.
При использовании операции in проверяемое на принадлежность значение и множество в квадратных скобках не обязательно описывать в разделе описаний.
Операция in позволяет эффективно и наглядно производить сложные проверки условий, заменяя иногда десятки других операций. Например, выражение
if (a=1) or (a=2) or (a=3) or (a=4) or (a=5) or (a=6) then... можно заменить более коротким выражением if a in [1,2,3,4,5,6] then... . Иногда операцию in пытаются записать с отрицанием: X not in M. Такая форма ошибочна, так как две операции следуют подряд; правильная инструкция имеет вид not (X in M).
Объединение множеств (+).
Объединениям двух множеств является третье множество, содержащее элементы обоих множеств.
Пересечением множеств (*).
Пересечением двух множеств является третье множество, которое содержит элементы, входящие одновременно в оба множества.
Разностью множеств (-).
Разностью двух множеств является третье множество, которое содержит элементы первого множества, не входящие во второе множество.
Использование в программе данных типа множества дает ряд преимуществ: значительно упрощаются сложные операторы if, увеличивается степень наглядности программ и понимания алгоритма решения, экономится память, время компиляции и выполнения. Имеется и отрицательный момент: элементов множества не может быть больше 256. Поэтому если при описании систем, где число элементов на начальном этапе работы мало, сопоставить элементы множества, в дальнейшем можно столкнуться с трудностями, если число элементов возрастет выше 256.
2.10.5. Файловые типы. Операторы write, writeln, assignFile, read, readln, reset, rewrite, closeFile.
Файл – это именованная область хранения информации с возможностью произвольного доступа к ней. Доступ бывает либо последовательный, либо произвольный.
Файлы являются структурными типами с особыми правилами работы с ними. В данном параграфе описываются операторы для работы с файлами.
Задание переменной файлового типа производится так:
type tF=file of t1
var f:tF;
либо var f:file of t1;
тут t1 – базовый тип файлового типа, то есть тип ячеек, из которых состоит файл.
Для работы с файлами надо сначала определить файловую переменную (например, F1), имеющую тип, соответствующий типу файла, с которым будет осуществляться работа. Для этого используется процедура: assign(F1, Name: string), где строковое выражение Name содержит полное имя файла, удовлетворяющее требованию операционной системы. Пример:
var F1: file of integer;
…
assign File(F1,'data1.x');
Файловая переменная (в нашем случае F1) выполняет роль указателя на файл, а оператор assign “перещелкивает” его с одного файла на другой. Причем до первого assign значение этого указателя неопределено.
В процессе работы файловой переменной можно переприсваивать имена файлов.
Имя файла может включать в себя имя в текущей директории, а также (необязательно) полный путь на локальном компьютере или относительный путь.
Для работы с текстовыми файлами существует предопределенный тип файлов Text:
var F: text;
…
assign File(F,'data. txt');
Существуют также нетипизированные файлы. Соответствующие файловые переменные описываются как var F:file.
Операторы write и writeln — полиморфные операторы с произвольным числом и типом параметров. Первым параметром является файловая переменная, далее через запятую следуют выводимые в файл переменные или выражения.
Неформатный вывод в файл:
write(F1,a); write(F1,b, c,...,d) — вывод в файл “подряд” всех значений. Эквивалентно write(F1,a, b,c,…,d). writeln(F1,a); writeln(F1,b, c,...,d) — имеет смысл только для текстовых файлов. После вывода всех перечисленных в операторе параметров в конец добавляется перевод на новую строку. В данном примере — после вывода a и после вывода d.Другой пример:
writeln(F1a); writeln(F1b);...; writeln(F1c); — после вывода в файл любого параметра туда добавляется перевод на новую строку.
Оператор writeln; без параметров используется для перехода на новую строку.
Форматный вывод в текстовый файл:
write(F1x:n1) — вывод значения целой, вещественной, булевской или строковой величины x (либо x как элемент множества) в правую сторону поля длинной n1. Если x - вещественная величина, она выводится в научной нотации. write(F1x:n1:n2) — вывод вещественной величины x в нотации с фиксированной десятичной точкой, n2 (лежащее от 0 до 24) — число знаков после точки. Например, при x=1.234567e-987 оператор write(F1x:12:3) дает -1.234e-0987, а write(F1x:12:2) дает -1.23e-0987.Оператор read(F, a) читает из файла, назначенного файловой переменной F, значение с текущего места позиционирования считывающей головки и передвигает головку на один элемент файла по направлению к концу файла. Установка в конец файла должна производиться программным путем с проверкой значения предопределенной переменной Eof на значение true, достигаемое в случае, если вместо следующего элемента в файле стоит маркер конца файла.
Консоль (монитор и клавиатура компьютера) является файлом чтения/записи по умолчанию, когда файловая переменная не указывается. Запись эквивалентна выводу в текстовом режиме на экран, чтение – вводу с клавиатуры. В Delphi такой формы операторов wride, writeln, read, reddln пользуются только в специальном режиме имитации консоли.
Оператор readln; обычно используют для приостановки работы программы до нажатия пользователем клавиши <Enter>, readln(a) — для ввода с клавиатуры значения переменной a.
Оператор rewrite(F) создает новый файл с именем, назначенным в данный момент файловой переменной F. Если файл с таким именем уже существует, он без предупреждения затирается.
Установка в начало файла производится оператором reset(F).
После окончания работы с файлом (перед новым вызовом assignFile(F,…) или выходом из программы) надо выполнить команду closeFile(F), иначе операционная система будет поддерживать файл открытым. Максимальное число одновременно открытых файлов зависит от версии и установок операционной системы. Если closeFile(F) вызвать после очередного assignFile, то предыдущий файл останется открытым и закроется операционной системой только после выхода из программы. Закроется же текущий файл, на который была настроена переменная F во время вызова последнего assign с ее участием.
В случае, когда файл открыт одновременно и по чтению, и по записи, возможны неконтролируемые ошибки из-за изменения позиции считывающей головки. Поэтому после завершения записей в файл его лучше закрывать командой close(F), а при необходимости дописать что-либо в конец — делать reset(F) и производить программным путем установку считывающей головки в конец файла.
В Delphi имеется расширение PASCAL. Вместо операторов assign и close, использовавшихся в ТР, приняты совершенно идентичные им, но имеющие более осмысленные названия assignFile и closeFile. Кроме того, имеются операторы blockRead и blockWrite, позволяющие производить блочные чтения и запись с произвольного места в файле. Надо отметить, что при работе с текстовыми файлами лучше пользоваться этими операторами. Имеются также:
булевская функция fileExists (имя файла), возвращающая true, если файл с таким именем существует, процедура flush (файловая переменная) – очищает буфер с немедленной записью в файл, процедура seek(var F;N:longInt) – смещает указатель файла F к компоненту с номером N (нумерация идет от нуля), функция fileSize(varF):longInt – возвращает число компонентов файла, функция filePoz(varF):longInt – возвращает текущую позицию в файле (то есть для очередных чтения или записи).Замечание: переход в конец файла – с помощью seek(F, fileSize(F)). Кроме того, имеется много других процедур и функций.
2.11. Указатели. Динамические переменные. Динамическое выделение и высвобождение памяти
В языке PASCAL имеются структурные типы особого рода (pointers), получившие название указателей, либо, что то же самое, ссылок. Они предназначены для динамического выделения памяти под данные. В разделе декларации указатели описываются следующим образом: если имеется некий предопределенный или определенный пользователями тип tAnyType, то тип — указатель на переменную var MyVariable:tAnyType описывается как type tpAnyType=^tAnyType, а переменная ссылочного типа может быть описана либо как var pAnyType:tpAnyType, либо сразу как var pAnyType:^tAnyType без специального объявления типа tpAnyType.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |


