Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Posobie_po_Delphi_2008.doc
Скачиваний:
75
Добавлен:
06.06.2015
Размер:
2.69 Mб
Скачать

Ввод и вывод двумерных массивов c помощью компонента StringGrid

После создания на форме строковой таблицы (компонент StringGrid) и задания с помощью Инспектора Объектов ее свойств, в программе нужно записать группу операторов для подписи строк и столбцов таблицы, чтобы пользователю программы было понятно, как вводить данные. Их можно записать в отдельной процедуре, связанной с событием выход (Exit) из компонента Edit, где вводится размерность массива, или в процедуре, связанной с событием создания формы (FormCreate).

{Процедура подготовки таблицы на форме для ввода квадратной матрицы, которая выполняется при выходе из поля ввода размерности матрицы.}

procedure TForm1.Edit1Exit(Sender: TObject);

Var i,j:Integer;// номера строки столбца квадратной матрицы

begin

// порядок матрицы получает свое значение из поля ввода

N:=StrToInt(Edit1.Text);

// свойство количество строк компонента StringGrid

// получает значение: порядок +1

StringGrid1.RowCount:=N+1;

// свойство количество столбцов компонента StringGrid

// получает значение порядок: +1

StringGrid1.ColCount:=N+1;

//подпись заголовка таблицы

For i:=1 to StringGrid1.RowCount do

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

// подпись строк таблицы

For j:=1 to StringGrid1.ColCount do

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

// добавление в свойства таблицы признака

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

StringGrid1.Options:= StringGrid1.Options +[goEditing];

end;

Замечание

Напоминаем, что для создания процедуры, связанной с каким-то событием, произошедшим с компонентом, нужно перейти на вкладку Events (события), найти нужное событие в строке, например OnCreate, и справа вписать название события (в данном примере Create). В модуле автоматически будет создана заготовка процедуры создания формы:

procedure TForm1.FormCreate(Sender: TObject);

begin

end;

Если щелкнуть по компоненту Edit, то автоматически будет создана заготовка процедуры обработки события изменение компонента Edit:

procedure TForm1.Edit1Change(Sender: TObject);

begin

end;

Нужно изменить событие Change (изменить) на событие Exit (выход). Для этого обязательно перейти на вкладку события (Events) в инспекторе объектов. В строке OnExit раскрыть список, выбрать название Edit1Change и заменить Change на Exit.

Для ввода двумерного массива из StrigGrid необходимо записать операторы, подобные этим:

For i:=1 to StringGrid1.RowCount-1 do

For j:=1 to StringGrid1.ColCount-1 do

begin

Massiv[i,j]:=StrToFloat(StringGrid1.Cells[j,i]);

end; {в данном случае begin и end можно опустить}

Для вывода:

For i:=1 to StringGrid1.ColCount-1 do

For j:=1 to StringGrid1.RowCount-1 do

StringGrid1.Cells[j,i]:=FloatToStr(Massiv[i,j]);

Понятие о классах в Delphi

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

Система Delphi всегда сама генерирует свои классы во время проектирования приложения.Описание сформированного класса находится в разделе type интерфейсной части модуля. Например, в программе про бак для летнего душа из темы 1 описание класса выглядит так:

type

TForm1 = class(TForm)

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Edit1: TEdit;

Edit2: TEdit;

Edit3: TEdit;

Button1: TButton;

Button2: TButton;

Button3: TButton;

Label5: TLabel;

Label6: TLabel;

Button4: TButton;

procedure Button1Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

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

Практика

Задача

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

Транспонированной матрицей к исходной является такая матрица, у которой элементы строк исходной матрицы расставлены в столбцы, а элементы столбцов исходной в строки.

Следом матрицы называется сумма главных диагональных элементов.

Компоненты

Имя

компонента

Свойства

компонента

Значение

Назначение

Form1

Caption

Матрица

Заголовок главной формы

Label1

Caption

Программа предназначена для преобразования квадратной матрицы (количество строк равно количеству столбцов)

Справочная информация для пользователя программы

Label2

Caption

Размерность матрицы

Подсказка пользователю

Edit1

Text

…..

Поле для ввода размерности матрицы

Form1.StringGrid1

ColCount

FixedCol

FixedRow

Options:

goFixedVertLine

goFixedHorzLine

goVertLine

goHorzLine

goTabs

goAlwaysShowEditor

5

1

1

True

True

True

True

True

True

Количество столбцов по умолчанию

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

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

Опции:

Разметка зафиксированных вертикальных линий

Разметка зафиксированных горизонтальных линий

Разметка вертикальных линий внутри таблицы

Разметка горизонтальных линий внутри таблицы

Разрешает использование клавиши Tab для перемещения в другую ячейку

Признак нахождения компонента в режиме редактирования

Form1.Button1

Caption

Транспонированная матрица

Кнопка для выполнения транспонирования и вывода в новое окно

Form1.Button2

Caption

След матрицы

Кнопка для вычисления следа матрицы и вывода в новое окно

Form1.Button3

Caption

Выход

Кнопка для завершения работы программы

Form2

Caption

Транспонированная матрица

Заголовок формы

