Категории раздела
J2me|java [29]
Basic [6]
Delphix [21]
C+|C++|C# [3]
Pascal [10]
Другие [0]
языки которые не войшли в верхние разделы
Главная » Статьи » Программирования » Pascal

Cинтаксис языка

Урок первый,

в котором рассказываетсявсе про синтаксис Pascal:как писать самое главное в программе -комментарии; какова на самом делеструктура программы;какие бывают идентификаторы;что такое и какие бываютстандартные типыи что за нестандартные типыможет создавать программист; как объявлятьпеременные и как ихобрабатывать, используяпростые операторы; и,наконец, как писать понтные прогрммы, используя процедуры и функции.И, естественно, с какой программы начать.


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

Синтаксис языка,

или внешнее устройство

Комментарии,

или то, что многие игнорируют

Совершенно необходимой частью каждой программы(за исключением элементарных и плохонаписанных) являются комментарии.Pascal поддерживает два способа выделениякомментариев:

(* Комментарий,выделенный первым способом *)
{Комментарий, выделенный вторым способом}

причем первый способ имеет болеевысокий приоритет (а значит может использоватьсядля "закомментаривания" участковтекста, уже содержащих коментарии, выделенныевторым способом.

Кстати совет: любому программисту следуетприобрести привычку постоянно комментировать своипрограммы - для последующего изучения иобеспечения возможности передачи другимпрограммистам. (Наиболее эффективный способоценить ценность любого совета - не следовать ему.Только делать это надо последовательно исистематически, а не так, что иногда следуешь,а иногда - нет.)

Структура программы,

или главный порядок

Pascal задумывалсяавторомкак учебный языкструктурного программирования. Как следствие этогопрограммы, на нем написанные, имеют достаточнопростую, но жесткую структуру. Она такова

{ часть объявления имени программы: }
Program NameOfProgram;
{ часть объявления списка подключаемых модулей: }
Uses {список модулей через запятую };
{ часть объявления констант: }
Const
{список констант и их значений через ; };
{ часть объявления типов пользователя: }
Type
{список типов пользователя через ; };
{ часть объявления переменных: }
Var
{список переменных и их типов через ;};
{ часть основной программы }
Begin {точка входа}
{операторы основной программы}
End. {основная точка выхода и конец программы}

Части Program иUses неявляются обязательными,однако должны быть первыми и единственнымив программе.Const,Typeи Var частей впрограмме может существоватьмножество, их порядок ненормируется и определяетсятребованиями программирования.Часть основной программы всегда являетсяпоследней, признаком ее завершенияявляется ключевое словоEnd с точкойпосле него. Любая информация послезавершения основной части игнорируетсякомпилятором.

Идентификаторы,

или имена

По определениюН.Вирта(автора языка) программа есть данныепродуманной структуры плюс алгоритмы,эти данные обрабатывающие.

Каждое данное (каждый элемент данных)может (и должен) иметьопределенное имя (идентификатор). То жесамое относится и к каждому типу данных,и к процедурам, и к функциям.Идентификатором на Pascal'eсчитается любая последовательностьиз не более чем 126 символов,состоящая из букв латинского алфавита,цифр и символа "_", причем первым символомдолжна быть буква. Большие и маленькиебуквы не различаются. Идентификаторы,у которых одинаковы первые63 символа, считаются идентичными.

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

Стандартные типы данных

Для того, чтобы правильно обрабатыватьсякомпилятором языка,каждый элемент данных должен иметьнекоторый определенный тип.Рассмотрим типы данных, стандартнообрабатываемыена Pascal'e. В основномгрупп типов девять (самих типов - море):

  1. целочисленные:
    Integer :2 байта со знаком;
    ShortInt:2 байта со знаком;
    Longint:1 байт со знаком;
    Word:2 байта без знака;
    byte:1 байт без знака.
  2. дробные:
    Real:6 байт;
    Single:4 байтa;
    Double:8 байт;
    Extended:10 байт;
    Comp:8 байт
  3. логические:
    Boolean:1 байт;
    WordBool:2 байта;
    ByteBool:1 байт;
    LongBool:4 байта;
  4. символьные:
    Char:1 байт;
    String:от 1 до 255 байт + байт длины;
  5. указатели:
    Pointer:4 байтa, нетипизированный указатель;
    ^<имя_типа>:4 байта, типизированнный указатель;
  6. массивы - несколько однотипных элементов, объединенныходним именем; доступ к элементам производится по их номерам(индексам);
  7. записи - несколько разнотипных элементов, объединенныходним именем; доступ к элементам производится по их уникальным"подименам";
  8. множества - несколько однотипных элементов,объединенных одним именем, причем элементы не повторяются; доступк элементам производится через специальные функции;
  9. файлы - несколько элементов, объединенных одним именеми расположенных вне оперативной памяти; доступ к ним производитсяс помощью специфических процедур и функций;
  10. типы, определяемые программистом,- поименованныеструктуры из некоторых стандартныхтипов (эти типы не являютсястандартными).

Следует отметить, что диапазонзначений числовых типовопределяется их размером и наличиемзнака для целочисленныхтипов, а для дробных - размероми спецификацией IEEE. Так к примерудиапазон переменной типа байт -от минус двух в седьмой до плюсдвух в седьмой без единицы (-128..127).Логические переменные могутпринимать значения Falseи True(ложь и истина соответственно),символьные - любое из значенийASCII набора, строки - наборсимволов ASCII длиной от 0 до указаннойдлины (максимально - 255).

Типы (д) - (и) и строковыетипы относятся к так называемымсложным типам (потому как однимименем объединено несколькоэлементов).

Переменные,

или реализация типов

Элементы данных (в данном случаепеременные; речь о константах- позже) простых типов описываются так:

<имя_переменной> : <имя_типа>;

Переменные типа "массивэлементов типа ..." объявляются следующимобразом:

<имя_переменной>: Array[нижняя_граница .. верхняя_граница] Of<имя_типа>;

при этом доступк элементам производится через индексы:i-йэлемент массива Kесть K[i].(Показано для одномерных массивов- линейной последовательности элементов,в принципе возможноописание двумерных массивов - матрицэлементов, трехмерных - кубов из элементов,etc., до семимерных, для которыхудобоваримого названия нет. Добавлениедополнительного измеренияк описанию массива производитсядобавлением после запятой пары"нижняя_граница ..верхняя_граница")

Переменные типа "запись"объявляются следующим образом.

<идентификатор>:Record
    <имя_поля>: <тип>;
    [<имя_поля>: <тип>;]
    End;

Доступ к полямзаписи производится так. "Полеpole переменнойf" естьf.pole.

Нестандартные типы

или типы, определяемые программистом

Рассмотрим способы определенияпрограммистом собственныхтипов. Для того, чтобы объявитьсобственный тип, программистдолжен в Type-части(то есть послеключевого словаType) написатьсначала имя типа, а затем, послесимвола "=", его определение, тоесть структуру. Как правило,программисты определяют собственнымитипами записи, массивы, объекты илитипизированные указатели:

Type
TMyArray = Array[4..18] Of Real;
PMyArray = ^MyArray;
TMyRecrd = Record
    I: Integer;
    C: Word;
    S: String[4];
    End;

Более подробно окаждом из них предлагается поговоритьпозже.

Операторы

Определив типы данных, самиданные и структурупрограммы, перейдем кспособам реализации алгоритмов,эти данные обрабатывающих.

Все действия производятсяс помощью операторов. Операторыделятся на два типа: простыеи составные.К простым относятся:

  1. пустой оператор:
    ;
  2. оператор присваивания:
    <переменная> := <выражение>;
  3. оператор условия:
    If <логическое условие> Then
      <оператор1>
    [Else <оператор2>];
  4. оператор множественного выбора:
    Case <переменная> Of
      <значение1>: <оператор1>;
      [<значениеN>: <операторN<;]
    [Else
      <оператор>;]
    End;
  5. оператор параметрического цикла:
    For<переменная> := <начальное_значение>To <конечное_значение>Do
      <оператор>;
  6. оператор цикла с предварительной проверкой условия:
    While <логическое условие> Do
      <оператор>;
  7. оператор цикла с постфиксной проверкой условия:
    Repeat<оператор>;
    [<оператор>;]
    Until <логическое условие>;
  8. вызов процедуры.

В квадратные скобки заключенынеобязательные частиоператоров. В качестве <оператора>может выступать любой простой или составнойоператор.

Составным операторомназывается любой набор простых исоставных операторов, начинающийсяс Begin иоканчивающийся End.

В описании простых операторов<оператор>означает операторлюбого типа - простой либо составной.Однако следует помнить,что если при выполнении условия(или в теле цикла) необходимовыполнять несколько действий,применение составного оператораобязательно. Также следуетотметить, что любой оператор -простой или составной - долженоканчиваться точкой с запятой,за исключением тех случаев,когда он находится перед ключевымсловом Else условного оператора илинепосредственно перед словомEnd.

Выполнение простых операторов

или как это работает

Пустой оператор попросту не выполняется,управление сразу передаетсяследующему оператору.

Оператор присваиваниявыполняется стандартным образом:<переменной> в левой части присваиваетсязначение предварительновычисленного<выражения>.Выражениеммогут служить:

  1. константа;
  2. переменная;
  3. вызов функции;
  4. правильно построенный набор изпредыдущих элементов,объединенных операциями.
Тип выражения должен соответствоватьтипу переменной в левойчасти оператора присваивания илимочь быть приведенным к этомутипу. Операции в последнем пункте зависятот типа вычисляемого выражения- арифметические (+ - * / mod div),логические (And, Or, Not, =),строковые (+), etc.

Также стандартнымобразом выполняется оператор условия. Приравенстве логического выражения True,выполняется <оператор1>, впротивном случае выполняется<оператор2>,если таковой наличествует.

Оператор множественноговыбора выполняется следующим образом.Значение <переменной>последовательносравнивается со<значениями>,указанными в теле оператора и приравенстве выполняетсясоответствующий <оператор>.Если все сравнения прошли безуспешно исуществует Elseчасть оператора,то выполняется ей принадлежащийоператор.

Оператор параметрическогоцикла выполняется следующимобразом. В первую очередьпеременной (называемой параметромцикла) присваивается начальное значение.Затем производитсясравнение значения параметра циклас конечным значением. Еслизначение параметра больше конечногозначения, цикл считаетсязавершенным. В противном случаевыполняется <оператор>(называемыйтелом цикла), после чего параметрцикла увеличивается на 1. Затемвсе повторяется начиная с этапа сравнения.

У параметрического цикла естьразновидность: если вместо словаTo написатьDownTo, то параметрцикла будет не увеличиваться, ауменьшаться на 1,и, соответственно,условием окончания циклабудет достижение параметром циклаконечного значения.

Как правило, в целях приданияхорошего стиля впрограммировании не рекомендуют изменятьзначение параметра циклавнутри тела цикла. Однако, большинствоязыков не запрещают делатьэтого, правда при работес Borland Pascal в этом случае следуеточень внимательно следить затем, чтобы по окончании выполнениякакого-либо повтора тела циклазначение параметра цикла было точноравно (а не просто больше)следующему за конечным значению,в противном случае правильногорезультата достичь довольно сложно.

Оператор цикла с предварительнойпроверкой условиявыполняется так. До первоговыполнения оператора (i.e. тела цикла)вычисляется значение логического условия.Если условие принимаетзначение True, то выполняетсятело цикла и вновь вычисляетсязначение логического условия, впротивном случае операторсчитается выполненным (цикл завершается).Следует заметить, чтоизменение значения логическогоусловия - личное делопрограммиста.

Оператор циклас постфиксной проверкой условия выполняется,в известном смысле, наоборот.Сначала выполняется<оператор> (телоцикла), затем вычисляетсялогическое условие. При равенстве егоFalse цикл повторяется. Изменениезначения логического условиятакже лежит на программисте.

Следует напомнить, что циклWhileможет не выполнится ни разу, а циклRepeatвыполнится как минимум один раз.

Процедуры и функции,

или как структурировать программы

Часто повторяющиеся участки программы,да и просто функционально законченныефрагменты кода, рекомендуется выделятьв процедуры. Объявление процедурыпроизводится в любой частипрограммы до ее первого использования(и, конечно, до началаосновной программы) следующим образом.

Procedure <имя процедуры>
    [(<список_параметров>)];
[Var часть]
[Const часть]
Begin
    {тело процедуры}
    [<операторы>]
End;

Именем процедуры может являться любойуникальный идентификатор.Список параметров должен состоятьиз одной или несколькихконструкций следующего вида:

[Var]<имя формального параметра>: <тип параметра>

разделенных точкамис запятой, где именем параметра являетсяидентификатор, с которымассоциируется значение фактическипереданного процедуре параметра(именно значение, а непеременная, передаваемая вкачестве параметра), а типомпараметра - стандартный или ранееопределенный тип. Если передименем параметра стоит ключевоеслово Var,то изменение данногопараметра в теле процедуры приведетк изменению значенияпеременной, переданной в качестве параметра.

Вызов процедуры производится так:

<имя процедуры>[(<список фактических параметров>)];

При этом производитсявыталкивание в стек передаваемых параметрови адреса возврата, выделение в стекеместа под объявленныев процедуре переменные и переходк выполнению первого операторатела процедуры. По достижении концатела процедуры (словаEnd)внутренние (локальные) переменныепроцедуры удаляются из стека ипереход к оператору, следующемуза вызовом процедуры.

Аналогичным образом выполняются функции.Объявление функциивыглядит так:

Function <имя_функции>
    [(<список_параметров>)]: тип_результата;
[Var часть]
[Const часть]
Begin
    {тело функции}
    [<операторы>]
End;

Единственным отличиемфункций от процедур является возможностьвозврата некоторого значения.Указание конкретного значения,возвращаемое функций, производитсяпутем присваивания в телефункции идентификатору именифункции данного значения.Естественно, что таких присваиванийможет быть несколько, приэтом значение возвращаемое функциейбудет зависеть от того,какое из таких присваиваний былопроизведено последним. В TurboPascal, начиная с версии 7.0возможен вызов функции безиспользования возвращаемого ею значения -аналогично процедуре.Так как при возврате значениефункции находится, за редкимисключением, в регистрах процессора,накладываются ограничения натипы результатов, возвращаемыхфункциями. Функции могутвозвращать значения простых типов и строки.

Первая программа,

или с чего начинают все всегда и везде

Собственно, прочитав этот текст выимеете представление о восьмидесяти процентахсинтаксических структур на Pascal'е.Осталось набрать стандартную первуюпрограмму

Program Hello; {привет, значит}
Var
    I: Integer;
Begin
    WriteLN('Hello, World!');
    Write('Enter the integer number, please ');
    ReadLN(I);
    WriteLN('You entered number greater than ',I-1, ', namely ', I);
End.

Стоит обратить внимание на разницу в выполненииWriteLN и Write.

Категория: Pascal | Добавил: graimp (21.12.2011)
Просмотров: 477 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Наш опрос
Оцените мой сайт
Всего ответов: 25
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0