
- •Лабораторная работа № 3: Ввод и обработка массивов
- •Цель работы
- •Задачи работы
- •Описание работы
- •Листинг 5. Текст файла проекта Lab3.Dpr
- •Листинг 6. Текст главного модуля MainUnit.Pas
- •Листинг 7. Текст вспомогательного модуля ListInput.Pas.
- •Листинг 8. Текст вспомогательного модуля GridInput.Pas.
- •Лабораторная работа № 5. «использование компонента stringgrid для представления двумерных массивов».
- •1 Задача
- •2 Задача
Лабораторная работа № 5. «использование компонента stringgrid для представления двумерных массивов».
Задание 1. Создайте приложение, которое выводит двумерный массив случайных целых чисел и определяет минимальный и максимальный элементы в этом массиве.
Решение:
1. Сохраните проект в папке «Массив2» с именем Massiv2 (файл модуля можно сохранить как Unit1).
2. Создайте форму «Обработка двумерного массива».
3. Выберите в палитре компонентов страницы Additional компонент StringGrid и разместите его в левом верхнем углу (см. рис.5.1). Задайте для свойств ColCount (количество столбцов) и RowCount (количество строк) значение 6. Задайте для свойств FixedCols и FixedRows (количество фиксированных, непрокручиваемых столбцов и строк, используемых для размещения надписей номеров строк и столбцов).
Примечание: данный компонент представляет собой таблицу, содержащую строки. Таблица может иметь полосы прокрутки, причем заданное число первых строк и столбцов может быть фиксированным. Таким образом, можно задать заголовки столбцов и строк, постоянно присутствующие в окне компонента.
4. Справа от объекта разместите кнопку Button1 и задайте для нее свойство Caption значение «Заполнить». Ниже разместите панель GroupBox1 и присвойте значение «Определить». На данной панели разместите компоненты CheckBox 1,2 и назначьте свойству Caption значения «Минимальный элемент», «Максимальный элемент» соответственно. Затем справа разместите компоненты Edit 1 ,2 и кнопку с надписью «Вычислить». Выровняйте компоненты как показано на рис. 5.1.
5. Прежде чем создавать обработчики событий кнопок «Заполнить» и «Вычислить», следует добавить в раздел описания переменных данного модуля целочисленные переменные, предназначенные для хранения индексов массива.
Var
Form1 : TForm1 ;
I , J : integer ;
6.
Создайте процедуру обработки события
щелчка мышью на кнопке Button1, в которой
сначала будет выполнена операция вывода
номеров строк и столбцов, а затем ячейки
StringGrid1 будут заполнены случайными целыми
числами.
Рис.5.1 Пример формы проекта «Массив2»
Примечание: при изучении языка TPascal вы использовали оператор with...do для сокращения записи при обращении к полям записей. Теперь можно применять этот оператор для обращения к свойствам и методам объекта. Это делается, чтобы избежать повторных ссылок на объект в последующих операторах. Например, вместо того чтобы, обращаясь к ячейки объекта StringGrid1 писать StringGrid1.Cells [ I , J ], удобнее использовать оператор with StringGrid1 do, в теле которого можно неоднократно обращаться к Cells [ I , J ], не упоминая имени объекта StringGrid1.
Процедура обработки события кнопки Button1:
Procedure TForm1.Button1Click (Sender: TObject) ;
{заполнение массива}
begin
randomize;
with StringGrid1 do
begin
I := 0 ;
For J := 1 to RowCount – 1 do {вывести номера строк}
Cells [ I , J ] := IntToStr( J ) ;
J := 0 ;
For I := 1 to ColCount – 1 do {вывести номера столбцов}
Cells [ I , J ] := IntToStr( I ) ;
End;
With StringGrid1 do {заполнение в таблице двумерного массива}
For I := 1 to ColCount – 1 do
For J := 1 to RowCount – 1 do
Begin
Cells [ I , J ] := IntToStr(Round(Sin(Random(100))*100)) ;
End ;
End ;
7. Создайте процедуру обработки массива для второй кнопки «Вычислить». Введите текст процедуры:
procedure TForm1.Button2Click(Sender: TObject); {обработка массива}
var
min, max : integer ;
begin
if CheckBox1.Checked then
with StringGrid1 do
begin
min := StrToInt (Cells [1,1]) ;
for I :=1 to colCount – 1 do
for J := 1 to RowCount – 1 do
if StrToInt (Cells [ I , J ]) < min then min := StrToInt (Cells [ I , J ] ) ;
Edit1.Text := IntToStr (min) ;
End
Else Edit1.Text := ‘’ ; …
(Определение максимального записать самостоятельно аналогично первой части модуля).
End ;
8. Сохраните приложение и проверьте его работу.
Приложение: Текст программы файла модуля.
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids;
Type TForm1 = class(TForm)
StringGrid1: TStringGrid;
Button1: TButton; Button2: TButton;
GroupBox1: TGroupBox; CheckBox1: TCheckBox; CheckBox2: TCheckBox;
Edit1: TEdit; Edit2: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private { Private declarations }
public { Public declarations }
end;
var Form1: TForm1; i, j: integer;
implementation {$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin Randomize;
with StringGrid1 do begin i:=0;
for j:=1 to RowCount-1 do Cells[i,j]:=IntToStr(j);
j:=0;
for i:=1 to ColCount-1 do Cells[i,j]:=IntToStr(i); end;
with StringGrid1 do
for i:=1 to ColCount-1 do
for j:=1 to RowCount-1 do
begin
Cells[i,j]:=IntToStr(Round(Sin(Random(100))*100));
end; end;
procedure TForm1.Button2Click(Sender: TObject);
var min, max:integer;
begin
if CheckBox1.Checked then
with StringGrid1 do begin
min:=StrToInt(Cells[1,1]);
for i:=1 to ColCount-1 do
for j:=1 to RowCount-1 do
if StrToInt(Cells[i,j])<min then min:=StrToInt(Cells[i,j]);
Edit1.Text:=IntToStr(Min);
End else Edit1.Text:='';
if CheckBox2.Checked then
with StringGrid1 do begin
max:=StrToInt(Cells[1,1]);
for i:=1 to ColCount-1 do
for j:=1 to RowCount-1 do
if StrToInt(Cells[i,j])>max then max:=StrToInt(Cells[i,j]);
Edit2.Text:=IntToStr(Max);
End else Edit2.Text:='';
end; end.
Упражнение для представления двумерных массивов с помощью компонента StringGrid
|
Упражнение. Создайте приложение, которое выводит двумерный массив случайных целых чисел в объекте StringGrid и определяет минимальный и максимальный элементы, а также сумму элементов массива, расположенных на главной диагонали. Создайте форму, свойству Caption которой присвойте значение «Обработка двумерного массива». Выберите в палитре компонентов страницы Additional компонент StringGrid и разместите его в левом верхнем углу формы. Задайте для свойств ColCount (количество столбцов) и RowCount (количество строк) значения 6. Задайте для свойств FixedCols и FixedRows (количество фиксированных, непрокручиваемых столбцов и строк, используемых для размещения надписей номеров столбцов и строк). Справа от объекта StringGrid разместите кнопку Buttonl и задайте для ее свойства Caption значение «Заполнить». Ниже объекта StringGrid разместите панель GroupBoxl и присвойте ее свойству Caption значение «Определить». На данной панели разместите компоненты CheckBoxl, CheckBox2, СпескВохЗ и назначьте свойству Caption значения «Минимальный элемент», «Максимальный элемент», «Сумма элементов главной диагонали», соответственно. Справа от компонентов CheckBoxl, CheckBox2, СпескВохЗ разместите компоненты Editl, Edit2, Edit3 и удалите текст Editl, Edit2, Edit3 из соответствующих компонентов. Правее панели GroupBoxl разместите кнопку Button2 и задайте для ее свойства Caption значение «Вычислить». Сохраните файл проекта и программного модуля. Прежде чем создавать обработчики событий щелчка мышью по кнопкам Buttonl и Button2, следует добавить в раздел описания переменных данного модуля целочисленные переменные I и J, предназначенные для хранения индексов массива (I – номер столбца, J – номер строки). var Forml : TForm1; I, J : integer;
Для получения подсказки Delphi по объекту StringGridl, указав объект, нажмите F1. В окне Delphi Help просмотрите общую информацию о назначении объекта. Щелкнув мышью по ссылке Properties (Свойства), откройте окно со списком свойств объекта, и, выбирая нужные свойства, например, Cells, ColCount и т. п., просмотрите справочную информацию. Для возврата к предыдущему экрану справки воспользуйтесь кнопкой Назад в панели инструментов окна Delphi Help. Щелкая мышью по ссылкам Methods (Методы) и Events (События), просмотрите список методов и событий объекта. Для просмотра примеров следует щелкнуть мышью по ссылке Example. Завершив просмотр справочной информации, закройте окно Delphi Help. Создайте процедуру обработчика события щелчка мышью на кнопке Buttonl, в которой сначала будет выполнена операция вывода номеров строк и столбцов, а затем ячейки StringGridl будут заполнены случайными целыми числами. Для этого выберите в окне Инспектора объектов объект Buttonl и на странице События произведите двойной щелчок на пустом поле списка в событии OnClick. После этого отредактируйте заготовку процедуры обработчика этого события следующим образом: procedure TForml.ButtonlClickCSender: TObject); {заполнение массива} begin Randomize; with StringGridl do {вывести номера строк в 0-м столбце и столбцов в 0-й строке} begin 1:=0; {столбец 0} for J:= 1 to RowCount - 1 do {вывести номера строк} Cells[I,J] := IntToStr(J); J:=0; {строка 0} for I:= 1 to ColCount - 1 do {вывести номера столбцов} Cells[I,J] := IntToStr(I); end; with StringGridl do {вывести в таблице элементы двумерного массива} for I := 1 to ColCount - 1 do for J:= 1 to RowCount - 1 do begin Cells[I,J] := IntToStr(Round(Sin(Random(100))*100)); end; end; Для создания процедуры обработки массива выберите в окне Инспектора объектов объект Button2 и на странице События произведите двойной щелчок на пустом поле списка в событии OnClick. После этого отредактируйте заготовку процедуры обработчика этого события следующим образом: procedure TForml.Button2Click(Sender: TObject); {обработка массива} var Min, Max, Sum : Integer; {локальные переменные – результаты обработки массива} begin if Checkbox1.Checked then {определение Min-элемента} with StringGrid1 do begin Min:=StrToInt(Cells[l,l]); {пусть - это Min-элемент} for I := 1 to ColCount - 1 do for J:= 1 to RowCount - 1 do if StrToInt(Cells[I,J])<=""> Min:=StrToInt(Cells[I,J]); Edit1.Text:=IntToStr(Min): end else Edit1.Text:="; if Checkbox2.Checked then {определение Мах-элемента} with StringGrid1 do begin Max:=StrToInt(Cells[l,l]); {пусть - это Мах-элемент} for I := 1 to ColCount - 1 do for J:= 1 to RowCount - 1 do if StrToInt(Cells[I,J])>Max then Max:=StrToInt(Cells[I,J]); Edit2.Text:=IntToStr(Max); end else Edit2.Text: = "; if Checkbox3.Checked then {вычисление Sum} with StringGrid1 do begin Sum:=0; {обнулить значение суммы перед подсчетом} for i := 1 to ColCount - 1 do Sum:=Sum+StrToInt(Cells[I,I]); Edit3.Text:=IntToStr(Sum); end else Edit3.Text:=''; end; Как видно из текста процедуры, в ней имеется три фрагмента, каждый из которых выполняет вычисления, если свойство Checked соответствующего флажка (Checkbox1, Checkbox2 или Checkbox3) имеет значение True. Операторы типа Edit1.Text:="; Edit2.Text:="; Edit3.Text:="; обеспечивают очистку соответствующего окна Edit, если вычисление не проводилось. Для обращения к элементу массива, расположенному на главной диагонали StringGrid1, указывается одинаковый номер строки и столбца Cells[I,I]. |
StringGrid1.Cells[i,j]:=IntToStr(random(10));
как заполнить двумерный массив значениями из StringGrid? По первой кнопке создаете одинаковые размеры двух таблиц.
-
Код Delphi
1
2
3
4
5
6
7
8
9
procedure TForm1.Button1Click(Sender: TObject);
begin
m:=StrToInt(Edit1.Text);
n:=StrToInt(Edit2.Text);
StringGrid1.RowCount:=m;
StringGrid1.ColCount:=n;
StringGrid2.RowCount:=m;
StringGrid2.ColCount:=n;
end;
Если Вы убрали фиксированные столбцы и строки, то так. Заносите числа с клавиатуры в таблицу. Для этого Инспекторе объуктов в Option поставьте в труе goEditting, и goTabs. По второй кнопке. Читаете массив из таблицы
-
Код Delphi
1
2
3
for i:=0 to m-1 do //счет идет с ноля
for j:=0 to n-1 do
a[i,j]:=StrToInt(StringGrid1.Cells[j,i]);//строки и столбцы в матрице и таблице наоборот
Матрицу создали. Выполняете преобразования в матрице Выводите матрицу во вторую таблицу.
-
Код Delphi
1
2
3
for i:=0 to m-1 do //заносим в новую таблицу тоже наоборот
for j:=0 to n-1 do
StringGrid2.Cells[j,i]:=IntToStr(a[i,j]);
1 задача. Дан двумерный массив размером n*m заполненый случайными числами. Найти в каждой строке массива максимальный и минимальный элементы и поменять их с первым и последним элементом соответственно. 2. Задача. Заполнить массив 7*7 по правилу: 1111111 0111110 0011100 0001000 0011100 0111110 1111111