Типы boolean, real и complex




Обзор типов

В Pascal ABC имеются следующие типы:

integer (целый)
byte (байтовый)
char (символьный)
перечислимый
диапазонный
boolean (логический)
real (вещественный)
complex (комплексный)
string (строковый)
тип "массив"
тип "запись"
тип "указатель"
процедурный
файловый
классовый

Типы integer, byte, char, перечислимый и диапазонный называются порядковыми. Только значения этих типов могут быть индексами массивов и фигурировать в качестве выражения-переключателя в операторе case. Переменная-параметр цикла for также должна иметь перечислимый тип.

Ко всем значениям порядкового типа применимы следующие функции:

Pred(x) возвращает значение, предшествующее x (к наименьшему значению не применяется);
Succ(x) возвращает значение, следующее за x (к наибольшему значению не применяется);
Ord(x) возвращает порядковое целое значение, соответствующее x. Для целых x возвращает само значение x, для символов char возвращает их код, а для элементов перечислимого типа - их номер (нумерация начинается с нуля).

Все порядковые типы, а также типы boolean, real и complex называются простыми типами.

Порядковые типы

Тип integer (целый). Значения этого типа занимают 4 байта и находятся в диапазоне от -2147483648 до 2147483647. Константа MaxInt хранит значение 2147483647.

Тип byte (беззнаковый целый). Значения этого типа занимают 1 байт и находятся в диапазоне от 0 до 255.

Тип word (беззнаковый целый). Значения этого типа занимают 2 байта и находятся в диапазоне от 0 до 65535.

Тип char (символьный). Значения этого типа занимают 1 байт и представляют собой символы в кодировке Windows. Стандартная функция Chr(x) возвращает символ с кодом x. Константы этого типа могут быть записаны в виде #x, где x - целое число от 0 до 255.

Перечислимый тип определяется упорядоченным набором идентификаторов:

type
Season = (Winter,Spring,Summer,Autumn);
DayOfWeek = (Mon,Tue,Wed,Thi,Thr,Sat,Sun);

Значения перечислимого типа занимают 4 байта.

Интервальный тип представляет собой подмножество значений целого, символьного или перечислимого типа и описывается в виде a..b, где a - нижняя, b - верхняя граница интервального типа:

var
a: 0..10;
c: 'a'..'z';
d: Mon..Thr;

Тип, на основе которого строится интервальный тип, называется базовым для этого интервального типа. Значения интервального типа занимают 4 байта.

Типы boolean, real и complex

Тип boolean (логический). Переменные и константы логического типа занимают 1 байт и принимают одно из двух значений, задаваемых предопределенными константами True (истина) и False (ложь).

Тип real (вещественный). Значения вещественного типа занимают 8 байт, содержат 15-16 значащих цифр и по модулю не могут превосходить величины 1.7∙10308. Самое маленькое положительное число вещественного типа равно 5.0∙10-324. Константы типа real можно записывать как в форме с плавающей точкой, так и в экспоненциальной форме: 1.7, 0.013, 2.5e3 (2500), 1.4e-1 (0.14).

Тип complex (комплексный). Значения комплексного типа занимают 16 байт. Константы этого типа записываются в виде (x,y), где x и y - выражения вещественного типа, представляющие собой вещественную и мнимую части комплексного числа. Если переменная c имеет тип complex, то обратиться к ее вещественной и мнимой частям можно как к полям записи: c.re и c.im. Например:

const ci=(0,1);
var c: complex;
...
c.re:=2*c.im;
c:=ci*c+(c.im,c.re);

К переменным типа complex применимы стандартные числовые функции: abs, sin, cos, exp, ln, sqrt, а также функция conj(c), возвращающая комплексно сопряженное к c, и функция carg(c), возвращающая главное значение аргумента комплексного числа c. При вычислении многозначных функций ln, sqrt, carg возвращается главное значение и предполагается, что разрез сделан по отрицательной вещественной оси, причем, верхний берег принадлежит разрезу. Так, carg(c) возвращает значение в диапазоне (-Pi,Pi].

Строки в Pascal ABC имеют тип string и состоят из не более чем 255 символов. При описании

var s: string;

под переменную s отводится 256 байт, при этом в нулевом байте хранится длина строки.

Для экономии памяти предусмотрено описание вида

var s1: string [40];

В этом случае под строку отводится 41 байт (нулевой байт - под длину строки). В случае присваивания переменной s1 строки из более чем 40 символов лишние символы отсекаются, и длина строки s1 полагается равной 40.

При выполнении операции конкатенации вида s1+s1 результат считается строкой типа string, т.е.занимает 256 байт. Однако, если при конкатенации результат будет занимать более 255 символов, то программа завершится с ошибкой.

К символам в строке можно обращаться, используя индекс: s[i] обозначает i-тый символ в строке. Обращение к нулевому символу s[0] считается ошибочным. Чтобы изменить длину строки, следует воспользоваться процедурой SetLength. Если индекс i выходит за пределы памяти, отводимой под строку, то выдается сообщение об ошибке. Однако, если индекс i выходит лишь за пределы длины строки, то сообщение об ошибке не выдается.

 

Массивы

Массив представляет собой набор элементов одного типа, каждый из которых имеет свой номер, называемый индексом (индексов может быть несколько, тогда массив называется многомерным). Тип массива конструируется следующим образом:

array [тип индекса1,..., тип индексаN] of базовый тип

Тип индекса обязательно представляет собой интервальный тип и обязательно должен задаваться в виде a..b, где a и b - константные выражения целого, символьного или перечислимого типа. Например:

