Лабораторная работа  № 5

Использование визуальных компонентов для программирования массивов

для студентов 1 курса ФИиИТ по дисциплине «ООП»

Цель работы: приобретение практических навыков проектирования и программирования массивов.

Используемые программные средства: Borland Delphi.

 

                               5.1.Теоретические сведения. Работа с компонентами

 

Массивом называется упорядоченная индексированная совокупность однотипных элементов, имеющих общее имя. Элементами массива могут быть данные различных типов. Каждый элемент массива одновременно определяется именем массива и индексом (номер этого элемента в массиве) или индексами,  если массив многомерный. Количество индексных позиций определяет размерность массива (одномерный, двумерный и т.д.).

Работу с массивами данных удобно организовывать в виде таблиц. Для этой цели предназначены компоненты StringGrid типа TStringGrid и DrawGrid типа TDrawGrid, отображающие информацию в виде двумерных таблиц. Компоненты расположены на панели Additional Палитры компонентов и  имеют

пиктограммы (StringGrid) и (DrawGrid).

Компонент DrawGrid позволяет отображать любую (текстовую и графическую) информацию, однако вся работа по визуальному отображению объектов возлагается на разработчиков программы. Компонент StringGrid применяется для работы с текстовой информацией, причем ее отображение и хранение производится компонентом автоматически. В дальнейшем будем рассматривать компонент StringGrid.

Основным элементом таблицы является ячейка, для доступа к которой используется свойство

Cells[ACol,ARow:Integer]:string,


где ACol и ARow индексы элемента двумерного массива. Индекс ACol определяет номер столбца, а индекс ARow номер строки. Свойство Cells доступно только во время выполнения программы. Нумерация элементов таблицы начинается с нуля.

Некоторые свойства компонента StringGrid приведены в табл. 5.1.

Таблица 5.1

 

Свойства компонента StringGrid

 

ColCount

число столбцов в таблице

RowCount

число строк в таблице

FixedCols

число фиксированных столбцов

FixedRows

число фиксированных строк

ColWidths

ширина столбца в пикселах

RowHeights

высота строки в пикселах

DefaultColWidth

значение ширины столбца по умолчанию

DefaultRowHeight

значение высоты строк по умолчанию

BorderStyle

определяет наличие или отсутствие внешней рамки таблицы

ScrollBars

параметры отображения полосы прокрутки :

ssNone

полоса прокрутки не допускается

ssHorizontal

допускается горизонтальная полоса прокрутки

ssVertical

допускается вертикальная полоса прокрутки

ssBoth

допускаются обе полосы прокрутки

Options

опции для доступа к параметрам таблицы для их настройки :

goVertLine

отображение в сетке вертикальных разделительных линий

goEditing

возможность      редактирования       содержания      ячейки       с клавиатуры

goHorzLine

отображение в сетке горизонтальных разделительных линий

 

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

Для визуального выделения функционально связанных компонентов или в качестве    средств    визуального    группирования    используются     компоненты GroupBox  или  Panel . Компонент GroupBox представляет собой прямоугольную рамку с заголовком (свойство Caption) в левом верхнем углу и служит  только  для  объединения  содержащихся  в  нем  элементов.    Компонент Panel предназначен  для  объединения  произвольных  элементов  управления  с  возможностями их перемещения по форме и стыковкой с другими панелями. Кроме того, компонент Panel может использоваться для создания рамок разнообразного вида (свойства BevelInner, BevelOuter , BevelWidth компонента).

5.2. Порядок выполнения работы

Изучить компонент StringGrid и его свойства, выполнить контрольный пример и задания соответствующего варианта.

           Контрольный пример 5.1

           Сформировать матрицу  A размерности

          Решение.

1.  Открыть новый проект Delphi: File – New Application .

2.      Установить  с  помощью  Object  Inspector  следующие  свойства     компонента

Form1:

Form1.Height = 480

Form1.Width = 487 Form1.BorderIcons

biMaximize = false

Form1.BorderStyle = bsSingle

3.   На форме расположить следующие компоненты: один компонент Edit, два компонента Label, один компонент StringGrid, два компонента Button и один компонент BitBtn установить с помощью Object Inspector для них следующие свойства:

Label1.Caption = 'Размерность матрицы А' Label2.Caption = 'Матрица А'

Edit1.Width = 120

Button1.Caption = 'Изменить размерность матрицы А' StringGrid1.Left = 50

StringGrid1.Top = 150

StringGrid1.Height = 153

