4606

Основные понятия языка программирования Delphi

Реферат

Информатика, кибернетика и программирование

Введение Среди множества языков программирования высокого уровня, используемых на персональных компьютерах, язык Pascal является одним из наиболее универсальных и легко изучаемых языков. Его удобно применять при создании сложных приложений, включая ...

Русский

2012-11-23

448.5 KB

69 чел.

Введение

Среди множества языков программирования высокого уровня, используемых на персональных компьютерах, язык Pascal является одним из наиболее универсальных и легко изучаемых языков. Его удобно применять при создании сложных приложений, включая работу с Интернет, базами данных, мультимедийными приложениями и т.п. За время своего развития язык Pascal постоянно совершенствовался, и на его основе создан Object Pascal, а затем и Delphi — это наиболее радикальное и удачное расширение возможностей языка.

Язык Pascal, получившим свое название в честь французского математика 17 века Блеза Паскаля, был разработан швейцарским профессором Никлаусом Виртом, одной из принципиальных целей которого было «разработать язык, пригодный для изучения программирования как систематической дисциплины, которая исходит из определенных фундаментальных понятий, ясно и естественно отраженных в языке». Описание языка было опубликовано в ноябре 1970 г. в техническом отчете Швейцарского федерального технологического института ETH (Eidgenoessische Technische Hochschule). В самом начале 1971 г. отчет был перепечатан в первом номере журнала Acta Informatica и стал доступен широкому кругу программистов. С середины 70-х годов Pascal стал основным языком, применяемым в обучении.

Важная роль в массовом распространении языка Pascal принадлежит компании Borland International, создавшей в 1983 г. Turbo-среду разработки (автором Turbo Pascal является датчанин Андерс Хейльсберг). Это был значительный шаг вперед в облегчении процесса программирования. Удобство визуальных средств в сочетании с тесной интеграцией инструментария стали для сотен тысяч программистов большим подспорьем.

Turbo Pascal видоизменялся едва ли не с каждой версией среды разработки: в версии 3.0 появилась встроенная графика, в версии 4.0 — модули, в версии 5.5 — средства объектно-ориентированного программирования. Начиная с версии Turbo Pascal 7.0 (1993 г.) язык был переименован в Borland Pascal. На его основе был разработан язык Object Pascal, вначале реализованный в системе программирования Turbo Vision, а затем в системе объектно-ориентированного визуального программирования Delphi, которая используется для профессиональной разработки реальных программ. Она является одной из наиболее популярных систем, реализующих так называемую быструю разработку приложений (программ), или RAD (Rapid Application Development). Такие системы содержат обширные библиотеки подпрограмм, которые обеспечивают отображение на экране (визуализацию) результатов работы программы и решение других задач, значительно повышая эффективность работы программистов.

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

Среди языков программирования наиболее широкое развитие получили универсальные языки, на которых удобно решать как логические задачи, так и вычислительные. При этом универсальный язык программирования должен быть удобен для обработки текстов, изображений, файлов, а составленная программа должна хорошо читаться и пониматься однозначно всеми программистами, чтобы ее в дальнейшей можно было модифицировать. Pascal наилучшим образом отвечает всем этим потребностям, и к его изучению мы приступаем, начиная с данной лекции.


1. ЛЕКСЕМЫ ЯЗЫКА

1.1. Алфавит языка Delphi

Любой язык начинается с алфавита – конечного множества символов, используемых в языке.

Алфавит языка Delphi является подмножеством набора символов кода ASCII и включает:

  •  Прописные и строчные буквы латинского алфавита, а также символ подчеркивания, который используется наравне с буквами:

ABCDEFGHIJKLMNOPQRSTUVWXYZ (коды ASCII от 65 до 90)

abсdefghijk1mnоpqrstuvwxуz (коды ASCII от 97 до 122)

_ (код ASCII 95)

  •  Десятичные цифры:

0123456789 (коды ASCII от 48 до 57)

  •  Специальные символы (в скобках указан код ASCII):

#

(35)

-

(45)

@

(64)

$

(36)

.

(46)

[

(91)

(39)

/

(47)

]

(93)

(

(40)

:

(58)

^

(94)

)

(41)

;

(59)

{

(123)

*

(42)

<

(60)

}

(125)

+

(43)

=

(61)

,

(44)

>

(62)

  •  Символ пробела (код ASCII 32).
  •  Управляющие символы (коды ASCII от 0 до 31).

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

Программа, написанная на языке Delphi, состоит из лексем и разделителей.

1.2. Лексемы

Из символов алфавита образуются лексические единицы языка, называемые лексемами.

Лексема – это минимально значимая единица текста программы. Лексемы подобны словам естественного языка. Они неделимы и сами по себе представляют некоторое содержание.

В Delphi можно выделить несколько категорий лексем, показанных на рис. 1.

К специальным символам относятся следующие символы:

+ - * / < = > [ ] ( ) { } . , : ; ^ @ # $

Кроме того, следующие пары специальных символов (составные символы) также являются лексемами

:= .<= >= (* *) (. .)

причем (* эквивалентно {; *) - }; (. - [; .) - ].

Зарезервированные (ключевые) слова имеют строго определенное назначение, которое не может быть изменено. Поэтому описание пользовательских идентификаторов, идентичных зарезервированным словам, не допускается!

Различия между словами, записанными прописными и строчными буквами (на верхнем или нижнем регистрах), в не делается. Таким образом, слова program Program PROGRAM будут обозначать одно и то же ключевое слово. Указанное свойство относится как к зарезервированным словам, так и ко всем идентификаторам, используемым в программах.

