Объявление процедур и функций без параметров

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

Объявление процедур и функций без параметров

Вызов процедуры без параметров осуществляется по имени данной процедуры в теле программы. Имя процедуры воспринимается как оператор. При выполнении этого оператора выполняется вся подпрограмма.

Procedure <имя процедуры>;

function MyCoolFunc: String;
begin
MyCoolFunc := 'Hello, world!';
end;

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

Определение процедуры, основные особенности работы

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

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

Процедура вызывается с помощью процедурного оператора.

Заголовок процедуры сопровождается:

· разделом описаний, в котором объявляются локальные объекты

· операторами, находящимися между Begin и End, которые определяют, что должно быть выполнено при вызове процедуры.

procedure<имя> (<сп.форм.пар.>);

Определение функции, основные особенности работы

function<имя> (<сп.форм.пар.>) : <тип>;

Функция в Паскале — это подпрограмма, которая в отличие от процедуры всегда возвращает какое-либо значение. Для этого в теле функции её имени присваивается вычисленное значение — результат, который она возвращает.

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

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

var …;{объявление глобальных переменных}   function название (параметры): тип результата; var…; {объявление локальных переменных} begin … {тело функции} название:=результат; {результат вычислений всегда присваивается функции} end;   begin … {тело основной программы} end.

Области видимости процедур и функций

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

Пример:
Program X;
Var
I,j:integer;
z:real;

Procedure x1(i:integer;);
Var
j:integer;
begin
End;
Begin
End;

Procedure x2;
Var
z:integer;

Procedure x3(z:string);
Begin
End;

Function y4(z:string):integer;
Begin
End;

Begin
End;

Begin
End.

Оформление исходного текста процедур и функций

Структурирование текста отступами («лесенка»). Правильно подобранные («мнемонические») имена пользовательских типов, процедур и функций, переменных, констант.

Все глобальные имена – пользовательские типы, процедуры и функции, глобальные переменные, глобальные константы, модули, имена программ, имена файлов и т.п. – обязательно должны быть достаточно длинными и осмысленными. Причем чем реже в программе используется имя, тем больше оно должно содержать символов. Локальные имена должны быть осмысленными. Существует ряд имен, использование которых общепринято: счетчики цикла – i, j, k …, сумма – s (или sum), координаты – x, y и т.п.

Комментарии следует писать: При объявлении пользовательских типов данных каждый тип поясняется отдельно. При объявлении глобальных переменных каждая переменная комментируется отдельно. При объявлении глобальных констант – по мере надобности. При определении процедур и функций – перед каждой процедурой и функцией. При этом указывается назначение подпрограммы, получаемые и возвращаемые значения, используемые глобальные переменные. «Нестандартные» локальные переменные – по мере надобности. Сложные места в программе – сложные алгоритмы или какие-то программистские хитрости

Явная и неявная рекурсия

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

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

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

сначала задаются прототипы подпрограмм с параметрами, за которыми вместо тела подпрограммы следует forword;

затем описываются тела этих подпрограмм (причем параметры второй раз можно уже не описывать).

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

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

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

<идентификатор> : <тип> = <значение> ;

Здесь <идентификатор> – идентификатор константы;

<тип> – тип константы;

<значение> – значение константы.

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

II. Файлы

III. Модули

Стандартные модули Паскаль

В Турбо Паскале имеется 8 стандартных модулей, в которых содержится множество различных типов, констант, процедур и функций. Этими модулями являются SYSTEM, DOS, CRT, GRAPH, OVERLAY, TURBO3, GRAPH3. Модули Паскаля GRAPH , TURBO 3, GRAPH 3 выделены в отдельные TPU -файлы, а остальные входят в состав библиотечного файла TURBO . TPL . Лишь один модуль Паскаля SYSTEM подключается к любой программе автоматически, все остальные становятся доступны только после указания их имен в списке подключаемых модулей.

Модуль Паскаля SYSTEM. В него входят все процедуры и функции стандартного Паскаля, а также встроенные процедуры и функции, которые не вошли в другие стандартные модули (например, INC , DEC , GETDIR и т.п.). Модуль Паскаля SYSTEM подключается к любой программе независимо от того, объявлен ли он в предложении USES или нет, поэтому его глобальные константы, переменные, процедуры и функции считаются встроенными в Турбо Паскаль.

Модуль Паскаля PRINTER делает доступным вывод текстов на матричный принтер. В нем определяется файловая переменная LST типа TEXT , которая связывается с логическим устройством PRN. После подключения данного модуля Паскаля можно выполнить, например, такое действие:

Пример стандартного модуля Паскаля

Uses printer;
Begin
Writeln(lst, ' Турбо Паскаль ');
End.

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

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

Модуль Паскаля DOS . В модуле собраны процедуры и функции, открывающие доступ к средствам дисковой операционной системы MS - DOS .

Модуль Паскаля OVERLAY . Данный модуль необходим при разработке громоздких программ с перекрытиями. Турбо Паскаль обеспечивает создание программ, длина которых ограничивается лишь основной оперативной памятью. Операционная система MS - DOS оставляет программе около 580 Кбайт основной памяти. Память такого размера достаточна для большинства исполняемых программ, тем не менее, использование программ с перекрытиями снимает это ограничение.

IV. Указатели

Основные понятия, типы указателей, объявление

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

* Если ваша программа работает с большими объемами данных (общий объем которых превышает 64К).

* Если ваша программа во время компиляция использует данные неизвестного размера.

* Если программа использует временные буферы данных.

* Если ваша программа работает с несколькими типами данных.

* Если ваша программа использует связанные списки данных или объектов.

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

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

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

Для описания используется символ ^.

