Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Костюк - Основы программирования

.pdf
Скачиваний:
134
Добавлен:
30.05.2015
Размер:
1.3 Mб
Скачать

161

<целочисленный тип> ::= integer | word | longint | byte | shortint

<вещественный тип> ::= real | single | double | extended | comp

Целочисленные типы имеют различные размеры, их характеристики приведены в следующем разделе. Константа целочисленного типа (<целая константа>) записыва­

ется в виде нескольких десятичных цифр, впереди может быть записан знак (+ или ), например, –1003, +10, 32000.

Вещественные типы (с плавающей запятой) также имеют различные размеры. Константа вещественного типа (<вещественная константа>) записывается в виде мантиссы, перед которой может быть знак (+ или ), после мантиссы может быть

записан порядок числа (со знаком или без него). Мантисса записывается как целое число или число с десятичной точкой. Порядок записывается так: буква e, затем це­

лое число (значение порядка). Примеры вещественных констант: –13e-10, +1e6,

3.14, 5.99e+22.

Тип char содержит символьное значение длиной в 1 байт, которое определяет код символа в кодировке ASCII. Константа типа char (<символьная константа>) записывается в виде символа, взятого в одинарные кавычки, например: ’a’, ’+’, ’[’, ’Щ’, ’ц’. Символ «кавычка» записывается удвоенным: ’’’’.

Тип string является одномерным массивом символов, рассматриваемым как единое целое. Длина этого массива по умолчанию – 255 символов, однако при описа­

нии можно в квадратных скобках задать и меньшую длину. При этом текущее значе­ ние типа string может иметь длину от нуля символов до величины, указанной в

описании. Константа типа string (<строковая константа>) записывается в виде

последовательности символов, взятых в одинарные кавычки, например: ’abc’, ’+-*/’, ’ПАСКАЛЬ’. Константа ’’ (две кавычки подряд) состоит из нуля симво­

лов.

Тип boolean содержит логическое значение true или false, причем в па­ мяти оно занимает 1 байт. Значения true и false определяют понятие <логи­

ческая константа>.

Знак ^ в описании типа означает тип-указатель, который содержит ссылку на переменную соответствующего типа. Особое значение указателя nil означает, что указатель не указывает ни на какую переменную.

<размерность> ::= [<размерность> ,] <константа>..<константа>

В описании типа array (массив) должна указываться его размерность по каж­ дому измерению (минимальное и максимальное значение индекса). Размерность за­ дается двумя целочисленными константами.

<процедурный тип> ::= procedure [(<список аргументов>)] |

162

function [(<список аргументов>)]:<тип>

Процедурный тип позволяет определять переменные – указатели на процедуры или функции.

<файловый тип> ::= file [of <тип>] | text

Файловый тип определяет тип данных, которые записываются в файлы. Тип text определяет данные в виде последовательности символов в кодировке ASCII. Тип file без указания конкретного типа определяет двоичные данные, один эле­ мент которых занимает один байт.

<константа> ::= <имя> | <целая константа> | <вещественная константа> | <символьная константа> | <строковая константа> | <логическая константа> | (<список констант>) | nil

<список констант> ::= [<список констант> ,] < константа>

<описание констант> ::= const <имя>[:<тип>] = <константа> | <описание констант> ; <имя>[:<тип>] = <константа>

Описание константы необходимо для того, чтобы задать константе имя. При этом можно также задать и тип константы. Для константы, описанной как массив или запись, значение задается в виде взятого в круглые скобки списка элементов.

<запись> ::= record <список полей> end

<список полей> ::= [<список полей> ;] <список имен> :<тип>

Запись (record) состоит из элементов, называемых полями. Каждое из полей описывается каким-либо типом данных и имеет свое имя.

<описание переменных> ::= var <список имен> :<тип> | <описание переменных> ; <список имен> :<тип>

<описание процедуры> ::= procedure <имя> [(<список аргументов>)] ;

163

<блок>

<описание функции> ::= function <имя> [(<список аргументов>)]:<тип> ; <блок>

<список аргументов> ::= [<список аргументов> ;]

{var <список имен> :<тип> | <список имен> :<тип>}

Описания типов, констант, переменных, процедур и функций локализуются вну­ три того блока, перед которым они помещены. Аргументы в процедуре или функции также локализуются в соответствующем блоке. Аргументы, перед описанием кото­ рых имеется слово var, при вызове процедуры или функции подставляются по ссылке, в противном случае они подставляются по значению. При подстановке по ссылке аргументам, в частности, можно присваивать значение внутри алгоритма про­ цедуры, а при подстановке по значению – нет. Особый случай – процедурный тип аргумента, перед его описанием нельзя писать слово var, однако на самом деле при подстановке будет передаваться ссылка на процедуру (или функцию).

Внутри функции последним выполняемым оператором должно быть присваива­ ние имени функции некоторого значения. Это значение будет возвращаться при вы­ зове функции.

<оператор> ::= <присваивание> | <оператор if> | <оператор case> | <цикл for> | <цикл while> | <цикл until> | <вызов процедуры> | <группа операторов>

<присваивание> ::= <переменная>:= <выражение>

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

1)от одного целочисленного типа к другому целочисленному типу;