Form2.StringGrid1

ColCount

FixedCol

FixedRow

Options:

goFixedVertLine

goFixedHorzLine

goVertLine

goHorzLine

goTabs

goAlwaysShowEditor

5

1

1

True

True

True

True

True

True

Количество столбцов по умолчанию

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

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

Опции:

Разметка зафиксированных вертикальных линий

Разметка зафиксированных горизонтальных линий

Разметка вертикальных линий внутри таблицы

Разметка горизонтальных линий внутри таблицы

Разрешает использование клавиши Tab для перемещения в другую ячейку

Признак нахождения компонента в режиме редактирования

Form2.Button1

Caption

Выход

Кнопка для закрытия окна “Транспонированная матрица”

Form3

Caption

След матрицы

Заголовок формы

Label1

Caption

Сумма главных диагональных элементов матрицы называется следом матрицы

Справочная информация для пользователя программы

Label2

Caption

Поле для вывода, рассчитанного программой значения следа матрицы

Form3.Button1

Caption

Выход

Кнопка для закрытия окна “След матрицы”

Переменные и массивы

Обозначение

в программе

Содержание

Тип

N

Порядок квадратной матрицы

Целый

M

Квадратная матрица действительных чисел

Вещественный,

расширенный

I

Текущий номер строки матрицы или столбца в StringGrid

Целый

J

Текущий номер столбца матрицы или строки в StringGrid

Целый

Sled

След матрицы

Вещественный,

расширенный

Проекты форм

Для решения данной задачи рекомендуется создать три окна.

Текст модуля

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics,

Controls, Forms, Dialogs, StdCtrls, Grids,Unit2,Unit3;

// подключаются модули, связанные со второй и третьей формами

type

TForm1 = class(TForm)

Label1: TLabel;

Label2: TLabel;

Edit1: TEdit;

StringGrid1: TStringGrid;

Button1: TButton;

Button2: TButton;

Button3: TButton;

procedure Button1Click(Sender: TObject);

procedure Edit1Exit(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

M :array [1..100,1..100] of Extended; // квадратная матрица

N:Integer;// порядок матрицы

Sled: Extended; // след матрицы

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

// процедура читает из таблицы на главной форме квадратную матрицу

// транспонирует матрицу и выводит в таблицу StringGrid

// на вторую форму

procedure TForm1.Button1Click(Sender: TObject);

Var i:Integer; // номер строки матрицы/номер столбца StringGrid

j:Integer; // номер столбца матрицы/номер строки StringGrid

begin

// чтение значений квадратной матрицы из компонента StringGrid

// главной формы

For i:=1 to StringGrid1.RowCount-1 do

For j:=1 to StringGrid1.ColCount-1 do

begin

M[i,j]:=StrToFloat(StringGrid1.Cells[j,i]);

end;

// открывается вторая форма

Form2.Show;

// количеству строк и столбцов компонента StringGrid на второй форме

// присваивается значение порядок: матрицы +1

Form2.StringGrid1.RowCount:=N+1;

Form2.StringGrid1.ColCount:=N+1;

// подписываются заголовок таблицы, и номера строк

For i:=1 to Form2.StringGrid1.RowCount do

Form2.StringGrid1.Cells[i,0]:= IntToStr(i);

For j:=1 to Form2.StringGrid1.ColCount do

Form2.StringGrid1.Cells[0,j]:= IntToStr(j);

{ вывод в компонент StringGrid на второй форме транспонированной матрицы}

{ Транспонированная матрица не создается. Транспонирование осуществляется путем вывода столбца исходной матрицы в строку компонента StringGrid. В StringGrid номер столбца i, номер строки j.}

For i:=1 to Form2.StringGrid1.ColCount-1 do

For j:=1 to Form2.StringGrid1.RowCount-1 do

Form2.StringGrid1.Cells[i,j]:=FloatToStr(M[i,j]);

end;

{ Процедура подготовки таблицы на форме для ввода квадратной матрицы, которая выполняется при выходе из поля ввода размерности матрицы.}

procedure TForm1.Edit1Exit(Sender: TObject);

Var i,j:Integer;//номера строки столбца квадратной матрицы

begin

// порядок матрицы получает свое значение из поля ввода

N:=StrToInt(Edit1.Text);

// свойство количество строк компонента StringGrid

// получает значение: порядок +1

StringGrid1.RowCount:=N+1;

// свойство количество столбцов компонента StringGrid

// получает значение порядок: +1

StringGrid1.ColCount:=N+1;

//подпись заголовка таблицы

For i:=1 to StringGrid1.RowCount do

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

//подпись строк таблицы

For j:=1 to StringGrid1.ColCount do

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

// добавление в свойства таблицы признака

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

StringGrid1.Options:= StringGrid1.Options +[goEditing];

end;

procedure TForm1.Button3Click(Sender: TObject);

begin

Form1.Close

end;

// процедура вычисляет след матрицы и выводит результат

// на третью форму

procedure TForm1.Button2Click(Sender: TObject);

Var i: Integer;

begin

Sled:=0;

Form3.Show;

For i:=1 to Form1.StringGrid1.ColCount-1 do

Sled:= Sled + M[i,i];

Form3.Label2.Caption:=' След матрицы равен ' + FloatToStr(Sled)

end;

end.

{ Модуль, связанный со второй формой}

unit Unit2;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids;

type

TForm2 = class(TForm)

StringGrid1: TStringGrid;

Button1: TButton;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);

