Лабораторная работа №9
Программирование алгоритмов с использованием динамических структур
данных
Цель лабораторной работы: освоить методику создания приложений, в
которых используются динамические структуры данных.
Примеры создания приложений
9.1 Использование динамических массивов
Задание: создать приложение для вычисления наименьшего и наибольшего из
всех значений элементов целочисленной матрицы A={aij}, где i=1,2,…, m;
j=1,2,…, n. Значения m и n задаются пользователем на панели интерфейса,
а элементы матрицы A генерируются с помощью датчика случайных чисел и
размещаются в памяти динамически.
Один из возможных вариантов панели интерфейса создаваемого приложения
показан на рис.9.1.
9.1.1. Размещение компонентов на Форме
Разместим на Форме компоненты Label, SpinEdit, Button и StringGrid.
Рис. 9.1
Сохраним модуль под именем UnDinMas (текст модуля приведен в п.9.1.3).
9.1.2 Создание процедур обработки событий FormCreate и Button1Click
Двойным нажатием клавиши “мыши” на Форме и кнопке Button1 создайте
соответствующие процедуры обработки событий. Пользуясь текстом модуля
UnDinMas, внимательно наберите операторы этих процедур.
При желании можно создать процедуру, которая будет выделять заданным
цветом границы ячеек с наименьшим и наибольшим значениями в компоненте
StringGrid. Для создания такой процедуры сделайте активным компонент
StringGrid и на странице Events(события) Инспектора Объектов дважды
щелкните “мышью” в правой части события OnDrawCell. В ответ Delphi
создаст обработчик этого события – процедуру procedure
TForm1.StringGrid1DrawCell и установит курсор между операторами begin и
end этой процедуры. Используя текст модуля UnDinMas, внимательно
наберите операторы процедуры TForm1.StringGrid1DrawCell.
9.1.3 Текст модуля UnDinMas
Unit UnDinMas;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,
StdCtrls, Spin, Grids, Buttons;
type
TForm1 = class(TForm)
Label1: TLabel;
SpinEdit1: TSpinEdit;
SpinEdit2: TSpinEdit;
Label8: TLabel;
StringGrid1: TStringGrid;
Label2: TLabel;
Label5: TLabel;
Label3: TLabel;
Button1: TButton;
Label4: TLabel;
Label6: TLabel;
Label7: TLabel;
Label9: TLabel;
procedure FormCreate(Sender: TObject);
procedure SpinEdit1Change(Sender: TObject);
procedure SpinEdit2Change(Sender: TObject);
procedure StringGrid1DrawCell(Sender: TObject; Col, Row: Integer;
Rect: TRect; State: TGridDrawState);
procedure Button1Click(Sender: TObject);
private
// массив целочисленных значений
pMas=array[1..1] of ^mas; // массив указателей
var // объявление глобальных переменных
pA:^pMas; // указатель на массив указателей
m,n,max,min:integer;
procedure TForm1.FormCreate(Sender: TObject);
begin
m:=6; // начальное значение m
n:=8; // начальное значение n
SpinEdit1.Text:=’6′;
SpinEdit2.Text:=’8′;
StringGrid1.RowCount:=m; // количество строк
StringGrid1.ColCount:=n; // количество столбцов
end;
procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
m:=StrToInt(SpinEdit1.Text);// m присваивается содержимое поля
редактора
StringGrid1.RowCount:=m;
end;
procedure TForm1.SpinEdit2Change(Sender: TObject);
begin
n:=StrToInt(SpinEdit2.Text);// n присваивается содержимое поля
редактора
StringGrid1.ColCount:=n;
end;
procedure TForm1.Button1Click(Sender: TObject);
label 1;
var
i,j,k,l,r:integer;
begin
Randomize; // инициализация датчика случайных чисел
GetMem(pA,4*m); // выделение памяти для массива из m указателей
for i :=1 to m do
begin // формирование i-й строки массива
{ Выделение памяти для n элементов i-й строки}
GetMem(pA^[i],SizeOf(integer)*n);
pA^[1]^[1]:=Random(1000);// случайное целое число занести в массив
for j:=1 to n do
begin // формирование j-го элемента строки
1: r:=Random(1000); // генерирование случайного числа
for k:=1 to i do
for l:=1 to j do
if r=pA^[k]^[l] then // если такое число уже есть в массиве
тогда…
goto 1;
pA^[i]^[j]:=r; // случайное число занести в массив
end;
end;
for i:=1 to m do // элементы массива занести в ячейки
for j:=1 to n do // компонента StringGrid1
StringGrid1.Cells[j-1,i-1]:=IntToStr(pA^[i]^[j]);
{ Поиск min и max значений среди элементов массива}
max:=pA^[1]^[1];
min:=max;
for i:=1 to m do
for j:=1 to n do
if pA^[i]^[j]
max:=pA^[i]^[j];
Label7.Caption:=IntToStr(min); // вывод min значения
Label9.Caption:=IntToStr(max); // вывод max значения
for i:=1 to m do
{ Освобожение памяти, занимаемой n элементами i-й строки}
FreeMem(pA^[i],SizeOf(integer)*n);
{ Освобождение памяти, занимаемой массивом из m указателей}
FreeMem(pA,4*m);
end;
procedure TForm1.StringGrid1DrawCell(Sender: TObject; Col, Row: Integer;
Rect: TRect; State: TGridDrawState);
begin
with StringGrid1.Canvas do
if StringGrid1.Cells[Col,Row]=IntToStr(min) then // если элемент
ячейки
begin // равен min тогда…
Brush.Color:=clGreen; // установить цвет кисти зеленый
FrameRect(Rect); // выделить границы ячейки заданным цветом
end
else
if StringGrid1.Cells[Col,Row]=IntToStr(max) then // если элемент
ячейки
begin // равен max
тогда…
Brush.Color:=clRed; // установить цвет кисти красный
FrameRect(Rect); // выделить границы ячейки заданным цветом
end
end;
end.
9.2 Использование динамических списков
Задание2: создать приложение для формирования стека, который
заполняется путем ввода целых положительных чисел с клавиатуры. Как
только будет введено первое отрицательное число, содержимое стека
выводится на панель интерфейса, а память занимаемая его элементами
освобождается.
Один из возможных вариантов панели интерфейса создаваемого приложения
показан на рис.9.2.
9.2.1. Размещение компонентов на Форме
Разместим на Форме компоненты Label, Edit, Button и Memo.
Рис. 9.2
Сохраним модуль под именем UnStek (текст модуля приведен в п.9.2.3).
9.2.2 Создание процедур обработки событий FormCreate и Button1Click
Двойным нажатием клавиши “мыши” на Форме и кнопке Button1 создайте
соответствующие процедуры обработки событий. Используя текст модуля
UnStek, внимательно наберите операторы этих процедур.
9.2.3 Текст модуля UnStek
Unit UnStek;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Button1: TButton;
Label2: TLabel;
Label3: TLabel;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
Type
PSt=^Zap;
Zap=record
inf:integer;
adr:PSt
end;
Var // объявление глобальных переменных:
PVer, // указатель вершины стека
PTek:PSt; // текущий указатель
ElSt:integer; // элемент стека
procedure TForm1.Button1Click(Sender: TObject);
begin
New(PTek); // выделить память
ElSt:=StrToInt(Edit1.Text);// в ElSt занести значение из Edit1
PTek^.inf:=ElSt; // в информационную часть стека занести ElSt
PTek^.adr:=PVer; // в адресную часть занести указатель на вершину
PVer:=PTek;// указатель вершины должен указывать на последний элемент
if ElSt>=0 then // если элемент стека неотрицательный тогда…
begin
Edit1.Text:=”;// очистить окно редактора Edit1
Edit1.SetFocus;// передать фокус ввода редактору Edit1
end
else
begin
Memo1.Lines.Add(‘Элементы стека:’); // вывести заголовок
repeat
Memo1.Lines.Add(#9+IntToStr(PTek^.inf));// вывод
элементов
PVer:=PTek^.adr;
Dispose(PTek); // освободить память
PTek:=PVer
until PTek=nil;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
PVer:=nil; // инициализировать указатель вершины
ElSt:=0; // инициализировать элемент стека
end;
end.
9.3. Выполнение индивидуального задания
По указанию преподавателя выберите два варианта индивидуальных заданий.
В заданиях №1-№15 необходимо использовать динамические массивы, а в
заданиях №16-№30 – динамические списки. Во всех заданиях необходимо
предусмотреть контрольный вывод исходных данных.
Создать приложение, которое осуществляет ввод k значений элементов
одномерного массива с клавиатуры, меняет местами элементы с наибольшим и
наименьшим значениями среди четных и выводит полученный массив.
Создать приложение, которое осуществляет ввод m строк и n столбцов
двумерного массива с клавиатуры и выводит номер строки и номер столбца
наименьшего из всех значений его элементов.
Создать приложение, которое осуществляет ввод k значений элементов
одномерного массива с клавиатуры и выводит порядковый номер элемента с
наименьшим значением среди нечетных.
Создать приложение, которое осуществляет ввод значений элементов
двумерного массива n-го порядка с клавиатуры и выводит значение
наибольшего из элементов главной диагонали.
Создать приложение, которое осуществляет ввод k значений элементов
одномерного массива с клавиатуры, изменяет порядок следования элементов
на противоположный и выводит полученный массив.
Создать приложение, которое осуществляет ввод k значений элементов
одномерного массива с клавиатуры и выводит порядковый номер элемента с
наибольшим значением среди четных.
Создать приложение, которое осуществляет ввод значений элементов
двумерного массива n-го порядка с клавиатуры и выводит значение суммы
элементов главной диагонали.
Создать приложение, которое осуществляет ввод k значений элементов
одномерного массива с клавиатуры, меняет местами элементы с минимальным
и максимальным значениями и выводит полученный массив.
Создать приложение, которое осуществляет ввод k значений элементов
одномерного массива с клавиатуры и выводит порядковый номер элемента с
наименьшим значением среди положительных.
Создать приложение, которое осуществляет ввод значений элементов
двумерного массива n-го порядка с клавиатуры, изменяет порядок
следования элементов главной диагонали на противоположный и выводит
преобразованный массив.
Создать приложение, которое осуществляет ввод k значений элементов
одномерного массива с клавиатуры, меняет местами элементы с минимальным
и максимальным значениями среди положительных и выводит полученный
массив.
Создать приложение, которое осуществляет ввод k значений элементов
одномерного массива с клавиатуры и выводит порядковый номер элемента с
наибольшим значением среди отрицательных.
Создать приложение, которое осуществляет ввод k значений элементов
одномерного массива с клавиатуры, меняет местами элементы с наибольшим
значением среди отрицательных и наименьшим среди положительных и выводит
полученный массив.
Создать приложение, которое осуществляет ввод k значений элементов
одномерного массива с клавиатуры и выводит среднее арифметическое
значение элементов массива.
Создать приложение, которое осуществляет ввод k значений элементов
одномерного массива с клавиатуры, меняет местами элементы с наименьшим
значением среди четных и наибольшим среди нечетных и выводит полученный
массив.
Создать приложение, которое заносит в стек целые положительные числа с
клавиатуры, выводит содержимое стека и среднее арифметическое значение
его элементов.
Создать приложение, которое заносит в стек символы с клавиатуры, выводит
содержимое стека и сообщение о том, содержится или нет в стеке заданный
символ.
Создать приложение, которое заносит в каждый элемент стека английское
слово с клавиатуры и, как только будет введено слово “end”, выводит
содержимое стека.
Создать приложение, которое заносит в стек произвольные целые числа с
клавиатуры, выводит содержимое стека и сообщение о том, содержится или
нет в стеке заданное число.
Создать приложение, которое заносит в стек символы с клавиатуры, выводит
содержимое стека и сообщение о том, упорядочены ли элементы стека по
алфавиту или нет.
Создать приложение, которое заносит в стек положительные целые числа с
клавиатуры и, как только будет введено число, равное сумме введенных
чисел, выводит содержимое стека.
Создать приложение, которое заносит в стек произвольные числа с
клавиатуры, выводит содержимое стека и сообщение о том, упорядочены ли
элементы стека по убыванию.
Создать приложение, которое заносит в каждый элемент стека русское слово
с клавиатуры и, как только будет введено слово “конец”, выводит
содержимое стека и сообщение о том, содержится или нет в стеке заданное
слово.
Создать приложение, которое заносит в стек произвольные числа с
клавиатуры, выводит содержимое стека и удаляет из стека наибольший
элемент.
Создать приложение, которое заносит в стек произвольные целые числа с
клавиатуры. Как только сумма введенных чисел станет равна нулю,
приложение должно вывести содержимое стека.
Создать приложение, которое заносит в каждый элемент стека русское слово
с клавиатуры и, как только будет введено слово “конец”, выводит
содержимое стека и затем удаляет из него любое слово, содержащееся в
стеке (ввести с клавиатуры).
Создать приложение, которое заносит в стек произвольные целые числа с
клавиатуры. Как только будет введено число 0(ноль), приложение должно
вывести содержимое стека, а затем сформировать из него два новых стека:
в первом должны находиться положительные, а во втором – отрицательные
числа.
Создать приложение, которое символы, упорядоченные по алфавиту, вводит с
клавиатуры и заносит в стек. Приложение должно вывести содержимое стека,
ввести с клавиатуры заданный символ и вставить его в стек так, чтобы
элементы стека опять оказались упорядоченными по алфавиту.
Создать приложение, которое заносит в стек буквы русского и латинского
алфавитов в произвольном порядке с клавиатуры. Как только будет введен
символ “.”(точка), приложение должно вывести содержимое стека, а затем
сформировать из него два новых стека: в первом должны находиться буквы
русского, а во втором – буквы латинского алфавита.
Создать приложение, которое заносит в стек целые числа с клавиатуры. Как
только будет введено число 9999, приложение выводит содержимое стека и
реверсирует стек(направления ссылок в стеке изменяются так, что вершина
и дно стека меняются местами).
PAGE
Label
SpinEdit
Button
StringGrid
Label
Label
Label
Edit
Button
Memo
Нашли опечатку? Выделите и нажмите CTRL+Enter