4831

Процедуры и функции в программировании на языке Pascal

Лекция

Информатика, кибернетика и программирование

Процедуры и функции. Цель: Научить студентов избегать дублирования кода в программе. Задачи: Воспитательная: работа над собой. Учебная: создание приложений. Развивающая: развитие внимательности. План занятия. Организационный момент. Изуч...

Русский

2012-11-27

151 KB

5 чел.

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

Цель:

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

Задачи:

Воспитательная: работа над собой.

Учебная: создание приложений.

Развивающая: развитие внимательности.

План занятия.

  1.  Организационный момент.
  2.  Изучение нового материала.
  3.  Контрольные вопросы.
  4.  Резюме.
  5.  Домашнее задание.

Изучение нового материала.

   Часто, работая над программой, программист замечает, что некоторая последовательность инструкций встречается в разных частях программы несколько раз. Например, в листинге 1 приведена программа пересчета веса из фунтов в килограммы. Инструкции, обеспечивающие ввод исходных данных из полей редактирования, расчет и вывод результата (в листинге они выделены фоном), есть как в процедуре обработки события на кнопке Вычислить, так и в процедуре обработки события OnKeyPress в поле Editl.

Листинг 1. Пересчет веса из фунтов в килограммы

unit Unit1;

interface

uses

   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

   TForm1 = class(TForm)

       Label1: TLabe1; // пояснительный текст 

       Edit1: TEdit; // поле ввода веса в фунтах 

       Button1: TButton; // кнопка Вычислить 

       Label2: TLabel; // поле вывода результата 

       procedure Button1Click(Sender: TObject);

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

   private

       { Private declarations }

   public

       { Public declarations }

   end;

var

   Form1: TForm1 ;

implementation

{$R *.dfm}

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

procedure TForml.Button1Click(Sender: TObject);

var

   f : real; // вес в фунтах 

   kg : real; // вес в килограммах 

begin

   f := StrToFloat(Edit1.Text);

   kg := f; * 0.4059;

   Label2.Caption := Edit1.Text + ' ф. — это ' + FloatToStrF(kg, ffGeneral, 4, 2} + 'кг.'; 

end;

// нажатие клавиши в поле ввода исходных данных

procedure TForml.Edit1KeyPress(Sender: TObject; var Key: Char);

var

   f : real; // вес в фунтах 

   kg : real; // вес в килограммах 

begin

   if Key = Char(VK_RETURN) then

       begin

           f: = StrToFloat(Editl.Text) ;

           kg := f * 0.4059;

           Label2.Caption := Editl.Text + ' ф. - это ' + FloatToStrF(kg, ffGeneral, 4, 2) + 'кг.''; 

       end; 

end;

end.

   Можно избежать дублирования кода в программе. Для этого надо оформить инструкции, которые встречаются в программе несколько раз, как подпрограмму, и заменить инструкции, оформленные в виде подпрограммы, инструкцией вызова подпрограммы. В листинге 2 приведена программа пересчета веса из фунтов в килограммы, в которой ввод исходных данных, вычисления и вывод результата объединены в подпрограмму, реализованную как функция.

Листинг 2. Пересчет веса из фунтов в килограммы (использование процедуры) 

unit Unit1;

interface

uses

   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

   TForm1= class(TForm)

       Label1: TLabel; // пояснительный текст 

       Edit1: TEdit; // поле ввода веса в фунтах 

       Button1: TButton; // кнопка Вычислить 

       Label2: TLabel; // поле вывела результата 

       procedure Button1Click(Sender: TObject);

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

   private

       { Private declarations }

   public

       { Public declarations }

   end;

var

   Form1: TForm1;

implementation

{$R *.dfm}

// процедура программиста 

procedure FuntToKg;

var

   f : real; // вес в фунтах 

   kg : real; // вес в килограммах 

begin

   f := StrToFloat(Form1.Edit1.Text);

   kg := f * 0.4059;

   Forml.Label2.Caption := Forml.Edit1.Text + ' ф. — это ' + FloatToStrF(kg, ffGeneral, 4, 2) + 'кг.';

end;

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

procedure TForml.ButtonlClick(Sender: TObject);

begin

   FuntToKg; // вызов процедуры FuntToKg

end;

// нажатие клавиши в поле ввода исходных данных

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);

begin

   if Key = Char(VK_RETURN) then FuntToKg; // вызов процедуры FuntToKg

end;

end.

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

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

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

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

  •  для передачи данных в подпрограмму;
  •  для получения из результата подпрограммы.

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

Функция

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

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

   где:

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

   Следует обратить внимание на то, что:

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

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

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

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

var

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

begin

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

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

