Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
К1_Допматериалы(02дек12).doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
3 Мб
Скачать
☆

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

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

  • ПРИМЕР 1. ОПИСАНИЕ ПРОЦЕДУРНОГО И ФУНКЦИОНАЛЬНОГО ТИПОВ

Type

FunctReal=function(x:Real):Real; {функция с вещественным параметром, возвращающая вещественное значение}

ProcNoParam=procedure; {процедура без параметров}

  • В определении типов обязательно указываются все параметры (и тип результата - для функции).

  • Возможно определение переменных процедурного и функционального типов.

  • В качестве фактических параметров нельзя использовать стандартные процедуры и функции (способ обхода ограничения - см. в примере 2).

  • Borland Pascal

Для передачи в подпрограмму значений процедурного или функционального типа нужно после заголовка соответствующей подпрограммы указать в ее описании зарезервированное слово far, либо задать для нее режим компиляции {$F+}.

Ключ компиляции {$F+} (команда меню Options>Compiler>Code Generation-Force far calls) обеспечивает выбор модели вызовов процедур и функций: {$F+} - дальняя (FAR); {$F-}- ближняя модель (NEAR) ).

  • Delphi

Данные установки не требуются (в примере 2 - зачеркнуто).

  • ПРИМЕР 2. ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ-ФУНКЦИЙ

Type

Functype=function (t:real):real;

Var

x:real;

Function Fx(x:Real; F:Functype):real;

begin

Fx:=F(x);

End;

{$F+}

Function Ln2(x:real):real;

Begin

Ln2:=ln(x); // использование стандартной функции Ln

End;

{$F-}

Function exp2(x:real):real;far;

Begin

exp2:=exp(x); // использование стандартной функции Exp

end;

begin

x:=1;

Writeln(x:8, Fx(x,Ln2));

Writeln(x:8, Fx(x,exp2))

end.

  • ТЕМА. МОДУЛИ (UNIT)

МОДУЛИ

СТРУКТУРА МОДУЛЯ

UNIT <имя_модуля> заголовок модуля, обязательный.

Используется для связи модуля с главной программой/другими модулями

  • Совпадает с именем файла

  • Уникальное (не повторяется внутри проекта).

INTERFACE раздел внешних объявлений, обязательный (интерфейсная секция, секция связи)

  • USES <список_модулей>

Содержит имена модулей, необходимых в интерфейсной части данного модуля (при определении констант, типов, переменных, параметров подпрограмм).

  • <внешние объявления>

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

IMPLEMENTATION раздел реализации, обязательный.

  • USES <список_модулей>

Список модулей, используемых в разделе реализации

  • <внутренние объявления>

  1. Определения типов/ констант/ переменных/ меток / подпрограмм, глобальных внутри модуля и недоступных извне.

  2. Реализации подпрограмм, объявленных в интерфейсной части.

  • В модуле доступны его внешние и внутренние объявления и внешние объявления других модулей, имена которых присутствуют в операторе uses.

INITIALIZATION раздел инициализации, необязательный.

  • <последовательность_операторов>

Операторы, выполняемые 1 раз перед выполнением основной программы (стартовые значения переменных, одноразовые действия).

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

FINALIZATION раздел завершения, необязательный.

  • <последовательность_операторов>

Операторы, выполняемые при завершении работы программы, например, освобождение всех элементов, назначенных в разделе инициализации.

Раздел может присутствовать только в модуле, где есть раздел initialization

Выполняется по окончании работы программы; для нескольких модулей - в порядке, обратном их перечислению в директиве uses.

END.

  • ПРИМЕР 1. ПЕРЕВОД ЧИСЛА В ДЕСЯТИЧНУЮ СИСТЕМУ счисления

Рис.1. Главная форма проекта

  • Используемые компоненты:

  • GroupBox (1 - группирующий компонент для компонентов, задающих исходные значения);

  • Edit (2 – для задания исходного числа и его основания);

  • Label (3 – подписи исходных данных и результата);

  • Button (1 – запуск преобразования заданного числа в десятичное);

  • Panel (1- группирующий компонент, используется для размещения компонентов, описывающих результат преобразования);

  • Memo (1 – вывод результатов преобразования);

СТРУКТУРА МОДУЛЯ

МОДУЛЬ С ФУНКЦИЕЙ ПЕРЕВОДА (Convert.PAS)

МОДУЛЬ ГЛАВНОЙ ФОРМЫ (MAINFRM.PAS)

UNIT <имя_модуля>

заголовок модуля

UNIT Convert;

UNIT MainFrm;

INTERFACE

раздел внешних объявлений

INTERFACE

function AnyToDec(chis:String; osn:Integer):Integer;

INTERFACE

{набор модулей, пополняемый при добавлении компонентов на форму}

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