Схема объявления указателя:

<имя переменной-указатемя>: ^<базовый тип данных>.

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

Такие указатели определяются с помощью предопределенного идентификатора Pointer.

<переменная~указатель>: Pointer;

2. Способы задания значений переменных

Чтобы хранить указатели, вам требуется переменная-указатель, а для создания переменной-указателя вам необходим ссылочный тип (или тип "указатель"). Простейшим ссылочным типом является стандартный тип с именем Pointer. Переменная типа Pointer - это общий (нетипизированный) указатель, то есть, просто адрес. Он не содержит информации о том, на что он указывает.

Таким образом, чтобы использовать тот же пример SomeNumber, вы можете присвоить его адрес переменной-указателю:

var

SomeNumber: Integer;

SomeAddress: Pointer;

begin

SomeNumber := 17; {присвоить SomeNumber значение}

SomeAddress := @SomeNumber; {присвоить SomeAddress адрес}

SomeAddress := Addr(SomeNumber); {другой способ получения

адреса}

end.

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

V. Объекты

1. ООП, основные понятия и определения

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

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

• Объекты относятся к соответствующим типам (классам).

• Типы (классы) могут наследовать атрибуты от супертипов (суперклассов).

К базовым принципам объектно-ориентированного стиля программирования относятся:

пакетирование или инкапсуляция ;

наследование ;

полиморфизм ;

передача сообщений.

Достоинства и недостатки

Достоинства ООП:

1. спользование более естественных с точки зрения обычной повседневной практики понятий, простота введения новых понятий;

2. упрощение разработки многократно используемых компонент приложений;

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

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

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

6. возможность написания подпрограмм с различными наборами формальных параметров, но имеющих одно и то же имя;

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

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

Недостатки ООП

1. Умеренное быстродействие программы

2. Эффективна для больших программ

Наследование

Если объектный тип создается "на базе" другого существующего объекта, то имя родительского типа должно быть указано в скобках после слова object при описании потомка:

Type <Потомок> = object(<Родитель>) <Добавленные поля> <Добавленные и переопределенные методы> end;

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

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

Type TPoint = object(TLocation) Clr : Byte; {Цвет} Visib : Boolean; {Видимость} Procedure Init (InitX, InitY:Word; InitColor:Byte); {Переопределяем метод инициализации - добавляем цвет} Function GetColor : Byte; {Возвращает цвет} Function IsVisib : Boolean; (Возвращает видимость} Procedure Show; {Делает видимым} Procedure Hide; {Делает невидимым} Procedure ChangeColor(NewColor : Byte); {Меняет цвет} Procedure MoveTo(NewX, NewY : Word); {Перемещает в новую позицию} Procedure Done; {Переопределяем для уничтожения объекта} end;

Теперь напишем реализацию методов:

Procedure TPoint.Init (InitX, InitY:Word; InitColor:Byte); begin X := InitX; Y := InitY; Clr := InitColor; Visib := False end;

Как видите, этот метод добавляет новую функциональность по сравнению с предыдущим. Первые две строки тела метода повторяют (причем полностью) операторную часть метода Init объекта TLocation, две следующие - новые. И хотя такой вариант переопределения метода тоже работоспособен, в данном случае его можно упростить с помощью такого механизма, как вызов метода непосредственного родителя из метода потомка. Для этого в Turbo Pascal есть специальное зарезервированное слово inherited (в переводе с английского - унаследованный), которым мы и воспользуемся:

Procedure TPoint.Init (InitX, InitY:Word; InitColor:Byte); begin inherited Init(InitX, InitY); Clr := InitColor; Visib := False end;

Как видите, этот метод добавляет новую функциональность по сравнению с предыдущим. Первые две строки тела метода повторяют (причем полностью) операторную часть метода Init объекта TLocation, две следующие - новые. И хотя такой вариант переопределения метода тоже работоспособен, в данном случае его можно упростить с помощью такого механизма, как вызов метода непосредственного родителя из метода потомка. Для этого в Turbo Pascal есть специальное зарезервированное слово inherited (в переводе с английского - унаследованный), которым мы и воспользуемся:

Procedure TPoint.Init (InitX, InitY:Word; InitColor:Byte); begin inherited Init(InitX, InitY); Clr := InitColor; Visib := False end;

Текст стал несколько короче. Это будет особенно заметно при дальнейшем наследовании. Вместо слова inherited можно указать имя объекта-родителя: TLocation.Init(InitX, InitY);

Продолжим:

Function TPoint.GetColor : Byte; begin GetColor := Clr; end; Procedure TPoint.Show; begin Graph.PutPixel(X, Y, Clr); Visib := True end; Procedure TPoint.Hide; begin Graph.PutPixel(X, Y, Graph.GetBkColor); Visib := False end; Procedure TPoint.IsVisib : Boolean; begin IsVisib := Visib end; Procedure TPoint.ChangeColor(NewColor : Byte); begin Clr := NewColor; If IsVisib then Show end; Procedure TPoint.MoveTo(NewX, NewY : Word); Var Status : Boolean; begin Status := IsVisib; Hide; X := NewX; Y := NewY; If Status then Show end; Procedure TPoint.Done; begin Hide; Clr := Graph.GetBkColor end;

Дочерний объектный тип "точка" - потомок родительского объекта "позиция" создан.

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

Объявление процедур и функций без параметров

Вызов процедуры без параметров осуществляется по имени данной процедуры в теле программы. Имя процедуры воспринимается как оператор. При выполнении этого оператора выполняется вся подпрограмма.

Procedure <имя процедуры>;

function MyCoolFunc: String;
begin
MyCoolFunc := 'Hello, world!';
end;

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

Наши рекомендации