.

Программирование на Object Pascal в среде Delphi

Язык: русский
Формат: реферат
Тип документа: Word Doc
98 950
Скачать документ

Лабораторная работа №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 then

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

Похожие документы
Обсуждение

Ответить

Курсовые, Дипломы, Рефераты на заказ в кратчайшие сроки
Заказать реферат!
UkrReferat.com. Всі права захищені. 2000-2020