Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programmir_na_Object_Pascal_lab_raboty_.doc
Скачиваний:
208
Добавлен:
11.03.2016
Размер:
14.48 Mб
Скачать

6.3. Процедурные типы

Язык Object Pascal позволяет объявлять типы и переменные процедурного типа, например:

type TPt1 = function(x:integer):integer;

var Pt1 : Tpt1;

Pt2 : procedure(var s:extended);

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

6.4. Область видимости переменных

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

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

begin

<операторы>

end;

Элементы называются локальными, если область видимости ограничена только блоком, в котором элемент объявлен. Если элемент объявлен и интерфейсной части модуля, то он будет виден во всех модулях, подключивших данный модуль, поэтому такой элемент является глобальным.

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

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

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

6.5. Пример написания программы с использованием процедур

Задание: Двухмерный массив (матрица) вещественных чисел A, размером NxM, вводится с клавиатуры (компонент TStringGrid). Найти количество положительных элементов массива и их сумму, а также количество отрицательных элементов массива и их произведение (см. пример 4.5). Оформить ввод двумерного массива из TStringGrid и его вывод в ТМемо процедурами.

Интерфейс программы будет таким же, что и примере 4.5, а текст программы с процедурами приведен на Листинге 6.1.

Листинг 6.1

unit Unit1;

Interface

uses

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

Dialogs, Grids, StdCtrls, jpeg, ExtCtrls, Spin;

type

TForm1 = class(TForm)

Label1: TLabel;

Label2: TLabel;

StringGrid1: TStringGrid;

Button2: TButton;

Memo1: TMemo;

Button1: TButton;

Label3: TLabel;

Image1: TImage;

SpinEdit1: TSpinEdit;

SpinEdit2: TSpinEdit;

Label4: TLabel;

Label5: TLabel;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

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

procedure SpinEdit1Change(Sender: TObject);

procedure SpinEdit2Change(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

Type

TMatr = array[1..10,1..10] of real; // Объявление типа матрицы размером 10х10

var

Form1: TForm1;

A : TMatr; // Глобальное объявление матрицы

n, m : integer;

Implementation

{$R *.dfm}

//============================================================

Procedure Vvod_Matr_iz_Tabl(StringGrid : TStringGrid; var n, m : integer;

var Matr : TMatr);

//ввод матрицы из StringGrid

var

i, j : integer;

begin

With StringGrid do begin

n := RowCount-1; //число строк матрицы

m := ColCount-1; //число столбцов матрицы

for i := 1 to n do

for j := 1 to m do

Matr[i, j] := StrToFloat(Cells[j, i]);

end;

end;

//============================================================

Procedure Vyvod_Matr(n, m : integer; Matr : TMatr; Memo : TMemo);

//вывод матрицы в Мемо

var

i, j : integer;

St : string;

begin

St := 'Введенная матрица:'+#13#10;

for i := 1 to n do begin

for j := 1 to m do

St := St+FloatToStr(Matr[i, j])+#9;

St := St+#13#10;

end;

Memo.Lines.Add(St);

end;

//============================================================

procedure TForm1.FormCreate(Sender: TObject);

//первоначальное формирование интерфейса программы

var i, j: integer;

begin

Memo1.Clear;

SpinEdit1.Text := '4';

SpinEdit2.Text := '4';

With StringGrid1 do begin

RowCount:=StrToInt(SpinEdit1.Text)+1;

ColCount:=StrToInt(SpinEdit2.Text)+1;

Cells[0, 0] := ' A';

for i:=1 to RowCount do Cells[0, i] := ' i=' + IntToStr(i);

for j:=1 to ColCount do Cells[j, 0] := ' j=' + IntToStr(j);

end;

end;

//---------------------------------------------------------------

procedure TForm1.SpinEdit1Change(Sender: TObject);

//изменение Числа строк в таблице

var i : integer;

begin

if SpinEdit1.Text = '' then Exit;

//подготовка таблицы по строкам

With StringGrid1 do begin

RowCount := StrToInt(SpinEdit1.Text)+1;

for i:=1 to RowCount do Cells[0, i] := ' i=' + IntToStr(i);

end;

end;

//--------------------------------------------------------

procedure TForm1.SpinEdit2Change(Sender: TObject);

//изменение Числа столбцов в таблице

var j : integer;

Begin

if SpinEdit2.Text = '' then Exit;

//подготовка таблицы по столбцам

With StringGrid1 do begin

ColCount := StrToInt(SpinEdit2.Text)+1;

for j := 1 to ColCount do StringGrid1.Cells[j, 0] := ' j=' + IntToStr(j);

end;

end;

//--------------------------------------------------------------

procedure TForm1.Button1Click(Sender: TObject);

//выполнить

var

i, j, k, ke : integer;

p, pe : real;

s : string;

begin

{Проверка на заполненность таблицы}

With StringGrid1 do begin

for i := 1 to RowCount-1 do

for j := 1 to ColCount-1 do

if Cells[j, i] = '' then begin

ShowMessage('Надо заполнить все ячейки таблицы !!!');

Exit;

end;

end;

{Ввод матрицы А из таблицы StringGrid1}

Vvod_Matr_iz_Tabl(StringGrid1, n, m, A); //вызов процедуры

{Расчет}

k := 0; ke:=0;

p:=0; pe := 1;

for i := 1 to n do

for j := 1 to m do

if A[i, j] > 0 then begin k := k+1; p := p + A[i,j]; end

else

if (A[i,j] < 0) then begin ke := ke+1; pe := pe * A[i,j]; end;

Memo1.Clear;

{Показаваем в Мемо1 введенную матрицу А}

Vyvod_Matr(n, m, A, Memo1); //вызов процедуры

{показываем в Мемо1 результаты расчета}

if k=0 then Memo1.Lines.Add('Положительных элементов нет !')

else begin

Memo1.Lines.Add('Количество положительных элементов: ' +IntToStr(k));

Memo1.Lines.Add('Сумма положительных элементов: ' + FloatToStr(p));

end;

Memo1.Lines.Add('');

if ke=0 then Memo1.Lines.Add('Отрицательных элементов нет !')

else begin

Memo1.Lines.Add('Количество отрицательных элементов: ' +IntToStr(ke));

Memo1.Lines.Add('Произведение отрицательных элементов: '+ FloatToStr(pe));

end;

end;

//-------------------------------------------------------------------

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

begin

{текст этой процедуры здесь не приводится, так как он полностью соответствует тексту примера 4.5}

end;

//---------------------------------------------------

end.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]