§2.1. Алфавит и служебные слова
Языки программирования, так же как и разговорные, имеют свой алфавит. Алфавитом языка программирования называют весь набор символов, с помощью которых составляется программа.
Алфавит языка Паскаль (Турбо-Паскаль) составляют:
1. Латинские строчные и прописные буквы, которые не различаются. К буквам относится и символ подчеркивания.
2. Арабские цифры от 0 до 9.
3. Символы-разделители: пробел, переход на новую строку, табуляция. Используются для большей наглядности текста программы.
4. Специальные символы:
+ – * / = . , ‘ : ; ^ @ # $ { } [ ] ( ) < >
Они выполняют определенные функции при построении различных конструкций языка.
5. Составные символы, то есть группа символов, воспринимаемых компилятором как единое целое:
<= => := (* *) (. .) ..
6. Служебные слова. Так как языки программирования являются формальными, а не разговорными, то служебные слова (ключевые слова английского языка) не подлежат изменению или сокращению – это просто иная форма записи символов. Например: Program, Begin, For и т.д. Если начальная версия языка Паскаль насчитывала 35 служебных слов, то в Турбо-Паскале 7.0 их уже 59.
Описание общих конструкций языка
Для описания общих структур в программировании используются специальные символы – метасимволы, которые в структурах не указываются, а предназначены лишь для пояснений. К ним относятся:
[a] – квадратные скобки указывают на необязательность элемента а;
[a1 |a2 |…an ] – свидетельствует о том, что может присутствовать только 1 элемент ai из указанного списка, или ни одного;
a1 |a2 |…an или – указывает на обязательность присутствия одного и только одного элемента ai.
<a> – на место а должно быть подставлено конкретное значение;
… – многоточие свидетельствует о том, что предыдущий тип элемента можно неоднократно повторять.
Например, запись [(<список параметров>)] эквивалентна [(<параметр> [, …])]. Конкретное же значение может либо вообще отсутствовать, либо выглядеть, например, так:
(А,В,С)
Или общая форма записи оператора цикла с параметром:
For <параметр цикла> := <начальное значение> To | DownTo <конечное значение> Do <внутренний оператор – тело цикла>
А его конкретная реализация в программе:
For i:=1 To 100 Do s:=s+(i+1)/(i*i+2);
§2.2. Структура программы
Алгоритмический язык Паскаль является операторным языком, то есть отдельными его предложениями являются операторы, с помощью которых задаются действия. Программа же на этом языке представляет собой формальную запись некоторого алгоритма.
В соответствии с этим принципом программа на любом алгоритмическом языке состоит из двух частей: описания последовательности действий, которые необходимо выполнить, и описания данных, с которыми оперируют действия. Действия представляются операторами языка, данные вводятся посредством описаний и определений. Описания данных по тексту должны предшествовать описанию действий.
В оригинале синтаксически программа разделена на 2 части:
<заголовок программы>;
<блок>.
Наличие точки в конце является обязательным и служит окончанием признака всего текста программы.
Заголовок начинается со служебного слова Program, далее следует имя программы и список параметров. Но в Турбо-Паскале заголовок может отсутствовать, то есть программа может состоять только из одного блока, хотя по правилам хорошего стиля программирования заголовок должен присутствовать.
Совокупность описаний и определений и следующая за ним последовательность операторов называется блоком.
Объекты, вводимые посредством описаний и определений, имеют различную природу и делятся на 5 классов, описываемых каждый в своем разделе:
1. раздел описания меток;
2. раздел описания констант;
3. раздел описания типов;
4. раздел описания переменных;
5. раздел описания процедур и функций.
В Турбо-Паскале соблюдение такой последовательности не обязательно, и добавлен еще один раздел подключаемых модулей. За разделами описаний следует раздел операторов, заключенный между словами Begin и End.
При составлении программы следует придерживаться определенных правил, основные из которых следующие.
1. Все описания и операторы отделяются друг от друга точкой с запятой. В принципе всю программу можно записать в одну строку, но правила хорошего стиля программирования требуют записи каждого оператора на отдельной строке для удобства чтения текста программы.
2. Для пояснения отдельных фрагментов программы используются комментарии. Для их записи могут использоваться любые символы клавиатуры, они могут стоять в любом месте, где может ставиться пробел, и для них в Турбо-Паскале введено 2 типа ограничителей:
{<комментарий>}
(*<комментарий>*)
3. Для обозначения переменных, констант, заголовков и т.д. используются идентификаторы или имена. Они могут состоять из прописных и строчных латинских букв, считающихся эквивалентными (символ подчеркивания относится к буквам и служит для разделения слов) и цифр, причем начинаться имя должно с буквы. В Турбо-Паскале длина имени не ограничена, но распознаются они по первым 63 символам.
4. Перед любым оператором может быть поставлена метка (допускается и несколько), за которой следует двоеточие. В стандартном Паскале меткой является целое число от 1 до 9999. В Турбо-Паскале меткой может быть как число (для обеспечения совместимости), так и имя.
5. Правилом хорошего стиля программирования является выделение различных конструкций программы: внутренних, составных операторов и др. отступами различной ширины от начала строки.
В качестве примера приведем программу для вычисления суммы при значении n = 20.
Program Summa;
Const n=20;
Var S:real;
i:integer;
Begin
S:=0;
For i:=0 to n do
S:=S+1/(i*i+3*i+5);
Writeln(‘Сумма=’,S:6:4)
End.
§2.3. Разделы описаний
Описание меток
Все метки, которые используются в программе, должны быть описаны в этом разделе. Раздел начинается со служебного слова Label, за которым следуют через запятую все используемые метки:
Label <метка1>[,<метка2>…];
Хотя метки и могут стоять перед любым оператором, причем даже несколько сразу, но используются они в единственном операторе безусловного перехода GoTo, который не рекомендуется к использованию, поэтому на практике данный раздел встречается редко. Например:
Label M1,Metka,L38;
Определение констант
Все значения, которые используются в программах на любых языках программирования, делятся на 2 больших класса: константы и переменные. При трансляции программы константы располагаются непосредственно в области кода программы, переменные же хранятся отдельно в сегменте данных. Так как при выполнении программы она не должна модифицировать сама себя (свойство реентерабельности), то константы изменять нельзя. Переменные же могут изменяться в процессе выполнения программы сколько угодно раз. Так, при трансляции оператора и дальнейшем его выполнении
А:=В+С
используются 3 ячейки памяти, а оператора
А:=8+9
только одна. Переменные обозначаются именами, а константы числами, строками и т.д.
Паскаль допускает введение в программу объектов, внешне похожих на переменные, но которые на самом деле являются константами, то есть не подлежат изменению при выполнении программы. Константе можно присваивать свое имя, которое просто является синонимом фиксированного числа. Использование в программе имен констант вместо записи конкретных значений является правилом хорошего стиля программирования, так как делает программу более наглядной и способствует лучшему ее пониманию без снижения эффективности. Кроме того, если конкретные значения обозначены именами, например, границы массивов, показатели точности вычислений, то при необходимости их легко изменить, не выискивая по всему тексту программы.
Описание констант начинается со служебного слова Const, за которым идет последовательность описаний констант:
Const <имя>=<значение>;
[<имя>=<значение>;…]
Здесь тип значения не указывается, так как считается, что значение является единственно возможным с однозначно определяемым типом по значению константы. В Турбо-Паскале допускается использовать в качестве значения константное выражение, строящееся по тем же правилам, что и обычное. Его операндами могут быть константы, ранее описанные имена констант и некоторые стандартные функции. Например:
Const
Max = 100; {константа целого типа}
Min = 0;
Center =(Max-Min) div 2; {выражение и результат тоже целого типа}
m_e = 9.10955854e-31; {масса покоя электрона – число вещественное}
LiteraA =’A'; {символьная константа}
В Турбо-Паскале существует понятие типизированных констант. Но на самом деле они являются переменными, которым в разделе описаний присваиваются начальные значения. Типизированные константы, как и обычные переменные, можно изменять в процессе вычислений, то есть они – переменные, но с начальными значениями. То есть их можно было бы описать в разделе описания переменных, а затем первыми операторами присвоить им начальное значение. Но в некоторых случаях, например при задании начальных значений массивам, их использование удобно. Для типизированных констант уже необходимо задавать конкретный тип, например:
Const max:integer = 9999;
MyArray: array[1..3] of string = (‘Red’,’Blue’,’Green’);
Определение типов
При составлении программ могут использоваться данные самых разнообразных типов, включая и достаточно сложные. От типа переменной зависит выделяемая для нее память и интерпретация данных в выделенной памяти.
В простейшем случае указывается стандартный тип при описании переменной, например, как в примере вычисления суммы. Однако в Паскале допускается определение своего типа отдельно, например определение комплексного типа:
Type Complex = Record
Re,Im:real;
end;
Начинается этот раздел с служебного слова Type и широко используется при работе с динамическими переменными и при объектном программировании.
Описание переменных
Перед началом выполнения программы под все переменные (за исключением динамических) должно быть выделено место в памяти ЭВМ. То есть все переменные, используемые в программе, должны быть описаны и транслятор «должен знать» о них. В некоторых языках программирования используются правила умолчания, так в Фортране тип и размер переменной определяется по первой букве имени, и часто этот раздел отсутствует: при встрече новой переменной по тексту программы для нее автоматически определяется размер и выделяется место (она заносится в таблицу). Но язык Паскаль разрабатывался как «надежный» язык программирования, с максимально возможным поиском формальных ошибок. Поэтому в нем все переменные, участвующие в программе, должны быть описаны в данном разделе.
Общий вид описания переменных выглядит следующим образом:
Var <имя1>[,<имя2>…] :<тип>; …
Например:
Var x:real;
i,j,k:integer;
Так как по свойству массовости алгоритма переменные присутствуют в каждой программе, то в реальных программах всегда в наличии и этот раздел.
Раздел описания процедур и функций будет рассмотрен далее.
Контрольные вопросы
1. Какие группы символов входят в алфавит языка Паскаль?
2. Что такое служебные слова?
3. Приведите примеры метасимволов для описания общих конструкций языка программирования.
4. Из каких элементов состоит программа на языке Паскаль?
5. Что такое в структуре программы блок?
6. Какие бывают разделы описаний?
7. Как отделяются операторы друг от друга?
8. Как записываются комментарии?
9. Для чего используются идентификаторы (имена)?
10. Какие есть правила образования идентификаторов (имен)?
11. Что такое метка и для чего они используются?
12. Каким образом рекомендуется располагать конструкции программы для ее большей наглядности?
13. Каким образом описываются метки?
14. Какие различия между константами и переменными?
15. Как описываются константы?
16. Как определяется тип описываемых констант?
17. Что такое типизированные константы?
18. Как описываются типы?
19. Как описываются переменные?
20. Какой раздел описаний чаще всего присутствует в простых программах?