2)от одного вещественного типа к другому вещественному типу;

3)от целочисленного типа к вещественному типу.

Преобразование от вещественного к целочисленному типу выполняется стан­ дартными функциями. Если тип переменной при приведении не достаточен для пред­

ставления конкретного значения выражения (например, при преобразовании от longint к integer) то результат будет неверным, причем эта ошибка не будет

зафиксована.

<переменная> ::= [ <переменная> . ] <имя> [^] [[<список выражений>]] [^]

164

<список выражений> ::= [ <список выражений> , ] <выражение>

<выражение> ::= [ <унарная операция> ] <операнд> | (<выражение>) | <выражение> <бинарная операция> <выражение>

<операнд> ::= <переменная> | <константа> | <вызов функции>

<вызов функции> ::= <переменная> [(<список выражений>)]

Переменная может быть скалярной или элементом массива с индексами, взятыми в квадратные скобки. Если переменная относится к некоторому полю записи, то по­ сле имени переменной записывается точка и имя поля. Символ ^ в переменной-ука­ зателе означает переход по ссылке.

Операндами в выражениях служат переменные, константы, вызовы функций. Унарная операция записывается перед операндом, а бинарная – между двумя операн­ дами. Над результатом операции может, в свою очередь, выполняться другая опера­ ция.

Переменная в вызове функции – это имя функции или процедурная переменная, которой присвоена ссылка на функцию. Список выражений в вызове должен точно соответствовать аргументам в описании этой функции, причем тип значения выраже­ ния должен совпадать с типом соответствующего ему аргумента (с точностью до приведений). Стандартные операции и функции описаны в следующем разделе.

<оператор if> ::= if <выражение> then <оператор> [ else <оператор> ]

<оператор case> ::= case <выражение> of <список вариантов> [ else <список операторов> ] end

<список вариантов> ::= [<список вариантов> ; ] <вариант> : <оператор>

<вариант> ::= [<вариант> , ] [<константа> .. ] <константа>

Выражение в операторе if (условном) должно выдавать логическое значение. Если его результат true, то будет выполняться оператор после then, а если false, то оператор после else (если он записан). Выражение в операторе case (выбирающем) может выдавать не только целочисленное, но и символьное значе­ ние. Из всех вариантов операторов в нем будет выполняться только один, тот, для ко­ торого значение выражения совпадет с перечисленным перед оператором значением.

165

Если ни одного совпадения не обнаружилось, то выполняются операторы, записан­ ные после else.

<цикл for> ::= for <имя> := <выражение>

{to | downto} <выражение> do <оператор>

После слова for должно быть записано имя целочисленной переменной (пере­

менной цикла). Оператор в цикле исполняется многократно, причем после каждом исполнении переменная цикла увеличивается на 1 (в варианте цикла со словом to) или уменьшается на 1 (в варианте цикла со словом downto) начиная со значения

первого выражения вплоть до значения второго выражения. Оператор в цикле не ис­ полнится ни разу, если второе выражение меньше первого (в варианте со словом to) или если второе выражение больше первого (в варианте со словом downto).

<цикл while> ::= while <выражение> do <оператор>

Выражение, записанное после слова while, должно давать логический ре­

зультат. Перед каждым выполнением цикла это выражение проверяется, и если его результат true, то оператор в цикле исполняется, если false – то нет. После ис­

полнения снова проверяется значение выражения.

<цикл until> ::= repeat <список операторов> until <выражение>

Выражение, записанное после слова until, должно давать логический ре­

зультат. Вначале список операторов внутри цикла исполняется, после чего проверя­ ется значение этого выражения. Если его результат false, то список операторов в

цикле исполняется повторно, после чего снова проверяется значение выражения. Если его результат true, то выполнение цикла прекращается.

<вызов процедуры> ::= <переменная> [(<список выражений>)]

Переменная в вызове процедуры – это имя процедуры или процедурная перемен­ ная, которой присвоена ссылка на функцию. Список выражений в вызове должен точно соответствовать аргументам в описании этой процедуры, причем тип значения выражения должен совпадать с типом соответствующего ему аргумента (с точностью до приведений).

Стандартные процедуры описаны в следующем разделе. У некоторых из проце­ дур имеются особенности в правилах записи списков аргументов.

