Лабораторная работа 3
АЛГЕБРА И ФОРМИРОВАНИЕ МАТРИЦ
Задание. Сформировать целочисленную матрицу и матрицу из вещественных чисел и найти их произведение.
Создайте новый проект командой Файл/Новый/Приложение.
Сохраните файлы модуля и проекта командой Файл/Сохранить все под именами LR3 и PR_LR3. Для этого удобно использовать соответствующую быструю кнопку (Сохранить все). В последующих сеансах работы сохраненный проект можно открыть командой Файл/Открыть проект (или Повторно открыть). Теперь перейдем к проектированию приложения - переносам на форму необходимых компонентов и заданию их свойствам значений, а в обработчиках событий – размещению кодов соответствующих алгоритмов. (Рекомендуется нажимать кнопку Сохранить все по окончании работы с каждым компонентом.) В результате проектирования получим форму, представленную на рис.3.1.
Выделите форму, щелкнув на ней левой кнопкой мыши, и в свойство Caption (надпись) впишите АЛГЕБРА И ФОРМИРОВАНИЕ МАТРИЦ.
На форме размещены 12 меток Label (страница Стандарт), в свойство Caption (надпись) которых вписаны значения размеры, диапазон чисел, число строк, число столбцов, макс значение, мин значение; 4 кнопки Button (страница Стандарт), с надписями целочисленная матрица, матрица из вещественных чисел, произведение матриц, конец. Во всех перечисленных компонентах свойство Font имеет размер 10. Кроме того, на форме размещены три таблицы - компоненты StringGrid1,2,3 (страница Дополнительно). Заданы следующие значения свойств всех компонентов StringGrid: ColCount – 5, DefaultColWidth -48, FixedCols – 0, FixedRows – 0, Font – черный, обычный, размер 8, RowCount – 5. Раскрыв свойство Options в компонентах StringGrid1,2, установите значение подсвойства goEditing – true, что даст возможность редактировать таблицы в StringGrid1,2. Далее, на форме размещены 8 компонентов ввода целых чисел – CSpinEdit (страница Примеры). Во всех компонентах шрифт – обычный, размер – 8. У компонентов, расположенных под метками размеры, занесите: в свойство MaxValue – 10, MinValue – 1, Value - 3. У компонентов, расположенных под метками диапазон чисел и напротив меток макс значение занесите в свойство MaxValue – 100, MinValue – 0, Value – 5,
рис.3.1
рис.3.2
рис.3.3
а напротив меток мин значение - занесите в свойство MaxValue – 0, MinValue – -100, Value – -5. И, наконец, внизу формы размещен компонент StatusBar1 (страница Win32) – представляет собой ряд панелей, отображающих полосу состояния. Поскольку в нашем случае достаточно одной панели (для одного сообщения), то установите свойство SimplePanel = true. Свойство SimpleText представляет собой текст, который задается во время проектирования или программно (в нашем случае программно).
Файл LR3.cpp содержит обработчики событий - щелчков на кнопках: Button1 с надписью целочисленная матрица, Button2 с надписью матрица из вещественных чисел, Button3 с надписью произведение матриц, Button4 с надписью конец.
/---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "LR3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CSPIN"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
StatusBar1->SimpleText="";
StringGrid3->RowCount=0;
StringGrid3->ColCount=0;
StringGrid3->Cells[0][0]="";
StringGrid1->RowCount=CSpinEdit1->Value;
StringGrid1->ColCount=CSpinEdit2->Value;
for(int i=0;i<StringGrid1->RowCount;i++)
for(int j=0;j<StringGrid1->ColCount;j++)
StringGrid1->Cells[j][i]=IntToStr(
random(CSpinEdit3->Value-CSpinEdit4->Value+1)
+CSpinEdit4->Value);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
StatusBar1->SimpleText="";
StringGrid3->RowCount=0;
StringGrid3->ColCount=0;
StringGrid3->Cells[0][0]="";
StringGrid2->RowCount=CSpinEdit5->Value;
StringGrid2->ColCount=CSpinEdit6->Value;
for(int i=0;i<StringGrid2->RowCount;i++)
for(int j=0;j<StringGrid2->ColCount;j++){
float z=random(CSpinEdit7->Value-CSpinEdit8->Value+1)
+CSpinEdit8->Value
+(float)random(CSpinEdit7->Value-CSpinEdit8->Value+1)
/(CSpinEdit7->Value-CSpinEdit8->Value)-0.5;
if(z>CSpinEdit7->Value)z=CSpinEdit7->Value;
if(z<CSpinEdit8->Value)z=CSpinEdit8->Value;
StringGrid2->Cells[j][i]=FloatToStrF(z,ffGeneral,5,5);}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
if(StringGrid1->ColCount!=StringGrid2->RowCount){
StatusBar1->SimpleText=
"Число столбцов матрицы с ЦЧ не равно числу строк матрицы с ВЧ!";
CSpinEdit2->SetFocus(); return;}
StringGrid3->RowCount=CSpinEdit1->Value;
StringGrid3->ColCount=CSpinEdit6->Value;
for(int i=0;i<StringGrid1->RowCount;i++)
for(int j=0;j<StringGrid2->ColCount;j++){
float z=0;
for(int k=0;k<StringGrid1->ColCount;k++)
z+=StrToInt(StringGrid1->Cells[k][i])*
StrToFloat(StringGrid2->Cells[j][k]);
StringGrid3->Cells[j][i]=FloatToStrF(z,ffGeneral,5,5);}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
Сохранив все, запустите приложение на выполнение с заданными во время проектирования параметрами матриц. Результат представлен на рис.3.2. Чтобы убедиться в правильном перемножении матриц, сделайте одну из матриц единичной.
Измените параметры матриц подобно тому, как это сделано на рис.3.3, и получите сообщение в строке состояния. Щелчком на кнопке конец перейдите из режима выполнения в режим проектирования приложения.