StringGrid1.Width = 313

StringGrid1.ScrollBars = ssBoth

Button2.Caption = 'Получение матрицы А' BitBtn1.Kind = 'bkClose'

BitBtn1. Caption = '&Закрыть'.

Результат показан на рис. 5.1.


Рис. 5.1. Вид формы для контрольного примера 5.1

4.          Запишем обработчик события Button1.Click (кнопка Изменить размерность матрицы А), в процессе выполнения которого устанавливается размерность матрицы, число столбцов и число строк в компоненте  StringGrid1.

В разделе описания глобальных переменных должны быть описаны следующие типы и переменные:

type

mas=array[1..10,1..10] of real; var

Form1: TForm1; N: integer;

A:mas;

Текст процедуры TForm1.Button1Click имеет вид:

procedure TForm1.Button1Click(Sender: TObject); var

i:integer; begin

N:=StrToInt(Edit1.Text);// размерность матрицы А

{Задание числа строк и столбцов в таблице} StringGrid1.ColCount:=N+1;

 StringGrid1.RowCount:=N+1;

{Ввод в левую верхнюю ячейку таблицы названия массива} StringGrid1.Cells[0,0]:='Массив A:';

{Заполнение    левого   и   верхнего    столбцов   поясняющими записями}

for i:=1 to N do begin

StringGrid1.Cells[0,i]:=' i= '+IntToStr(i); StringGrid1.Cells[i,0]:=' j= '+IntToStr(i);

end;

end;

5.      Для формирования матрицы А нужно записать процедуру, являющуюся обработчиком события Button2.Click (кнопка Получение матрицы А). Текст процедуры приведен ниже:

procedure TForm1.Button2Click(Sender: TObject); var i,j:integer;

begin

for i:=1 to n do for j:= 1 to n do begin

if i<j then A[i,j]:=sqr(j)*i; if i=j then A[i,j]:=2;

if i>j then A[i,j]:=i*sqr(i)/j; end;

{Вывод результата в таблицу  StringGrid1} for i:=1 to N do

for j:=1 to N do StringGrid1.Cells[j,i]:=FloatToStrf(A[i,j],fffixed,6,2);

end;

6.  Запустить проект на выполнение. Результат выполнения программы показан на рис. 5.2.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 5.2. Результат выполнения программы для контрольного примера 5.1

Контрольный пример 5.2

Создать программу для определения вектора ,   матрица размерности Y и B - одномерные массивы размерности N. Элементы    вектора  Y определяются по формуле  . Значения N вводить в компонент Edit, элементы массивов А и B – в компонент StringGrid. Результат, после нажатия кнопки типа Button, вывести в компонент StringGrid.

Решение.

1.  Открыть новый проект Delphi: File – New Application.

2.      Установить  с  помощью  Object  Inspector  следующие  свойства     компонента

Form1:

Form1.Height = 395

Form1.Width = 585 Form1.BorderIcons biMaximize = false

Form1.BorderStyle = bsSingle

3.   На форме расположить следующие компоненты: один компонент Edit, один компонент Label, три компонента StringGrid, два компонента Button и один компонент BitBtn установить с помощью Object Inspector для них следующие свойства:

Label1.Caption = 'Размерность массива' Edit1.Width = 50

Button1.Caption = 'Изменить размерность массива' StringGrid1.ColCount = 2

StringGrid1.RowCount = 2

StringGrid1.FixedCols = 1

StringGrid1.FixedRows = 1

StringGrid2.ColCount = 1

StringGrid2.RowCount = 2

StringGrid2.FixedCols = 0

StringGrid2.FixedRows = 1

StringGrid3.ColCount = 1

StringGrid3.RowCount = 2

StringGrid3.FixedCols = 0

StringGrid3.FixedRows = 1

Button2.Caption = 'Вычислить А' BitBtn1.Kind = 'bkClose' BitBtn1. Caption = '&Закрыть'.

По умолчанию в компонент StringGrid запрещен ввод информации с клавиатуры, поэтому необходимо свойство Options goEditing для компонентов StringGrid1 и StringGrid2 установить в положение True.

4.  Текст программы имеет вид:

unit Unit1; interface uses

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

Dialogs, Buttons, Grids, StdCtrls; type

TForm1 = class(TForm) Label1: TLabel; Edit1: TEdit;

  Button1: TButton;

StringGrid1: TStringGrid; StringGrid2: TStringGrid; StringGrid3: TStringGrid; Button2: TButton; BitBtn1: TBitBtn;

procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject);

private

{ Private declarations } public

{ Public declarations } end;

const

Nmax=10;         // Максимальная размерность массива

Type

Mas2 = array[1..Nmax,1..Nmax] of extended; // Объявление типа двумерного массива размерностью Nmax

Mas1 = array[1..Nmax] of extended;          // Объявление типа одномерного массива размерностью Nmax

var

Form1: TForm1;

A : Mas2;      // Объявление двумерного массива B,Y : Mas1;    // Объявление одномерного массива N: integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject); var i,j:integer;

begin

N:=StrToInt(Edit1.Text);

{Задание числа строк и столбцов в таблицах} StringGrid1.ColCount:=N+1; StringGrid1.RowCount:=N+1; StringGrid2.RowCount:=N+1; StringGrid3.RowCount:=N+1;

{ Ввод в левую верхнюю ячейку таблицы названия массива} StringGrid1.Cells[0,0]:='Массив A:'; StringGrid2.Cells[0,0]:='Массив B:'; StringGrid3.Cells[0,0]:='Массив Y:';

{Заполнение верхнего и левого столбцов поясняющими подписями} for i:=1 to N do begin

StringGrid1.Cells[0,i]:=' i= '+IntToStr(i); StringGrid1.Cells[i,0]:=' j= '+IntToStr(i);

end;

end;

procedure TForm1.Button2Click(Sender: TObject); var s: extended;i,j:integer;

begin

{ Заполнение массива А элементами из таблицы StringGrid1} for i:=1 to N do

for j:=1 to N do A[i,j]:=StrToFloat(StringGrid1.Cells[j,i]);

{ Заполнение массива В элементами из таблицы StringGrid2} for i:=1 to N do

B[i]:=StrToFloat(StringGrid2.Cells[0,i]);

{Умножение массива А на массив В} for i:=1 to N do begin

s:=0;

for j:=1 to N do s:=s+A[i,j]*B[j]; Y[i]:=s;

{Вывод результата в таблицу StringGrid3}

StringGrid3.Cells[0,i]:=FloatToStrF(y[i],fffixed,6,2);

end;end;end.

5.  Запустить проект на выполнение. Результат выполнения программы показан на рис. 5.3.

Рис. 5.3. Результат выполнения программы для контрольного примера 5.2


 

Контрольный пример 5.3

Для  заданной  матрицы A (aij ) сформировать  матрицу B (bij ) так,  чтобы

 Вычислить  сумму  элементов  нечетных  строк  матрицы  B. Матрица  A  заполняется  случайными  значениями  в  диапазоне  от  0  до  10.

Предусмотреть ввод параметров P и Q .

Решение.

1.  Открыть новый проект Delphi: File - New Application .

2.      Установить  с  помощью  Object  Inspector  следующие  свойства     компонента

Form1:

Form1.Height = 316

Form1.Width = 586 Form1.BorderIcons

biMaximize = false

Form1.BorderStyle = bsSingle

3.    На форме расположить следующие компоненты: два компонента GroupBox, пять компонентов Edit, пять компонента Label, два компонента StringGrid и два компонента Button и установить с помощью Object Inspector для них следующие свойства:

GroupBox1.Align = alLeft

GroupBox1.Width = 289

GroupBox1.Caption = 'Исходные данные'

Label1.Caption = 'К-во строк:'

Label2.Caption = 'К-во столбцов:' Edit1.Width = 60

Edit2.Width = 60

Button1.Caption = 'Задать' StringGrid1.Left = 10

StringGrid1.Top = 71

StringGrid1.Height = 177

StringGrid1.Width = 271 StringGrid1.ScrollBars = ssBoth Label3.Caption = 'P='

Label4.Caption = 'Q=' Edit3.Width = 60

Edit4.Width = 60

Button2.Caption = 'Вычислить' GroupBox2.Align = alClient GroupBox2.Caption = 'Результат'

Label4.Caption = 'Сумма элементов=' StringGrid2.Left = 10

StringGrid2.Top = 71 StringGrid2.ScrollBars = ssBoth

4.       При запуске программы в момент создания формы возникает событие OnCreate (создание формы). Обработка этого события используется для настройки компонентов формы, для задания начальных значений и т.д.

Создадим обработчик этого события, во время выполнения которого будут установлены некоторые начальные значения компонентов.  Текст соответствующей процедуры имеет вид:

procedure TForm1.FormCreate(Sender: TObject); begin