В языке Delphi используется более 60 ключевых слов, перечень которых и их назначение приведены в табл. 1. В редакторе кода системы Delphi ключевые слова выделяются полужирным шрифтом.

Таблица 1. Ключевые слова

Ключевое слово

Комментарий

and

Булев оператор И

array

Массив

as

Используется при проверке соответствия типов, определяет объект как операнд

asm

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

begin

Начало блока

case

Оператор выбора. Используется при выборе из многих вариантов

class

Определяет тип класс

const

Определяет константы, т.е. неизменяемые переменные. Но в Delphi есть режим, допускающий изменение констант в теле программы

constructor

Специальный метод класса, необходимый для создания и инициализации экземпляра класса (объекта)

destructor

Специальный метод класса, необходимый для разрушения объекта

dispinterface

Определяет тип интерфейса

div

Целочисленное деление

do

Определяет начало исполнимой части в операторах цикла, конструкции try..except и в операторе with

downto

Определяет направление итерации в операторе for

else

Используется в операторах выбора case, условном операторе if и в операторе проверки исключений try..except

end

Обычно используется совместно с ключевым словом begin и отмечает конец блока. Также ставится в конце описания типа, например класса или записи

except

Используется в операторе проверки исключений try..except

exports

Определяет список экспортируемых процедур, функций и переменных

file

Устанавливает тип переменной как файл. Используется при работе с файлами

finalization

Определяет начало раздела, который в программе всегда выполняется последним

finally

Используется в операторе проверки исключений try..finally

for

Используется в операторах цикла for..to и for..downto

function

Используется при объявлении функций

goto

Переход на метку

if

Используется в операторах выбора if..then и if..then..else

implementation

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

in

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

inherited

Дословно можно перевести как «унаследованный». Используется при работе с классами, поддерживая возможности полиморфизма

initialization

Определяет раздел инициализации, который всегда располагается перед разделом finalization. Если раздела finalization нет, то перед завершением программы. Выполняется сразу после запуска программы, перед всеми другими операторами. Обычно используется для инициализации переменных

inline

Используется при работе с ассемблерным кодом. Устаревшее, и не рекомендуется к применению

interface

Определяет тип интерфейса. Используется при опережающем объявлении интерфейса

is

Используется при проверке типов

label

Метка. Используется совместно с ключевым словом goto. Может быть выражена любым идентификатором или числом от 0 до 9999

library

Директива-напоминание или рекомендательная директива. Используется наравне с директивами platform и deprecated для напоминания об особенностях стандартных типов, методов или модулей. Во время компиляции вызывает появление предупреждающего сообщения

mod

Остаток от деления целых чисел

nil

Специальная константа, которая может быть присвоена любому указателю, после чего считается, что указатель не ссылается ни на что

not

Булев оператор отрицания

object

Используется как альтернатива слову «класс». Сохранено в языке для совместимости со старыми версиями. Не рекомендуется к использованию

of

Используется во многих операторах как связующее ключевое слово

or

Булев оператор ИЛИ

out

Используется при объявлении параметров процедуры, функции или метода. Предупреждает о том, что данный параметр используется только для выдачи значений

packed

Используется для более плотного размещения данных в структурированных типах (массивы, множества, записи, файлы, классы)

procedure

Используется при объявлении процедур

program

Определяет имя программы, которое должно быть выражено идентификатором

property

Используется при объявлении свойств

raise

Используется при генерации исключений

record

Определяет тип запись

repeat

Используется в операторе цикла repeat..until

resourcestring

Определяет раздел объявления ресурсов

set

Ключевое слово для объявления множества

shl

Логический оператор сдвига влево

shr

Логический оператор сдвига вправо

string

Используется при объявлении строковых типов

then

Используется в операторах if..then и if..then..else

threadvar

Используется при разработке многопотоковых приложений

to

Используется в операторе for..to

try

Используется в операторе проверки исключений try..finally, try..except и в операторе выбора case

type

Определяет раздел объявления типов

unit

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

until

Используется в операторе repeat..until

uses

Определяет раздел подключаемых модулей

var

Определяет раздел переменных

while

Используется в операторе while..do

with

Используется для определения идентификатора, который всегда записывается с другими идентификаторами. Код получается более компактным и понятным

xor

Булев оператор Исключающее ИЛИ

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

Идентификатор может иметь произвольную длину, однако значимыми являются только первые 255 символов.

Примеры:

Правильные идентификаторы:

Неправильные идентификаторы:

MyVariable

My_Variable

_Stop

Lab_12

_1_2_3

MyVariable# — содержит недопустимый символ #

My-Variable — содержит недопустимый символ -

l_2_3_ — начинается с цифры

Abc def12 – содержит символ пробела

Написание идентификаторов можно сделать нагляднее, если использовать слова, отражающие назначение идентификатора и начинать каждое слово с прописной буквы. Например, идентификатор для счетчика символов можно обозначить так: SymbolCounter.

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

Примеры:

Unit1.MyVar   Unit2.MyVar   Unit3.MyVar

Кроме указанного случая уточненные идентификаторы используются при работе с записями и объектами.

Какие из идентификаторов могут быть уточненными, а какие нет, показано на рис. 2.

B Delphi используются две разновидности идентификаторов:

  •  стандартные (предопределенные);
  •  пользовательские.

