ТОП 10:

Характеристики Free Pascal. Этапы разработки программы.



Характеристики Free Pascal. Этапы разработки программы.

 

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

 

* Высокоструктурированный: то есть, любая программа – структура из 3 типов базовых конструкций (последовательное исполнение операций или процесс, ветвление (условие), цикл); конструкции могут быть вложены друг в друга. Разработка происходит пошагово, сверху вниз, повторяющиеся фрагменты программы оформляются в виде подпрограмм (процедур и функций).

 

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

 

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

 

Free Pascal – свободно распространяемый компилятор языка Pascal, поддерживающий расширенный диалект языка Pascal (например, наличие объектной модели).

 

Основная единица языка –программа.

 

Программа – это набор операторов, организованных определенным образом, который после определенной обработки может быть запущен на выполнение вычислительным устройством (ЭВМ).

 

Этапы разработки программы.

1) Создание программы в текстовом редакторе или в среде разработки (IDE) (написание исходного кода).

2) Обработка исходного файла и его преобразование компилятором (компиляция). На данном этапе исходный код программы транслируется в машинный код, понимаемый процессором.

3) Исполнение скомпилированного файла процессором ЭВМ.

 

Файлы исходного кода программы на языке Pascal имеют расширение *.pas.

Исполняемые файлы Free Pascal на ОС Windows имеют расширение *.exe.

 

Структура программы на Free Pascal.

 

Любая программа на языке Pascal имеет следующую структуру:

 

// Раздел описания программы

program _1; // _1 – название программы

 

uses // Подключение модулей (например, CRT, Graph, Strings и др.)

 

const // Описание констант, определяемых на этапе компиляции

type // Описание пользовательских типов

var // Описание переменных

label // Описание меток

 

procedure …; // Описание подпрограмм – процедур и функций

function …;

 

// Раздел реализации

Begin

// Тело программы (операторы)

End.

 

Программа подразделяется на 2 раздела:

- Раздел описания (interface), где помещаются все данные, необходимые для правильной компиляции и организации взаимосвязей элементов программы.

- Раздел реализации (implementation), где содержится непосредственно набор операторов для решения задачи по поставленному алгоритму.

 

Описание элементов программы.

 

program name; // name – имя программы, состоящее из [a..z, A..Z, 0..9, _]

Нельзя, чтобы имя программы начиналось с цифры.

После названия программы ставится точка с запятой (";").

 

uses CRT, Graph;

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

 

Для подключения стандартного (поставляемого с компилятором или со средой разработки) модуля необходимо указать его имя в секции uses; то же самое справедливо и для пользовательских модулей.

 

Const

C = 10;

C2 = C * 4 + 3;

 

Секция const определяет перечень констант с установленными значениями. Данная секция является глобальной, если она описывается в контексте программы (т.е. на самом верхнем уровне видимости), и локальной, если она описывается в контексте подпрограммы (видима только для подпрограммы и ее вложенных подпрограмм).

 

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

 

Type

T1 = Integer;

T2 = record

A, B: T1;

C: Real;

end;

 

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

1900..2014 – интервальный

(_1, _2, _3) – перечисляемый

array[1..12] of String – структурированный

 

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

Некоторые типы (например, Byte, Integer, String и др.) не разрешается переопределять.

 

Аналогично (как для const) определяется видимость секции type.

 

Var

X, X2, X3: Integer;

X4: T2;

 

Секция var определяет переменные, используемые в программе или подпрограмме.

 

В Pascal применяется строгая типизация переменных.

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

 

Явное описание: A, B: TData;

Неявное описание: A, B: (_1, _2);

Аналогично (как для const и type) определяется видимость секции var.

 

Label

L1, L2;

 

Секция label определяет метки для безусловного перехода. При выполнении оператора goto происходит переход на метку, имя которой описано как в секции label, так и в теле программы или подпрограммы.

Данный метод редко применяется на практике, так как структурированный язык программирования (каким является Pascal) подразумевает, что любой алгоритм можно реализовать на основе последовательного исполнения операций, ветвления и цикла. Единственное исключение – выход из 2 и более вложенных циклов; в таком случае использование оператора goto и секции label может быть оправдано.

 

procedure P1;

function P2: Integer;

 

function имя(параметры): возвр. значение // заголовок

раздел описания (const, type, var, label)

begin// тело

раздел реализации

end;

 

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

Кроме того, процедуры и функции могут быть импортированы извне (например, из системных библиотек).

 

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

 

После описания раздела реализации ставится ключевое слово end. с точкой.

 

3. Типы данных. Понятие "переменная" и "идентификатор".

 

Основные свойства концепции типов языка Pascal:

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

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

 

Тип определяет:

- возможные значения констант, переменных, функций, выражений;

- внутреннюю форму представления данных в ЭВМ;