Form1.Caption:='Работа с массивами'; Edit1.Text:='';

Edit2.Text:='';

Edit3.Text:='';

Edit4.Text:='';

Edit5.Text:='';

StringGrid1.Cells[0,0]:='A';

StringGrid2.Cells[0,0]:='B';

StringGrid2.Height:=StringGrid1.Height; StringGrid2.Width:=StringGrid1.Width;

end;

5.    Запишем обработчик события Button1.Click (кнопка Задать), в процессе выполнения которого устанавливается размерность массива, число столбцов и число строк в компоненте StringGrid1, формируется матрица A со  случайными значениями в диапазоне от 0 до 10 и происходит заполнение ячеек компонента StringGrid1 элементами матрицы A.

В разделе описания глобальных переменных должны быть описаны следующие константы, типы и переменные:

const MaxMN=10; {максимальная размерность массива} K=10;          {диапазон генерации случайного числа}

Type Mas=array [1..MaxMN,1..MaxMN] of real; var

Form1: TForm1;

M,N:integer;             {количество   строк  и  столбцов  в матрицах}

i,j:integer;

A,B:Mas;           {массивы}

P,Q:real;          {переменные для параметров P и Q} Sum:real;

 

Текст процедуры TForm1.Button1Click имеет вид:

procedure TForm1.Button1Click(Sender: TObject); begin

M:=StrToInt(Edit1.Text); N:=StrToInt(Edit2.Text);

StringGrid1.RowCount:=M+StringGrid1.FixedRows; StringGrid1.ColCount:=N+StringGrid1.FixedCols; for i:=1 to M do

StringGrid1.Cells[0,i]:='i='+IntToStr(i); for j:=1 to N do

StringGrid1.Cells[j,0]:='j='+IntToStr(j); Randomize;

for i:=1 to M do for j:=1 to N do begin

A[i,j]:=random(K); StringGrid1.Cells[j,i]:=FloatToStr(A[i,j]);

end; end;

Процедура Randomize используется для смены базы генерации случайных чисел.

6.   Для формирования матрицы B и вычисления суммы элементов нечетных строк в этой матрице нужно записать процедуру, являющуюся обработчиком события Button2.Click (кнопка Вычислить). Текст процедуры приведен ниже:

procedure TForm1.Button2Click(Sender: TObject); begin

P:=StrToFloat(Edit3.Text); Q:=StrToFloat(Edit4.Text);

StringGrid2.RowCount:=StringGrid1.RowCount; StringGrid2.ColCount:=StringGrid1.ColCount; for i:=1 to M do

StringGrid2.Cells[0,i]:='i='+IntToStr(i); for j:=1 to N do

StringGrid2.Cells[j,0]:='j='+IntToStr(j); for i:=1 to M do

for j:=1 to N do begin

B[i,j]:=sqr(A[i,j])/(A[i,j]+P*sqr(A[i,j])+Q);

StringGrid2.Cells[j,i]:=FloatToStrF(B[i,j],ffFixed,5,3);

end; Sum:=0;

for i:=1 to M do for j:=1 to N do begin

if odd(i) then Sum:=Sum+B[i,j]; end;

Edit5.Text:=FloatToStr(Sum); end;

 

7.  Запустить проект на выполнение. Результат выполнения программы показан на рис. 5.4.


Рис. 5.4. Результат выполнения программы для контрольного примера 5.3

                 5.3. Контрольные вопросы

 

1.  Приведите определение массива.

2.  Какие данные могут быть элементами массива?

3.  С какой целью применяется компоненты StringGrid и DrawGrid?


4.  Какие основные свойства компонентов StringGrid и DrawGrid?

5.   В каких разделах программы и модуля описываются локальные и глобальные переменные?

          5.4. Варианты заданий

Вариант 1

Задание  1. Сформировать матрицу А размерности m ´ n , для которой

Числа  m и  n вводятся с клавиатуры.

Задание    2.          Написать    программу,   вычисляющую   значение    матрицы

C = A + k × B . Найти произведение всех элементов матрицы C (для вывода значения

 


использовать компонент Edit). Элементы матриц клавиатуры.


A , B


и параметр k


вводятся с


Задание 3. Написать программу, вычисляющую произведение двух матриц произвольной размерности. Элементы матриц вводятся с клавиатуры в компонент StringGrid. Предусмотреть возможность ввода с клавиатуры количества строк и столбцов заданных матриц.

Вариант 2

