Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 7.doc
Скачиваний:
3
Добавлен:
21.11.2019
Размер:
198.14 Кб
Скачать

6.2.5. Пример 1: умножение матрицы на строку

Рассмотрим задачу умножения матрицы 3*3, состоящую из целых чисел, на столбец с использованием компонентов TStringGrid.

Создадим новый проект и на форму выставим три компонента TStringGrid и кнопку Button1. В первых двух таблицах данные будут вводиться, а в третьей будет выводится столбец результата умножения.

В Инспекторе Объектов изменим свойства компонентов:

StringGrid1

ColCount

3

Число столбцов

RowCount

3

Число строк

DefaultColWidth

60

Ширина колонок

DefaultRowHeight

20

Высота строк

FixedCols

0

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

FixedRows

0

Нет фиксированных строк

Options

[…,goEditing]

Ячейки можно редактировать

StringGrid2

ColCount

1

Число столбцов

RowCount

3

Число строк

DefaultColWidth

60

Ширина колонок

DefaultRowHeight

20

Высота строк

FixedCols

0

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

FixedRows

0

Нет фиксированных строк

Options

[…,goEditing]

Ячейки можно редактировать

StringGrid3

ColCount

1

Число столбцов

RowCount

3

Число строк

DefaultColWidth

60

Ширина колонок

DefaultRowHeight

20

Высота строк

FixedCols

0

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

FixedRows

0

Нет фиксированных строк

Button1

Caption

Exit

Рис. 6.4

В результате форма должна принять вид как на рис. 6.4.

Мы будем разрешать ввод только целых чисел и, поэтому, на событие onGetEditMask компонента StringGrid1 создадим обработчик события, задающий маску редактора строки:

procedure TForm1.StringGrid1GetEditMask(Sender:

TObject; ACol,ARow: Integer; var Value: String);

begin

Value :='00000;1; ';

end;

Точно такой же обработчик события создадим для компонента StringGrid2.

Для первоначального заполнения таблиц в момент активизации формы заполним нулями ячейки таблиц StringGrid1 и StringGrid2:

procedure Tform1.FormActivate(Sender: Tobject);

var

i,j: byte;

begin

with StringGrid1 do

for i:=0 to ColCount-1 do

for j:=0 to RowCount-1 do Cells[i,j]:='0';

with StringGrid2 do

for i:=0 to RowCount-1 do Cells[0,i]:='0';

end;

Основное событие таблицы StringGrid1 (заполнение ячеек третьей таблицы) назначим на событие onSetEditText, возникающее при изменении содержимого ячейки:

procedure Tform1.StringGrid1SetEditText(Sender:

Tobject; Acol,Arow: Integer; const Value: String);

var

i,j,Sum: integer;

begin

for j:=0 to StringGrid1.ColCount-1 do

begin

Sum:=0;

for i:=0 to StringGrid1.ColCount-1 do

begin

Sum:=Sum+MyStrToInt(StringGrid1.Cells[i,j])*

MyStrToInt(StringGrid2.Cells[0,i]);

end;

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

end;

end;

Такое же событие для компонента StringGrid2 в Инспекторе Объектов направим на событие StringGrid1SetEditText.

Преобразование содержимого ячеек реализует целочисленная функция MyStrToInt:

function TForm1.MyStrToInt(s: string): integer;

var

k,Code: integer;

begin

while (s<>'') and (s[Length(s)]=' ') do

Delete(s,Length(s),1);

if s<>'' then

begin

Val(s,k,Code);

if Code=0

then MyStrToInt:=k

else MyStrToInt:=0;

end

else MyStrToInt:=0;

end;

которая очищает строку от пробелов и проверяет возможность преобразования строки в число.