Использование динамических переменных 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Использование динамических переменных



Указатели являются эффективным средством построения списков. Списком называется упорядоченная структура, каждый элемент которой содержит ссылку, связывающую его со следующим элементом. Для организации списков используются записи, состоящие из двух смысловых частей: основной и дополнительной. Основная часть содержит подлежащую обработке информацию, в дополнительной части находится указатель на следующую запись списка. Начало списка указывается в переменной, которая всегда присутствует в программе обработки списков. Если в списке нет элементов, т.е. список пустой, значение этой переменной равно Nil. Если список не заполнен, последний элемент содержит в дополнительной части значение Nil.

Наибольшее распространение получили два вида списков – стеки и очереди.

Стек – это список с одной точкой доступа к его элементам, которая называется вершиной стека. Добавить или убавить элемент можно только через его вершину. Принцип работы стека: «последний пришел – первый вышел». Основные операции над стеком: формирование стека, добавление, удаление и просмотр элементов стека. Для их демонстрации используем следующее описание:

type

pSt=^zap;

zap=record

inf:integer;

adr:pSt;

end;

var

pVer, pTek, nVer:pSt;

elSt:integer;

Формирование и добавление элементов в стек

procedure TForm1.BitBtn1Click(Sender: TObject);

Begin

pVer:= nil;

new(pTek);

elSt:=StrToInt(Edit1.Text);

pTek^.inf:=elSt;

pTek^.adr:=pVer;

pVer:=pTek;

Edit1.Text:='';

Edit1.SetFocus;

end;

Удаление элемента из стека

procedure TForm1.BitBtn3Click(Sender: TObject);

Begin

pVer:=pTek^.adr;

Dispose(pTek);

pTek:=pVer;

end;

Просмотр элементов стека

procedure TForm1.BitBtn4Click(Sender: TObject);

Begin

pTek:=pVer;

while pTek<> nil do

Begin

Memo1.Lines.Add(#9+IntToStr(pTek^.inf));

pTek:=pTek^.adr;

end;

Пример создания приложения

Использование динамических массивов

Задание. Создать приложение для вычисления наименьшего и наибольшего из всех значений элементов целочисленной матрицы A[m,n]. Значения m и n задаются пользователем на панели интерфейса, а элементы матрицы А генерируются при помощи датчика случайных чисел и размещаются в памяти динамически.

Сохранение проекта

Для нового проекта создайте новую папку, например, X: \ 35эи \ LAB11_M.

Сохраните проект File | Save Project As… Сначала сохраните модуль под именем UnDinMas, затем файл проекта под именем Pr_DinMas.

Размещение компонентов на Форме

Один из возможных вариантов панели интерфейса создаваемого приложения показан на рисунке 11.1.

Разместим на форме компоненты Label, SpinEdit, BitBtn и Stringgrid.

Рис.11.1. Размещение компонентов на форме

Установите для компонентов SpinEdit1 и SpinEdit2 значения свойств: MinValue=2, MaxValue=10.

В тех случаях, когда объем выводимой информации превышает размер поля компонента Stringgrid1, целесообразно снабдить его линейками прокрутки для этого в свойстве ScrollBars установим значение ssBoth.

Создание процедуры обработки событий FormCreate

И BitBtn1Click

Двойным нажатием клавиши «мыши» на Форме и кнопке BitBtn создайте соответствующие процедуры обработки событий. Пользуясь текстом модуля UnDinMas, наберите операторы этих процедур.

Создать процедуру, которая будет выделять заданным цветом границы ячеек с наименьшим и наибольшим значениями в компоненте StringGrid. Для создания такой процедуры сделайте активным компонент StringGrid и на странице Events (события) Инспектора Объектов дважды щелкните «мышью» в правой части события OnDrawCell. В ответ Delphi создаст обработчик этого события – процедуру procedure TForm1.StringGrid1DrawCell и установит курсор между операторами begin и end этой процедуры. Используя текст модуля UnDinMas, наберите операторы процедуры TForm1.StringGrid1DrawCell.

Текст модуля UnDinMas

unit UnDinMas;

Interface

Uses

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

Dialogs, StdCtrls, Spin, Buttons, Grids;

 

Type

TForm1 = class(TForm)

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

Label6: TLabel;

Label7: TLabel;

Label8: TLabel;

Label9: TLabel;

StringGrid1: TStringGrid;

BitBtn1: TBitBtn;

SpinEdit1: TSpinEdit;

SpinEdit2: TSpinEdit;

BitBtn2: TBitBtn;

procedure FormCreate(Sender: TObject);

procedure SpinEdit1Change(Sender: TObject);

procedure SpinEdit2Change(Sender: TObject);

procedure BitBtn1Click(Sender: TObject);

procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;

Rect: TRect; State: TGridDrawState);

Private

{ Private declarations }

Public

{ Public declarations }

end;

 

Var

Form1: TForm1;

 

Implementation

 

{$R *.dfm}

Type

Mas = array [1..1] of integer;

pMas = array [1..1] of ^mas;

Var

pA: ^pMas;

m,n,max,min: integer;

 

procedure TForm1.FormCreate(Sender: TObject);

Begin

SpinEdit1.Text:='6'; // начальное значение m

SpinEdit2.Text:='8'; // начальное значение n

m:=6;

n:=8;

StringGrid1.RowCount:=m; // количество строк

StringGrid1.ColCount:=n; // количество столбцов

end;

 

procedure TForm1.SpinEdit1Change(Sender: TObject);

Begin

m:=StrToInt(SpinEdit1.Text);

StringGrid1.RowCount:=m;

end;

 

procedure TForm1.SpinEdit2Change(Sender: TObject);

Begin

n:=StrToInt(SpinEdit2.Text);

StringGrid1.ColCount:=n;

end;

 

 

procedure TForm1.BitBtn1Click(Sender: TObject);

label 1;

Var

i,j,k,l,r,p: integer;

Begin

Randomize; // инициализация датчика случайных чисел

GetMem(pA,4*m);

for i:=1 to m do

begin // формирование i-й строки массива

GetMem(pA^[i],SizeOf(integer)*n);

for j:=1 to n do

Begin

1: r:=Random(1000); // генерирование случайного числа

for k:=1 to i do

Begin

if k=i then p:=j-1 else p:=n;

for l:=1 to p do

if r=pA^[k]^[l] then goto 1; //если число есть в массиве,

//тогда сгенерировать новое число

end;

pA^[i]^[j]:=r; // случайное число занести в массив

end;

end;

for i:=1 to m do

for j:=1 to n do

StringGrid1.Cells[j-1,i-1]:=IntToStr(pA^[i]^[j]);

max:=pA^[1]^[1];

min:=max;

for i:=1 to m do

for j:=1 to n do

if max<pA^[i]^[j] then max:=pA^[i]^[j]

else if min>pA^[i]^[j] then min:=pA^[i]^[j];

Label8.Caption:=IntToStr(min);

Label9.Caption:=IntToStr(max);

end;

 

 

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;

Rect: TRect; State: TGridDrawState);

Begin

with StringGrid1.Canvas do

if StringGrid1.Cells[ACol,ARow]=IntToStr(min) then

Begin

Brush.Color:=clGreen;

FrameRect(Rect);

End

else if StringGrid1.Cells[ACol,ARow]=IntToStr(max) then

Begin

Brush.Color:=clRed;

FrameRect(Rect)

End

end;

 

end.

Пример создания приложения



Поделиться:


Последнее изменение этой страницы: 2016-12-16; просмотров: 256; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.151.106 (0.015 с.)