А.2 Стандартные типы, операции, функции и процедуры

166

Стандартные типы. Характеристики стандартных целочисленных типов приве­ дены в табл. А.1, а стандартных вещественных типов – в табл. А.2.

 

Таблица А.1

 

 

 

Тип

Длина, байт

Диапазон значений

integer

2

–32768 … 32767

word

2

0 … 65535

longint

4

–2147483648 … 2147483647

byte

1

0 … 255

shortint

1

–128 … 127

Тип comp формально вещественный, но содержит целочисленные значения.

К стандартным относятся также следующие типы:

char – символьный тип, занимающий в памяти 1 байт и содержащий двоичный

код номера символа в какой-либо кодировке, например ASCII;

string – строка символов, по умолчанию занимает в памяти 255 байтов, но при описании можно задать меньший размер; текущая длина строки (количество за­

полненных символов) может изменяться от 0 до максимального размера;

boolean – логическое значение, занимает в памяти 1 байт, может принимать значение true или false;

text – переменная с таким типом связывается с текстовым файлом;

file – переменная с таким типом связывается с нетипизированным файлом; file of <тип> – переменная с таким типом связывается с типизированным

файлом, каждая запись которого имеет тип <тип> .

Таблица А.2

Тип

Длина, байт

Диапазон значений

Число верных

десятичных цифр

real

 

 

6

2,9∙10–39 … 1,7∙1038

11–12

single

4

1,5∙10–45 … 3,4∙1038

7–8

double

8

5,0∙10–324 … 1,7∙10308

15–16

extended

10

3,4∙10–4932 … 1,1∙104932

19–20

comp

8

–9,2∙1018 … 9,2∙1018

19

Стандартные операции. Правила выполнения операций в выражениях:

1)операции вначале выполняются внутри круглых скобок, а затем вне их;

2)унарная операция (с одним аргументом) записывается перед аргументом, би­ нарная (с двумя аргументами) – между аргументами, результат выполнения операции может служить аргументом для какой-либо другой операции;

167

3) операции выполняются слева-направо, но с учетом приоритетов: вначале унар­ ные операции, затем бинарные от высокого приоритета к низкому.

В табл. А.3 приведены стандартные операции и указаны их приоритеты.

Таблица А.3

 

 

Операции

 

 

Вид

Приоритет

@

not

-

 

 

 

унарная

наивысший

*

/

div

mod

and

 

бинарная

высокий

+

-

or

xor

 

 

бинарная

средний

=

<>

<

>

<=

>=

бинарная

низкий

Операция @ может применяться к переменной любого типа. Ее результат – ука­

затель на эту переменную.

Операции + (сложение), - (вычитание), * (умножение) применяются к число­ вым аргументам. Тип результата совпадает с типом аргументов, если их типы одина­ ковые, и совпадает с более длинным типом, если типы аргументов различны. Если у одного аргумента тип целочисленный, а у другого вещественный, то тип результата – вещественный. При этом операция - (вычитание) может использоваться и как унар­ ная. Кроме того, операция + может применяться к символьным (char) или стро­

ковым (string) аргументам, тогда результат является конкатенацией (склеиванием) двух строк и имеет тип string.

Операция / (деление) применяется к числовым аргументам, тип результата все­

гда вещественный и совпадает с более длинным типом из двух аргументов. Операции div (деление) и mod (остаток от деления) применяются к целочис­

ленным аргументам, тип результата целочисленный и совпадает с более длинным ти­ пом из двух аргументов.

Операции сравнения = (равно), <> (не равно), < (меньше), > (больше), <= (меньше или равно), >= (больше или равно) применяются к числовым аргументам, тип результата – логический. Эти операции могут применяться также к символьным аргументам, в этом случае сравниваются двоичные коды символов. Кроме того, опе­

рации сравнения могут применяться к аргументам, являющимся символьными стро­ ками (string), в этом случае производится посимвольное сравнение двух строк до

первого несовпадения (лексикографическое сравнение).

Логические операции not (отрицание), and (и), or (или) и xor (исключаю­ щее или) применяются к логическим аргументам, тип результата – логический.

Стандартные функции и процедуры. В табл. А.4 приведены математические функции, имеющие один аргумент (кроме функции pi, у которой список аргумен­

тов отсутствует).

168

Таблица А.4

Функция

Тип аргумента

Тип результата

Пояснение

 

 

 

 

abs

целочислен­

как у

Абсолютное значение

 

ный или ве­

аргумента

 

 

щественный

 

 

arctan

real

real

Арктангенс, главное значение

cos

real

real

Косинус

exp

real

real

Экспонента

frac

real

real

Дробная часть числа

int

real

real

Целая часть числа

ln

real

real

Натуральный логарифм