Стандартными предопределенными идентификаторами являются имена всех встроенных в язык процедур и функций (Read, Write, Sin и др.), типов (Integer, Real, Char и др.), директив (absolute, forward, private, public и др.). Переопределение стандартных идентификаторов, в принципе допускается, однако нужно иметь в виду, что в этом случае их стандартное действие будет для данной программы утеряно. Поэтому, такие переопределения считаются в программировании плохим стилем.

Некоторые из стандартных директив, учитывая специфику их применения, называют также процедурными директивами.

Метки в программе используются для обозначения некоторых операторов, к которым можно передать управление. Метки бывают двух разновидностей: числовые и символьные. Числовая метка представляет собой последовательность цифр в диапазоне от 0 до 9999. Начальные нули не являются значащими. Символьная метка – это идентификатор, подчиняющийся вышеприведенным правилам записи. Метка отделяется от оператора символом двоеточия (:).

Примеры:

27: Writeln(‘Оператор вывода помечен числовой меткой’);

Label_A: if x<0 then i:=i+1 else i:=i-1;   {Используется символьная метка}

В Delphi используются целые десятичные числа и шестнадцатеричные числа, а также вещественные десятичные числа.

Целые десятичные числа записываются стандартным образом и должны находиться в диапазоне от -2 147 483 648 до 2 147 483 647, например,

35    77    -39    9    -6428

Для обозначения шестнадцатеричных целых чисел используется символ $, который ставится перед числом, например,

$0   $3E   $FCB5434   $A10

Допустимый диапазон шестнадцатеричных чисел от $00000000 до $FFFFFFFF. Знак (плюс или минус) шестнадцатеричного числа определяется самой формой записи и зависит от значения старшего разряда двоичного представления числа.

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

6.3   -1436.9456   7.9E12   -34.83e7   0.2745e-10

Числа с десятичными точками или показателем степени являются константами вещественного типа, остальные десятичные и шестнадцатеричные числа являются константами целого типа.

Булевы константы false и true обозначают соответственно «ложь» и «истина» и могут использоваться в выражениях.

Строка символов представляет собой последовательность символов из расширенного набора символов кода ASCII, заключенную в одиночные кавычки. Необходимо также, чтобы вся последовательность располагалась в одной строке программы.

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

Примеры:

'Object Pascal'

'Н.Вирт — автор языка Pascal'

''    {Пустая строка}

'Две подряд кавычки '' считаются в строке одним символом'

Управляющие символы в строке представляются в виде целого десятичного числа, непосредственно перед которым ставится символ #. Указанное десятичное число должно быть кодом ASCII требуемого управляющего символа.

#7  — символ "звонок"

#10  — символ "перевод строки"

#13  — символ "возврат каретки"

В принципе, таким образом могут быть представлены не только управляющие символы, но и любой другой символ кода ASCII (коды от 0 до 255). Кроме того, в строке допускается совмещать печатные и управляющие символы. Если в строку входят несколько управляющих символов, то между ними не должно быть разделителей, например,

'Совмещение печатных символов'#13#10'и управляющих'#13#10

Комментарий представляет собой фрагмент текста программы, ограниченный слева символом { или составным символом (*, а справа — символом } или составным символом *).. Комментарии выполняют в программе чисто информационную функцию и служат для описания назначения отдельных подпрограмм, типов, констант, переменных и т.п. Комментарии игнорируются компилятором и не влияют на работу программы.

Если комментарий однострочный, то перед комментарием ставят две наклонные черты.

Примеры комментариев:

{Комментарием может быть любая последовательность символов, ограниченная с двух сторон фигурными скобками, независимо от того, сколько строк она будет занимать.}

(* Последовательность символов в круглых скобках со звездочками также является комментарием *)

var

 { коэффициенты уравнения }

 a: real; // при второй степени неизвестного 

 b: real; // при первой степени неизвестного 

 с: real; // при нулевой степени неизвестного 

 { корни уравнения } x1,x2: real;

Замечание: вложенность комментариев не допускается! Однако можно использовать конструкции вида:

{…   (* комментарий *) …} или (*…   { комментарий } … *)