- операции и функции, которые могут выполняться над величинами, принадлежащими к данному типу.

 

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

- скалярные: Значения не зависят от составных частей. Такие типы подразделяются на порядковые и вещественные.

- порядковые: Значение элементов можно четко определить по количеству и порядку. Пример –

Byte, Integer, подинтервалы (1..31), перечисление и т.д. В свою очередь, порядковые

типы могут подразделяться еще на 6 подклассов: целый, символьный, логический,

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

 

- вещественные: числа с точкой (фиксированной или плавающей).

 

- структурированные: Такие типы представляют собой набор элементов скалярного либо структурированного типа. Пример – записи (record), массивы (array), множества (set), файлы (file).

 

- объектные: Типы, определяющие совокупность данных и методы их обработки.

 

- процедурные: Типы, определяющие набор операций, имеющих общий заголовок (типизированные указатели на процедуру/функцию).

 

Целые типы:

 

Название Размер Значения
Shortint -27..27-1
Byte 0..28
Smallint -215..215-1
Word 0..216
Longint -231..231-1
LongWord 0..232
Int64 -263..263-1
 
Integer varies -2x-1..2x-1-1
Cardinal varies 0..2x

 

На 16-битных платформах тип Integer по размеру и значению совпадает с Smallint; на 32-битных – с Longint (т.е. размер Integer не гарантируется).

То же самое справедливо и для Cardinal (Word и LongWord соответственно).

 

Компилятор Free Pascal по умолчанию использует 16-битный вариант.

 

Логический тип – Boolean, имеет 2 возможных значения: False или True. (False < True). В памяти данный тип занимает 1 байт.

По умолчанию происходит сравнивание типа Boolean со значением True, т.е. формы записи

if Bool = True then и

if Bool then являются идентичными.

 

Операции not, and, or и xor над типом Boolean являются логическими, над другими порядковыми типами – битовыми.

 

Над переменными типа Boolean можно применять операции Ord, Succ, Pred, Inc, Dec.

 

