Функции в delphi 7. Создание собственных процедур и функций Delphi
В этом уроке я расскажу вам об устройстве и применении процедур и функций в языке программирования Pascal/Delphi.
Процедуры — это конструкции программного кода, которые позволяют создавать в программном коде некоторые подпрограммы, которые выполняют определенные операции независимо от остального программного кода. Разберем несложный пример:
procedure shownumbers(n:integer);
var i:integer;
begin
for i:=1 to n do
showmessage(inttostr(i));
end;
procedure showsimplemessages;
begin
showmessage(‘This is a simple message 1!’);
showmessage(‘This is a simple message 2!’);
end;
begin
shownumbers(5);
showsimplemessages;
end;
Пока не будем изучать синтаксис, сначала разберемся с принципом работы процедур. Как вы уже наверное заметили, все события (например тот же OnCreate) представлены процедурами. Сначала изучим содержимое обработчика события создания формы Form1 (или точнее уже можно говорить — содержимое процедуры «procedure TForm1.OnCreate(Sender:TObject)»). Внутри этой процедуры мы видим «shownumbers(5);» и «showsimplemessages;» — это и есть вызов процедур, находящихся выше чем «procedure TForm1.OnCreate(Sender:TObject)». Как вы уже наверняка поняли, для того чтобы вызвать существующую процедуру, необходимо сначала указать ее название, а затем в скобках перечислить ее параметры. Если параметр один, то достаточно просто указать его значение. Также, процедуры могут не иметь параметров. В таком случае скобки можно опустить. Указывать сами параметры нужно в соответствующем им типе. Например строковые переменные «string» нужно указывать в кавычках ‘ ‘.
Теперь разберем синтаксис самой процедуры. В самом начале процедуры идет ключевое слово «procedure». Затем указывается имя процедуры, а после имени указываются параметры в скобках. Указываются они перечислением через «точку с запятой». Несколько однотипных переменных подряд можно указывать через запятую. На словах это понять достаточно трудно, поэтому приведу пример:
procedure example(a,b,c:integer; d:string; e:real; x1,y1:string);
Затем, после объявления параметров процедуры, указывается программный код процедуры между ключевыми словами «begin» и «end» также, как это показано на первом примере. Перед «begin» можно также указать локальные переменные, создав новый раздел var. Эти переменные могут использоваться и обрабатываться только внутри самой процедурой, внутри которой они объявлены. Также внутри программного кода процедуры можно использовать параметры процедуры как обычные переменные указанного в процедуре типа. Только во время вызова процедуры, всем параметрам процедуры будет уже переданы соответствующие значения, указанные в вызове процедуры.
Очень важно при написании кода учитывать то, что сама процедура должна находиться выше в коде, чем то место где происходит ее вызов! Иначе может произойти ошибка, связанная с тем, что процедура попросту не будет найдена.
Любая процедура может вызвать любую другую процедуру, но только если вызываемая процедура стоит выше вызывающей ее процедуры.
Внутри процедур можно обращаться к глобальным переменным и изменять их значения.
Надеюсь, что принцип работы процедур я достаточно вам объяснил. Теперь рассмотрим функции. Функции — это по сути те же процедуры, но только функции могут возвращать результат, т.е. какое-либо значение. Принцип устройства процедур можно очень легко понять на простом примере:
function calc(a,b,c:integer; d:string): integer;
begin
result:=length(d);
inc(a,5);
dec(b,2);
inc(result, a+b-c);
end;
procedure TForm1.OnCreate(Sender:TObject);
var a:integer;
begin
a:=calc(1,2,3,’testing’);
showmessage(‘Результат функции равен ‘+inttostr(a));
end;
Кстати, в этом примере мы также разберем две новые процедуры и одну новую для вас функцию, уже предусмотренные в Pascal/Delphi. Эти процедуры — «inc(a;integer;b:integer)» и «dec(a:integer;b:integer)». Первая называется инкрементом, и увеличивает целочисленное число «a» на «б» единиц. Вторая процедура называется декрементом, и делает совершенно обратную операцию инкременту, а именно уменьшает целочисленное число «a» на «b» единиц. Если переменной «b» не указать значение, то вместо числа «b» автоматически будет использоваться единица. Таким образом «inc(a);» — тоже самое что и «inc(a,1);». В качестве «b» могут выступать и отрицательные числа, что приведет к инверсии операции, т.е. «inc(a,-3);» — тоже самое что и «dec(a,3);». Процедуры инкремента и декремента использовать несколько удобнее и работают они относительно быстрее чем присвоение «a:=a+1;».
Функция «length(s:string):integer» подсчитывает количество символов в строке s и возвращает результат в виде целочисленной переменной.
В дальнейших уроках, когда я буду вам показывать новые функции или процедуры, мне будет достаточно указать ее заголовок, в котором описаны все имена, типы переменных и конечно же название самой функции или процедуры, т.к. синтаксис этих заголовков мы уже разобрали с вами в этом уроке.
Во всех функциях присутствует зарезервированная переменная под названием «result», которая хранит в себе результат функции, т.е. ее значение. Внутри программного кода функции нужно произвести присвоение переменной «result» значения, которое должна возвращать функция. Тип переменной «result» указывается после перечисления параметров (после закрывающей скобки и двоеточия), как это показано на примере. Внутри программного кода функции мы также как и в процедуре можем производить любые операции над параметрами, а также и над переменной «result». Также как и в процедуре, в функции необязательны параметры. Тогда она может выглядеть так:
function example: string;
begin
result:=’simple function’;
end;
Вызов функции осуществляется через присвоение, так как это показано в примере. Параметры функции указываются точно так же как и у процедуры.
Функции и процедуры могут вызывать сами себя. Такой прием программирования называется рекурсией и используются чаще всего в реализации каких-либо алгоритмов.
Название процедур и функций может содержать только латинские буквы, цифры и знаки подчеркивания.
Функции и процедуры с любыми различиями в параметрах считаются абсолютно разными и независимыми друг от друга, даже если у них одинаковые названия. Если существует две функции или процедуры с одинаковыми названиями, но разными параметрами, то при вызове одной из этих процедур или функций будет использоваться автоматически та, которая подходит по параметрам (по их типам и количеству).
В данной статье речь пойдет о процедурах и функциях. Она ориентирована в первую очередь на начинающих программистов, которые хотят лучше узнать все их возможности и научиться использовать их более эффективно. Однако и всем остальным эта статья может показаться полезной. Начнем.
В рамках статьи мы рассмотрим следующие вопросы:
Скобки
Добавление скобок при вызове процедур и функций без параметров уже давно не является новинкой в Delphi, тем не менее, эта возможность мало известна. Эту возможность оценят по достоинству те программисты, которым приходится работать на двух языках (C++ и Delphi), так как им не нужно будет постоянно помнить о разнице в синтаксисе при вызове процедур и функций в разных языках. В Delphi оба варианта, приведенные ниже, считаются корректными.
При вызове процедуры Test, Delphi сама решит, какую из трех процедур необходимо выполнить, в зависимости от передаваемого ей параметра. Но нужно отметить, что это не самая безопасная возможность языка. Применение перегружаемых процедур и функций может стать неиссякаемым источником трудноуловимых ошибок в программе. Поэтому пользуйтесь этой возможностью осторожно.
Pascal позволяет передавать параметры в функции и процедуры либо по значению, либо по ссылке. Передаваемый параметр может иметь любой встроенный или пользовательский тип либо являться открытым массивом. Параметр также может быть константой, если его значение в процедуре или функции не меняется.
Этот режим передачи параметров применяется по умолчанию. Если параметр передается по значению, создается локальная копия данной переменной, которая и предоставляется для обработки в процедуру или функцию. Посмотрите на следующий пример:
procedure Test(s: string); |
При вызове указанной процедуры будет создана копия передаваемой ей в качестве параметра строки s, с которой и будет работать процедура Test. При этом все внесенные в строку изменения никак не отразятся на исходной переменной s.
Однако это не относится к объектам. Например, если в функцию передается переменная (а точнее экземпляр объекта) TStringList, то в данном случае произойдет передача по ссылке (даже если это не указано явно).
Pascal позволяет также передавать параметры в функции или процедуры по ссылке - такие параметры называются параметрами-переменными. Передача параметра по ссылке означает, что функция или процедура сможет изменить полученные значения параметров. Для передачи параметров по ссылке используется ключевое слово var , помещаемое в список параметров вызываемой процедуры или функции.
Открытый массив параметров позволяет передавать в функцию или процедуру различное количество параметров. В качестве параметров можно передать либо открытый массив элементов одинакового типа, либо массивы констант различного типа. В приведенном ниже примере объявляется функция, которой в качестве параметра должен передаваться открытый массив целых чисел.
Для получения информации о фактически передаваемом массиве параметров в функции или процедуре могут использоваться функции High, Low и SizeOf. Для иллюстрации их использования ниже приведен текст функции AddEmUp, которая возвращает сумму всех переданных ей элементов массива A.
Вызвать объявленную выше функцию можно, например, с помощью такого оператора:
procedure WhatHaveIGot(["Text", 10, 5.5, @WhatHaveIGot, 3.14, true, "c"]); |
При передаче функции или процедуре массива констант все передаваемые параметры компилятор неявно конвертирует в тип TVarRec. Тип данных TVarRec объявлен в модуле System следующим образом:
Поскольку массив констант способен передавать данные разных типов, это может вызвать определенные затруднения при создании обрабатывающей полученные параметры функции или процедуры. В качестве примера работы с таким массивом рассмотрим реализацию процедуры WhatHaveIGot, которая просматривает элементы полученного массива параметров и выводит их тип.
procedure WhatHaveIGot(A: array of const); var i: integer; TypeStr: string; begin for i:= Low(A) to High(A) do begin case A[i].VType of vtInteger: TypeStr:= "Integer"; vtBoolean: TypeStr:= "Boolean"; vtChar: TypeStr:= "Char"; vtExtended: TypeStr:= "Extended"; vtString: TypeStr:= "String"; vtPointer: TypeStr:= "Pointer"; vtPChar: TypeStr:= "PChar"; vtObject: TypeStr:= "Object"; vtClass: TypeStr:= "Class"; vtWideChar: TypeStr:= "WideChar"; vtPWideChar: TypeStr:= "PWideChar"; vtAnsiString: TypeStr:= "AnsiString"; vtCurrency: TypeStr:= "Currency"; vtVariant: TypeStr:= "Variant"; vtInterface: TypeStr:= "Interface"; vtWideString: TypeStr:= "WideString"; vtInt64: TypeStr:= "Int64"; end; ShowMessage(Format("Array item %d is a %s", )); end; end; |
Значения параметров по умолчанию
В Delphi есть одна очень полезная возможность - использование значений параметров по умолчанию. Она позволяет установить принимаемое по умолчанию значение параметра процедуры или функции. Это значение будет использоваться в тех случаях, когда вызов процедуры или функции производится без указания значения данного параметра. В объявлении процедуры или функции принимаемое по умолчанию значение параметра указывается после знака равенства, следующего после его имени. Поясним это на следующем примере:
Во втором случае можно задать только значение параметра s, а для параметра i использовать значение, установленное по умолчанию:
procedure HasDefVal("Hello"); |
При использовании значении параметров по умолчанию следует помнить о нескольких приведенных ниже правилах.
- Параметры, имеющие значения по умолчанию, должны располагаться в конце списка параметров. Параметр без значения по умолчанию не должен встречаться в списке после параметра, имеющего значение по умолчанию.
- Значения по умолчанию могут присваиваться только параметрам обычных типов, указателям или множествам.
- Значение по умолчанию может передаваться только по значению либо с модификатором const . Оно не может быть ссылкой или нетипизированным параметром.
Директива {$X-} запрещает вызов функций как процедур (с игнорированием возвращаемого результата). По умолчанию этот режим включен ({$X+}). Так вот, запомните, использование переменной Result недопустимо при сброшенном флажке опции Extended Syntax, расположенном во вкладке Compiler диалогового окна Project Options, или при указании директивы компилятора {$X-} .
В каждой функции языка Objecl Pascal существует локальная переменная с именем Result, предназначенная для размещения возвращаемого значения. Кроме того, вернуть значение из функции можно также путем присвоения значения переменной, имеющей то же имя, что и данная функция. Это стандартный синтаксис языка Pascal, сохранившийся от его предыдущих версий. При использовании в теле функции переменной с ее именем не забывайте, что существуют большие отличия в обработке этого имени - все зависит от того, где она расположена - в левой части оператора присвоения или же в любом другом месте текста функции. Если имя функции указано в левой части оператора присвоения, то предполагается, что назначается возвращаемое функцией значение. Во всех других случаях предполагается, что осуществляется рекурсивный вызов этой функции.
Вот и все, что я хотел рассказать вам сегодня. Процедура и функция - это ключевые понятия в любом языке программирования, без которых не обходится ни одна серьезная программа. И поэтому очень важно иметь полное понимание о механизме их работы, это является еще одним шагом на пути к профессионализму. Надеюсь, данная статья оказалась для вас хоть немного полезной. Удачи в программировании.
Всем привет сегодня, в этом уроке я хочу раз и на всегда рассказать всем что же такое функция, как создавать и использовать её. Решил добавить данный урок потому что довольно часто сталкиваюсь с тем что многие начинающие программисты не умеют да и не хотят ими пользоваться.
Ну для начала немного теории.
Что же такое функция и зачем она нужна?
А нужна она, как не банально это звучит для облегчения жизни программисту. Объявляется она с помощью ключевого слова function затем идет её имя, а в скобках указываются входные параметры. После чего скобки закрываются и указывается тип выходных данных.
Да замудрил я как всегда, на самом деле тут нет ничего сложного, посмотрите на пример и вам все станет предельно ясно:
Пример №1
function
Name (X: integer; S: String
): Integer;
Как видно из примера сначала идет ключевое слово function, затем имя функции, затем входные параметры с указанием их типов, и в конце за скобками тип выходных данных.
Давайте сейчас отойдем от скучной и никому не нужной теории и сразу попытаемся сделать все на практике.
Итак, Открываем Delphi
создаем новый проект. Нам понадобится один компонент Button, и один компонент label оба с закладки Standart кидаем их на форму. Сделали? Отлично двигаемся дальше.
Теперь переходим к самому сладенькому - создадим нашу первую delphi функцию. Называться она будет просто: Sum, иметь она будет два входных параметра типа integer, выходной параметр будет тоже integer.
Перходим в код и после ключевого слова private пишем вот такую строчку:
function Sum (a, b: integer): integer;
Нажимем комбинацию клавиш CTRL + SHIFT + C и delphi автоматически сгенерирует вам вот такую штуку:
function
TForm1.sum(a, b: integer): integer;
begin
Все что мы будем писать здесь между ключевыми словами begin и end называется тело функции . Давайте сейчас это тело и пропишем, оно у нас будет предельно простым.
и все!
Как вы уже наверное догадались она будет складывать два числа.
Вызов в программе.
С созданием разобрались, осталось научиться вызывать...! Создаем, обработчик событий OnClick на кнопке, между begin end пишем:
Label1.Caption:=inttostr(Sum(2,2));
Здесь мы вызываем функцию и её результат сразу выводим в label1, т.к выходные данные у неё имеют тип integer, что бы вывести их в label нам нужно перевести их в тип string за что и отвечает конструкция inttostr()
По своей сути наша программа не выполняет ничего особенного, она просто складывает два числа указанные в скобках, ну а представьте, если у вас есть огромная формула, которую вы используете 25 раз в своей программе и каждый раз вам в формулу нужно подставлять новые числовые значения..! Согласитесь писать 25 раз огромную формулу в программе неудобно, гораздо легче создать функцию и каждый раз при необходимости вызывать её в нужном месте программы просто указывая её имя и в скобках нужные числа для подстановки в формулу.
в последнее время увлекса программированием и написанием интеренет мессенджеров, хочется сделать нечто свое, с оригинальным и не похожим функционалом. надеюсь в скорем будующем вы сможете скачать miranda моего производства с набором наиболее интересных дополнений.
P.S. Не забываем подписываться на бесплатную мультимедийную рассылку.
Форма для подписки расположена с права и с лева.
До встречи Delphi Expert.ru !!!
До встречи
Добрый день. Хотим предоставить свои услуги взлома сайтов, скайпа, любой почты, социальных сетей(вконтакте, одноклассники, фейсбук, инстраграмм). Прослушивание вайбер, вотсап, чтение сообщений и многое другое. Многолетний опыт и огромное количество отзывов о нашей работе. По всем вопросам в telegram - @Dred36
создание и seo продвижение сайтов любой сложности По всем возникшим вопросам Вы можете обратиться в скайп логин SEO PRO1 мы с удовольствием ответим на все интересующие вас вопросы...Анализ вашего интернет-проекта бесплатно
Наш сервис предоставляет настоящие лайки на фотографии заказчиков, которые готовы платить за качество.
Именно для этого мы и набираем удалённых сотрудников, которые будут выполнять работу, то есть ставить лайки и зарабатывать за это деньги.
Чтобы стать нашим удалённым сотрудником и начать ставить лайки, зарабатывая при этом 45 рублей за 1 поставленный лайк,
Вам достаточно просто зарегистрироваться на нашем сервисе. > like-rabota.tk <
Вывод заработанных средств ежедневно в течении нескольких минут.
8 ответов
Просьба дать более подробную информацию о том, чего вы пытаетесь достичь.
Насколько я знаю:
- Невозможно вызвать такую случайную функцию.
- Для функций класса и объекта (MyObject.Function) это можно сделать с помощью RTTI, но это много работает.
- Если вам просто нужно вызвать один конкретный тип функций (скажем, function (integer, integer): string), это намного проще.
Для последнего объявите тип функции, затем получите указатель на функцию и произведите его следующим образом:
Type TMyFuncType = function(a: integer; b: integer): string of object; TMyClass = class published function Func1(a: integer; b: integer): string; function Func2(a: integer; b: integer): string; function Func3(a: integer; b: integer): string; public function Call(MethodName: string; a, b: integer): string; end; function TMyClass.Call(MethodName: string; a, b: integer): string; var m: TMethod; begin m.Code:= Self.MethodAddress(MethodName); //find method code m.Data:= pointer(Self); //store pointer to object instance Result:= TMyFuncType(m)(a, b); end; {...} //use it like this var MyClass: TMyClass; begin MyClass:= TMyClass.Create; MyClass.Call("Func1", 3, 5); MyClass.Call("Func2", 6, 4); MyClass.Destroy; end.
Вы не указали свою версию Delphi, но если у вас есть Delphi 2010 (+), вы можете сделать это с помощью расширенного RTTI, я не эксперт по ним, но я попробовал этот образец для вас:
TProcClass = class public procedure SayHi; function GetSum(X,Y:Integer): Integer; end; uses Rtti; { TProcClass } procedure TProcClass.SayHi; begin ShowMessage("Hi"); end; function TProcClass.GetSum(X, Y: Integer): Integer; begin ShowMessage(IntToStr(X + Y)); end; procedure ExecMethod(MethodName:string; const Args: array of TValue); var R: TRttiContext; T: TRttiType; M: TRttiMethod; begin T:= R.GetType(TProcClass); for M in t.GetMethods do if (m.Parent = t) and (m.Name = MethodName)then M.Invoke(TProcClass.Create,Args) end; procedure TForm1.FormCreate(Sender: TObject); begin ExecMethod("SayHi",); ExecMethod("GetSum",); end;
Хорошие вещи, если у вас есть процедура или функция с параметрами, она будет работать без дополнительной работы.
В Delphi 2010 вы можете использовать JSON и SuperObject для вызова метода с параметрами.
Если вам нужно, есть также XML-парсер для преобразования xml в json.
TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } procedure TestMethod(const value: string); end; var Form1: TForm1; implementation uses superobject; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin SOInvoke(Self, "TestMethod", SO("{value: "hello"}")); end; procedure TForm1.TestMethod(const value: string); begin Caption:= value; end;
Я удивлен, что никто не предложил таблицу рассылки. Для этого это и есть.
Program RPS;
uses
SysUtils,
Generics.Collections;
type
TDispatchTable = class(TDictionary
Реализация, которую я написал, использует generics, поэтому она будет работать только с Delphi 2009+. Для более старых версий, вероятно, было бы проще реализовать с помощью TStringList и шаблон команды
Если вы спрашиваете, есть ли что-то вроде JavaScript eval() в Delphi, это невозможно (легко), поскольку Delphi компилируется в собственный код.
Если вам нужно только поддерживать некоторые строки, вы всегда можете сделать много if или case ... Что-то вроде:
If myString = "myFunction" then myFunction();
Вы можете сделать что-то подобное, создав один или несколько классов с опубликованными свойствами, которые используют функции для реализации своих функций чтения и записи. Затем свойства могут быть обнаружены с использованием RTTI-отражения и ссылки, в результате чего вызывающие функции вызываются.
В качестве альтернативы вы можете хранить указатели функций в таблице или даже свойство Object TStringList и эффективно индексировать их по имени строки.
Прямой вызов функции по имени в Delphi невозможно.
Что такое процедура? Это маленькая программа, выполняющая операции с указанными данными. Различают собственно процедуры и функции. Их основное отличие - процедура просто совершает какие-либо операции, а функция обязательно выдаёт какой-либо результат в результате своей работы. Существует огромное количество стандартных процедур и функций. Подпрограммы (так называют процедуры и функции) можно писать и самостоятельно, но об этом речь пойдёт позже. Сейчас нам нужно научиться работать с готовыми функциями.
Общие сведения о подпрограммах
Фактически, подпрограмма - это такая же полноценная программа, просто работает она не отдельно, не сама по себе, а включена в другую программу.
У подпрограммы всегда есть имя. Имя строится по тем же правилам, что и идентифмкатор. Как правило, имена даются вполне логичные. Например, если функция находит максимальное из нескольких чисел, то её логично назвать Max
.
Подпрограммы могут иметь входные параметры. Входные параметры
- это данные, которые сообщаются подпрограмме до начала её работы, а в процессе выполнения эти данные могут использоваться. Тем не менее, подпрограммы могут и не иметь входных параметров. Входные параметры также называют аргументами. Например, функции, которая узнаёт текущее время, никакие дополнительные параметры не нужны, а вот если функция считает факториал, то обязательно должно быть число, для которого он считается.
Как было сказано выше, функция выдаёт какое-то значение в результате своей работы. Процедура в общем случае значения не выдаёт.
Вызов подпрограмм
Вызываются подпрограммы по имени. Если подпрограмме требуется передать какие-либо параметры, то они указываются в скобках после имени подпрограммы через запятую. Если входные параметры отсутствуют, достаточно просто написать имя подпрограммы, либо оставить скобки пустыми. В случае, если работа происходит с функцией, результат можно "сохранить" в какой-то переменной, просто "присвоив" этой переменной функцию.
Обратите внимание: работа с функциями происходит как с обычными переменными, просто их значения вычисляются "на лету".
Функции математических вычислений
Эти функции работают с числовыми данными. Как правило, входным параметром является какое-то число, а выходным - результат вычисления. Практически везде аргумент является либо целым числом (Integer ), либо вещественным (Real ). Возвращаемое значение - тоже число. Рассмотрим некоторые из этих функций:
Abs(x) - модуль (абсолютное значение) указанного числа x . Пример: Abs(-5) = 5 .
Sin(x) - синус числа x . Здесь x - угол в радианах (не в градусах!). Пример: Sin(Pi/2) = 1 .
Cos(x) - косинус числа x . Аналогично, x - радианы. Пример: Cos(Pi) = -1 .
Exp(x) - экспонента, e x (e в степени x ).
Ln(x) - натуральный логарифм числа x . Пример: Ln(Exp(2)) = 2 .
Sqr(x) - квадрат числа x (x 2 ). Пример: Sqr(5) = 25 .
Sqrt(x) - квадратный корень числа x . Пример: Sqrt(64) = 8 .
Int(x) - целая часть числа x . Пример: Int(1.234) = 1 .
Frac(x) - дробная часть числа x . Пример: Frac(1.234) = 0.234 .
Round(x) - округление аргумента до ближайшего целого числа. Пример: Round(1.234) = 1 .
Trunc(x) - целая часть вещественного числа x. Пример: Trunc(1.234) = 1 .
Pred(x) - предыдущее значение x (например, для x = 2 это 1 ).
Succ(x) - следующее значение x (для x = 2 это 3 ).
Odd(x) - проверка аргумента на нечётность. Функция возвращает значение True , если аргумент является нечётным числом и False - если чётным. Пример: Odd(5) = True .
Предсказываю вопрос: в чём отличие Int() от Trunc() ? А отличие в том, что Int() возвращает число вещественного типа, а Trunc() - целочисленного .
Это лишь часть всех доступных функций. На самом деле их гораздо больше. Но помимо функций есть ещё процедуры.
Процедуры работы с числами
Поскольку процедуры в результате работы не выдают никакого значения, процедуры работы с числами просто изменяют переданные им параметры-переменные.
Inc(x)
- увеличение аргумента на единицу. Фактически, это то же самое, что x:=x+1
. Тем не менее, рекомендуется использовать именно эту функцию, так как работает она быстрее.
Примечание:
под понятием "быстрее" подразумевается, конечно, быстрота "компьютерная". Компьютер выполняет миллионы операций в секунду и для человека такие вещи незаметны.
Inc(x,n) - увеличение аргумента на число n . Эквивалентно записи x:=x+n .
На самом деле, это не две разные процедуры - просто параметр n является необязательным. Да, бывают необязательные параметры, которые можно указать, а можно и не указывать. Если они отсутствуют, то просто берётся какое-то значение по умолчанию. В данном случае n по умолчанию имеет значение 1 .
Dec(x,n) - уменьшение аргумента на n единиц. Точно также, как и в Inc , параметр n является необязательным. Эквивалентно записи x:=x-n .
В документации необязательные параметры обычно заключают в квадратные скобки, т.е. обычно пишут Inc(x , [n]) . Обратите внимание: это лишь условное обозначение, которое создано с целью узнавания, что параметр необязательный. В программном коде никаких скобок нет и быть не может.
Не хватает стандартных математических функций?
Существует дополнительный модуль с именем Math
, в котором содержится большое число математических функций. Например, если нужно посчитать гиперболический арксеканс числа, то мучаться и описывать способ его вычисления вручную не придётся - есть готовая функция ArcSecH()
.
Чтобы подключить модуль Math
, откройте исходный код модуля. Для этого, когда открыта форма, следует нажать F12
, либо выбрать пункт меню View " Toggle Form/Unit
. Далее нужно переместиться в самое начала модуля в раздел uses
. В этом разделе через запятую описываются имена подключённых модулей. Как можно заметить, даже при наличии пустой формы несколько модулей уже подключены. В этот список и следует добавить Math
:
Всё, теперь в Вашем распоряжении большое количество математических функций.
Пример комбинирования функций
Раз уж речь пошла о математических функциях, пусть пример будет на них и основан. Допустим, у нас есть такая сравнительно сложная функция:
Нам нужно создать программу, которая бы вычисляла значение этой функции по заданным числам x
и y
. Рассмотрим поэтапно элементы функции:
1) Возведение числа e
в степень, модуль - функции Exp()
и Abs()
соответственно.
2) Натуральный логарифм - функция Ln()
.
3) Число e
... Часто спрашивают - как получить число e
? Ведь это, по сути, такая же константа, как и число пи
... Но она не объявлена... А ответ прост: e
=
e 1
, поэтому e
- это exp(1)
.
4) Тангенс - функция Tan()
.
Всё необходимое у нас есть, поэтому можно приступить к записи. Главное - не забывать заключать в скобки отдельные элементы формулы, чтобы порядок действий сохранился (в нашем примере это не потребуется).
var f,x,y: Real;
f:= Exp(Abs(x-y))+Ln(1+Exp(1))*Tan(Pi-7);
Как возвести число в степень?
Почему я останавливаюсь на таких вопросах? Просто они очень часто возникают у новичков и не каждый может догадаться, как выполнить требуемую операцию.
Способ 1. X y можно преобразовать к виду e ln(x)⋅y . Тогда возведение в степень можно записать так:
:= Exp(y * Ln(x));
Способ 2. В модуле Math есть функция для возведения в степень - Power . У функции 2 аргумента - основание и показатель степени. Запись, соответственно, следующая :=Power(x,y);
Случайные числа
Зачем нужны случайные числа? Как правило, чтобы проверить результаты какого-то эксперимента при различных условиях. На основе случайных чисел можно вычислять различные вероятности. Во всех языках программирования есть возможность использовать случайные числа.