type enum=(w1,w2,w3,w4,w5);
var
a1,a2: array [1..10] of integer;
b: array ['a'..'z',w2..w4] of string;
c: array [1..10] of array [1..5] of real;

Базовый тип может быть любым (в частности, он может быть типом массива, как для переменной c).

Переменные-массивы одного типа можно присваивать друг другу, при этом будет производиться копирование содержимого одного массива в другой:

a1:=a2;

При передаче по значению параметра типа массив в подпрограмму также производится копирование содержимого массива-фактического параметра в массив-формальный параметр:

procedure p(arr: array [1..10] of integer);
...
p(a1);

Как правило, в этой ситуации копирование содержимого массива не требуется, поэтому массив рекомендуется передавать по ссылке:

procedure r(var arr: array [1..10] of integer);
...
r(a1);

К элементам массива обращаются при помощи переменных с индексами:

a1[3]:=a2[5];
b['f',w3]:='Hello';
c[3][4]:=3.14;

Наиболее часто встречающаяся ошибка при работе с массивами - выход за границы изменения индекса. В Pascal ABC возникновение этой ошибки приводит к завершению работы программы.

Записи

Запись представляет собой набор элементов разных типов, каждый из которых имеет свое имя и называется полем записи. Тип записи конструируется следующим образом:

record список полей1: тип1;... список полейN: типN; end

Последний символ ";" не является обязательным. Например:

type
Date= record
Day: 1..31;
Month: (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
Year: Integer;
end;

Теперь можно объявить переменные типа Date:

var d1,d2: Date;

Чтобы получить доступ к полям записи, следует воспользоваться точечной нотацией, указав имя переменной-записи и поле, разделенные точкой:

d1.Day:=9;
d1.Month:=Sep;
d1.Year:=2004;

Как и для массивов, можно скопировать содержимое полей одной переменной-записи в другую:

d2:=d1;

Множества

Множество представляет собой набор элементов одного порядкового типа. Элементы множества считаются неупорядоченными; каждый элемент может входить во множество не более одного раза. Тип множества описывается следующим образом:

set of базовый тип

В качестве базового может быть любой порядковый тип с элементами, для которых функция Ord возвращает значения в диапазоне от 0 до 255. Например:

type
ByteSet = set of byte;
CharSet = set of char;
Digits = set of '0'..'9';
SeasonSet = set of (Winter,Spring,Summer,Autumn);

Переменная типа множество занимает 16 байт и может содержать несколько значений базового типа. Чтобы сконструировать значение типа множество, используется конструкция вида

[список значений]

где в списке могут перечисляться через запятую либо выражения базового типа, либо их диапазоны в виде a..b, где a и b - выражения базового типа. Например:

var
bs: ByteSet;
bestdays: (Mon,Tue,Wed,Thi,Thr,Sat,Sun);
...
bs:=[1,3,5,20..25];
bestdays:=[Wed,Thr..Sun];

Значения в списке могут отсутствовать, тогда множество является пустым:

bs:=[];

Операция in проверяет принадлежность элемента множеству:

if Wed in bestdays then...

Для множеств определены операции + (объединение), - (разность), * (пересечение), = (равенство), <> (неравенство), <= (вложено) и и >= (содержит). Примеры этих операций приведены в пункте Выражения и операции.

Множества с совместимыми базовыми типами неявно преобразуются одно к другому (см. пункт Неявное приведение типов). При присваивании множеству при необходимости происходит усечение его элементов до значений базового типа. Например:

var st: set of 3..9;
...
st:=[1..5,8,10,12]; // в st попадут значения [3..5,8]

Чтобы вывести значения элементов множества, необходимо перебрать всевозможные значения в цикле и проверить их на принадлежность множеству с помощью операции in:

for i:=0 to 255 do
if i in st then write(i,' ');

Указатели

Указатель хранит адрес памяти. В Pascal ABC имеются типизированные указатели (содержат адрес ячейки памяти данного типа) и бестиповые указатели (содержат адрес оперативной памяти, не связанный с данными какого-либо определенного типа).

Тип указателя на тип T имеет форму ^T, например:

type pinteger=^integer;
var p: ^ record r,i: real end;

Бестиповой указатель описывается с помощью слова pointer.

Для доступа к ячейке памяти, адрес которой хранит типизированный указатель, используется операция разыменования ^:

var
i: integer;
pi: ^integer;
...
pi:=@i; // указателю присвоили адрес переменной i
pi^:=5; // переменной i присвоили 5

Операция разыменования не может быть применена к бестиповому указателю.

Типизированный указатель может быть неявно преобразован к бестиповому:

type preal=^real;
var

p: pointer;
pr: ^real;
...
p:=pr;

Обратное преобразование может быть выполнено только явно:

pr:=preal(p);
pr^:=3.14;

Указатели можно сравнивать на равенство (=) и неравенство (<>). В дополнение к этому типизированные указатели можно сравнивать, используя операции <, >, <=, >=.

Для типизированных указателей доступны также операции p+i, p-i и p2-p1, где i - целое (см.п.Выражения и операции).

Для того чтобы отметить тот факт, что указатель никуда не указывает, используется стандартная константа nil (нулевой указатель): p:= nil.

Файлы

Файл в Pascal ABC представляет собой последовательность элементов одного типа, хранящихся на диске. В Pascal ABC имеется два типа файлов - типизированные и текстовые. Текстовые файлы хранят символы, разделенные на строки символами #13#10.

Для описания текстового файла используется стандартное имя типа text, а для описания типизированного файла - конструкция file of тип элементов:

var
f1: file of real;
f2: text;



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: