ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Синтаксис и языковые конструкцииПаскаль, в его первоначальном виде, представляет собою чисто процедурный язык и включает в себя множество алголоподобных структур и конструкций с зарезервированными словами наподобие if, then, else, while, for, и т. д. Тем не менее, Паскаль также содержит большое количество возможностей для структурирования информации и абстракций, которые отсутствуют в изначальном Алголе-60, такие как определение типов, записи, указатели, перечисления, и множества. Эти конструкции были частично унаследованы или инспирированы от языков Симула-67, Алгол-68, созданного Никлаусом Виртом AlgolW и предложены Хоаром. В современных диалектах (Free Pascal) доступны такие операции как перегрузка операторов и функций. Hello world Программы на Паскале начинаются с ключевого слова program и следующего за ним имени программы с точкой с запятой (в некоторых диалектах является необязательным), за именем может в скобках следовать список внешних файловых дескрипторов в качестве параметров; за ним следует тело программы, состоящее из секций описания переменных, типов и констант, объявлений процедур и функций и следующего за ними блока операторов, являющегося точкой входа в программу. В языке Паскаль блок ограничивается ключевыми словами begin и end. Операторы разделяются точками с запятой, после тела помещается точка, служащая признаком конца программы. Регистр символов в Паскале не имеет значения. Таким образом, простейшая программа на Паскале будет выглядеть следующим образом: program p; begin end. Программа не выполняет никаких действий и содержит пустой блок операторов. Пример программы, выводящей строку «Hello, World!»: program HelloWorld(output); begin writeln('Hello, World!') { оператор вывода строки } end. Типы данных Простые типы данных Паскаля: числа с плавающей запятой (real), целые (integer), символьный (char), логический (boolean) и перечисления (конструктор нового типа, введённый в Паскале). В диалекте Delphi существуют следующие простые типы: -Целочисленные:
-Типы с плавающей точкой:
-Логические типы: Boolean, ByteBool, WordBool и LongBool. -Символьные типы: Char, AnsiChar, WideChar. -Перечислимый тип. var { секция объявления переменных } r: Real; { переменная вещественного типа } i: Integer; { переменная целого типа } c: Char; { переменная-символ } b: Boolean; { логическая переменная } s: String; { переменная строки } t: Text; { переменная для обьявления текстового файла } e: (apple, pear, banana, orange, lemon); { переменная типа-перечисления }
Выделяется понятие порядковых типов данных (ordinal), к ним относятся целые типы (знаковые и беззнаковые), логический (boolean), символьный (char), перечислимые типы и типы-диапазоны. Порядковые типы задаются целым числом (кодом), которое можно получить с помощью функции ord. Все операции, выполняемые над порядковыми типами, выполняются с их кодами. Диапазоны содержат подмножество значений других порядковых типов: var x: 1..10; y: 'a'..'z'; z: pear..orange; Для порядковых типов определены операции inc, dec, succ, pred, ord, операции сравнения (= > < => <= <>), их можно использовать в операторах case, for (как счётчик цикла), как границы массивов, для задания элементов множеств и типов-диапазонов. В Паскале, в отличие от Си-подобных языков, с типами boolean и char арифметические целочисленные операции не определены. В отличие от многих распространённых языков, Паскаль поддерживает специальный тип данных множество: var set1: set of 1..10; set2: set of 'a'..'z'; set3: set of pear..orange; Множество — фундаментальное понятие в современной математике, которое может быть использовано во многих алгоритмах. В паскале тип множество может содержать только однотипные элементы порядкового типа. Эта особенность широко используется и обычно быстрее эквивалентной конструкции в языке, не поддерживающем множества. К примеру, для большинства компиляторов Паскаля: if i in [5..10] then { проверка на принадлежность элемента множеству } ... обработается быстрее, чем if (i>4) and (i<11) then { проверка логическими условиями } ... Для задания значения множества используется список элементов множества, отделенных запятыми и заключённый в квадратные скобки (как уже было показано выше): var { секция объявления переменных } d:set of char; begin { начало блока } d:=['a','b']; ... В Паскале Йенсен и Вирта строки представлялись как упакованные массивы символов; следовательно, они имели фиксированную длину и обычно дополнялись до этой длины пробелами. В современном Паскале для работы со строками используется встроенный тип string, поддерживающий операции конкатенации (+) и сравнения (> < = <> >= <=). Строки сравниваются в лексикографическом порядке. Например, строки считаются равными если они имеют одинаковую длину и коды всех символов с одинаковыми индексами совпадают. Тип string [n] или просто string в диалектах языка 1970-1990-х годов определялся в виде массива символов array [0..n] of char (n по умолчанию принимало значение 80 в UCSD Pascal и 255 в Turbo/Borland Pascal), код нулевого символа при таком представлении служит для задания длины строки, соответственно строка могла иметь максимальный размер 255 символов. По умолчанию в Delphi и FreePascal в качестве String используется тип AnsiString, память под который выделяется и освобождается компилятором динамически, а максимальный размер строки в текущих реализациях составляет 2 гигабайта. Кроме того, в Delphi и Free Pascal в качестве string может использоваться тип WideString, где применяется 16-битное представление символов в кодировке UCS-2, при этом средства преобразования из однобайтовых строк в многобайтовые и обратно в стандартной библиотеке языка отсутствуют. Новые типы могут быть определены из существующих: type { секция объявления типов } x = Integer; y = x; ... Более того, из примитивных типов могут быть сконструированы составные: type { секция объявления типов } a = Array [1..10] of Integer; { определение массива } b = record { определение записи } x: Integer; y: Char; end; c = File of a; { определение файла } Файловые типы в Паскале делятся на типизированные, текстовые и файлы без типов. Как показано в вышеприведённом примере, типизированные файлы в Паскале — это последовательности однотипных элементов. Для каждого файла существует переменная-указатель на буфер, которая обозначается f^. Процедуры get (для чтения) и put (для записи) перемещают указатель к следующему элементу. Чтение реализовано так, что read(f, x) представляет собою то же, что и get(f); x:=f^. Соответственно, запись реализована так, что write(f, x) представляет собою то же, что и f^:= x; put(f). Текстовые файлы text определены как расширение типа file of char и помимо стандартных операций над типизированными файлами (чтение, запись символа), позволяют осуществлять символьный ввод-вывод в файл всех типов данных аналогично консольному вводу-выводу. Файлы без типов объявляются как переменные типа file. С ними можно проводить операции побайтового нетипизированного ввода-вывода по несколько блоков байт указанной длины через буфер, для этого служат специальные процедуры blockread и blockwrite (расширение UCSD). Указатели Паскаль поддерживает использование указателей (типизированные ^тип и нетипизированные pointer): type a = ^b; b = record x: Integer; y: Char; z: a; end; var pointer_to_b:a; Здесь переменная pointer_to_b — указатель на тип данных b, являющийся записью. Тип типизированного указателя может быть задан перед объявлением типа, на который он ссылается. Это исключение к правилу, которое гласит, что любая вещь должная быть объявлена перед тем, как используется. Введение этого исключения позволило организовывать рекуррентные определения структур данных, в том числе такие, как линейные списки, стеки и очереди, включая указатель на запись в описании этой записи (см. также: нулевой указатель — nil). Для типизированного указателя определена операция разыменования (её синтаксис: указатель^). Чтобы создать новую запись и присвоить значение 10 и символ A полям a и b в ней, необходимы следующие операторы: new(pointer_to_b); { выделение памяти указателю }
pointer_to_b^.x:= 10; { разыменовывание указателя и обращение к полю записи } pointer_to_b^.y:= 'A'; pointer_to_b^.z:= nil; ... dispose(pointer_to_b); { освобождение памяти из-под указателя } Для целей обращения к полям записей и объектов можно также использовать оператор with, как показано в примере: new(pointer_to_b);
with pointer_to_b^ do begin x:= 10; y:= 'A'; z:= nil end; ... dispose(pointer_to_b); Процедурный тип В оригинальном языке Паскаль Йенсен и Вирта процедурный тип использовался только при описании формального параметра. Уже в TP существовал полноправный процедурный тип. В объявлении типа ставится заголовок процедуры либо функции (без имени), обобщённо описывающий интерфейс подпрограммы. Значение этого типа содержит указатель на подпрограмму с заголовком, соответствующую описанному в объявлении типа. С помощью идентификатора переменной может происходить вызов соответствующей процедуры или функции. type myfunc=function:string;
function func1:string; begin func1:='func N 1' end;
function func2:string; begin func2:='func N 2' end;
var fun:myfunc; begin fun:=@func1; writeln(fun) {происходит вызов функции func1} end. Не нашли, что искали? Воспользуйтесь поиском:
|