Особым случаем является комментарий, в котором непосредственно после открывающей скобки, { или (*, следует символ доллара $. Такой комментарий является директивой компилятора, например,

{$N+}  (*$R-*)  {$I MyFile.pas}  {$APPTYPE CONSOLE}

1.3. Разделители

Для повышения наглядности программы используются разделители. В качестве разделителей лексем друг от друга применяются символы:

  •  пробел (код ASCII 32);
  •  табуляция (код ASCII 09);
  •  составной символ перехода в начало следующей строки (пара символов «возврат каретки» (код ASCII 13) и «перевод строки» (код ASCII 10));
  •  любые управляющие символы набора кодов ASCII из диапазона от символа с кодом 0 до символа с кодом 31.

Между любыми двумя лексемами допускается произвольное количество символов-разделителей. Кроме того, лексемы группы «специальные символы» сами являются разделителями и, следовательно, отделение их от других лексем символами-разделителями не обязательно.

В качестве разделителей могут использоваться и комментарии.

Следует помнить:

  1.  две соседних лексемы, если они представляют собой ключевое слово, идентификатор, метку или число, должны быть отделены друг от друга одним или несколькими разделителями;
  2.  разделитель нельзя применять в составных символах :=; <=; >=; (*; *); (.; .).

2. СТРУКТУРА ПРОГРАММЫ

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

Синтаксическая диаграмма общей структуры программы на языке Delphi приведена на рис. 2.1.

Неформально структуру программы можно представить так:

{I. Заголовок программы}

program Name_Program;     {Имя программы}

{II. Раздел указания используемых модулей}

uses                      {Список используемых модулей}

{III. Раздел описаний}

label                     {Описания меток}

const                     {Описания констант}

type                      {Описания типов}

var                       {Описания переменных}

procedure                 {Описания процедур}

function                  {Описания функций}

exports                   {Описания экспортируемых имен}

{IV. Раздел операторов (Операторный блок)}

begin

     Операторы

end.

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

I. Заголовок программы не обязателен, но если он присутствует в программе, то должен быть записан синтаксически корректно (рис. 4).

Примеры:

program Simple;

program Print(Output);

program GetPut(Input,Output);

program Complex(Input,Output,MyFile);

Если в заголовке используются параметры, то они обозначаются соответствующими идентификаторами, разделенными запятыми и заключенными в круглые скобки.

II. Раздел указания используемых модулей начинается с зарезервированного слова uses. Дело в том, что большинство программ (кроме совсем простых) создаются в виде нескольких программных единиц – собственно программы и набора модулей. Все они хранятся и транслируются по отдельности, а их исполняемые коды подключаются к программе при компоновке. Чтобы этот процесс был успешным, в начале программы нужно указать имена используемых в ней модулей в предложении uses.

Примеры:

uses

   SysUtils,

   QForms,                 {cross-platform Form}

   REAbout in 'REAbout.pas' {AboutBox},

   REMain in 'REMain.pas'  {MainForm};

Предложение uses в каждой отдельной программе может быть описано только однократно и должно располагаться непосредственно после заголовка программы.

III. Раздел описаний представляет собой последовательность определений имен – указаний, что именно обозначается тем или иным идентификатором в программе.

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

Каждое определение заканчивается разделителем «;».

Подразделы описания констант (const), типов (type), переменных (var), процедур (procedure), функций (function) и экспорта (exports) могут повторяться многократно в рамках раздела описаний в любом порядке. Необходимо следить лишь за выполнением следующего правила:

Если в описании какого-либо элемента В (константы, типа, переменной, процедуры, функции, списка экспорта) используется элемент А (константа, тип и т.д.), то элемент А должен быть описан перед элементом В.

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

Пример:

type              {Описания для решения подзадачи 1}

var

procedure

----------------------------------------------------

label             {Описания для решения подзадачи 2}

const

var

----------------------------------------------------

----------------------------------------------------

const             {Описания для решения подзадачи N}

type

var

function

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

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

Классическая простейшая программа имеет следующий вид.

begin

 Writeln('Hello, World!')

end.

Операторы отделяются друг от друга точкой с запятой и заключаются в «операторные скобки» begin..end, после которых обязательно ставится точка. Текст программы между ее заголовком и точкой называется блоком.

Модули в языке Delphi являются основой модульного программирования. Они используются для создания библиотек, включаемых в различные программы, а большие программы могут подразделяться на логически связанные модули.

Структура модуля выглядит следующим образом:

unit Unit1;     {Заголовок модуля}

interface       {Интерфейсный раздел}

uses            {Здесь указывается список подключаемых модулей}

 {Здесь объявляются внешние процедуры, функции, типы, переменные, константы}

implementation  {Раздел реализации}

uses            {Здесь указывается список подключаемых модулей}

 {Здесь описываются внутренние процедуры, функции,}

 {объявляются внутренние типы, переменные, константы, метки}

 {Рабочие коды программы}

initialization

 {Инициализация элементов}

 {Всегда выполняется первым при инициализации модуля}

finalization

 {Заключительный раздел. Всегда выполняется последним}

end.

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

В интерфейсном разделе (interface) описываются константы, типы, переменные, процедуры и функции, являющиеся глобальными, т.е. доступными в основной программе, где используется данный модуль. Основная программа имеет доступ к этим элементам, как если бы они были описаны в модуле, являющимся вложенным по отношению к данной программе.

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

3. ТИПЫ ДАННЫХ

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

Все типы данных можно разделить на шесть основных подразделов:

  •  простой тип;
  •  строковый тип;
  •  структурированный тип;
  •  указательный тип;
  •  процедурный тип;
  •  вариантный тип.

Кроме того, используемые в языке типы можно разделить на две группы:

  •  стандартные (предопределенные) типы;
  •  типы, определяемые пользователем (пользовательские типы).

Имена стандартных типов являются предопределенными идентификаторами и действуют в любой точке программы.

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

Простые типы определяют упорядоченные множества значений. К ним относятся:

  •  группа целых типов;
  •  группа вещественных типов;
  •  группа булевых типов;
  •  символьный тип.

В разделе описаний программы стандартные типы данных описываются в подразделах var и type.

Синтаксис подраздела var имеет следующую структуру:

В качестве типа можно использовать или идентификатор типа, который был ранее определен в разделе описания типов, или самостоятельное новое определение типа согласно синтаксису описания типов, например,

type

   Colors=(Red,Blue,Green);

   Vector=array[1..100] of integer;

var

   а,b,с:      Real;

   Flag:       Boolean;

   Color:      Colors;

   Digit:      0..9;

   Season:     (Spring,Summer,Autumn,Winter);

   Vect1,Vect2: Vector;

   Matrix:array[1..5,1..10] of Byte;

С помощью директивы absolute описываются абсолютные переменные, располагаемые в памяти по строго указанному адресу. Каждая абсолютная переменная должна быть описана отдельно, т.е. список идентификаторов в объявлении перед двоеточием должен состоять только из одного идентификатора.

Существует две формы описания абсолютных переменных:

  •  форма с указанием точного адреса расположения переменной;
  •  форма с расположением двух переменных по одному адресу.

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

CrtMode: Byte absolute $0040:$0049;

Первая константа ($0040) определяет значение сегмента, а вторая ($0049) — значение смещения внутри этого сегмента. Обе константы не должны выходить за пределы диапазона от $0000 до $FFFF (от 0 до 65535).

Вторая форма с директивой absolute используется для описания переменной, которая помещается «поверх» другой переменной, т.е. по тому же самому адресу.

Пример. В объявлениях следующей программы указывается, что переменная Digits должна размещаться по тому же адресу, что и переменная ChDigits. В результате, наложение массива типа Byte на строку символов присваивает элементам массива значения кодов символов, из которых состоит строка.

program TestAbsolute;

const

   ChDigits: String[10]='0123456789';

var

   Digits: array [0..10] of Byte absolute ChDigits;

   i: integer;

begin

   Writeln('Code chars: ''0'' .. ''9''');

   for i:=1 to 10 do Write(Digits[i],' ');

   Writeln

end.

Результат:

Code chars: '0' .. '9'

48 49 50 51 52 53 54 55 56 57

Синтаксис подраздела type имеет следующую структуру:

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

  1.  Множество допустимых значений любого порядкового типа представляет собой упорядоченную последовательность, каждый элемент которой имеет свой порядковый номер – целое число. Первое значение любого порядкового типа имеет порядковый номер 0, следующее значение имеет порядковый номер 1 и т.д. Порядковым номером значения целочисленного типа является само это значение.
  2.  К любому значению порядкового типа можно применить стандартную функцию Ord, возвращающую порядковый номер этого значения.
  3.  К любому значению порядкового типа можно применить стандартную функцию Pred, возвращающую значение, предшествующее этому значению. Если эта функция применяется к первому допустимому значению любого порядкового типа, кроме булевских, то возвращается порядковый номер последнего значения.
  4.  К любому значению порядкового типа можно применить стандартную функцию Succ, возвращающую значение, следующее за указанным. Если эта функция применяется к последнему допустимому значению любого порядкового типа, кроме булевских, то возвращается порядковый номер первого значения.

Целый тип. B Delphi включены девять типов для описания переменных и констант, представляющих целые числа (табл. 2).

Таблица 2. Характеристика целых чисел

Тип

Диапазон представления чисел

Формат

Integer

-2147483648..2147483647

Знаковый, 4 байта

Cardinal

0...4294967295

Беззнаковый, 4 байта

Shortint

-128..127

Знаковый, 1 байт

Smallint

-32768..32767

Знаковый, 2 байта

Longint

-2147483648..2147483647

Знаковый, 4 байта

Int64

-263..263-1

Знаковый, 8 байт

Byte

0..255

Беззнаковый, 1 байт

Word

0..65535

Беззнаковый, 2 байта

Longword

0.. 4294967295

Беззнаковый, 4 байта

Пример:

var

 a,b,c:  integer;

 x1,y2:  cardinal;

 Byte_1: byte;

Вещественный тип. К вещественному типу относится подмножество вещественных чисел, которые могут быть представлены в формате с плавающей точкой (табл. 3).

Таблица 3. Характеристика вещественных чисел

Тип

Диапазон представления чисел

Значащие цифры мантиссы

Размер памяти

Real

от 5.0*10-324 до 1.7*10308

15..16

8 байт

Real48

от 2.9*10-39 до 1.7*1038

11..12

6 байт

Single

от 1.5*10-45 до 3.4*1038

7..8

4 байта

Double

от 5.0*10-324 до 1.7*10308

15..16

8 байт

Extended

от 3.4*10-4951 до 1.1*104932

19..20

10 байт

Comp

от -263+1 до 263-1

19..20

8 байт

Currency

-922337203685477.5808 .. 922337203685477.5807

19-20

8 байт

Тип Real48 в ранних версиях назывался Real и оставлен для совместимости с более ранними версиями языка Pascal.

Тип Extended (расширенный) используется для получения более точных вычислений, но он плохо совмещается с различными платформами.

Тип Comp (вычислительный) хорошо совмещается с процессами архитектуры Intel, и поэтому его можно использовать для повышения скорости выполнения программ.

Тип Currency (коммерческий) используется для финансовых вычислений, так как разработан специально с целью исключения ошибок при проведении денежных расчетов.

Пример:

var

 a,b,c:  real;

 x1,y2:  extended;

 C1,D1:  currency;

Булев тип. Delphi содержит несколько булевских типов, элементы которых могут принимать лишь два логических значения: True (истина) и False (ложь) (табл. 4).

Таблица 4. Характеристика булевых типов

Тип

Значению False соответствует

Значению True соответствует

Размер памяти

Boolean

число 0

любое число, отличное от 0

1 байт

ByteBool

число 0

1 байт

WordBool

число 0 в обоих байтах

2 байта

LongBool

число 0 во всех байтах

4 байта

Булевы типы ByteBool, WordBool и LongBool введены для обеспечения совместимости разрабатываемых программ с оболочкой Windows, в которой значению False соответствует число 0, а значению True — любое число, отличное от 0. Результирующим типом операций сравнения и логических операций остается тип Boolean.

Пример:

var

 a,b,c:  boolean;

 x1,y2:  WordBool;

 C1,D1:  LongBool;

Поскольку булев тип является порядковым, то имеют место следующие отношения:

False < True

Ord(False)  = 0

Ord(True)   = 1

Succ(False) = True

Pred(True)  = False

Символьному типу соответствует стандартный идентификатор Char. Переменные и константы символьного типа могут принимать значения из множества символов кода ASCII. Значение кода требуемого символа можно получить при помощи функции Ord: например, Ord(Ch)(где Ch — значение символьного типа) возвращается порядковый номер Ch.

Любое значение символьного типа может быть получено с помощью стандартной функции Chr, например, процедура вывода Write(Chr(110)); отобразит на экран символ «n», а процедура Write(Ord('n')); отобразит значение 110.

Кроме того, к значениям типа Char, как и к значениям других порядковых типов, применимы также функции Pred и Succ.

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

Все идентификаторы в списке перечислимого типа описывается как константы. Типом этой константы является описанный перечислимый тип.

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

type

 Season  = (Spring, Summer, Autumn, Winter);

 WeekDay = (Mon, Tue, Wed, Thu, Fri, Sat, Sun);

В рамках блока, где объявлен, перечисляемый тип, идентификаторы всех элементов перечисляемого типа интерпретируются как константы: Spring, Summer, Autumn и Winter представляют собой константы типа Season, a Mon, Tue, Wed, Thu, Fri, Sat и Sunконстанты типа WeekDay.

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

type

  WeekDay = (Mon, Tue, Wed, Thu, Fri, Sat, Sun);

  WorkDay = (Mon, Tue, Wed, Thu, Fri);

то при трансляции будет выдано сообщение об ошибке, так как одни и те же константы Mon, Tue, Wed, Thu, Fri описаны в двух разных типах.

Константы простых (предопределенных типов) не могут быть значениями перечисляемого типа. Например, следующие описания некорректны:

type

 Digitals = (0,1,2,3,4,5,6,7,8,9);   {константы числового типа}

 DigSymbols = ('0','1','2','3');     {константы символьного типа}

 WeekDay = ('Mon','Tue','Wed','Thu'); {константы строкового типа}

Так как перечислимые типы являются порядковыми, то, соответственно, они перечислением своих элементов определяют упорядоченные наборы констант. Упорядочение констант в типе выполняется в соответствии с последовательностью, в которой перечисляются идентификаторы. Порядковый номер константы перечислимого типа определяется ее позицией в списке идентификаторов при объявлении. Первая константа в списке имеет порядковый номер 0, вторая — номер 1, и т.д.

Так же, как и к переменным других порядковых типов, к переменным перечислимого типа применимы встроенные функции Ord, Pred и Succ.

Ord(Summer)=1  Pred(Winter)=2  Succ(Spring)=1

Отметим одну «неприятную» особенность перечисляемых типов. К значениям этих типов не применимы ни арифметические операции, ни стандартные процедуры ввода-вывода Read, Readln, Write, Writeln.

Интервальный тип представляет собой диапазон (интервал) значений какого-либо порядкового типа, называемого базовым. При описании интервального типа указываются наименьшее и наибольшее значения диапазона значений, допустимых для этого типа. Минимальное и максимальное значения интервала разделяются знаком .. (две точки).

Примеры:

var

   x: 0..500;   {х может принимать значения 0,1,2,...,500}

   y: -1..1;    {y может принимать значения -1,0,1}

  Ch: 'A'..'Z';

 Day: Mon..Fri;

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

Строковый тип. Значением строкового типа является последовательность символов с динамически изменяемой длиной. Текущее значение атрибута длины можно получить с помощью стандартной функции Length, a c помощью процедуры SetLength можно установить длину строки. С точки зрения структур данных строковые типы, в отличие от других простых типов, являются структурными типами. Основные строковые типы перечислены в табл. 5.

Тип AnsiString часто называют длинной строкой, и он является предпочтительным для большинства приложений. «Обобщающее» ключевое слово string используется как обозначение типа для AnsiString.

Пример:

var

 S:  string;       {Строка произвольной длины}

 S1: string[10];   {Длина строки ограничена 10 символами}

После такого объявления переменная S будет иметь тип AnsiString. При этом должна использоваться директива компилятора {$H+} (обычно она установлена по умолчанию). Если использовать директиву {$H-}, то слово string будет относиться к ShortString.

Таблица 5. Строковые типы

Тип

Максимальная длина

Требуемая память

Для чего используется

ShortString

255 символов

2 до 256 байт

Обратная совместимость

AnsiString

231 символов

4 байта до 2 Гбайт

8-разрядные символы ANSI, DBCS ANSI, MBCS ANSI и т.д.

WideString

230 символов

4 байта до 2 Гбайт

Символы UNICODE; многопользовательские серверы и многоязычные приложения

Отношение между любыми двумя строковыми значениями устанавливается согласно отношению порядка между значениями символов в соответствующих позициях. В двух строках разной длины каждый символ более длинной строки без соответствующего символа в более короткой строке принимает значение «больше», например, 'Xs' больше, чем 'X'. Нулевые строки могут быть равны только другим нулевым строкам и являются наименьшими строковыми значениями. К символам в строке можно обращаться как к элементам массива.

Кроме того, существует тип PChar, поддерживающий формат представления строк, признаком конца которых служит символ с кодом 0 (нуль) и которые называются строками с завершающим нулем или ASCIIZ-строками. Такие строки используются в Windows.

Фактически данный тип является указательным типом с описанием

type PChar = ^Char;

Переменные же этого типа обрабатываются как массив типа

array [0..K] of Char;

где К — количество символов в строке, не считая символа — признака конца строки.

Описание меток. Если в программе используются метки, то они описываются в разделе label, отделяясь друг от друга запятыми:

label Метка_1,Метка_2,...,Метка_n;

Метки могут предшествовать любому оператору программы и отделяются от операторов двоеточием «:». Используются метки совместно с операторами перехода goto, в которых метка записывается без двоеточия.

Пример:

label 1,Quit;

  ...

  goto 1;

  ...

  1: a:=1;

  goto Quit;

  ...

Quit:end.

Следует отметить, что использование меток и операторов goto в большинстве случаев противоречит принципам структурного программирования и поэтому рекомендуется избегать применения этих конструкций в программах.

Описание констант. Если в программе используются константы, которым присвоены имена (идентификаторы), то они должны быть описаны в подразделе описания констант. Синтаксис такого описания приведен на рис. 7.

Примеры простых констант:

const

 Length=100; MaxNeg=-32678; Numb=7.87e-3; {Числовые константы}

 Booll= True; Bool2=False;                {Булевские константы}

 Char7='7'; CharCR=#13;                   {Символьные константы}

 Strl='Turbo'; Str2=' Pascal';            {Строковые константы}

Кроме простых констант Delphi допускает использование константных выражений, которые могут быть вычислены во время компиляции программы. Если предполагать, что нижеприведенные константы будут располагаться после вышеприведенных, то следующие объявления будут допустимыми:

const

 ChrLength=Chr(Length);

 Mean=(MaxNeg-MinNeg) div 2;

 BoolAnd=Booll and Bool2;

 CodeOfChar7=Ord(Char7);

 Name=Str1+Str2;

Константные выражения описываются точно по таким же правилам, что и обычные выражения. Однако перечень допустимых в константных выражениях стандартных функций ограничен следующими функциями: Abs, Chr, Hi, Length, Lo, Odd, Ord, Pred, Ptr, Round, SizeOf, Succ, Swap, Trunc.

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

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

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

Примеры типизированных констант:

  {Типизированные константы простых типов}

const

  Arr_Length: Integer=100;

  Step: Real=0.001;

  Flag: Boolean=False;

  LineFeed: Char=#10;

  Newline: String[2]=#13#10;

  Name:String[14]='Turbo Pascal';

ВЫВОДЫ

  1.  Алфавитом языка Delphi является подмножеством набора символов кода ASCII, включающее прописные и строчные буквы латинского алфавита, символ подчеркивания, десятичные цифры, а также символы: специальные, пробела и управляющие.
  2.  Лексемы – это минимально значимые единицы текста программы. К лексемам языка Delphi относятся специальные символы, ключевые слова, идентификаторы, метки, числовые и булевы константы, строки и комментарии.
  3.  При создании любого приложения в нем обязательно должны присутствовать либо программа, либо программа и модули. Причем программа может быть только одна, но к ней можно подключать сколь угодно много модулей. В структуре программы выделяются разделы: заголовка, указания подключаемых модулей, описания используемых идентификаторов и операторный блок.
  4.  Модули используются для создания библиотек, включаемых в различные программы, а большие программы могут подразделяться на логически связанные модули. В структуре модуля выделяются: заголовок, интерфейсный раздел и раздел реализации.
  5.  При описании переменной необходимо указать ее тип, определяющий набор значений, которые она может принимать, и действий, которые над ней можно выполнять. Для обозначения типа используют идентификаторы. Все типы данных подразделяются на простые, строковые, структурированные, указательные, процедурные и вариантные типы. Часть типов являются стандартными (предопределенными), а часть - определяемыми пользователем (пользовательскими).
  6.  К простым (стандартным, предопределенным) типам относятся: целые, вещественные, булевы и символьный.
  7.  Значением строкового типа является последовательность символов с динамически изменяемой длиной.

Контрольные вопросы

  1.  Что такое алфавит языка программирования? Какие символы включает язык Delphi?
    1.  Какие категории лексем входят в язык Delphi?
    2.  Допустимо ли использование в качестве пользовательских идентификаторов зарезервированных слов?
    3.  Что представляет собой идентификатор и какова его допустимая длина?
    4.  Какие идентификаторы являются стандартными?
    5.  Как записываются числа десятичные и шестнадцатеричные, целые и вещественные?
  2.  Что представляет собой строка символов?
  3.  Что представляет собой комментарий?
  4.  Какие символы используются в качестве разделителей лексем?
  5.  Какова структура программы на языке Delphi?
  6.  Что такое модуль и что входит в структуру модуля?
  7.  Перечислите стандартные типы языка Delphi?
  8.  Какими свойствами характеризуются порядковые типы?
  9.  Что представляют собой пользовательские типы?
  10.  Как описываются метки, используемые в программе?
  11.  Как описываются константы в программе?
  12.  Что представляют собой типизированные константы?

Контрольные задания

1. Укажите ошибки в следующей программе:

program P1;

type

  TM=array[1..N] of Real;

const

  N=100; M=50;

var

  S,T: array[1..20] of Byte;

begin

  z:=TM[101]

end.

2. Напишите примеры констант, принадлежащих одновременно каждому из следующих целых типов:

а) Shortint, Integer;

б) Longint, Shortint;