Символьный тип – Char (AnsiChar – ANSI, WideChar – Unicode). К символу можно обратиться по имени ('a'), коду (#63) или порядку (Chr(63)).

 

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

Любое значение символьного типа может быть получено с помощью стандартной функции Chr из его кода ASCII (Chr(32) = ' ').

 

Перечислимый тип определяет упорядоченное множество значений путем перечисления идентификаторов, обозначающих эти значения. Упорядочивание значений определяется порядком следования идентификаторов, определяющих эти значения (т.е. при перечислимом типе (_1, _2) будет принято _1 < _2; кроме этого, Ord(_1) = 0, Ord(_2) = 1).

 

Интервальный тип представляет собой поддиапазон значений из некоторого порядкового типа, называемого базовым (TData = 1..31, базовый тип – Byte).

 

Для порядковых типов применяются следующие функции:

Ord: по значению перечислимого типа возвращает порядковый номер значения (например, код символа).

Pred, Succ – возвращают предшествующее или последующее значение по значению порядкового типа.

Low, High – возвращают наименьшее или наибольшее значение по перечислимому типу или переменной данного типа.

.

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

 

Вещественные типы представляются в памяти компьютера как mE+p, где m – мантисса (целое/дробное с десятичной точкой), p – порядок (целое число).

-36.142E+2 = -36.142 * 10^2 = -3614.2

7.25E-5 = 7.25 * 10^-5 = 0.0000725

 

Название Размер Кол-во значащих цифр
Real 11-12
Single 7-8
Double 15-16
Extended 19-20
Comp 19-20

 

Строковый тип: String. Позволяет создавать строковые массивы, состоящие из заданного числа символов. Каждый символ занимает 1 байт (в кодировке ANSI). Максимально допустимое число символов в строке – 255. Однако, при использовании нуль-терминированных строк это ограничение не применяется.

 

Строковый тип – последовательность символов с атрибутом "динамическая длина" (зависит от фактического количества символов во время выполнения программы) и с атрибутом "размер" (от 1 до 255).

Текущее значение длины строки можно получить с помощью стандартной функции "Length".

Для значений строкового типа определен лексикографический порядок (bc > ac, abc < ac, ab < aba).

Символы строки доступны как элементы массива (т.е. запись S[1] является допустимой и возвратит первый символ в строке, если ее длина больше или равна 1).

В символе с индексом "0" хранится длина строки.

 

В Pascal имеется тип PChar (PAnsiChar, PWideChar), который описывает "длинные строки" (или ASCIIZ-строки), у которых длина не указывается явно, а строка завершается символом #0.

 

Структурные типы.

 

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

 

Структурный тип характеризуется типом (или типами) элементов, составляющих объект, и способом доступа к элементам.

 

Элементы объекта структурного типа сами могут иметь структурный тип (многоуровневая структуризация).

Количество уровней структуризации не ограничено.

 

Массив – структурированный тип, содержащий фиксированное число элементов одного типа.

В качестве индексного допускается любой порядковый тип, кроме Longint и ограниченных типов, основанных на нем (на 16-битной архитектуре). Стандартные функции Low и High выдают верхнюю и нижнюю границы массива соответственно.

 

Запись – структурированный тип данных, являющийся неоднородной неупорядоченной структурой с прямым доступом к компонентам. Компоненты записи называют полями записи.

 

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

 

Type

C = set of Char;

 

Ссылочные типы используются для описания указателей. Указатель – значение, задающее адрес другого значения в памяти.

 

PInteger = ^Integer;

 

Файл – линейная последовательность компонент некоторого типа. Тип компонентов файла (file of …) не может быть файловым типом, структурным типом, содержащим элементы файлового типа, и объектным типом. Количество компонент не фиксируется при определении файлового типа.

 

Процедурный тип предоставляет возможность использования переменных-подпрограмм.

Type

TFunc = function(X: Real): Real;

 

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

 

Объектный тип введен для поддержки концепций объектно-ориентированного программирования (ООП).

 

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

 

Идентификатор – имя объекта (установление соответствия объекта некоторому набору символов).

Правила создания идентификаторов:

- могут начинаться только с буквы или некоторых специальных символов ( _ ) (кроме специальных идентификаторов меток);

- может состоять из букв, цифр и знака подчеркивания;

- при написании идентификаторов можно использовать строчные и прописные буквы (регистронезависимость);

- между двумя идентификаторами должен стоять хотя бы 1 пробел или специальный символ (>, <, ,).

 

Оператор вызова процедур.

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

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

 

Примеры: ClrScr; Inc(I);.

 

Оператор перехода:

goto < метка >;

Определяет возможность безусловного перехода в указанную точку программы.
Метка – целое число без знака, определяется в секции label того же блока, что и оператор goto; устанавливается в необходимую строку для перехода.

 

Break: досрочно прекращает выполнение цикла.

Continue: начинает новую итерацию цикла.

Exit: досрочно завершает подпрограмму или программу.

 

 

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

 

Оператор присоединения.

with < ссылка на запись или объект > do

< оператор >

 

Такая конструкция позволяет ссылаться на поля или методы объекта/записи без указания имени объекта/записи.

 

Пример:

with TData(Data) do

Begin

end;

 

Оператор условия if.

if < логическое условие > then

< оператор >

Else

< оператор >;

 

Сокращенная форма:

if < логическое условие > then

< оператор >;

 

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

Оператор условия может работать в 2 формах: полная и сокращенная.

 

Полная форма предполагает наличие операторов как в секции then, так и в секции else. В некоторых случаях в секции then или else используется еще один или несколько вложенных операторов условия.

 

Сокращенная форма предполагает наличие только секции then.

 

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

 

Оператор выбора (case):

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

1 часть – выражение-селектор. В качестве такого выражения может быть представлено любое выражение порядкового типа.

2 часть – список выполняемых операторов, которые определяют, при каком значении селектора нужно запускать один из предопределенных вычислительных процессов. В качестве оператора может использоваться как простой оператор, так и составной оператор, но только один.

 

case Var of // Var – выражение-селектор

1: ; // оператор 1

2: ; // оператор 2

3: ; // оператор 3

else ; // оператор по умолчанию

end;

 

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

 

Операторы цикла.

 

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

 

Набор операторов, выполняющийся в цикле, является телом цикла.

 

В языке Pascal существуют 3 вида циклов: цикл с параметром (с известным числом повторений), цикл с постусловием, цикл с предусловием.

 

Цикл с параметром:

for Счетчик := Начальное значение to Конечное значение do

< оператор >;

Используется в программе, когда заранее известно число повторений тела цикла, при этом каждое повторение цикла приводит к увеличению или уменьшению счетчика цикла. Счетчик – переменная, имеющая начальное и конечное значение.

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

Изменение счетчика происходит автоматически после завершения тела цикла.

 

Возможно использование ключевого слова downto, тогда счетчик цикла будет уменьшаться.

 

 

Цикл с предусловием:

while < логическое выражение > do

< оператор >;

 

Выход из цикла происходит, когда логическое выражение равно False.

 

Такой цикл выполняется тогда, когда число повторений не определено, и возможная ситуация, что тело цикла не выполнится ни один раз. В таком цикле сначала проверяется условие входа в цикл, и если оно истинно, то выполняется тело цикла; в противном случае, управление передается оператору, стоящему после тела цикла.

 

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

 

 

Цикл с постусловием:

Repeat

< оператор 1 >;

< оператор 2 >;

until < логическое выражение >;

 

Выход из цикла происходит, когда логическое выражение равно True.

 

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

 

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

 

Оператор условия if.

if < логическое условие > then

< оператор >

Else

< оператор >;

 

Сокращенная форма:

if < логическое условие > then

< оператор >;

 

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

Оператор условия может работать в 2 формах: полная и сокращенная.

 

Полная форма предполагает наличие операторов как в секции then, так и в секции else. В некоторых случаях в секции then или else используется еще один или несколько вложенных операторов условия.

 

Сокращенная форма предполагает наличие только секции then.

 

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

 

Оператор выбора (case):

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

1 часть – выражение-селектор. В качестве такого выражения может быть представлено любое выражение порядкового типа.

2 часть – список выполняемых операторов, которые определяют, при каком значении селектора нужно запускать один из предопределенных вычислительных процессов. В качестве оператора может использоваться как простой оператор, так и составной оператор, но только один.

 

case Var of // Var – выражение-селектор

1: ; // оператор 1

2: ; // оператор 2

3: ; // оператор 3

else ; // оператор по умолчанию

end;

 

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

 

Операторы цикла.

 

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

 

Набор операторов, выполняющийся в цикле, является телом цикла.

 

В языке Pascal существуют 3 вида циклов: цикл с параметром (с известным числом повторений), цикл с постусловием, цикл с предусловием.

 

Цикл с параметром:

for Счетчик := Начальное значение to Конечное значение do

< оператор >;

Используется в программе, когда заранее известно число повторений тела цикла, при этом каждое повторение цикла приводит к увеличению или уменьшению счетчика цикла. Счетчик – переменная, имеющая начальное и конечное значение.

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

Изменение счетчика происходит автоматически после завершения тела цикла.

 

Возможно использование ключевого слова downto, тогда счетчик цикла будет уменьшаться.

 

 

Цикл с предусловием:

while < логическое выражение > do

< оператор >;

 

Выход из цикла происходит, когда логическое выражение равно False.

 

Такой цикл выполняется тогда, когда число повторений не определено, и возможная ситуация, что тело цикла не выполнится ни один раз. В таком цикле сначала проверяется условие входа в цикл, и если оно истинно, то выполняется тело цикла; в противном случае, управление передается оператору, стоящему после тела цикла.

 

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

 

 

Цикл с постусловием:

Repeat

< оператор 1 >;

< оператор 2 >;

until < логическое выражение >;

 

Выход из цикла происходит, когда логическое выражение равно True.

 

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

 

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

 

Type

TArray = array[1..10] of Integer;

 

Var

A: TArray;

B: array[1..5] of Integer;

 

Возможно также описание массива без предварительного определения собственного типа, однако при этом следует помнить о возможном нарушении правил соответствия и эквивалентности.

 

Массивы могут быть одномерными, многомерными и открытыми.

 

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

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

 

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

 

Статические массивы.

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

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

 

Пример:

var A: array[0..5, 1..15] of Byte;

A[1, 10] – элемент на 2 строчке, 10 столбце

 

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

 

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

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

 

Addr(C[I]) = Addr(C) + I * SizeOf(Char)

 

Инициализация массива может осуществляться 3 способами:

- Если значения элементов массива определены до начала работы программы:

const A: array[1..3] of Integer = (1, 2, 3);

- Если исходные данные необходимо внести с клавиатуры в процессе выполнения программы

for I := 1 to 2 do

for J := 1 to 3 do

Read(A[I, J]);

- Прямое присвоение в теле программы значений элементам массива

A[10] := 1.2;

 

Для обнуления массива используется процедура FillChar.

 

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

 

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

Addr(A[I, J]) = Addr(A) + (J * Cols + I) * SizeOf(Integer)

 

Всякий массив можно создать несколькими способами:

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

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

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

 

Динамические массивы.

 

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

 

A2: array of Integer;

 

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

Особенность таких массивов – их индексы всегда начинаются с нулевого элемента.

 

SetLength(var A, Count): принимает имя переменной открытого массива и устанавливаемое количество элементов.

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

 

High – возвращает индексный номер последнего элемента массива.

 

Чтобы освободить память, выделенную под открытый массив, необходимо присвоить переменной массива значение nil. Это означает, что ссылка на данный массив будет недействительной, а сам массив – безразмерно пустым.

 

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

 

Пустой открытый массив занимает столько же памяти, сколько и нетипизированный указатель (на 32-битных платформах – 4 байта).

 

Подпрограммы. Понятие процедуры и функции. Определение области действия идентификаторов. Предварительные и внешние описания подпрограмм.

 

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

 

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

 

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

 

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

 

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

- Экономится оперативная память, так как многократно используемые операции заносятся в память только один раз.

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

 

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

 

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

 

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

 

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

 

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

 

function имя (набор параметров): возвращаемое значение;

секции const, type, var, label

Begin

тело подпрограммы

end;

 







Последнее изменение этой страницы: 2016-08-26; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.232.188.251 (0.064 с.)