ShowHint := True; //Разрешаембыстрыеподсказки
lbPrompt1.Caption := 'Размерность N ';
//Настройка эелемента ввода для размерности массива по строкам - М
sedtRazmA.MinValue := 1; //Установили минимальное знаечение для ввода-переключателя
sedtRazmA.MaxValue := MaxN ; //Установили максимальное значение для ввода - переключателя
sedtRazmA.Value := MassA.N; //Установили значение, выводимое на экран
//Настройка эелемента ввода для размерности массива по столбцам - N
sedtRazmB.MinValue := 1; //Установили минимальное знаечение для ввода-переключателя
sedtRazmB.MaxValue := MaxM; //Установили максимальное значение для ввода - переключателя
sedtRazmB.Value := MassA.M; //Установили значение, выводимое на экран
lbPrompt2.Caption := 'Размерность M ';
btnNext.Caption := 'Далее';
btnCancel.Caption := 'Отмена';
If InRazmForm.ShowModal = Mrok Then //если пользователь нажал кнопку "Далее"
Begin
MassA.N := sedtRazmA.Value; //Сохраняем размерность массива
MassA.M := sedtRazmB.Value; //Сохраняем размерность массива
VS_InputMass(MassA); //Выводим сетку для ввода масива
end; {If ShowModal = Mrok Then}
end; {With InRazmForm do}
end; {procedure TMainForm.InputMassAClick(Sender: TObject);}
procedure TMainForm.NMultiplicationClick(Sender: TObject);
//Умножениематриц
begin
VS_MultiplicMass(MassA, MassB, MassC); //Умножаемматрицы
VS_ShowMassToMemo('Результат произведения A*B получился ', MassC); //Результат выводим в Мемо
VS_ShowMass('Итоговый результат ', MassC); //Выводим результаты расчета
end;
procedure TMainForm.VS_MultiplicMass(var inMassA, InMassB, MassOut: TVS_MassData);
//Умножаем матрицы
//N, M - размерность матрицы, где
//N - стоблец
//M - строка
//inMassA - массив А
//inMassB - массив Б
//MassOut - массив С / выходной массив
Var P, i, j : Integer;
S : Real;
begin
For I := 0 to inMassA.M - 1 do // i = 1.. m
For J := 0 to inMassB.N - 1 do // j = 1.. k
begin
S := 0; //Сбнуляемсчетчик
For P := 0 to inMassA.N -1 do // p = 1..n
S := S + inMassA.Mass[i, p] * InMassB.Mass[p, j]; //Вычисляемпоформуле (Cij = Ep (Aip *Bpj)? где i=1..m, j = 1..k)
MassOut.Mass[I, J] := s; //Сохраняем результат в массив С
end;
MassOut.N := inMassB.N; //Сохраняем получившиюся размерность массива С
MassOut.M := inMassA.M; //Сохраняем получившиюся размерность массива С
end;
procedure TMainForm.InputMassBClick(Sender: TObject);
begin
If InRazmForm = Nil Then Application.CreateForm(TInRazmForm, InRazmForm);
With InRazmForm do
Begin
Caption := 'ВводразмерностирядаБ';
Hint := Caption;
ShowHint := True; //Разрешаем быстрые подсказки на форме
lbPrompt1.Caption := 'Размерность N ';
sedtRazmA.MinValue := 1; //Установили минимальное знаечение для ввода-переключателя
sedtRazmA.MaxValue := MaxN; //Установили максимальное значение для ввода - переключателя
sedtRazmA.Value := MassB.N; //Установили значение, выводимое на экран
sedtRazmB.MinValue := 1; //Установили минимальное знаечение для ввода-переключателя
sedtRazmB.MaxValue := MaxM; //Установили максимальное значение для ввода - переключателя
sedtRazmB.Value := MassB.M; //Установили значение, выводимое на экран
lbPrompt2.Caption := 'Размерность M ';
btnNext.Caption := 'Далее';
btnCancel.Caption := 'Отмена';
If ShowModal = Mrok Then //если пользователь нажал "Далее"
Begin
MassB.N := sedtRazmA.Value; //Сохраняем размерность массива
MassB.M := sedtRazmB.Value; //Сохраняем размерность массива
VS_InputMass(MassB); //Выводи окно с сеткой для ввода массива
end{If ShowModal = Mrok Then}
end; {With InRazmForm do}
end;
procedure TMainForm.VS_ShowMass(inCaption : String; inMass: TVS_MassData);
//Выводим массив
//N, M - размерность матрицы, где
//N - стоблец
//M - строка
//inMass - массив, который выводим
Var
I, K : Integer;
begin
If InMassForm = Nil Then Application.CreateForm(TInMassForm, InMassForm);
with InMassForm do
Begin
Caption := 'Выводмассива';
strGrid.RowCount := InMass.M+1;
strGrid.ColCount := inMAss.N+1;
For I := 0 To inMAss.N -1 do //Выводимшапкудлястолбцов
strGrid.Cells[I + 1, 0] := 'N = ' + IntToStr( I + 1);
For I := 0 To inMAss.M -1 do //Выводимшапкудлястрок
strGrid.Cells[0, I + 1] := 'M = ' + IntToStr( I + 1);
btnNext.Caption := 'Ok';
btnCancel.Visible := False; //Выключаемкнопку "Отмена". Она нам не нужна
For I := 0 To inMAss.N -1 do //Пробегаемся по строкам
For K := 0 To inMAss.M -1 do //Пробегаемся по столбцам
InMassForm.strGrid.Cells[I +1,K +1] := FloatToStr(inMass.Mass[K, I]); //Выводим в сетку ранее сохраненный массив
ShowModal; //Выводим окно, ждем реакции пользователя
btnCancel.Visible := True; //Не забываем включить кнопку "Отмена", иначе ее не увидят в других нужных нам метсах
end; {with InMassForm do}
End;
procedure TMainForm.FormShow(Sender: TObject);
//Обрабатываемся прри вызове формы
Var I, J : Integer;
begin
//Обнуляем массивы, во избежание шаманских действий программы
SetLength(MassA.Mass, MaxM , MaxN ); //Установили размер массива в памяти
SetLength(MassB.Mass, MaxM , MaxN ); //Установили размер массива в памяти
SetLength(MassC.Mass, MaxM , MaxN ); //Установили размер массива в памяти
For I := 0 to MaxM - 1 Do //Пробегаемся по строкам
For J := 0 to MaxN - 1 do //Пробегаемся по столбцам
Begin
MassA.Mass[I, J] := 0;
MassB.Mass[I, J] := 0;
MassC.Mass[I, J] := 0;
end; {For J := 1 to MaxN do}
//Обнуляем переменные размерностей массивов
MassA.N := DefValueMas; //Устанавливаем размерность матрицы по умолчанию
MassA.M := MassA.N;
MassB.N := MassA.N;
MassB.M := MassA.N;
MassC.N := MassA.N;
MassC.M := MassA.N;
MassA.Name := 'A';
MassB.Name := 'B';
MassC.Name := 'C';
ResultMemo.Clear; //ОчищаемМемо-поле.
end;
procedure TMainForm.VS_InputMass(var InMass: TVS_MassData);
//Вводим Элементы массива
Var
I, K : Integer;
begin
If InMassForm = Nil Then Application.CreateForm(TInMassForm, InMassForm);
with InMassForm do
Begin
Caption := 'Вводмассива';
strGrid.RowCount := InMass.M+1; //указали количество строк рамным М
strGrid.ColCount := InMass.N+1; //Указали количество столбцов, равным N
For I := 0 To InMass.N -1 do //Делаемшапкудлястолбцов
strGrid.Cells[I +1, 0] := 'N = ' + IntToStr( I +1);
For I := 0 To InMass.M -1 do //Делаемшапкудлястрок
strGrid.Cells[0, I +1] := 'M = ' + IntToStr( I +1);
//Заносим результаты массива в сетку, если вводили ранее
For I := 0 to InMass.M -1 do //Пробегаемся по строкам массива
For K := 0 to InMass.N -1 do //Пробегаемся по столбцам массива
Try
strGrid.Cells[I+1, K+1] := FloatToStr (InMass.Mass[K, I]); //Выводиммассиввсетку
except
strGrid.Cells[I+1, K+1] := '0';
end;
btnNext.Caption := 'Далее';
btnCancel.Caption := 'Отмена';
If ShowModal = Mrok Then //Выводим форму, ждем реакции пользователя
Begin
SetLength(MassA.Mass, InMass.M +1 , InMass.N +1); //Установили размер массива в памяти
For I := 0 To InMass.N -1 do //Пробегаемся по строкам массива
For K := 0 To InMass.M -1 do //Пробегаемся по столбцам массива
Try //Включаем обработку ошибок
InMass.Mass[K, I] := StrToInt(InMassForm.strGrid.Cells[I +1,K +1]); // Заносим элемент из сетки в массив
except //Если произошла ошибка, например с переводом строки в число
InMass.Mass[I, K] := 0; //Если ошибка - заносим в массив 0
end; {except}
VS_ShowMassToMemo('Успешно введена матрица ',InMass); //Выводим матрицу в Мемо
end;{If ShowModal = Mrok Then}
end;
end;
procedure TMainForm.N3Click(Sender: TObject);
//Выводим результат. Просто выводим массив
begin
VS_ShowMass('', MassC)
end;
procedure TMainForm.nDetAClick(Sender: TObject);
//Определяем определитель матрицы А
Var Det : Real;
begin
Det := VS_Det(MassA); //ВЫчисляем определитель
ResultMemo.Lines.Add('Определитель матрицы А равен ' + FloattoStr(Det)); //Выводим результат в Мемо
ShowMessage(FloatToStr(Det)); //Выводим результат в диалоговое окно
end;
procedure TMainForm.NDetBClick(Sender: TObject);
//Определяем определитель матрицы B
Var Det : Real;
begin
Det:= VS_Det(MassB); //Вычисляем определитель
ResultMemo.Lines.Add('Определитель матрицы B равен ' + FloattoStr(Det)); //Результат вычислений выводим в МЕмо
ShowMessage(FloatToStr(Det)); //Результат выводим в диалоговое окно
end;
procedure TMainForm.VS_ShowMassToMemo(Caption : String; InMass: TVS_MassData; ShowRazm : Boolean = True);
//Выводим массив в МЕмо
Var S : String;
I, J : Integer;
begin
If ShowRazm Then ResultMemo.Lines.Add(Caption + InMass.Name + ' m = ' + IntToStr(InMass.M) + ' n = ' + IntToStr(InMass.n))
Else ResultMemo.Lines.Add(Caption );
For I := 0 to InMass.M - 1 do //Пробегаемсяпострокам
Begin
S := ''; //Готовимся к формированию строки
For J := 0 To InMass.N -1 Do //Пробегаемся по столбцам
S := S + FloatToStr(InMass.Mass[i,j]) + ' '; //Формируем строку элементов
ResultMemo.Lines.Add(S); //Выводим строку в Мемо
end;{For I := 0 to InMass.M - 1 do //Пробегаемсяпострокам}
end;
procedure TMainForm.N5Click(Sender: TObject);
Var DetA, DetB, Det : Real;
begin
ResultMemo.Clear;
//Решаем det C обычнымспособом
VS_VerMass(MAssA, MAssB); //Проверяеммассивы. Если в первом массиве число столбцов меньше, чем во втором, меняем матрицы местами
ResultMemo.Lines.Add('1)');
VS_ShowMassToMemo('Пусть ', MassA); //Выводим матрицу А
VS_ShowMassToMemo('', MassB); //Выводим матрицу Б
VS_MultiplicMass(MassA, MassB, MassC); //Умножаемматрицы
VS_ShowMassToMemo('получаем матрицу ', MassC); //Выводим матрицу С
Det := VS_Det(MassC);
ResultMemo.Lines.Add('Итого: Det C = ' + FloatToStr(Det));
ResultMemo.Lines.Add('2)');
//Решаем по Бине-Коши
If (MassA.M > MassA.N) Then
Begin //попали под условие, когда М>n , значит определитель равен 0
ResultMemo.Lines.Add('m > n массива А , исходя из т. Бине - Коши, DetC = 0');
Exit //Завершаемпроцедуру
end;
//If (MassB.M > MassB.N) Then
// Begin //попали под условие, когда М>n , значит определитель равен 0
// ResultMemo.Lines.Add('m > n массива B , исходя из т. Бине - Коши, DetC = 0');
// Exit//Завершаемпроцедуру
// end;
If (MassA.M = MassA.N) And (MassA.M = MassA.N)
Then //попали под условие, когда обе матрицы кувадратные
Begin
ResultMemo.Lines.Add('m = n массивов B и А, исходя из т. Бине - Коши, ');
DetA := VS_Det(MassA);
DetB := VS_Det(MassB);
Det := DetA * DetB;
ResultMemo.Lines.Add('DetC = detA * Det B = ' + FloatToStr(DetA) + ' * ' + FloatToStr(DetB) + ' = ' + FloatToStr(Det));
end;
If (MassA.M < MassA.N) And (MassB.M > MassB.N) Then
Begin
IF VS_IfMassEq(MAssA, MAssB)
Then
BEgin
VS_VerMass(MAssA, MAssB);
VS_InitMassPErebor;
VS_Init2xMassPerebot ;
VS_SortMassPerebor;
VS_GetMAssForDet;
ResultMemo.Lines.Add('ИтогопоформулеКоши - Бине: ' + FloattoStr(VS_GetKoshi_Bine))
end{IF VS_IfMassEq(MAssA, MAssB)}
Else ResultMemo.Lines.Add('Матрицынеравны')
end;{If (MassA.M < MassA.N) And (MassB.M > MassB.N) Then}
end;
procedure TMainForm.DetCClick(Sender: TObject);
Var Det : Real;
begin
Det := VS_Det(MassC); //ВЫчисляемопределитель
ResultMemo.Lines.Add('Определитель матрицы C равен ' + FloattoStr(Det)); //Выводим результат в Мемо
ShowMessage(FloatToStr(Det)); //Выводим результат в диалоговое окно
end;
function TMainForm.VS_Minor(II, Jj: Integer; InMass : TVS_MassData): REal;
//Вычислаем минор
Var
Col, //Текущий столбец новой матрицы
Row, //Текущая строка новой матрицы
I, J : Integer;
TempMass : TVS_MassData;
begin
If InMass.M <> InMass.N Then Exit; // Матрица не квадратная - убегаем
SetLength(TempMass.Mass, InMass.M -1, InMass.N -1);//Установили размер матрицы
Row := 0;
For I := 0 To InMass.M -1 Do
begin
Col := 0; //Начали новый массив с первого элемента
If I <> II -1 Then
Begin //Отбрасываем I строку
For J := 0 To InMass.N -1 do
If J <> JJ -1 Then
Begin //Перебираем все столюцы, кроме J
TempMass.Mass[Row,Col] := InMass.Mass[I,J];
Inc(Col);
end;{If J <> JJ Then}
Inc(Row); //Перешли на сл. строку для нового массива
end;{If I <> II Then}
end; {For I := 0 To InMass.M Do}
TempMass.M := InMass.M - 1;
TempMass.N := InMass.N - 1;
Result := VS_Det(TempMass);
end;
procedure TMainForm.AssignMass(InMAss: TVS_MassData;