end;

   где:

  •  function — зарезервированное слово языка Delphi, обозначающее, что далее следуют инструкции, реализующие функцию программиста;
  •  имя — имя функции. Используется для перехода из программы к инструкциям функции;
  •  параметр — это переменная, значение которой используется для вычисления значения функции. Отличие параметра от обычной переменной состоит в том, что он объявляется не в разделе объявления переменных, который начинается словом var, а в заголовке функции. Конкретное значение параметр получает во время работы программы в результате вызова функции из основной программы;
  •  тип — тип значения, которое функция возвращает в вызвавшую ее программу.

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

   В качестве примера в листинге 3 приведены функции IsInt и IsFioat. Функция IsInt проверяет, является ли символ, соответствующий клавише, нажатой во время ввода целого числа в поле редактирования, допустимым. Предполагается, что допустимыми являются цифры, клавиши <Enter> и <Backspace>. Функция IsFloat решает аналогичную задачу, но для дробного числа. У функции IsFloat два параметра: код нажатой клавиши и строка символов, которая уже введена в поле редактирования.

Листинг 3. Примеры функций 

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

function IsInt(ch : char) : Boolean;

begin

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

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

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

   then IsInt := 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;

   Использование функции

Если вы собираетесь использовать в программе свою функцию, то в простейшем случае ее объявление следует поместить в текст программы, перед подпрограммой, которая применяет эту функцию. Следующая программа (ее текст приведен в листинге 4, а вид диалогового окна на рис.) вычисляет стоимость поездки на дачу. Исходными данными для программы являются: расстояние, цена одного литра бензина и потребление бензина на 100 км пути. Для ввода исходных данных применяются поля Edit1, Edit2 и Edit3. Функции обработки события OnKeyPress используют функцию IsFloat для фильтрации вводимых в эти поля символов, во время работы программы в полях ввода отображаются только допустимые символы.

   

Листинг 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(0);

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 Button1.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.

Процедура

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

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

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

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

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

var

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

begin

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

end;

   где:

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

   Параметры процедуры используются для передачи данных в процедуру, а также для возврата данных из процедуры в вызвавшую ее программу. В качестве примера в листинге 5 приведена процедура решения квадратного уравнения (которое в общем виде записывается так: ах2 + bх+ с = 0). У процедуры шесть параметров: первые три предназначены для передачи в процедуру исходных данных — коэффициентов уравнения; параметры x1 и х2 используются для возврата результата — корней уравнения; параметр ok служит для передачи информации о том, что решение существует.

Листинг 5. Процедура SgRoot

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

