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

2016-07-31СтудИзба

Описание файла

Документ из архива "Программирование на Object Pascal в среде Delphi", который расположен в категории "". Всё это находится в предмете "информатика" из , которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "рефераты, доклады и презентации", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "Radio9"

Текст из документа "Radio9"


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


Label

SpinEdit

Label

StringGrid


Button

Label


Рис. 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

{ 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

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]then

min:=pA^[i]^[j]

else

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.


Label

Memo


Edit

Button


Рис. 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 – динамические списки. Во всех заданиях необходимо предусмотреть контрольный вывод исходных данных.

  1. Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры, меняет местами элементы с наибольшим и наименьшим значениями среди четных и выводит полученный массив.

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

  3. Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры и выводит порядковый номер элемента с наименьшим значением среди нечетных.

  4. Создать приложение, которое осуществляет ввод значений элементов двумерного массива n-го порядка с клавиатуры и выводит значение наибольшего из элементов главной диагонали.

  5. Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры, изменяет порядок следования элементов на противоположный и выводит полученный массив.

  6. Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры и выводит порядковый номер элемента с наибольшим значением среди четных.

  7. Создать приложение, которое осуществляет ввод значений элементов двумерного массива n-го порядка с клавиатуры и выводит значение суммы элементов главной диагонали.

  8. Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры, меняет местами элементы с минимальным и максимальным значениями и выводит полученный массив.

  9. Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры и выводит порядковый номер элемента с наименьшим значением среди положительных.

  10. Создать приложение, которое осуществляет ввод значений элементов двумерного массива n-го порядка с клавиатуры, изменяет порядок следования элементов главной диагонали на противоположный и выводит преобразованный массив.

  11. Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры, меняет местами элементы с минимальным и максимальным значениями среди положительных и выводит полученный массив.

  12. Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры и выводит порядковый номер элемента с наибольшим значением среди отрицательных.

  13. Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры, меняет местами элементы с наибольшим значением среди отрицательных и наименьшим среди положительных и выводит полученный массив.

  14. Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры и выводит среднее арифметическое значение элементов массива.

  15. Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры, меняет местами элементы с наименьшим значением среди четных и наибольшим среди нечетных и выводит полученный массив.

  16. Создать приложение, которое заносит в стек целые положительные числа с клавиатуры, выводит содержимое стека и среднее арифметическое значение его элементов.

  17. Создать приложение, которое заносит в стек символы с клавиатуры, выводит содержимое стека и сообщение о том, содержится или нет в стеке заданный символ.

  18. Создать приложение, которое заносит в каждый элемент стека английское слово с клавиатуры и, как только будет введено слово “end”, выводит содержимое стека.

  19. Создать приложение, которое заносит в стек произвольные целые числа с клавиатуры, выводит содержимое стека и сообщение о том, содержится или нет в стеке заданное число.

  20. Создать приложение, которое заносит в стек символы с клавиатуры, выводит содержимое стека и сообщение о том, упорядочены ли элементы стека по алфавиту или нет.

  21. Создать приложение, которое заносит в стек положительные целые числа с клавиатуры и, как только будет введено число, равное сумме введенных чисел, выводит содержимое стека.

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Нашёл ошибку?
Или хочешь предложить что-то улучшить на этой странице? Напиши об этом и получи бонус!
Бонус рассчитывается индивидуально в каждом случае и может быть в виде баллов или бесплатной услуги от студизбы.
Предложить исправление
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5138
Авторов
на СтудИзбе
442
Средний доход
с одного платного файла
Обучение Подробнее