Сделай Сам Свою Работу на 5

Тип фактического параметра должен соответствовать типу формального параметра.





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

Цель работы:

- Ознакомиться с понятиями Процедура и Функция;

- Научиться применять Процедурыи Функциив программах.

Теоретическая часть

Если задача довольно большая, то ее следует разделить на несколько подзадач и оформить каждую подзадачу как подпрограмму. В этом случае значительно улучшается «читаемость» программы и, как следствие, существенно облегчается процесс отладки.

Подпрограммаэто небольшая программа, которая решает часть общей задачи. В языке Delphi есть два вида подпрограмм – процедура и функция. У каждой подпрограммы есть имя, которое используется в программе для вызова подпрограммы (процедуры).

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

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

Параметры используются:



o Для передачи данных в подпрограмму;

o Для получения результата подпрограммы.

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

Функция

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

Переменная := Функция(Параметры);

где:

§ Переменнаяимя переменной, которой надо присвоить значение, вычисляемое функцией;

§ Функцияимя функции, значение которой надо присвоить переменной;

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

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



Объявление функции

Объявление функции в общем виде выглядит так:

Function Имя(параматр1: тип1, . . . , параметрК : типК) : Тип

var

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

begin

// здесь инструкции функции

 

Имя := Выражение;

end;

где:

o Functionслово языка Delphi, обозначающее, что далее следуют инструкции , реализующие функцию программиста;

o Имя имя функции.

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

o Тип тип значения, которое функция возвращает в вызвавшую ее программу.

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

Пример использования функции

Рассмотрим программу, которая вычисляет стоимость поездки на дачу. Исходными данными для программы являются расстояние, цена одного литра бензина и потребление бензина на 100 км пути. Для ввода исходных данных применяются поля Edit1, Edit2, Edit3. Функция обработки события OnKeyPress использует функцию IsFloat для фильтрации вводимых в эти поля символов, во время работы программы в поля ввода отображаются только допустимые символы.

 

Окно программы Поездка на дачу

 

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

unitfazenda_;

 

Interface

 



Uses

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 Edit1KeyPress(Sender: TObject; varKey: Char);

procedure Edit2KeyPress(Sender: TObject; varKey: Char);

procedure Edit3KeyPress(Sender: TObject; var Key: Char);

procedure Button1Click(Sender: TObject);

Private

{ Private declarations }

Public

{ Public declarations }

end;

 

Var

Form1: TForm1;

 

Implementation

 

// проверяет, является ли символ допустимым

// во время ввода дробного числа

function IsFloat(ch : char; st: string) : Boolean;

Begin

if (ch >= '0') and (ch <= '9' // цифры

or (ch = #13) // клавиша <Enter>

or (ch = #8) // клавиша <Back Space>

Then

Begin

IsFloat := True; // символ верный

Exit; // выход из функции

end;

 

casech 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;

 

 

{$R *.dfm}

 

// нажатие клавиши в поле Расстояние

procedureTForm1.Edit1KeyPress(Sender: TObject; var Key: Char);

Begin

if Key = Char(VK_RETURN)

then Edit2.SetFocus // переместить курсор в поле Цена

else If not IsFloat(Key,Edit2.Text) then Key := Chr(0);

end;

 

// нажатие клавиши в поле Цена

procedure TForm1.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 TForm1.Edit3KeyPress(Sender: TObject; var Key: Char);

Begin

if Key = Char(VK_RETURN)

thenButton1.SetFocus // сделать активной кнопку Вычислить

else Ifnot IsFloat(Key,Edit2.Text) then Key := Chr(0);

end;

 

// щелчок на кнопке Вычислить

procedure TForm1.Button1Click(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 CheckBox1.Checked then

summ := summ * 2;

mes := 'Поездка на дачу';

ifCheckBox1.Checked then

mes := mes + ' и обратно';

mes := mes + 'обойдется в ' + FloatToStrF(summ,ffGeneral,4,2)

+ ' руб.';

Label4.Caption := mes;

end;

 

End.

Процедура

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

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

· Когда подпрограмма возвращает в вызванную ее программу больше чем одно значение. Например, подпрограмма, которая решает квадратное уравнение, должна вернуть в вызвавщую ее программу два корня уравнения.

Объявление процедуры

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

Procedure Имя(var параметр1:тип1; . . . var параметрN : типN);

Var

//здесь объявлениелокальных переменных

Begin

//здесь инструкции процедуры

end;

 

где:

Имя - имя процедуры, которое используется для вызова процедуры;

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

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

 

Листинг процедуры SqRoot

// решает квадратное уравнение

procedureSqRoot( a,b,c : real; var x1, x2 : real; varok : boolean);

{ a,b,c - коэффициенты уравнения

x1,x2 - корни уравнения

ok = True - решение есть

ok = False - решения нет }

Var

d : real; // дискриминант

Begin

d:= Sqr( b ) - 4*a*c;

if d < 0

then

ok := False // уравнение не имеет решения

Else

Begin

ok := True;

x1 := (-b + Sqrt(d)) / (2*a);

x2 := ( b + Sqrt(d)) / (2*a);

end;

end;

Использование процедуры

Разработанную процедуру нужно поместить в раздел implementation, перед подпрограммой, которая эту процедуру использует.

Инструкция вызова процедуры в общем виде выглядит так:

 

Имя( СписокПараметров);

где:

Имя – имя вызываемой процедуры;

СписокПараметров – разделенные запятыми фактические параметры.

 

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

Тип фактического параметра должен соответствовать типу формального параметра.

 

Окно программы Квадратное уравнение

Label5
Button1
Edit 3
Edit 2
Edit 1

 

Листинг программы Решение квадратного уравнения (использование процедуры)

unitSqRoot_;

 

Interface

 

Uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, OleCtrls;

 

Type

TForm1 = class(TForm)

Edit1: TEdit;

Edit2: TEdit;

Edit3: TEdit;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Button1: TButton;

Label5: TLabel;

Button2: TButton;

procedureButton1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

Private

{ Private declarations }

Public

{ Public declarations }

end;

 

Var

Form1: TForm1;

 

Implementation

// решает квадратное уравнение

procedure SqRoot( a,b,c : real; var x1, x2 : real; varok : boolean);

{ a,b,c - коэффициенты уравнения

x1,x2 - корни уравнения

ok = True - решение есть

ok = False - решения нет }

Var

d : real; // дискриминант

Begin

d:= Sqr( b ) - 4*a*c;

if d < 0

Then

ok := False // уравнение не имеет решения

Else

Begin

ok := True;

x1 := (-b + Sqrt(d)) / (2*a);

x2 := ( b + Sqrt(d)) / (2*a);

end;

end;

{$R *.dfm}

 

procedure TForm1.Button1Click(Sender: TObject);

Var

k1,k2: real; // корни уравнения

rez: boolean; // True - решение есть, False - решения нет

mes: string; // сообщение

Begin

SqRoot(StrToFloat(Edit1.Text), StrToFloat(Edit2.Text),

StrToFloat(Edit3.Text), k1,k2,rez);

if rez then

mes := 'Корни уравнения' + #13 +

'x1='+FloatToStrF(k1,ffGeneral,4,2)+#13+

'x2='+FloatToStrF(k2,ffGeneral,4,2)+#13

Else

mes := 'Уравнение не имеет решения';

 

label5.Caption := mes;

end;

// Процедура для обращения к справке

procedureTForm1.Button2Click(Sender: TObject);

Begin

winhelp(Form1.Handle,'sqroot.hlp',HELP_CONTEXT,1);

end;

 

End.

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.