Функция
Функция — это
подпрограмма, т. е. последовательность инструкций, имеющая имя.
Процесс
перехода к инструкциям функции называется вызовом функции или обращением к
функции. Процесс перехода от инструкций функции к инструкциям программы,
вызвавшей функцию, называется возвратом из функции.
В общем виде
инструкция обращения к функции выглядит так:
Переменная :=
Функция (Параметры) ;
где:
- переменная — имя
переменной, которой надо присвоить значение, вычисляемое функцией;
- Функция — имя функции,
значение которой надо присвоить переменной;
- Параметры — список
формальных параметров, которые применяются для вычисления значения функции. В
качестве параметров обычно используют переменные или
константы.
Следует
обратить внимание на то, что:
- каждая функция возвращает
значение определенного типа, поэтому тип переменной, которой присваивается
значение функции, должен соответствовать типу функции;
- тип и количество параметров для каждой конкретной функции строго определены.
Объявление функции
Объявление функции в общем виде выглядит так:
function Имя (параметр1 : тип1,
..., параметрК : типК) : Тип; var
// здесь объявления
локальных переменных begin
// здесь инструкции
функции
Имя := Выражение;
end;
где:
- function —
зарезервированное слово языка Delphi, обозначающее, что далее следуют
инструкции, реализующие функцию программиста;
- имя — имя функции.
Используется для перехода из программы к инструкциям функции;
- параметр — это
переменная, значение которой используется для вычисления значения функции.
Отличие параметра от обычной переменной состоит в том, что он объявляется не в
разделе объявления переменных, который начинается словом var, а в заголовке
функции. Конкретное значение параметр получает во время работы программы в
результате вызова функции из основной программы;
- тип — тип значения,
которое функция возвращает в вызвавшую ее программу.
Следует
обратить внимание, что последовательность инструкций, реализующих функцию,
завершается инструкцией, которая присваивает значение имени функции. Тип
выражения, определяющего значение функции, должен совпадать с типом функции,
указанным в ее объявлении.
В качестве
примера в листинге 6.3 приведены функции isint и isFioat. Функция isint
проверяет, является ли символ, соответствующий клавише, нажатой во время ввода
целого числа в поле редактирования, допустимым. Предполагается, что допустимыми
являются цифры, клавиши <Enter> и <Backspace>. Функция IsFloat
решает аналогичную задачу, но для дробного числа. У функции IsFloat два
параметра: код нажатой клавиши и строка символов, которая уже введена в поле
редактирования.
Листинг 6.3.
Примеры функций
// проверяет, является ли
символ допустимым
// во время ввода целого
числа
function Islnt(ch :
char) : Boolean;
begin
if (ch >= '0'}
and (ch <= '9') // цифры
or (ch = 113) //
клавиша <Enter>
or (ch = #8) //
клавиша <Backspace>
then Islnt := True // символ допустим
else Islnt :=
False; // недопустимый символ
end;
// проверяет, является ли
символ допустимым
// во время ввода дробного
числа
function IsFloat(ch
: char; st: string) : Boolean;
begin
if (ch >= '0')
and (ch <= '9') // цифры
or (ch = #13) //
клавиша <Enter>
or (ch = #8) //
клавиша <Backspace>
then
begin
IsFloat := True; // символ верный
Exit; // выход из функции
end;
case ch
of
'-': if Length(st) = 0
then IsFloat := True; ',':
if (Pos(',',st) =
0)
and
(st[Length(st)]'>= '0') and (st[Length(st)] <= '9')
then // разделитель
можно ввести только после цифры // и если он еще не введен
IsFloat := True; else
// остальные символы запрещены
IsFloat := False;
end;
end;
Использование
функции
Если вы собираетесь использовать в программе свою функцию, то в простейшем случае ее объявление следует поместить в текст программы, перед подпрограммой, которая применяет эту функцию.
Рис. 6.1.
Окно программы Поездка на дачу
Следующая
программа (ее текст приведен в листинге 6.4, а вид диалогового окна на рис. 6.1)
вычисляет стоимость поездки на дачу. Исходными данными для программы являются:
расстояние, цена одного литра бензина и потребление бензина на 100 км пути. Для
ввода исходных данных применяются поля Edit1, Edit2 и Edit3. Функции обработки
события OnKeyPress
используют
функцию IsFioat для фильтрации вводимых в эти поля символов, во время работы
программы в полях ввода отображаются только допустимые символы.
Листинг
6.4. Пример использования функций программиста
unit fazenda_;
interface
Windows, Messages, SysUtils, Variants,
Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls;
type
TForm1 =
class(TForm)
Edit1: TEdit; //
расстояние
Edit2: TEdit; // цена
литра бензина
Edit3: TEdit; //
потребление бензина на 100 км
CheckBox1: TCheckBox; //
True - поездка туда и обратно
Button1: TButton; //
кнопка Вычислить
Label4: TLabel; // поле
вывода результата расчета
Label1:
TLabel;
Label2:
TLabel;
Label3:
TLabel;
procedure EditlKeyPress(Sender: TObject;
var Key:
Char);
procedure Edit2KeyPress(Sender: TObject;
var Key:
Char);
procedure Edit3KeyPress(Sender: TObject;
var Key:
Char);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1:
TForm1;
implementation
{$R *.dfm}
// проверяет, является ли
символ допустимым
// во время ввода дробного
числа
function IsFloat(ch
: char; st: string) : Boolean;
begin
if (ch >= '0') and (ch
<= '9') // цифры
or (ch = #13) // клавиша
<Enter>
or (ch = #8) // клавиша
<Backspace>
then
begin
IsFloat := True; // символ верный
Exit; // выход из функции
end; case ch
of
'-': if Length(st) = 0 then IsFloat := True; ', ':
if (Pos(',',st) =
0)
and (st[Length(st)]
>= '0') and (st[Length(st)] <= '9')
then // разделитель можно ввести только после цифры
// и если он еще не введен
IsFloat := True/else //
остальные символы запрещены
IsFloat := False;
end;
end;
// нажатие клавиши в поле
Расстояние
procedure TForm1.EditlKeyPress(Sender: TObject;
var Key:
Char);
begin
if Key =
Char(VK_RETURN)
then Edit2.SetFocus // переместить курсор в поле Цена
else
If not
IsFloat(Key,Edit2.Text) then Key := Chr(O);
end;
// нажатие клавиши в поле
Цена
procedure TForml.Edit2KeyPress(Sender: TObject;
var Key:
Char);
begin
if Key =
Char(VK_RETURN)
then Edit3.SetFocus // переместить курсор в поле Потребление
else If not IsFloat(Key,Edit2.Text)
then Key := Chr
(0);
end;
// нажатие клавиши в поле
Потребление
procedure TForml.Edit3KeyPress(Sender: TObject;
var Key:
Char);
begin
if Key =
Char(VK_RETURN)
then Buttonl.SetFocus // // сделать активной кнопку Вычислить
else If not
IsFloat(Key,Edit2.Text) then Key := Chr (0);
end;
// щелчок на кнопке
Вычислить
procedure
TForm1.ButtonlClick(Sender: TObject);
var
rast : real; // расстояние
cena : real; // цена
potr : real; //
потребление на 100 км
summ : real; //
сумма
mes: string;
begin
rast :=
StrToFloat(Edit1.Text);
cena :=
StrToFloat(Edit2.Text);
potr :=
StrToFloat(Edit3.Text);
summ := rast / 100 * potr
* cena;
if
CheckBoxl.Checked then summ := summ * 2;
mes := 'Поездка на
дачу';
if CheckBoxl.Checked
then mes := mes + ' и обратно';
mes := mes + 'обойдется в '
+
FloatToStrF(summ,ffGeneral,4,2) + ' руб.';
Label4.Caption := mes;
end;
end.