procedure SqRoot(a,b,c : real; var xl,x2 : real; var ok : 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, перед подпрограммой, которая использует эту процедуру. Инструкция вызова процедуры в общем виде выглядит так:

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

   где:

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

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

   SqRoot(StrToFloat(Edit1.Text), StrToFloat(Edit2.Text), StrToFloat(Edit3.Text), k1,k2,rez);

   Если в описании процедуры перед именем параметра стоит слово var, то при вызове процедуры на месте соответствующего параметра должна стоять переменная основной программы. Использование константы или выражения считается ошибкой, и компилятор в этом случае выведет сообщение: Types of actual and formal var parameters must be identical (тип фактического параметра должен соответствовать типу формального параметра). В листинге 6 приведена программа решения квадратного уравнения, в которой используется процедура SqRoot. Окно программы представлено на рис.

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

unit SqRoot_;

interface

uses

   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

   TForm1 = class(TForm)

       Editl: TEdit;

       Edit2: TEdit;

       Edit3: TEdit;

       Label1: TLabe1;

       Label2: TLabe1;

       Label3: TLabe1;

       Label4: TLabe1;

       Button1: TButton;

       Label5: TLabel;

       procedure ButtonlClick(Sender: TObject);

   private

       { Private declarations }

   public

       { Public declarations }

   end;

var

   Form1: TForm1;

implementation

{$R *.dfm}

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

procedure SqRoot(a,b,c : real; var xl, x2 : real; var ok : 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;

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

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

           end;

end;

procedure TForml.Button1Click(Sender: TObject);

var

   x1, x2: real; // корни уравнения 

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

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

begin

   SqRoot(StrToFloat(Editl.Text), StrToFloat(Edit2.Text) , StrToFloat(Edit3.Text) , x1, x2,rez);

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

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

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

   else

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

   label5.Caption := mes;

end;

end.

Повторное использование функций и процедур

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

   Создание модуля Delphi позволяет программисту поместить свои функции и процедуры в отдельный модуль, а затем использовать процедуры и функции модуля в своих программах, указав имя модуля в списке модулей, необходимых программе (инструкция uses). Чтобы приступить к созданию модуля, нужно сначала закрыть окно формы и окно модуля формы (в ответ на вопрос о необходимости сохранения модуля следует выбрать No, т. е. модуль, соответствующий закрытой форме, сохранять не надо). Затем из меню File нужно выбрать команду New | Unit. В результате открывается окно редактора кода, в котором находится сформированный Delphi шаблон модуля. Его текст приведен в листинге 7.

Листинг 7. Шаблон модуля

unit Unit1;

interface

implementation

end.

   Начинается модуль заголовком — инструкцией unit, в которой указано имя модуля. Во время сохранения модуля это имя будет автоматически заменено на имя, указанное программистом. Слово interface отмечает раздел интерфейса модуля. В этот раздел программист должен поместить объявления находящихся в модуле процедур и функций, которые могут быть вызваны из других модулей, использующих данный. В раздел implementation (реализация) нужно поместить процедуры и функции, объявленные в разделе interface. В качестве примера в листинге 8 приведен модуль программиста, который содержит рассмотренные ранее функции IsInt и isFioat.

Листинг 8. Модуль программиста

unit my__unit;

interface // объявления процедур и функций, доступных программам, использующим этот модуль 

function IsInt(ch : char) : Boolean;

// функция Islnt проверяет, является ли символ допустимым во время ввода целого числа

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

// Функция IsFloat проверяет, является ли символ допустимым во время ввода дробного числа

// ch — очередной символ

// st — уже введенные символы

implementation // реализация 

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

function Islnt(ch : char) : Boolean;

begin

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

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

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

   then Islnt := True // символ допустим 

   else Islnt := False; // недопустимый символ 

end;

// проверяет, является ли символ допустимым во время ввода дробного числа

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

// ch — очередной символ

// st — уже введенные символы

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

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

   Использование модуля Для того чтобы в программе могли применяться функции и процедуры модуля, программист должен добавить этот модуль к проекту и указать имя модуля в списке используемых модулей (обычно имя модуля программиста помещают в конец сформированного Delphi списка используемых модулей). В листинге 9 приведен вариант программы Поездка на дачу. Процедура обработки события onKeyPress в полях ввода исходных данных обращается к функции IsFloat, которая находится в модуле my_unit.pas, поэтому в списке используемых модулей указано имя модуля my_unit.

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

unit fazenda_;

interface

uses

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

   my_unit; // модуль программиста 

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}

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

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

begin

   if Key = Char(VK_RETURN) then Button1.SetFocus // сделать активной кнопку Вычислить 

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

end;

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

procedure TForml.ButtonlClick(Sender: TObject);

var

   rast : real; // расстояние 

   cena : real; // цена 

   potr : real; // потребление на 100 км 

   summ : real; // сумма 

   mes: string;

begin

   rast := StrToFloat(Editl.Text) ;

   cena := StrToFloat(Edit2.Text);

   potr := StrToFloat(Edit3.Text);

   summ := rast / 100 * potr * cena;

   if CheckBoxl.Checked then summ := summ * 2;

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

   if CheckBox1.Checked then

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

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

   Label4.Caption := mes;

end;

end.

   После добавления имени модуля в список модулей, используемых приложением, сам модуль нужно добавить в проект. Для этого из меню Project надо выбрать команду Add to Project и в открывшемся диалоговом окне — имя файла модуля. В результате добавления модуля к проекту в окне редактора появится вкладка с текстом добавленного к проекту модуля. Увидеть структуру проекта можно в окне Project Manager, которое появляется в результате выбора соответствующей команды из меню View. В качестве примера на рис. приведена структура проекта Поездка на дачу. После добавления модуля к проекту и включения его имени в список используемых модулей (инструкция uses) можно выполнить компиляцию программы.

 

Контрольные вопросы

  1.  Как избежать дублирования кода в программе?
  2.  Понятие подпрограммы.
  3.  Виды подпрограмм.
  4.  Отличия подпрограмм.
  5.  Понятие функции и ее запись.
  6.  Понятие процедуры и ее запись.

Резюме

  1.  Для этого надо оформить инструкции, которые встречаются в программе несколько раз, как подпрограмму, и заменить инструкции, оформленные в виде подпрограммы, инструкцией вызова подпрограммы.
  2.  Подпрограмма — это небольшая программа, которая решает часть общей задачи.
  3.  В языке Delphi есть два вида подпрограмм — процедура и функция. У каждой подпрограммы есть имя, которое используется в программе для вызова подпрограммы (процедуры).
  4.  Отличие функции от процедуры состоит в том, что с именем функции связано значение, поэтому функцию можно использовать в качестве операнда выражения, например, инструкции присваивания.
  5.  Функция — это подпрограмма, т. е. последовательность инструкций, имеющая имя. Процесс перехода к инструкциям функции называется вызовом функции или обращением к функции.
  6.  Процедура — это разновидность подпрограммы.

Домашнее задание

       Исправить уже созданные приложения в связи с изложенным материалом.


 

А также другие работы, которые могут Вас заинтересовать

22937. СТРУКТУРИ 74 KB
  struct ім’я_типу { cписок_полів} список_змінних ; struct date { int day; int month; int year; char mon_name[4]; } d d1; змінніструктури dd1 типу date typedef struct { double real; double imag; } complex;...
22938. Синтаксичний аналіз виразів 31 KB
  Мова в певному алфавіті основному символів – це слова записані за певними синтаксичними правилами. Синтаксичні правила подаються формулами БекусаНаура БНФ вигляду : ::= де позначає синтаксичне поняття а послідовність символів розширеного алфавіту. Вираз [] означає що послідовність символів входить або не входить в конструкцію. Синтаксичний аналізатор це програма що для заданої послідовності символів основного алфавіту розпізнає чи побудована вона у відповідності з синтаксичними правилами для даного поняття.
22939. ВВЕДЕННЯ / ВИВЕДЕННЯ 48 KB
  Перед тим як розпочати роботу з потоком його необхідно відкрити за допомогою функції FILE fopenchar filename char mode. Функція формує потік з даним файлом і повертає результат у вигляді покажчика на об’єкт типу FILE який містить всю інформацію необхідну для роботи з потоком адресу та розмір буфера індексзсув поточної позиції в буфері режим оборобки інформації і т. FILE fp; fp=fopen€œfile1.txt€ €œa€; відкриття файлу file1.
22940. Адресация в IP-сетях 120 KB
  В терминологии TCP/IP под локальным адресом понимается такой тип адреса, который используется средствами базовой технологии для доставки данных в пределах подсети, являющейся элементом составной интерсети. В разных подсетях допустимы разные сетевые технологии, разные стеки протоколов
22941. Конструктивні обєкти. Індуктивні визначення. Рекурсивні функціїї 854 KB
  Рекурсивні функціїї. При такому підході конструктивність того чи іншого об’єкту у тому числі і функції вже не є абсолютною субстанцією а тільки відносною і залежить від вибору системи подання. Загальне індуктивне визначення унарної функції ІВФ спирається на ІВ множини і має вигляд: БФ База індукції. Для кожного конструктора елементів з існує конструктор значень функції такий що для будьяких .
22942. ПРЕПРОЦЕСОРНІ ЗАСОБИ 34.5 KB
  ім’я_директиви лексемиоперанди { лексемиоперанди } Макропідстановки: define ідентифікатор послідовність_символів Сем. define begin { define end } main begin if begin end else return 0; end На виході препроцесора цей фрагмент матиме вигляд: main { if { }else return 0; } Допускаються ланцюжки макропідстановок. ...
22943. ФУНКЦІЇ ЯК ТИП ДАНИХ 49 KB
  Кожен з таких покажчиків має тип який відповідає типам параметрів та типу значення функції. З ними можна працювати як зі звичайними даними: присвоювати організовувати у вигляді масивів передавати у якості параметрів повертати як значення функції і т. ПОКАЖЧИКИ ФУНКЦІЙ ПОВИННІ БУТИ ЯВНО ОПИСАНІ В ПРОГРАМІ Ім’я та тип покажчика функції задаються її прототипом або описом.
22944. Загальна структура Сі-програми 217.5 KB
  oператор ::= безлейбовий_ оператор лейба : безлейбовий_ оператор безлейбовий_ оператор ::= базовий оператор структурований опeрaтор лейба ::= ідентифікатор базовий_оператор ::= порожній_oператор oперато_переходу присвоєння виклик_функції oператор_вираз порожній_oператор ::= ; Сем. вихід_ з_функції ::= return[ значення_функції ] ; значення_функції ::= вираз Сем. присвоєння ::= Lvalue_вираз [ операція ]= вираз ; вираз ::= терм Lvalue_вираз ::= ідентифікатор індексація_покажчика розіменування_покажчика ...
22945. СТАНДАРТНІ ТИПИ ДАНИХ 194.5 KB
  До них відносяться числа символи булеів значення та адреси. Вираз може не мати значення на певних даних наприклад зациклюватись. Вважається що в цьому разі він приймає значення =€невизначено€. 2 Яке значення набудуть змінні АВС після виконаня оператора { int A=0B=2C=1; A=2 A B C; } З точки зору семантики булевий тип є моделлю двозначної булевої алгебри.