Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
delphi.pdf
Скачиваний:
191
Добавлен:
24.02.2016
Размер:
6.84 Mб
Скачать

Move(...)

ParamCount

ParamStr(X)

SizeOf(X)

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

Возвращает количество байт, занимаемое аргументом X в памяти. Функция SizeOf особенно нужна для определения размеров переменных обощенных типов данных, поскольку представление обощенных типов данных в памяти может изменяться от одной версии среды Delphi к другой. Рекомендуем всегда использовать эту функцию для определения размера переменных любых типов данных; это считается хорошим стилем программирования.

Swap(X) Меняет местами значения старшего и младшего байтов аргумента. UpCase(C) Возвращает символ C, преобразованный к верхнему регистру.

Примеры:

Выражение Результат

Hi($F00F) $F0

Lo($F00F) $0F

High(Integer) 32767 Low(Integer) –32768 SizeOf(Integer) 2 Swap($F00F) $0FF0 UpCase('a') 'A'

2.8.3. Процедуры программиста

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

procedure <имя процедуры> ( <список формальных параметров> ) ; const ...;

81

type ...; var ...; begin

<операторы> end;

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

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

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

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

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

Приведем пример небольшой программы, использующей процедуру Power для вычисления числа X в степени Y. Результат вычисления процедура Power заносит в глобальную переменную Z.

program Console;

{$APPTYPE CONSOLE}

uses SysUtils;

var

Z: Double;

procedure Power(X, Y: Double); // X и Y - формальные параметры begin

Z := Exp(Y * Ln(X)); end;

82

begin

Power(2, 3); // 2 и 3 - фактические параметры

Writeln('2 в степени 3 = ', Z); Writeln('Press Enter to exit...'); Readln;

end.

2.8.4. Функции программиста

Функции программиста применяются в тех случаях, когда надо создать подпрограмму, участвующую в выражении как операнд. Как и процедура, функция состоит из заголовка и блока. Заголовок функции состоит из зарезервированного слова function, имени функции, необязательного заключенного в круглые скобки списка формальных параметров и типа возвращаемого функцией значения. Функции возвращают значения любых типов данных кроме Text и file of (см. файлы). Тело функции представляет собой локальный блок, по структуре аналогичный программе.

function <имя функции> ( <список формальных параметров> ): <тип результата>;

const ...; type ...; var ...; begin

<операторы> end;

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

ввыражениях как операнд.

Вкачестве примера заменим явно неуклюжую процедуру Power (см. выше) на функцию с таким же именем:

program Console;

 

{$APPTYPE CONSOLE}

 

uses

 

SysUtils;

 

function Power(X, Y: Double): Double;

// X и Y - формальные

параметры

 

begin

 

83

Result := Exp(Y * Ln(X)); end;

begin

Writeln('2 в степени 3 = ', Power(2, 3)); // 2 и 3 - фактические параметры

Writeln('Press Enter to exit...'); Readln;

end.

2.8.5. Параметры процедур и функций

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

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

Входные параметры объявляются с помощью ключевого слова const; их значения не могут быть изменены внутри подпрограммы:

function Min(const A, B: Integer): Integer; begin

if A < B then Result := A else Result := B;

end;

Для объявления выходных параметров служит ключевое слово out:

procedure GetScreenResolution(out Width, Height: Integer); begin

Width := GetScreenWidth; Height := GetScreenHeight;

end;

Установка значений выходных параметров внутри подпрограммы приводит к установке значений переменных, переданных в качестве аргументов:

var

W, H: Integer; begin

GetScreenResolution(W, H);

...

end;

84

После вызова процедуры GetScreenResolution переменные W и H будут содержать значения, которые были присвоены формальным параметрам Width и Height соответственно.

Если параметр является одновременно и входным, и выходным, то он описывается с ключевым словом var:

procedure Exchange(var A, B: Integer); var

C: Integer; begin

C := A;

A := B;

B := C; end;

Изменение значений var-параметров внутри подпрограммы приводит к изменению значений переменных, переданных в качестве аргументов:

var

X, Y: Integer; begin

X := 5;

Y := 10;

...

Exchange(X, Y);

// Теперь X = 10, Y = 5

...

end;

При вызове подпрограмм на место out- и var-параметров можно подставлять только переменные, но не константы и не выражения.

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

function NumberOfSetBits(A: Cardinal): Byte; begin

Result := 0; while A <> 0 do begin

Result := Result + (A mod 2); A := A div 2;

end;

85

end;

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

Разные способы передачи параметров (const, out, var и без них) можно совмещать в одной подпрограмме. В следующем законченном примере процедура Average принимает четыре параметра. Первые два (X и Y) являются входными и служат для передачи исходных данных. Вторые два параметра являются выходными и служат для приема в вызывающей программе результатов вычисления среднего арифметического (M) и среднего геометрического (P) от значений X и Y:

program Console;

{$APPTYPE CONSOLE}

uses SysUtils;

procedure Average(const X, Y: Double; out M, P: Double); begin

M := (X + Y) / 2;

P := Sqrt(X * Y); end;

var

M, P: Double;

begin

Average(10, 20, M, P);

Writeln('Среднее арифметическое = ', M); Writeln('Среднее геометрическое = ', P); Writeln('Press Enter to exit...'); Readln;

end.

Существует разновидность параметров без типа. Они называются нетипизированными и предназначены для передачи и для приема данных любого типа. Нетипизированные параметры описываются с помощью ключевых слов const и var, при этом тип данных опускается:

procedure JustProc(const X; var Y; out Z);

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

86

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]