// ОБЪЯВЛЕНИЕ КЛАССА (ТИПА) - ФОРМЫ

TYPE

TForm1 = class(TForm)

{ компоненты, размещаемые на форме, и методы-обработчики событий; добавляются автоматически }

GroupBox1: TGroupBox;

Edit1: TEdit;

Edit2: TEdit;

Label1: TLabel;

Label2: TLabel;

Panel1: TPanel;

Button1: TButton;

Label3: TLabel;

Memo1: TMemo;

procedure Button1Click(Sender: TObject);

...

end;

// ОБЪЯВЛЕНИЕ ОБЪЕКТА (ПЕРЕМЕННОЙ) - ФОРМЫ

VAR

Form1: TForm1;

IMPLEMENTATION

раздел реализации

IMPLEMENTATION

CONST

ChrDgts:String='0123456789ABCDEF';

function AnyToDec(chis:String; osn:Integer):Integer;

var

d, Res,i:Integer;

begin

Res:=0;

d:=1;

For i:=Length(chis) downto 1 do

begin

Res:=Res+ (Pos(UpCase(chis[i]),ChrDgts)-1)*d;

d:=d*osn;

end;

AnyToDec:=Res;

end;

IMPLEMENTATION

{$R *.dfm} // Подключение настроек формы

uses Convert; // Подключение модуля с описанием функции преобразования числа

// РЕАЛИЗАЦИЯ МЕТОДОВ (ПОДПРОГРАММ)

procedure TForm1.Button1Click(Sender: TObject);

var

E1t,E2t:string;

begin

e1T:=Edit1.text;

e2T:=Edit2.text;

Memo1.Lines.Add(E1T+'('+E2t+')='+ IntToStr(AnyToDec(e1t,StrToInt(e2t)))+ '(10)');

end;

INITIALIZATION

раздел инициализации

ОТСУТСТВУЕТ

ОТСУТСТВУЕТ

FINALIZATION

раздел завершающих действий

ОТСУТСТВУЕТ

ОТСУТСТВУЕТ

END.

END.

END.

  • ПРИМЕР 2. Проект, содержащий две формы

При нажатии на кнопку «Добавить строку» первой формы выводится вторая форма, при нажатии на кнопку «OK» второй формы содержимое поля редактирования Edit1 переносится в memo-поле (многострочное поле) первой формы.

  • Файл главной программы (файл проекта, *.dpr)

program Project1;

uses

Forms,

// <имя модуля> in '<имя файла модуля>' [{<имя формы>}];

Unit1 in 'Unit1.pas' {Form1},

Unit2 in 'Unit2.pas' {Form2};

{$R *.res} // директива компилятора - подключение файла ресурсов

begin

Application.Initialize; // инициализация приложения

// Создание форм приложения:

Application.CreateForm(TForm1, Form1);

Application.CreateForm(TForm2, Form2);

Application.Run; // запуск приложения

end.

  • Файл модуля первой формы (unit1.pas)

UNIT Unit1; //ЗАГОЛОВОК МОДУЛЯ

INTERFACE //РАЗДЕЛ ИНТЕРФЕЙСА

Uses

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

TYPE

TForm1 = class(TForm) // описание типа формы

Memo1: TMemo;

Button1: TButton;

procedure Button1Click(Sender: TObject);

...

end;

VAR

Form1: TForm1; // объявление переменной-формы Form1

IMPLEMENTATION //РАЗДЕЛ РЕАЛИЗАЦИИ

uses Unit2; // подключение модуля второй формы (Unit2)

{$R *.dfm} // подключение файла описания формы Unit1.dfm

procedure TForm1.Button1Click(Sender: TObject);

begin

Form2.showmodal; // обращения к объявлениям модуля Form2

end;

END.

  • Файл модуля второй формы (unit2.pas)

UNIT Unit2; //ЗАГОЛОВОК МОДУЛЯ

INTERFACE //РАЗДЕЛ ИНТЕРФЕЙСА

uses

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

TYPE

TForm2 = class(TForm) // описание типа формы

Edit1: TEdit;

BitBtn1: TBitBtn;

BitBtn2: TBitBtn;

procedure BitBtn1Click(Sender: TObject);

...

end;

VAR

Form2: TForm2; // объявление переменной-формы Form2

IMPLEMENTATION //РАЗДЕЛ РЕАЛИЗАЦИИ

uses Unit1; // подключение модуля первой формы (Unit1)

{$R *.dfm} // подключение файла описания формы Unit2.dfm

procedure TForm2.BitBtn1Click(Sender: TObject);

begin

Form1.memo1.Lines.Add(Edit1.text); // обращения к объявлениям первого модуля (Form1)

end;

END.

  • ТЕМА. СИМВОЛЬНЫЕ И СТРОКОВЫЕ ТИПЫ