odd

longint

boolean

Проверка нечетности числа

pi

отсутствует

real

Число π

round

real

longint

Округление до ближайшего целого

sin

real

real

Синус

sqr

real

real

Возведение в квадрат

sqrt

real

Real

Квадратный корень

trunc

real

longint

Целая часть числа

В табл. А.5 приведены функции, а в табл. А.6 – процедуры для работы с символа­ ми и строками.

Таблица А.5

Функция

Типы аргументов

Тип результата

Пояснение

chr

1) integer

char

Выдает символ с кодом, равным

значению аргумента

 

 

 

ord

1) char

integer

Выдает код символа (аргумента)

length

1) string

integer

Выдает длину строки (аргумента)

concat

1) string

string

Выдает строку, полученную скле­

 

 

иванием строк-аргументов (коли­

 

 

 

чество аргументов >1)

copy

1) string (s);

string

Выдает строку, полученную вы­

 

2) integer (i);

 

резанием k символов из строки

169

 

3) integer (k)

 

s, начиная с i-го символа

 

 

 

 

pos

1) string

(s);

integer

Выдает номер символа в строке

 

 

2) string

(s2)

 

s, с которого начинается подстро­

 

 

 

 

 

ка s2.

 

Таблица А.6

Процедура

Типы аргументов

 

Пояснение

 

 

 

 

delete

1) string

(s);

В строке s удаляет k символов, начиная

 

2) integer (i);

с

i–го символа

 

3) integer (k)

 

 

insert

1) string

(s);

В строке s, начиная с i–го символа,

 

2) string

(s2);

вставляет подстроку s2

str

3) integer (i)

Преобразует x в его изображение симво­

1) целочисленный или

 

вещественный (x);

лами в строке s. После x (через двоето­

 

2) string

(s)

чие) может стоять одно или два числа

 

 

 

(первое – общее количество символов,

 

 

 

второе – после десятичной точки)

val

1) string

(s);

Преобразует строку s, в которой должно

 

2) целочисленный или

быть записано изображение числа, в чис­

 

вещественный (x);

ло

x. Если при преобразовании обнару­

 

3) integer (k)

жена ошибка, то k – номер ошибочного

 

 

 

символа

В табл. А.7 приведены функции и процедуры управления памятью для перемен­ ных.

Таблица А.7

Процедура

Типы аргументов и

Пояснение

или функция

результата

 

dispose

1) указатель ( )

Освобождает динамическую память, на

(процедура)

 

p

которую указывает p, и которая ранее

 

 

 

была выделена процедурой new

freemem

1) указатель (p);

Освобождает динамическую память разме­

(процедура)

2) word

(n)

ром n байтов, на которую указывает p, и

 

 

 

которая ранее была выделена процедурой

 

 

 

getmem

getmem

1) указатель (p);

Выделяет динамическую память размером

(процедура)

2) word

(n)

n байтов и ссылку на нее присваивает ука­

170

 

 

зателю p

 

 

 

 

new

1) указатель ( )

Выделяет динамическую память, создавая

 

(процедура)

p

новый экземпляр объекта, который может

 

 

адресоваться указателем p, и ссылку на

 

 

 

 

 

 

объект присваивает указателю p

 

maxavail

Аргументы отсут­

Выдает длину наибольшего доступного для

 

ствуют, тип ре­

распределения непрерывного блока памяти

 

(функция)

 

зультата –

в байтах

 

 

 

 

longint

 

 

В табл. А.8 приведены процедуры (без аргументов) для управления процессом вычислений.

 

Таблица А.8

 

 

Процедура

Пояснение

exit

Осуществляет выход из текущего блока (из

выполняемой процедуры или функции)

halt

Прекращает выполнение программы

Процедура move быстро пересылает данные из одной области памяти в другую.

Ее вызов:

move(<источник>,<получатель>,<длина>)

Первые два аргумента могут иметь любой тип, третий аргумент – тип word.

В табл. А.9 приведены функции и процедуры генерирования случайных чисел.

При генерации инициировать начальное случайное число можно либо присвоением переменной randseed произвольного значения типа longint, либо вызовом

процедуры randomize.

 

 

Таблица А.9

Процедура

Типы аргументов и

 

Пояснение

или функция

результата

 

randomize

Отсутствуют

Инициирует начальное случайное число

(процедура)

 

значением из таймера

random

1) word (d) или от­ Генерирует очередное случайное число из

(функция)

сутствует.

диапазона от 0 до d-1 (тип word) или,

 

Тип результата –

если аргумент отсутствует, из диапазона от

 

word или real

0 до 1 (тип real)

В табл. А.10 приведены функции чтения параметров вызова программы из ко­ мандной строки операционной системы.

Таблица А.10