в) Byte, Word;

г) Word, Shortint;

3. Напишите примеры констант, принадлежащих одновременно каждому из следующих вещественных типов:

a) Single, Comp;

б) Double, Single;

в) Real, Extended;

г) Real, Double, Extended, Comp;

д) Extended, Comp;


Лексемы

Специальные символы

Ключевые слова

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

Стандартные (предопределенные) идентификаторы

Метки

Пользовательские идентификаторы

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

дентификаторы процедур и функций

Десятичные

Числовые и булевы константы

Шестнадцатеричные

Строки

Комментарии

Рис. 1. Категории лексем

Булевы

Рис. .2. Диаграммы, показывающие, какие идентификаторы могут быть уточненными, а какие нет

Блок

Заголовок программы

Предложение Uses

Раздел описаний

Раздел операторов

;

.

Рис. 3. Диаграмма структуры программы

Параметры программы

(список идентификаторов)

Имя программы

(идентификатор)

(

);

Program

Рис. 4. Диаграмма заголовка программы

Описание абсолютной переменной

var

Список идентификаторов

:

:

;

Тип

Идентификатор переменной

Целое без знака

absolute

Целое без знака

Рис. 5. Синтаксическая диаграмма подраздела описания переменных var

Рис. 6. Синтаксическая диаграмма подраздела описания типов type

