85232 (612479), страница 5
Текст из файла (страница 5)
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 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 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;
var OutMass: TVS_MassData);
//Передаем данные из InMass в OutMass;
Var
I,
J : Integer;
begin
for i := 0 to InMAss.M - 1 do //Пробегаемся по строкам
for j := 0 to InMAss.N - 1 do //Пробегаемся по столбцам
OutMass.Mass[i, j] := InMass.Mass[i, j]; //Переносим значения из InMAss в OutMas
OutMass.M := InMAss.M; //Переносим число, определяющее количество строк
OutMass.N := InMAss.N; //Переносим число, определяющее количество столбцов
OutMass.Name := InMAss.Name; //Переносим название массива
end;
procedure TMainForm.VS_MinorMass(InMass : TVS_MassData; var OutMass: TVS_MassData);
//Находим все миноры входящей матрицы
//InMass - массив, в котором будем искать миноры
//OutMass - массив минор
Var
i,
j : Integer;
begin
If InMass.M <> InMass.N Then Exit; //Вышли, так как мартица не квадратная
For I := 0 to InMass.M - 1 Do //пробегаемся по строкам
For J := 0 To InMass.N - 1 do //Пробегаемся по столбцам
OutMass.Mass[I,J] := VS_Minor(I +1, J +1 , InMass); //Получили I, J минор и занесли в массив OutMass
OutMass.M := InMass.M;
OutMass.N := InMass.N;
end;
procedure TMainForm.N6Click(Sender: TObject);
begin
VS_MinorMass(MassA, MassC);
VS_ShowMass('Минор', MassC);
VS_ShowMassToMemo('Минор', MassC);
end;
procedure TMainForm.N7Click(Sender: TObject);
begin
VS_MinorMass(MassB, MassC);
VS_ShowMass('Минор', MassC);
VS_ShowMassToMemo('Минор', MassC);
end;
procedure TMainForm.N8Click(Sender: TObject);
begin
VS_MinorMass(MassC, MassC);
VS_ShowMass('Минор', MassC);
VS_ShowMassToMemo('Минор', MassC);
end;
procedure TMainForm.lll1Click(Sender: TObject);
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
Else ResultMemo.Lines.Add('Матрицы не равны')
end;
procedure TMainForm.VS_InitMassPErebor;
//Создаем массив переборов для вычесления Детерминант формулы Коши-Бине
// Все действия делаются над массивом MAssP
Var
I, J, Curr : Integer;
begin
Curr := 0; //Текущий элемент массива
SetLength(MassP, MassA.N * MassA.M); //Установили размерность
For I := 0 to MassA.M -1 do //Пробегаемся по строкам
For J := 0 to MassA.N -1 do //Пробегаемся по столбцам
Begin
MassP[Curr] := J +1; //Заполняем массив строками-перестановками/столбцами-перестановками
Inc(Curr); //Перешли к след. элеенту массива
end;
//VS_SortMassPerebor
end;
procedure TMainForm.VS_GetMAssForDet;
//Формуриуем массив для вычисления Дет.
//Данные перестановки уже должны хранится в массиве MassP
//т. е уже нужно иметь Массив А и уже должна быть выполнена VS_InitMassPErebor;
Var I, J : Integer;
Det : Real;
SA, SB : String;
TempB,
TempA : TVS_MassData; //Н*М мерный массив миноров
begin
ResultMemo.Lines.Add('Переборы: ');
SetLength(TempA.Mass, MAssA.M, MAssA.M);
SetLength(TempB.Mass, MAssB.N, MAssB.N);
SetLength(DetA, MassA.N);
SetLength(DetB, MassB.M);
TEmpA.M := MAssA.M;
TEmpA.N := MAssA.M;
TEmpB.M := MAssB.N;
TEmpB.N := MAssB.N;
For I := 0 to MassPer.M - 1 do //пробегаемся по строкам
Begin
SA:= IntToStr(I +1) + 'A) ';
SB:= IntToStr(I +1) + 'B) ';
For J := 0 to MassPer.N - 1 do //Пробегаемся по всем столбцам -1
begin
SA:= SA + FloatToStr(MassPer.Mass[I, J]) + ' ';
SB:= SB + FloatToStr(MassPer.Mass[I, J]) + ' ';
VS_GenerateColMinorData(J, Trunc(MassPer.Mass[I, J]), TempA);
VS_GenerateRowMinorData(J, Trunc(MassPer.Mass[I, J]), TempB);
end;{For J := 0 to MassPer.N - 1 do //Пробегаемся по всем столбцам -1}
ResultMemo.Lines.Add('');
ResultMemo.Lines.Add(SA);
VS_ShowMassToMemo('', TempA, False);
DetA[I] := VS_Det(TempA);
ResultMemo.Lines.Add('DetA = ' + FloatToStr(Deta[I]));
ResultMemo.Lines.Add('');
ResultMemo.Lines.Add(SB);
VS_ShowMassToMemo('', TempB, False);
DetB[I] := VS_Det(TempB);
ResultMemo.Lines.Add('DetB = ' + FloatToStr(DetB[I]));
end;{For I := 0 to MassPer.M - 1 do //пробегаемся по строкам}
end;
procedure TMainForm.VS_GenerateColMinorData(CurCol, Col: Integer;
var inMass: TVS_MassData);
//Формируем массив минор для КоШИ_БИНЕ
//На входе
//CurCol - номер столбюца в новом массиве
//COl - номер столбца для массива, с которого будем брать значения
//InMass - массив, в который будем заносить значения
Var I : Integer;
begin
For I := 0 To MassA.M -1 do
inMass.Mass[I, CurCol] := MassA.Mass[I, Col -1];
end;
procedure TMainForm.VS_SortMassPerebor;
//Сортируем элементы массива переборов для правильного вычисления миноров
Var
K, I, J, Curr : Integer;
Rez : Real;
begin
For I := 0 to MassPer.M - 1 do //пробегаемся по строкам
For J := 0 to MassPer.N - 2 do //Пробегаемся по всем столбцам -1
For K := J + 1 to MassPer.N - 1 do
If MassPer.Mass[I, j] > MassPer.Mass[I, K] Then //Текущий элемент больше следующего - меняем местами
Begin
REz := MassPer.Mass[I, j];
MassPer.Mass[I, j] := MassPer.Mass[I, K];
MassPer.Mass[I, K] := Rez;
end;
end;
procedure TMainForm.VS_Init2xMassPerebot;
//Формируем 2хмерный массив переборов
//На выходе будет M*N мерный массив переборов (не сортированый)
Var I, J, Curr, CurCol, CurRow : Integer;
Det : Real;
S : String;
begin
Curr := 0; //Текущий элемент в массиве MassP
SetLEngth(MassPer.Mass, MassA.N, MassA.M); //Установвили размерность массива перестановок
MassPer.M := MassA.N; //Задали размерность
MassPer.N := MassA.M; //Задали размерность
CurRow := 0; //Текущая строка нового массива
For I := 0 to MassA.N -1 Do //Запускаем по строкам
begin
CurCol := 0; // Текущий столбец/строка нового массива
For J := 0 to MassA.M - 1 do
Begin
MassPer.Mass[CurRow, CurCol] := MassP[Curr];
Inc(Curr); //Перешли к новому элементу массива MassP
Inc(CurCol); //Перешли к нововму столбцу нового массива
end; {For J := 0 to MassA.M - 1 do}
Inc(CurRow); //Перешли к новой строке нового массива
end;{For I := 0 to MassA.N -1 Do //Запускаем}
end;
procedure TMainForm.VS_GenerateRowMinorData(CurCol, Col: Integer;
var InMass: TVS_MassData);
//Формируем массив минор для КоШИ_БИНЕ
//На входе
//CurCol - номер столбюца в новом массиве
//COl - номер столбца для массива, с которого будем брать значения
//InMass - массив, в который будем заносить значения
Var I : Integer;
begin
For I := 0 To MassB.N -1 do
inMass.Mass[CurCol, I ] := MassB.Mass[Col -1,I];
end;
Function TMainForm.VS_GetKoshi_Bine: Real;
//Вычисляем формулу Коши-Бине
// ьПеред вызовом должны быть выполнены след. условия:
//1 - введен масив а и б
//выполнены след. процедуры
//VS_InitMassPErebor;
//VS_Init2xMassPerebot ;
//VS_SortMassPerebor;
//VS_GetMAssForDet
//
Var I : Integer;
S : String;
begin
Result := 0;
S := '';
For I := 0 to MassA.N - 1 do
Begin
REsult := REsult + DetA[I] * Detb[I];
S := S + ' (' + FloattoStr(DetA[I])+ ')*(' + FloattoStr(DetB[I] ) + ') + ';
end;
ResultMemo.Lines.Add('C = ' + (Copy(S, 1, Length(s) -2)));
end;
function TMainForm.VS_IfMassEq(Massin1, MAssIn2: TVS_MassData): Boolean;
//Сравниваем 2 мартицы
//Получаем True, если
//1. число строк матрицы 1 - числу столбцов матрицы 2
//2. число стоблцов матрицы 1 = числу строк матрицы 2
begin
Result := (Massin1.M = MAssIn2.N) And (Massin1.N = MAssIn2.M)
end;
procedure TMainForm.VS_VerMass(var Massin1, MAssIn2: TVS_MassData);
//Проверяем матрицы
//Если Столбцв матрицы А меньше, чем в Б, меняем матрицы местами
Var TempMass: TVS_MassData;
begin
If Massin1.N < MAssIn2.N Then
Begin
SetLength(TempMass.Mass, MassIn1.M, MassIn1.N);
TempMass := Massin1;
SetLength(Massin1.Mass, MassIn2.M, MassIn2.N);
Massin1 := MAssIn2;
SetLength(Massin2.Mass, TempMass.M, TempMass.N);