Алгоритмические языки высокого уровня. Курс лекций
.pdfЦелые числа в Pascal записываются в обычном виде, например: 0, +100,-56498. Следует учесть, что если целочисленная кон- станта выходит за указанные границы, компилятор дает сообщение об ошибке. Такие константы должны записываться с десятичной точкой, т.е. определяться как вещественные числа.
Вещественные числа в Pascal представляются в одной из двух форм, которые называются: запись числа с фиксированной точкой и запись с плавающей точкой.
Первая форма – запись числа в виде целой и дробной частей:
–3.15, 0.1, +23.0125.
Вторая форма (с плавающей точкой) – это запись числа с мантис- сой и десятичным порядком, разделенными латинской буквой E. Та- кая запись означает, что мантисса (которая может быть целым чис- лом или вещественным числом в форме с фиксированной точкой) умножается на 10 в степени, задаваемой порядком (который всегда должен быть целым числом): -18.7Е+3, 2.123Е+4, 2.34Е-2,
6Е-1.
Вязыке программирования Pascal запрещается запись веществен- ных чисел в виде .5 или 5, их необходимо записывать как 0.5 и
5.0соответственно. Если в записи числа содержится точка, то, по крайней мере, одна цифра ей должна предшествовать и следовать за ней.
Выражение-константа представляет собой выражение, которое может вычисляться компилятором без необходимости выполнения программы. Поскольку компилятор должен иметь возможность пол- ностью вычислить выражение-константу во время компиляции, в ка- честве выражений-констант не допускается использовать следующие конструкции:
•ссылки на переменные и типизированные константы (кроме констант в адресных выражениях);
•вызовы функций (кроме тех, которые отмечены далее);
•оператор получения адреса @ (кроме констант в адресных выражениях).
Ввыражениях-константах допускается использовать следующие стандартные функции: Abs, Chr, Hi, High, Length, Lo,
Low, Odd, Ord, Pred, Ptr, Round, SizeOf, Succ,
Swap, Trunc.
11
Примеры использования выражений-констант
Const
Min = 0; Max = 100;
Center = (Max - Min) div 2; Beta = Chr(255);
NumChars = Ord('Z') - Ord('A') + 1; Message = 'Out of memory';
ErrStr = 'Error:' + Message + '.'; ErrPos = 80 - Length(Error) div 2; ErrAttr = Blink + Red * 16 + White; Ln10 = 2.302585092994095684;
Ln10R = 1 / Ln10; Numeric = ['0'..'9'];
Alpha = ['A'..'Z','a'..'z']; AlphaNum = Alpha + Numeric; DD = $7F;
Шестнадцатеричное число состоит из шестнадцатеричных цифр, которым предшествует знак доллара $ (код 36 в ASCII). Диапазон шестнадцатеричных чисел – от $00000000 до $FFFFFFFF.
Логическая константа – это слово FALSE (ложь), либо слово TRUE (истина).
Символьная константа – это любой символ ПК, заключенный в апострофы: 'z' – символ z; 'Ф' – символ Ф. Если необходимо запи- сать как символьную константу сам апостроф ('), он удваивается: '''. Допускается использование записи символа путем указания его внут- реннего кода, которому предшествует символ # (код 35): #97 – сим- вол а; #90 – символ Z; #39 – символ '; #13 – символ CR.
Строковая константа – любая последовательность символов (кроме символа CR – возврат каретки), заключенная в апострофы. Если в строке нужно указать сам символ апострофа, он удваивается.
А='Это - строка символов' – cтрока на экране:[Это -
строка символов]
B= 'That'''s string' – cтрока на экране:[ That's string]
Строка символов может быть пустой, т.е. не иметь никаких сим- волов в обрамляющих ее апострофах.
Строку можно составлять из кодов нужных символов с предшест- вующими каждому коду символами #: К примеру такая запись #83#121#109#98#11#108 эквивалентна строке 'Symbol'. Здесь 83 – код символа S, 121 – y и т.д.
В строке можно чередовать части, записанные в обрамляющих апо- строфах, с частями, записанными кодами. Таким способом можно
12
вставлять в строки любые управляющие символы, в том числе и сим- вол CR (код 13): СС=#7'Ошибка !'#13'Нажмите любую клавишу ...'#7 .
2.3. Идентификаторы и переменные
Важным элементом исходного текста программы являются иден- тификаторы.
Идентификаторы – это имена констант, типов переменных, пе- ременных, меток, процедур (функций), программ, модулей, библио- тек, объектов, полей в записях и т.п. Использование идентификато- ров осуществляется с помощью описаний. В качестве идентификато- ров можно использовать любые последовательности символов, кото- рые удовлетворяют следующим условиям:
•идентификатор может состоять из букв латинского алфави- та, цифр, знака подчеркивания (другие символы в описании недопус- тимы);
•идентификатор не может начинаться с цифры;
•идентификатор не может совпадать ни с одним из зарезер- вированных слов;
•длина идентификатора может быть произвольной, но зна- чащими считаются первые 63 символа.
Пример программы (использования описания идентификаторов)
Program Stepen; Var
A,B: Real;
N: Integer; Begin
Writeln('Программа возведения числа в степень'); Write('Введите число = '); Readln(A); Write('Укажите степень = '); Readln(N);
Writeln; B:=Exp(N*Ln(A));
Writeln('Результат:');
Writeln('B= ',B:8:2); Readln
End.
В примере Stepen, A,B,N – правильные идентификаторы. Переменная – это область оперативной памяти, занимающая не-
сколько ячеек и имеющая свое имя. Переменная обладает следую- щими свойствами:
•переменная хранит не более 1 значения;
•переменная способна хранить значения только одного типа;
13
•переменная хранит значение до тех пор, пока в нее не по- местят новое значение, при этом предыдущее значение переменной стирается;
•значение переменной может быть вызвано для использова- ния сколько угодно раз без изменения оригинала (значения);
•в начале выполнения программы содержимое переменной считается неопределенным;
•ячейки памяти, отведенные под переменную путем ее опи- сания, заполняются значениями в ходе выполнения программы с по- мощью оператора присваивания (этим переменная отличается от константы, которой значение присваивается до выполнения основ- ной программы, в разделе определения констант).
Различные типы данных занимают в оперативной памяти ПК раз- ное количество ячеек (емкость одной ячейки – 1 байт). Перед нача- лом вычислений следует сообщить ПК, сколько ячеек памяти надо зарезервировать под ту или иную переменную. Для этого в блоке «VAR» раздела описаний программы должны быть описаны все ис- пользуемые переменные, т.е. должно быть указано имя каждой пере- менной и типы данных, которые будут храниться в этих переменных.
Внастоящее время в профессиональном программировании при- нято записывать имена переменных с использованием так называе- мой венгерской нотации.
Венгерская нотация – это соглашение о наименованиях пере- менных и функций. Соглашение широко используется при програм- мировании на языках Pascal, C и в среде WINDOWS. Венгерская но- тация основывается на следующих принципах:
•имена переменных и функций должны содержать префикс, описывающий их тип;
•имена переменных и функций записываются полными сло- вами или словосочетаниями или их сокращениями, но так, чтобы по имени можно было понять назначение переменной или действие, вы- полняемое функцией.
Префиксы записываются малыми буквами, первая буква каждого слова – заглавная, префиксы и слова записываются либо слитно, ли- бо через символ _ (подчеркивание).
Для языка Pascal рекомендованы префиксы для скалярных пере- менных и функций, приведенные в табл. 2.1.
14
|
|
|
|
|
Таблица 2.1 |
|
Префиксы, используемые в именах переменных |
|
|||
|
|
|
|
|
|
№ |
Префикс |
Тип |
№ |
Префикс |
Тип |
|
|
|
|
|
|
1 |
by |
Byte |
11 |
ch |
Char |
2 |
sh |
Shortint |
12 |
b |
Boolean |
3 |
i |
Integer |
13 |
p |
Pointer |
4 |
w |
Word |
14 |
ar |
Array |
5 |
l |
Longint |
15 |
s |
String |
6 |
r |
Real |
16 |
sz |
Stringz |
7 |
si |
Single |
17 |
se |
Set |
8 |
d |
Double |
18 |
re |
Record |
9 |
e |
Extended |
19 |
f |
File |
10 |
c |
Comp |
20 |
t |
Text |
Пример: Var rV, arVector[1..20], sName, iCount.
В откомпилированной программе для всех переменных отведено место в памяти, и всем переменным присвоены нулевые значения.
2.4. Служебные (ключевые и зарезервированные) слова
Любая программа на Pascal начинается словом PROGRAM и со- держит объявление имени программы. Слово PROGRAM зарезервиро- вано в Pascal, т.е. не может использоваться ни в каких иных целях, кроме как для объявления имени программы. В Pascal имеется мно- жество зарезервированных слов. Любое из них нельзя использовать в качестве идентификатора (имени) какого-либо объекта программы – переменной, константы и т.д. Смысл зарезервированных слов строго зафиксирован (каждое слово предназначено для описания опреде- ленных действий). Служебные слова нельзя использовать не по на- значению. При этом набор зарезервированных слов может меняться от версии к версии. Происходит это потому, что в качестве новой версии языка появляются дополнительные возможности, для реали- зации которых нужны новые зарезервированные слова. В то же вре- мя некоторые из старых зарезервированных слов перестают быть та- ковыми. Делается это для лучшей переносимости программ.
Основные зарезервированные слова:
absolute – директива, с помощью которой определяется абсо- лютный адрес переменных, функций или процедур;
and, or, xor, not – директивы логических операций; array – используется для описания переменных типа «массив»;
15
begin, end – «операторные скобки». Любая программа начина- ется со слова begin и заканчивается словом end с точкой (end.). Внутри «операторных скобок» может находиться любой набор опе- раторов, действий или выражений. Операторы всегда отделяются друг от друга точкой с запятой «;»;
case – оператор выбора вариантов (для реализации разветвления процесса);
if <операторы> then <операторы> else <операто-
ры> – оператор «разветвления» вычислительного процесса (возмож- но два разветвления: да – в этом случае выполняются операторы, стоящие после then, или нет – выполняются операторы, стоящие после else);
const – описание констант;
object, constractor, destructor, virtual – дирек-
тивы для работы с объектами;
do(downto), for, to, while, repeat, until – опера-
торы цикла;
file – описание переменной типа «файл»;
forward – директива, которая говорит о том, что вызывается процедура или функция, описаниe которой в программе будет после; function, procedure – директива описания процедур и
функций;
implementation, interface, unit, uses – директивы для описания модулей и библиотек;
mod – операция взятия остатка от деления по модулю; div – операция целочисленного деления;
program – идентификатор названия программы; set – описание переменной типа «множество»;
string – описание переменной типа «строка» (массив симво- лов);
var – описание переменных;
type – описание типов переменных;
goto(label) – переход на определенное место в программе; in – операция проверки принадлежности элемента множеству; nil – нулевая ссылка (нулевой адрес динамической переменной); record – описание переменной типа «запись».
16
2.5. Выражения и операции
Основными объектами, из которых конструируется программа, являются константы, переменные и обращения к функциям. С помо- щью знаков операций и скобок из них составляют выражения, т.е. в самом общем виде можно сказать, что выражения строятся из опе- рандов, знаков операций и круглых скобок. При этом операндами могут быть константы, переменные и сами выражения. Частными случаями выражения являются: одна константа, переменная или об- ращение к функции.
Примеры выражений
У
21
(а + b) * с sin(t)
а > 2
not Flag and (a=b) NIL
[1, 3. .7] * set1
Основным требованием к записи выражения в Pascal является раз- мещение всех его элементов в одной строке. В выражениях допуска- ется использовать константы (неизменяемый объект программы), переменные (объект программы, который может изменять свое зна- чение), операции (например: + , - , / , * и др.) и функции.
Пример: выражение (6-x)x+10(xy-6xyz) xy-yz-zx
выражение на Pascal:
((6-x)*x+10*(x*y-6*x*y*z))/(x*y-y*z-z*x).
2 2
Пример: выражение sinx +cosy
2 e(2x-5)
выражение на Pascal:
(Sqrt(Sin(x*x)+Cos(y*y)))/Exp(Sqr(2*x-5)).
Выражение – это правило вычисления значения. В выражении участвуют операнды, объединенные знаками операций. Операндами выражения могут быть константы, переменные и вызовы функций. Операции выполняются в определенном порядке в соответствии с приоритетами, как и в математике. Для изменения порядка выпол- нения операций используются круглые скобки, уровень их вложенно- сти практически не ограничен. Результатом выражения всегда явля- ется значение определенного типа, который определяется типами
17
операндов. Величины, участвующие в выражении, должны быть со- вместимых типов, о чем далее будет рассказано подробнее.
В выражениях используемые операции обладают приоритетом, определяющим порядок их выполнения.
Унарные: not (отрицание), @;
Пример: not (5 > 7) – истина, not (5 > 2) – ложь.
Мультипликативные: *, /, div (деление нацело), mod (остаток от целочисленного деления),and (ло-
гическое «И»), shl, shr;
Пример: 3 div 2 равно 1, +5 mod 2 равно 1. Пример: (5 > 2) and (4 > 7) – ложь,
(7 > 3) and (2 < 6) – истина.
Аддитивные: +, -, or (логическое "ИЛИ"), xor (исключаю- щее «ИЛИ»);
Пример: (5 > 2) or (3 > 8) – истина, (1 > 4) or (10 > 50) – ложь.
(5 > 2) xor (3 < 8) – ложь.
Операции отношения: =, <>, <, >, <=, >=,in
Пример: (8 >= 7) – истина, (5 <= 2) – ложь.
Приоритет операций убывает в указанном порядке. При равном приоритете операции выполняются слева направо в порядке записи. Для изменения очередности выполнения операций следует использо- вать круглые скобки. При этом все, что заключено в скобки, будет представлять собой вложенное выражение, и за пределами скобок будет использоваться только результат его вычисления. Внутри ско- бок действуют обычные правила, т.е., например, умножение и деле- ние, которые имеют более высокий уровень, чем сложение и вычита- ние, будут выполняться первыми. Степень вложенности выражений ограничений не имеет, при написании таких выражений следует помнить о правиле равенства количества открывающихся и закры- вающихся скобок. Операции отношения имеют самый низкий при- оритет. С помощью операций отношения величина слева от знака сравнивается с величиной справа от него.
Примечание. В Pascal нет операции возведения в степень. Вместо этого для возве- дения в целую степень можно использовать операцию умножения, а в дробную – выражение, использующее операцию логарифмирования и потенцирования: xy=ey*lnx, что на языке Pascal соответствует выражению exp(y*ln(x)) с исполь- зованием двух стандартных функций exp(<выражение>) и ln(<выражение>).
18
Pascal – типизированный язык. Он построен на основе строгого соблюдения концепции типов, в соответствии с которой все приме- няемые в языке операции определены только над операндами со- вместимых типов.
Два типа считаются совместимыми, если:
•оба они есть один и тот же тип;
•оба вещественные;
•оба целые;
•один тип – тип-диапазон второго типа;
•оба являются типами-диапазонами одного и того же базово-
го типа;
•оба являются множествами, составленными из элементов одного и того же базового типа;
•оба являются строками одинаковой максимальной длины;
•один тип – тип-строка, а другой – тип-строка, или символ;
•один тип – любой указатель, а другой – нетипизированный указатель;
•оба есть процедурные типы с одинаковым типом результата (для типа-функции), количеством параметров и типом параметров.
Совместимость типов имеет значение в операторах присваивания. Пусть T1 – тип переменной, а Т2 – тип выражения. Операция при-
сваивания: T1 := T2 возможна в следующих случаях:
•T1 и T2 есть один и тот же тип и этот тип не относится к файлам или массивам файлов, или записям, содержащим поля- файлы, или массивам таких записей;
•T1 и T2 являются совместимыми порядковыми типами, и значение T2 лежит в диапазоне возможных значений T1;
•T1 и T2 являются вещественными типами, и значение T2 лежит в диапазоне возможных значений T1;
•T1 – вещественный тип, а T2 – целый тип;
•T1 – строка, а T2 – символ;
•T1 – строка, а T2 – упакованная строка;
•T1 и T2 – совместимые упакованные строки;
•T1 и T2 – совместимые множества, и все члены T2 при- надлежат множеству возможных значений T1;
•T1 и T2 – совместимые указатели;
•T1 и T2 – совместимые процедурные типы;
19
•T1 – объект, а T2 – его потомок.
Впрограмме данные одного типа могут преобразовываться в дан- ные другого типа. Такое преобразование может быть явным или не- явным.
При явном преобразовании типов используются вызовы специ- альных функций преобразования, аргументы которых – одного типа,
азначения – другого. Это функции ORD, TRUNC, ROUND, CHR,
PTR (преобразует четырехбайтный целочисленный аргумент к типу- указателю).
В Pascal может использоваться и более общий механизм преобра- зования типов, согласно которому преобразование достигается при- менением идентификатора имени) стандартного типа или типа, опре- деленного пользователем, как идентификатора функции преобразо- вания к выражению преобразуемого типа (так называемое автоопре- деленное преобразование типов). Приведение типов позволяет рас- сматривать одну и ту же величину в памяти ПК как принадлежащую разным типам. Для этого используется конструкция вида:
Имя_Типа (переменная или значение)
Допустимы следующие вызовы функций:
type
МуТуре = (а, Ь, с, d);
.....
МуТуре (2) Integer ('D')
pointer (longint(a)+ $FF) Char (127 mod c)
Byte (k)
При автоопределенном преобразовании типа выражения может произойти изменение длины его внутреннего представления (длина может увеличиться или уменьшиться).
Неявное преобразование типов возможно только в двух случаях:
•в выражениях, составленных из вещественных и целочисленных переменных, последние автоматически преобразуются к веществен- ному типу, и все выражение в целом приобретает вещественный тип;
•одна и та же область памяти попеременно трактуется как содер- жащая данные то одного, то другого типа (совмещение в памяти данных разного типа).
Совмещение данных в памяти может произойти при использова- нии записей с вариантными полями, типизированных указателей, содержащих одинаковый адрес, а также при явном размещении дан-
20