Описание типа

=

;

Тип

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

type

Рис. 7. Синтаксическая диаграмма подраздела описания констант const

Описание типизированной константы

Описание простой константы

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

=

:

;

Тип

Типизированная константа

const

Выражение

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


 

А также другие работы, которые могут Вас заинтересовать

34739. Материалы всероссийской переписи населения 1897года как источник по генеалогии непривилегированных слоев населения 13.06 KB
  дают материалы Первой всероссийской переписи населения это прямой массовый статистический учет населения проводимый с целью определения его численности состава и размещения на определенный момент. Первый подробный проект переписи населения был представлен председателем Центрального статистического комитета П. Только почти через 20 лет этот проект был утвержден императором Николаем II согласно Положению о Первой всеобщей переписи населения Российской империи изданному в 1895 г.
34740. Церковные метрические книги как источник по генеалогии непривилегированных слоев населения 13.82 KB
  Метрические книги велись в России до революции в церковных приходах духовенством или особыми гражданскими чиновниками. Во второй части метрической книги также приводился порядковый номер и дата бракосочетания. Метрические книги велись в двух экземплярах: один направлялся на хранение в архив консистории учреждение с церковноадминистративными и судебными функциями которая подчинялась епархиальному архиерею второй оставался в церкви.
34741. Методика генеалогических исследований. Генеалогические таблицы и росписи 15.71 KB
  Поколенная роспись – это нумерованное перечисление членов рода потомков родоначальника по мужской линии обоего пола по генеалогическому старшинству с выделением поколений и указанием при каждом члене рода номера его отца. Выделяются три наиболее употребительных: а все лица рода распределялись по коленам нумеровавшимся римскими цифрами перед представителем рода ставился порядковый номер арабскими цифрами а в конце строки ставился порядковый номер отца; как валовая нумерация б номер отца при сплошной нумерации переносится в начало...
