Лабораторная работа
№ 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);
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
1.
Приведите определение массива.
2.
Какие данные могут быть
элементами массива?
3.
С какой целью применяется
компоненты StringGrid и DrawGrid?
4. Какие основные свойства компонентов StringGrid и DrawGrid?
5.
В каких
разделах программы и модуля описываются локальные и глобальные переменные?
Вариант 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. Предусмотреть возможность ввода с клавиатуры
количества строк и столбцов заданных матриц.