Описание типа производится в разделе TYPE.
Структура:
<Имя идентификатора>=SET of <имя типа> ;
где <Имя идентификатора> - правильный идентификатор Турбо Паскаля;
<имя типа> - тип элементов множества, в качестве которого может
использоваться любой порядковый тип, кроме WORD, Integer, LogInt,
ShortInt.
пример: TYPE dchar=SET of '1'..'9'; {базовый символьный тип-диапазон}
digit=SET of 0..9;
Переменные этого типа описываются в разделе
VAR S1,S2,S3:dchar; S4,S5,S6,S7:digit;
Для задания множества может использоваться конструктор множества: список (спецификаций) элементов множества, отделенных друг от друга запятыми; список заключается в квадратные скобки. Спецификациями элементов м.б. константы или выражения базового типа, а также пример:
S1:=['1','2','3']; S4:=[0..3,7];
S2:=['2','1','3']; S5:=[4,6];
S3:=['1','2']; S6:=[3..8]; S7:=[]; (пустое)
Два множества считаются эквивалентными тогда и только тогда, когда все их элементы одинаковы причем порядок следования в множестве их безразличен. (S1 и S2 эквивалентны).Если все элементы одного множества входят в другое множество то говорят, что первое включено во второе. (S3 включено в S1).Пустое множество включено в любое другое.
Над множествами определены следующие операции:
1. * пересечение множеств; результат содержит элементы, общие
для обоих множеств. (S4*S6 содержит [3,7]; S4*S5 образует пустое мн.).
2. + объединение множеств, результат содержит элементы первого
множества, дополненные недостающими элементами второго.
S4+S5 содержит [0,1,2,3,4,6,7] S5+S6 содержит [3,4,5,6,7,8]
3. - разность множеств, результат содержит элементы из первого
множества, которые не принадлежат второму.
S6-S5 содержит [3,5,7,8])
S4-S5 содержит [0,1,2,3,7]) []-S4 даст [].
4. Операции отношений:
= операция эквивалентности; возвращает значение TRUE, если оба
множества эквивалентны; (S1:=S2; ['1','2','3']) =['2','3','1']
проверка неэквивалентности; (TRUE, если множества неэквивалентны); [1,2]<>[1] S3<>S2
>= проверка вхождения (TRUE, если второе множество входит в первое;
in - проверка принадлежности. Структура этой бинарной операции:
in ;возвращает TRUE, если выражение имеет значение, принадлежащее множеству.
пример:
3 in S6 TRUE; [] in [0..5] [] in S5
2*2 in S4 FALSE;
Множества имеют компактное машинное представление. Недостаток: невозможность вывода множества на экран, т.к. отсутствует механизм изъятия элемента из множества. Ввод множества возможен только поэлементно.
пример: Можно тип объявлять при описании переменных
VAR S:SET of char; {переменная-множество}
C: char; {элемент множества}
Begin
S:=[]; S:=#0; {обнуление значений}
while C '.' do {циклдоввода "."}
begin
readln(C); {чтение символа в с}
S:=S+[C]; {добавление его к S}
end; ...
S:=S-['.']; {исключение точки}
End. {Смотри задание на л.р. N 12 }
CASE<ключ выбора> OF
Const1:оператор;
Const2:оператор;
ELSE: оператор;
END;
Запись – это структура данных, состоящая из фиксированного числа компонент, называемых полями записи. В отличие от массива компоненты могут быть различного типа. Поля именуются:
<имя типа>=RECORD<определение полей>END.
Type
Bd = record
D,m: byte;
Y: word
Var a,b: bd;
a::=8;
a.day:=27;-доступ к компоненту
Для упрощения доступа к полям записи используют оператор записи With
With<переменная>do<оператор>;
With c.bp do month:=9;
With c do with bp do month:=9;
c.bp.month:=9;
Вариантныеполя
Type f= record
N: string;
Case byte of
0:(bp: string[30]);
1:(c: string[10],e: string[20],ed:1..31)
end;
Имена должны быть уникальны, хотя возможно повторение на различных уровнях
Вложенныеполя:
Type bd =record
D,m: byte;
X: word;
End;
Var c: record;
Name: string;
Db: bd;
Begin if c.db.year=1939 then………..
End.
В качестве ключа переменная:
Type rec2=record
C: LongInt;
Case x: byte of
1: (d: word);
2: (e:record
case boolean of
3: (f: real);
3: (g: single);
‘3’: (c: word);
end;
end;
Вещественный тип определяет число с некоторой конечной точностью, зависящей от внутреннего формата числа
Длина название кол-во знаковых цифр диапазон десятичного порядка
байт
6 real 11..12 -39..38
8 couble 15..16 -324..308
10 extended 19..20 -4951..4932
8 comp 19..20 -2*10^63+1 .. 2*10^63-1
функции
ABS(X), ARCTAN(x), COS(X), EXP(X), FRAC(X), INT(X),LN(X), SIN(X), ROUND(X),SQR(X),SQRT(X) ИТ.Д.
Общие процедуры для работы с файлами
_____________________________________________________________
|Assign(Var f,FileName:String) - Cвязываниеф.п.f сфайлом FileName
|RESET(Var f) | Открытие файла с логическим именем f для чтения |
|REWRITE(Var f) Открытие файла с лог. именем f для записи |
| CLOSE(f) | Закрытие файла с лог. именем f |
|Erase(Var f) | Удаление файла (стирание) с диска |
|Rename(f, NewName:String)|Переименовывает физический файл |
| EOF(f) | Функция тестирования конца файла |
|FLUSH()| Очищает внутренний буфер файла |
-------------------------------------------------------------
ТЕКСТОВЫЕ ФАЙЛЫ
Это файлы последовательного доступа.
Они предназначены для хранения текстовой информации. Компоненты (запи-
си) текстового файла могут иметь переменную длину.
Для доступа к записям файла применяются процедуры
READ, READLN, WRITE, WRITELN.
Текст-ориентированные процедуры и функции
____________________________________________________________
| процедуры | пояснения |
| и функции | (действия) |
|-------------|----------------------------------------------|
|Append |Процедура открывает уже существующий файл f|
| () |для дозаписи в конец файла |
|пр:Append(f) | (для его расширения) |
|SeekEOLN |Функция пропускает все пробелы и знаки табуля-|
| () |ции до первого признака EOLN или первого зна-|
| логич.типа |чащего символа. Возвращает значение TRUE, если|
пр:SeekEOLN(f)|обнаружен маркер конца файла или маркер конца |
| |строки. Если ф.п. опущена, |
| |функция проверяет стандартный файл INPUT. |
| | |
|SeekEOF |Функция пропускает все пробелы,знаки табуляции|
| () |и маркеры конца строк до маркера конца файла|
|пр:SeekEOF(f)|или первого значащего символа. Если маркер об-|
| |наружен, возвращает значение TRUE. |
|EOLN ()|Функция возвращает значение TRUE,если во вход-|
| логич.типа | ном файле f достигнут маркер EOLN или |
|пр: EOLN(f) | EOF; FALSE - в противном случае. |
|_____________|______________________________________________|
Типизированные файлы
позволяют организовать прямой доступ к каждой из компонент (по его по-
рядковому номеру). Описание файловой переменной
Var ft: file of ;
Перед первым обращением к процедурам ввода-вывода указатель файла
стоит в его начале и указывает на 1-ю компоненту с номером 0. После
каждого чтения или записи указатель сдвигается с следующему компоненту
файла. Переменные в списках в/в должны иметь тот же тип, что и компо-
ненты файла.
Процедуры и функции для работы с типизированными файлами
____________________________________________________________
| процедуры | пояснения |
| и функции | (действия) |
|-------------|----------------------------------------------|
READ(,); Процедура
Обеспечивает чтение очередных компонентов файла
WRITE(,) используется для записи новых
компонент в файл; в качестве элементов вывода
м.б. выражение.
SEEK(,) - смещает указатель
файла к компоненту с ;
- выражение типа LONGINT.
(К текстовым файла применять нельзя.)
FILESIZE) Функция возвращает количество компонент,
содержащихся в файле.(Типа LongInt )
Функция FILEPOS() возвращает порядковый номер компо-
ненты файла, доступной для чтения или записи
(который будет обрабатываться следующей операцией в/в).
( Процедура CLOSE () - закрытие файла. )
|-------------|----------------------------------------------|
- содержит одну или более переменных такого
же типа, что и компоненты файла,
- файловая переменная д.б. объявлена предложением FILE OF
и связана с именем файла процедурой ASSIGN. Файл необходимо открыть
процедурой RESET для чтения.
Если файл исчерпан, обращение к READ вызовет ошибку В/В
Чтобы переместить указатель в конец файла можно написать
Пр. Seek(f,FileSize(f)) ; где f - файловая переменная
Нетипизированные файлы
Обьявляются без указания типа файла:
TYPE ftype=file; или VAR fn: file;
Для данных файлов не указывается тип компонентов, что делает их сов-
местимыми с любыми другими файлами. Позволяет организовать высокоско-
ростной обмен данными между диском и памятью.
При инициализации нетипизированных файлов процедурами RESET и
REWRITE указывается длина записи нетипизированного файла в байтах.
пример: VAR f:file; ...
ASSIGN (f,'a.dat');
RESET (f,512);
\ длина записи
Длина файла может быть представлена выражением типа WORD; если пара-
метр длины опущен, подразумевается длина 128 байт; максимальная длина
65535 байт.
Для обеспечения максимальной скорости обмена данными следует за-
давать длину, кратную длине физического сектора дискового носителя
(512 байт). Кроме того, фактически пространство на диске выделяется
любому файлу порциями - кластерами, которые в зависимости от типа дис-
ка могут занимать 2 и более смежных секторов. Как правило, кластер
м.б. прочитан или записан за один оборот диска, поэтому наивысшую ско-
рость обмена данными можно получить, если указать длину записи, равную
длине кластера.
При работе с нетипизированными файлами Могут применяться все
рассмотренные процедуры и функции, доступные типизированным файлам, за
исключением READ и WRITE, которые для чтения и записи заменяются соот-
ветственно высокоскоростными процедурами BlockREAD и BlockWRITE.
BlockREAD(,,,[,Var])
BlockWRITE(,,,[,Var])
где - имя переменной, которая будет участвовать в обмене дан-
ными с дисками;
- количество записей, которые д.б. прочитаны или записаны за одно
обращение к диску;
- необязательный параметр, содержащий при выходе из процедуры ко-
личество фактически обработанных записей.