34742. Историческая хронология. Предмет и задачи. Виды календарных систем. Основные понятия и термины 17.43 KB
  В этом календаре год состоял из 365 дней. по 30 дней каждый; в конце года добавлялось пять праздничных дней не входивших в состав месяцев. В течение каждых 19 лет считают 12 лет по 12 лунных месяцев по 29 30 дней и 7 лет по 13 лунных месяцев. лунносолнечный календарь является официальным в Израиле где начало года приходится на один из дней периода с 5 сентября по 5 октября.
34743. Древние календарные системы: Египет, Древняя Греция, Китай 18.83 KB
  Этот лунный календарь использовался на протяжении всей древнеегипетской истории как религиозный календарь фиксирующий время проведения праздников. Схематический гражданский календарь Новый календарь был построен по простой схеме. Поздний лунный календарь Хронологической единицей в нем как и в раннем лунном календаре служил лунный месяц начинавшийся в первый день невидимости Луны.
34744. Мусульманский календарь. Мусульманская система летоисчисления 13.08 KB
  Мусульманская система летоисчисления Мусульманский исламский календарь лунный календарь используемый в исламе для определения дат религиозных праздников а также как официальный календарь в некоторых мусульманских странах. Поэтому в мусульманских странах календарь называют календарём Хиджры. Такая система до сих пор используется в некоторых странах например в Пакистане и Бангладеш. В разных странах используются разные правила.