begin

Form2.Close

end;

end.

{ Модуль, связанный с третьей формой.}

unit Unit3;

interface

uses

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

Dialogs, StdCtrls;

type

TForm3 = class(TForm)

Label1: TLabel;

Label2: TLabel;

Button1: TButton;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

M :array [1..100,1..100] of Extended;

N:Integer;

Sled: Extended;

end;

var

Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);

begin

Form3.Close

end;

end.

Тестовый пример

Задачи для самостоятельного решения

Группа А

№ 6.1. Дана действительная матрица размера N х M элементов:

a11 a12 a13 ... a1m

а21 a22 a23 ... a2m

.................... …

аn1 an2 an3 ... anm

Найти сумму положительных элементов матрицы.

№ 6.2. Дана целочисленная квадратная матрица порядка n. Найти номера строк: а) все элементы которых — нули; б) все элементы которых четны.

№ 6.3. Дана действительная матрица размера N х M элементов, все элементы которой различны. Найти наибольший и наименьший элементы матрицы.

№ 6.4. Дана целочисленная квадратная матрица порядка n. Подсчитать: а) количество нулей, стоящих на главной диагонали; б) количество единиц в матрице.

№ 6.5. Дана действительная матрица размера N х M элементов, все элементы которой различны. Указать номер строки и столбца, на пересечении которых находится минимальный элемент матрицы. Подсчитать количество отрицательных элементов.

№ 6.6. Дана целочисленная квадратная матрица порядка n. Найти номера строк: а) все элементы которых положительны; б) все элементы которых нечетны.

№ 6.7. Дана целочисленная квадратная матрица порядка n. Найти номера столбцов: а) все элементы которых отрицательны; б) все элементы которых равны нулю.

№ 6.8. Дана действительная матрица размера N х M элементов:

a11 a12 a13 ... a1m

а21 a22 a23 ... a2m

.................... …

аn1 an2 an3 ... anm

Найти номера строк матрицы, где все элементы различны.

№ 6.9. Дана целочисленная квадратная матрица порядка n. Подсчитать: а) произведение элементов главной диагонали; б) количество нулей.

№ 6.10. Дана действительная матрица размера N х M элементов, все элементы которой различны. Вывести элементы матрицы, которые меньше среднего арифметического из ее элементов.

Группа Б

№ 6.11. Дана матрица A размера N х M элементов, содержащая вещественные числа,. Сформировать из нее массив B, состоящий из сумм положительных элементов каждой строки; если таких в строке нет, результат должен быть равен 0.

№ 6.12. Дана матрица A размера N х M элементов, содержащая вещественные числа,. Сформировать из нее массив B, состоящий из произведений положительных элементов каждой строки; если таких в строке нет, результат должен быть равен 0.

№ 6.13. Дана матрица A размера N х M элементов , содержащая вещественные числа. Сформировать из нее массив B, состоящий из сумм отрицательных элементов каждой строки; если таких в строке нет, результат должен быть равен 0.

№ 6.14 Дана матрица A размера N х M элементов, содержащая вещественные числа. Сформировать из нее массив B, состоящий из числа отрицательных элементов каждой строки.

№ 6.15. Дана действительная матрица размера N х M элементов:

| a11 a12 a13 ... a1m|

|а21 a22 a23 ... a2m |

| .................... |

|аn1 an2 an3 ... anm|

Получить последовательность b1,..., bn, где bk — произведение квадратов тех элементов k-й строки, модули которых принадлежат отрезку [1,1.5].

№ 6.16. Даны: натуральное число n, целочисленная квадратная матрица порядка n. Получить последовательность b1,...,bn, где bi — сумма элементов, расположенных за первым отрицательным элементом в i-й строке (если все элементы строки неотрицательны, то принять bi= –1).

№ 6.17. Дана действительная матрица размера n x m, в которой не все элементы равны нулю. Получить новую матрицу путем деления всех элементов данной матрицы на ее наибольший по модулю элемент.

№ 6.18. Даны натуральное число n, действительное число x, действительная матрица размера n х 2n. Получить последовательность b1,...,bn из нулей и единиц, где bi=1, если элементы i-й строки матрицы не превосходят х, и bi=0 в противном случае.

№ 6.19. Дана целочисленная квадратная матрица a порядка m. Строку с номером i матрицы назовем отмеченной, если aij>0, и неотмеченной в противном случае.

а) Нужно все элементы, расположенные в неотмеченных строках матрицы, преобразовать по правилу: отрицательные элементы заменить на –1, положительные — на 1, а нулевые оставить без изменения.

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

№ 6.20. Дана действительная квадратная матрица порядка n. Получить x1xn+ x2 xn-1 + ... + xn x1 , где xk — наибольшее значение элементов k–й строки данной матрицы.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]