Задание  1. Сформировать матрицу А размерности n ´ n , для которой

               

Число  n вводится с клавиатуры.

Задание  2.  Задана  вещественная  матрица   A  размерности  m ´ n . Написать

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


единственный. Элементы матрицы  A  и числа


m  и n


вводятся с клавиатуры. Для


вывода результата использовать компонент Edit.

Задание 3*. Написать программу, вычисляющую произведение двух матриц произвольной размерности. Элементы матриц вводятся с клавиатуры в компонент StringGrid. Предусмотреть возможность ввода с клавиатуры количества строк и столбцов заданных матриц.

Вариант 3

Задание  1. Сформировать матрицу А размерности n ´ n , для которой

Число  n вводится с клавиатуры.

Задание  2. Дана вещественная матрица  A  размерности  m ´ n , все  элементы

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

A  и числа  m и  n вводятся с клавиатуры.

Задание 3. Написать программу, вычисляющую произведение двух матриц произвольной размерности. Элементы матриц вводятся с клавиатуры в компонент StringGrid. Предусмотреть возможность ввода с клавиатуры количества строк и столбцов заданных матриц.

Вариант 4

Задание  1. Сформировать матрицу  A размерности n ´ n , для которой

Число  n вводится с клавиатуры.

         Задание 2. Для матрицы A размерности m ´ n посчитать количество


элементов  меньше  нуля  и  равных  нулю.  Элементы  матрицы   A   и  числа   m, n

 

вводятся с клавиатуры. Для вывода результатов использовать компонент Edit.

Задание 3. Написать программу, вычисляющую произведение двух матриц произвольной размерности. Элементы матриц вводятся с клавиатуры  в  компонент StringGrid. Предусмотреть возможность ввода с клавиатуры количества строк и столбцов заданных матриц.

Вариант 5

Задание  1. Сформировать матрицу А размерности m ´ n , для которой

Числа  m и  n вводятся с клавиатуры.

Задание 2. Для заданной матрицы A [m , n] найти минимальный элемент (и его  номер)  и  максимальный  элемент    его  номер).  Для  вывода    результатов использовать компонент Edit.  Элементы матрицы A и числа m, n  вводятся с клавиатуры.


Задание 3*. Написать программу, вычисляющую произведение двух матриц

произвольной размерности. Элементы матриц вводятся с клавиатуры в компонент


StringGrid. Предусмотреть возможность ввода с клавиатуры количества строк и столбцов заданных матриц.

Вариант 6

         Задание  1. Сформировать матрицу А размерности m ´ n , для которой числа

 m и  n  вводятся с клавиатуры.


Задание    2.         Для           матрицы    A       размерности


m ´ n


посчитать   количество


 


положительных элементов в каждом столбце. Элементы матрицы  A  и   числа


m, n


 

вводятся с клавиатуры. Для вывода результатов использовать компонент Edit.

Задание 3. Написать программу, вычисляющую произведение двух матриц произвольной размерности. Элементы матриц вводятся с клавиатуры в компонент StringGrid. Предусмотреть возможность ввода с клавиатуры количества строк и столбцов заданных матриц.

Вариант 7

Задание  1. Сформировать матрицу А размерности n ´ n , для которой

Числo  n вводятся с клавиатуры.

Задание 2. Найти матрицу, транспонированную относительно исходной. Предусмотреть ввод исходной матрицы различной размерности. Если исходная матрица квадратная (для размерности не более 3), то вычислить ее  определитель. В противоположном случае выдать сообщение 'Матрица не является квадратной или ее размерность больше 3'. Элементы матрицы вводятся с клавиатуры.

Задание  3. Написать программу, вычисляющую произведение двух  матриц

произвольной размерности. Элементы матриц вводятся с клавиатуры в компонент StringGrid. Предусмотреть возможность ввода с клавиатуры количества строк и столбцов заданных матриц.

Вариант 8

Задание  1. Сформировать матрицу А размерности m ´ n , для которой

Задание  2. Задана вещественная квадратная матрица порядка  n .    Написать

программу нахождения среднего арифметического наибольшего и    наименьшего


значений ее элементов. Элементы матрицы и число вывода результата использовать компонент Edit.


n  вводятся с клавиатуры. Для


Задание 3.Написать программу, вычисляющую произведение двух матриц произвольной размерности. Элементы матриц вводятся с клавиатуры в компонент StringGrid. Предусмотреть возможность ввода с клавиатуры количества строк и столбцов заданных матриц.