Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
представление двумерных массивов с помощью комп...docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
165.57 Кб
Скачать

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