Radio9 (664341)

Файл №664341 Radio9 (Программирование на Object Pascal в среде Delphi)Radio9 (664341)2016-07-31СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла


Лабораторная работа №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. Создать приложение, которое заносит в стек положительные целые числа с клавиатуры и, как только будет введено число, равное сумме введенных чисел, выводит содержимое стека.

Характеристики

Тип файла
Документ
Размер
158 Kb
Тип материала
Учебное заведение
Неизвестно

Тип файла документ

Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.

Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.

Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.

Список файлов реферата

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