34745. Календарные системы в Древнем Риме. Реформа Юлия Цезаря 16.15 KB
  Последующие месяцы продолжали сохранять свои числовые обозначения: Квинтилис Quintilis пятый Секстилис Sextilis шестой Септембер September седьмой Октобер Oktober восьмой Новембер November девятый Децомбер December десятый Мартиус майус квинтилис и октобер имели по 31 дню а остальные месяцы состояли из 30 дней. Очень любопытна история распределения дней по месяцам. Первоначально год римского календаря как уже говорилось состоял из 304 дней. Чтобы...
34746. Григорианская реформа и григорианский календарь 14.62 KB
  Эта разница ежегодно накапливаясь привела через 128 лет к ошибке в одни сутки а через 1280 лет уже в 10 суток. Реформа должна была решить две основные задачи: вопервых ликвидировать накопившуюся разницу в 10 суток между календарным и тропическим годами вовторых максимально приблизить календарный год к тропическому чтобы в будущем разница между ними не была ощутимой. Григорианский календарь В григорианском календаре длительность года принимается равной 3652425 суток.
34747. Единицы счета времени: месяц, неделя, сутки 12.86 KB
  Переход к земледелию и скотоводству определил необходимость учета времени его фиксирования в определенных единицах. Все основные выработанные человечеством единицы счета времени сутки месяц и год определяются астрономическими факторами: сутки периодом обращения Земли вокруг своей оси месяц периодом обращения Луны вокруг Земли год периодом обращения Земли вокруг Солнца. Для облегчения исчисления времени введено фиктивное понятие среднее солнце т.