|
Программа на С++ Builder для знаходження оберненої матриці з використання елементарних перетворень |
ar F: Text; I,J: Byte; BeginIF Errors<> [0] Then Exit; IF Not Exist Then Begin NotExist; WriteError; Exit; End; Assign(F,Name); {$I-}ReWrite(F); IF IOResult<>0 Then Begin FileError; WriteError; Exit; End; For I: =1 to CLines doBeginFor J: =1 to CBars doBeginWrite(F,GetE(I,J): F1: F2,' '); IF IOResult<>0 Then Begin Close(F); WriteError; Exit; End; End; Writeln(F) End; Close(F); {$I+}End; Procedure Tabl. TooManySize; BeginErrors: =Errors+ [CTooManySize] ; AnyErrorEnd; Procedure Tabl. BadPosition; BeginErrors: =Errors+ [CBadPosition] ; AnyErrorEnd; Procedure Tabl. FileNotFound; BeginErrors: =Errors+ [CFileNotFound] ; AnyErrorEnd; Procedure Tabl. FileError; BeginErrors: =Errors+ [CFileError] ; AnyErrorEnd; Procedure Tabl. ReadError; BeginErrors: =Errors+ [CReadError] ; AnyErrorEnd; Procedure Tabl. WriteError; BeginErrors: =Errors+ [CWriteError] ; AnyErrorEnd; Procedure Tabl. OutOfData; BeginErrors: =Errors+ [COutOfData] ; AnyErrorEnd; Procedure Tabl. SearchError; BeginErrors: =Errors+ [CSearchError] ; AnyErrorEnd; Procedure Tabl. NotExist; BeginErrors: =Errors+ [CNotExist] ; AnyErrorEnd; Procedure Tabl. ZFE; BeginErrors: =Errors+ [CZFE] ; AnyErrorEnd; Procedure Tabl. UnkNownError; BeginErrors: =Errors+ [CUnkNownError] ; AnyErrorEnd; Procedure Tabl. AnyError; BeginEnd; Constructor TAbl. VMT; BeginExist: =False; End; Procedure Matrix. MSqr; Var i,j: Integer; BeginIF Not A. Exist Then Begin A. NotExist; BadOperands; MSqrError; Exit; End; IF A. Errors<> [0] Then Begin MsqrError; Exit; End; IF Self. Exist Then Del; Self. DataInit(A. CLines,A. CBars); For i: =1 to CLines doFor j: =1 to CBars doSetE(i,j,Sqr(A. GetE(i,j))); Self. SelfClear; End; Procedure Matrix. MDg; Var i,j: Integer; BeginIF Not A. Exist Then Begin A. NotExist; BadOperands; MDgError; Exit; End; IF A. Errors<> [0] Then Begin MDgError; Exit; End; IF A. CLines<>A. CBars Then Begin MNotSquare; MDgError; Exit; End; IF Exist Then Del; DataInit(A. CLines,A. CBars); For i: =1 to A. CLines doFor j: =1 to A. CBars doIF i=j Then SetE(i,j,A. GetE(i,j)) Else SetE(i,j,0); Self. SelfClear; End; Procedure Matrix. BadOperands; BeginErrors: =Errors+ [CBadOperands] ; AnyError; End; Procedure Matrix. MulError; BeginErrors: =Errors+ [CMulError] ; AnyError; End; Procedure Matrix. MDgError; BeginErrors: =Errors+ [CMDgError] ; AnyError; End; Procedure Matrix. SortError; BeginErrors: =Errors+ [CSortError] ; AnyError; End; Procedure Matrix. DetError; BeginErrors: =Errors+ [CDetError] ; AnyError; End; Procedure Matrix. DGaussError; BeginErrors: =Errors+ [CDGaussError] ; AnyError; End; Procedure Matrix. MSqrError; BeginErrors: =Errors+ [CMSqrError] ; AnyError; End; Procedure MAtrix. CuanZeeroError; BeginErrors: =Errors+ [CCuanZeeroError] ; AnyError; End; Procedure MAtrix. SwapError; BeginErrors: =Errors+ [CSwapError] ; AnyError; End; Procedure Matrix. MulToNumError; BeginErrors: =Errors+ [CMulToNumError] ; AnyErrorEnd; Procedure Matrix. DegrError; BeginErrors: =Errors+ [CDegrError] ; AnyErrorEnd; Procedure Matrix. IgError; BeginErrors: =Errors+ [CIgError] ; AnyErrorEnd; Procedure MAtrix. SelfClear; BeginLin: = [0] ; Bar: = [0] ; Plus: =True; Direction: =True; SortLines: =True; BeginZeero: =True; SpecialSort: =False; Chek: =0; Gauss: =False; DetForRev: =False; End; Procedure Matrix. AllClear; Begininherited AllClear; SelfClear; End; Procedure Matrix. Revers; VAr FM: Mem; BeginGauss: =False; InnerRevers(A); End; Procedure Matrix. RevWithGauss; Var FM: Mem; BeginGauss: =True; InnerRevers(A); End; Procedure Matrix. InnerRevers; Var P,A1: Matrix; D: TOE; i,j: Integer; Var Ver: TOE; Var FM: Mem; BeginIF Not A. Exist Then Begin A. NotExist; BadOperands; ReversError; Exit; End; IF (A. Errors<> [0]) Then Begin Exit; ReversError; End; IF (A. CBars<>A. Clines) Then Begin BadOperands; ReversError; Exit; End; P. VMT; P. DataInit(A. CLines,A. CBars); A1. VMT; A1: =A; IF A1. CLines=31 Then Begin Matrix31(A1). VMT; A1. Exist: =True; End; IF A1. CLines=63 Then Begin Matrix63(A1). VMT; A1. Exist: =True; End; IF Gauss Then D: =A1. DetWithGauss; IF D=0 ThenBeginMDegenerate; ReversError; Exit; End; DetForRev: =True; For i: =1 to P. Clines doBeginA. StepRevers; For j: =1 to P. CBars doBeginA1. Lin: =A1. Lin+ [i] ; A1. Bar: =A1. Bar+ [j] ; IF Gauss Then Ver: =A1. DetWithGauss; IF (A1. Errors<> [0]) or (A. Errors<> [0]) Then Begin ReversError; Exit; End; P. SetE(j, i,(Ver) *Sign(i+j) /D); A1. Lin: =A1. Lin- [i] ; A1. Bar: =A1. Bar- [j] ; End; End; IF Self. Exist Then Self. del; Self: =P; Self. SelfClear; End; Procedure Matrix. SwapBars(B1,B2: Integer); Var Prom: TOE; i: Integer; BeginIF Not Exist Then BEgin NotExist; SwapError; Exit; End; IF (Errors<> [0]) Then Begin SwapError; Exit; End; For i: =1 to CLines doBeginProm: =GetE(i,B1); SetE(i,B1,GetE(i,B2)); SetE(i,B2,Prom) End; End; Function Matrix. CuanZeeroInBar(B1: Integer): Integer; Var i: Integer; Sum: Integer; BeginIF Not Exist Then Begin NotExist; CuanZeeroError; Exit; End; IF (Errors<> [0]) Then Begin CuanZeeroError; Exit; End; Sum: =0; IF Not SpecialSortThenFor i: =1 to CLines do IF GetE(i,B1) =0 Then Inc(Sum) elseElseIF BeginZeeroThenBeginSum: =1; While (GetE(Sum,B1) =0) and (Sum<=CLines) do inc(Sum); Dec(Sum); EndElseBeginSum: =CLines; While (GetE(Sum,B1) =0) and (Sum>0) do Dec(Sum); Sum: =Clines-Sum; End; CuanZeeroinBar: =Sum; End; Procedure Matrix. ZeeroSortBars; Var i,j: Integer; Max,NMax,CZ: Integer; FM: Mem; BeginIF Not Exist Then Begin NotExist; Exit; End; IF (Errors<> [0]) Then Exit; RemSettings(FM); SortLines: =False; SpecialSort: =False; UniversalSort; RestoreSettings(FM); End; Function Matrix. CuanZeeroinLine(L1: Integer): Integer; Var i: Integer; Sum: Integer; BeginIF Not Exist Then Begin NotExist; CuanZeeroError; Exit; End; IF (Errors<> [0]) Then Begin CuanZeeroError; Exit; End; Sum: =0; IF Not SpecialSortThenFor i: =1 to CBars do IF GetE(L1, i) =0 Then Inc(Sum) elseElseIF BeginZeeroThenBeginSum: =1; While (GetE(L1,Sum) =0) and (Sum<=CBars) do inc(Sum); Dec(Sum); EndElseBeginSum: =CBars; While (GetE(L1,Sum) =0) and (Sum>0) do Dec(Sum); Sum: =CBars-Sum; End; CuanZeeroinLine: =Sum; End; Procedure Matrix. SwapLines(L1,L2: Integer); Var Prom: TOE; i: Integer; BeginIF Not Exist Then Begin NotExist; SwapError; Exit; End; IF (Errors<> [0]) Then Begin SwapError; Exit; End; For i: =1 to CBars doBeginProm: =GetE(L1, i); SetE(L1, i,GetE(L2, i)); SetE(L2, i,Prom) End; End; Procedure Matrix. ZeeroSortLines; VAr FM: Mem; BeginIF Not Exist Then Begin NotExist; Exit; End; IF (Errors<> [0]) Then Exit; RemSettings(FM); SortLines: =True; SpecialSort: =False; UniversalSort; RestoreSettings(FM); End; Procedure Matrix. UniversalSort; Var i,j: Integer; Max,NMax,CZ: Integer; Cuan: Integer; BeginIF Not Exist Then Begin NotExist; SortError; Exit; End; IF (Errors<> [0]) Then Begin SortError; Exit; End; IF SortLines Then Cuan: =CLinesElse Cuan: =CBars; For i: =1 to Cuan doBeginIF SortLines Then Max: =CuanZeeroInLine(i) Else Max: =CuanZeeroInBar(i); Nmax: =i; For j: =i to Cuan doBeginIF SortLines Then CZ: =CuanZeeroInLine(j) Else CZ: =CuanZeeroInBar(j); IF (CZ<Max) xor DirectionThenBeginMax: =CZ; NMax: =j; End; End; IF i<>NMax ThenBeginIF SortLInes Then SwapLines(i,NMax) Else SwapBars(i,NMax); Inc(Chek); End; End; End; Function Matrix. DetWithGauss: TOE; Var i,j: Integer; K: TOE; P: TOE; S: Matrix; Si,Sj: Integer; Procedure SortLinesOfTheBar(B1: Integer); Var i: Integer; Max: TOE; nMax: Integer; BeginMax: =S. GetE(1,B1); nMax: =1; For i: =2 to S. Clines doIF Abs(Max) <Abs(S. GetE(i,B1)) ThenBeginMax: =S. GetE(i,B1); nMAx: =i; End; IF S. Clines<>nMAx ThenBeginS. SwapLines(S. Clines,nMAx); Inc(S. Chek); End; End; Procedure AddLines(l1,l2: Integer; K: TOE); Var i: Integer; BeginFor i: =1 to S. CBars doS. SetE(l2, i,(S. GetE(l2, i) - S. GetE(l1, i) *K)); End; Procedure InitObject; Var i,j: Integer; Ver: TOE; BeginSi: =0; Sj: =0; For i: =1 to CLines do IF not (i in Lin) Then Inc(Si); For j: =1 to CBars do IF not (j in Bar) Then Inc(sj); S. VMT; S. DataInit(Si,Sj); Si: =0; For i: =1 to CLines doIF not (i in Lin) ThenBeginInc(Si); Sj: =0; For j: =1 to CBars doIF not (j in Bar) ThenBeginInc(sj); Ver: =GetE(i,j); S. SetE(Si,Sj,Ver); EndEnd; End; BeginIF Not Exist Then Begin NotExist; DGaussError; Exit; End; IF (Errors<> [0]) Then Begin DGaussError; Exit; End; IF CBars<>CLines Then Begin MNotSquare; DGaussError; Exit; End; InitObject; IF S. CBars<>S. CLines Then Begin MNotSquare; DGaussError; Exit; End; For i: =Si downto 2 doBeginS. Clines: =i; SortLinesOfTheBar(i); S. Clines: =Si; IF S. GetE(i, i) =0 Then Begin DetWithGauss: =0; Exit; End; For j: =i-1 downto 1 doIF S. GetE(j, i) <>0 ThenBeginK: =S. GetE(j, i) /S. GetE(i, i); AddLines(i,j,K); End; End; P: =1; S. Clines: =Si; S. CBars: =Sj; For i: =1 to S. Clines doP: =P*S. GetE(i, i); DetWithGauss: =P*S. Sign(S. Chek); S. Del; End; Function Matrix. Sign; BeginIF (C div 2) *2=C Then Sign: =1.0 Else Sign: =-1.0; End; Procedure Matrix. SpecialSortLines; VAr FM: Mem; BeginIF Not Exist Then Begin NotExist; Exit; End; IF (Errors<> [0]) Then Exit; RemSettings(FM); SpecialSort: =True; SortLines: =True; UniversalSort; RestoreSettings(FM); End; Procedure Matrix. SpecialSortBars; VAr FM: Mem; BeginIF Not Exist Then Begin NotExist; Exit; End; IF (Errors<> [0]) Then Exit; RemSettings(FM); SpecialSort: =True; SortLines: =False; UniversalSort; RestoreSettings(FM); End; Procedure RemSettings; BeginEnd; Procedure MAtrix. MNotSquare; BeginErrors: =Errors+ [CMNotSquare] ; AnyErrorEnd; Procedure Matrix. AddError; BeginErrors: =Errors+ [CAddError] ; AnyErrorEnd; Procedure Matrix. ReversError; BeginErrors: =Errors+ [CReversError] ; AnyErrorEnd; Procedure Matrix. MDegenerate; BeginErrors: =Errors+ [CMDegenerate] ; AnyErrorEnd; Procedure Matrix. Stopped; BeginErrors: =Errors+ [CStopped] ; AnyErrorEnd; Procedure Matrix. StepRevers; BeginEnd; Procedure Matrix. RemSettings; BeginWith FM doBeginmPlus: = Plus; mDirection: = Direction; mSortLines: = SortLines; mBeginZeero: = BeginZeero; mSpecialSort: = SpecialSort; mGauss: = Gauss; mDetForRev: = DetForRev; EndEnd; Procedure Matrix. RestoreSettings; BeginWith FM doBeginPlus: = mPlus; Direction: = mDirection; SortLines: = mSortLines; BeginZeero: = mBeginZeero; SpecialSort: = mSpecialSort; Gauss: = mGauss; DetForRev: = mDetForRev; End; End; {********************************Quick metods *****************************}Function Matrix31. DetWithGauss; Var i,j: Integer; K: TOE; P: TOE; S: Matrix31; si,sj: Integer; Procedure SortLinesOfTheBar(B1: Integer); Var i: Integer; Max: TOE; nMax: Integer; BeginMax: =Ar31(S. M^) [1,B1] ; nMax: =1; For i: =2 to S. Clines doIF Abs(Max) <Abs(Ar31(S. M^) [i,B1]) ThenBeginMax: =Ar31(S. M^) [i,B1] ; nMAx: =i; End; IF S. Clines<>nMAx ThenBeginS. SwapLines(S. Clines,nMAx); Inc(S. Chek); End; End; Procedure AddLines(l1,l2: Integer; K: TOE); Var i: Integer; BeginFor i: =1 to S. CBars doBeginAr31(S. M^) [l2, i]: =Ar31(S. M^) [l2, i] -Ar31(S. M^) [l1, i] *K; End; End; Procedure InitObject; Var i,j: Integer; Ver: TOE; BeginS. VMT; S. DataInit(31,31); Si: =0; IF DetForRevThenBeginsi: =31; sj: =31; Ar31(S. M^): =Ar31(M^) EndElseFor i: =1 to CLines doIF not (i in Lin) ThenBeginInc(Si); Sj: =0; For j: =1 to CBars doIF not (j in Bar) ThenBeginInc(sj); Ar31(S. M^) [Si,Sj]: =Ar31(M^) [i,j] ; EndEnd; End; BeginIF Not Exist Then Begin NotExist; DGaussError; Exit; End; IF (Errors<> [0]) Then Begin DGaussError; Exit; End; IF CBars<>CLines Then Begin MNotSquare; DGaussError; Exit; End; InitObject; S. Clines: =si; S. CBars: =sj; IF S. CBars<>S. CLines Then Begin MNotSquare; DGaussError; Exit; End; For i: =si downto 2 doBeginS. Clines: =i; SortLinesOfTheBar(i); S. Clines: =si; IF Ar31(S. M^) [i, i] =0 Then Begin DetWithGauss: =0; Exit; End; For j: =i-1 downto 1 doIF Ar31(S. M^) [j, i] <>0 ThenBeginK: =Ar31(S. M^) [j, i] /Ar31(S. M^) [i, i] ; AddLines(i,j,K); End; End; P: =1; S. Clines: =si; S. CBars: =sj; For i: =1 to S. Clines doP: =P*Ar31(S. M^) [i, i] ; DetWithGauss: =P*S. Sign(S. Chek); S. Del; End; Procedure Matrix31. SwapLines(L1,L2: Integer); Var Prom: TOE; i: Integer; BeginIF Not Exist Then BEgin NotExist; SwapError; Exit; End; IF (Errors<> [0]) Then Begin SwapError; Exit; End; For i: =1 to CBars doBeginProm: =Ar31(M^) [L1, i] ; Ar31(M^) [L1, i]: =Ar31(M^) [L2, i] ; Ar31(M^) [L2, i]: =PromEnd; End; {-------------------------------------------------------------------------}Function Matrix63. DetWithGauss; Var i,j: Integer; K: TOE; P: TOE; S: Matrix63; si,sj: Integer; Procedure SortLinesOfTheBar(B1: Integer); Var i: Integer; Max: TOE; nMax: Integer; BeginMax: =Ar63(S. M^) [1,B1] ; nMax: =1; For i: =2 to S. Clines doIF Abs(Max) <Abs(Ar63(S. M^) [i,B1]) ThenBeginMax: =Ar63(S. M^) [i,B1] ; nMAx: =i; End; IF S. Clines<>nMAx ThenBeginS. SwapLines(S. Clines,nMAx); Inc(S. Chek); End; End; Procedure AddLines(l1,l2: Integer; K: TOE); Var i: Integer; BeginFor i: =1 to S. CBars doBeginAr63(S. M^) [l2, i]: =Ar63(S. M^) [l2, i] -Ar63(S. M^) [l1, i] *K; End; End; Procedure InitObject; Var i,j: Integer; Ver: TOE; BeginS. VMT; S. DataInit(63,63); Si: =0; IF DetForRevThenBeginsi: =63; sj: =63; Ar63(S. M^): =Ar63(M^) EndElseFor i: =1 to CLines doIF not (i in Lin) ThenBeginInc(Si); Sj: =0; For j: =1 to CBars doIF not (j in Bar) ThenBeginInc(sj); Ar63(S. M^) [Si,Sj]: =Ar63(M^) [i,j] ; EndEnd; End; BeginIF Not Exist Then Begin NotExist; DGaussError; Exit; End; IF (Errors<> [0]) Then Begin DGaussError; Exit; End; IF CBars<>CLines Then Begin MNotSquare; DGaussError; Exit; End; InitObject; S. Clines: =si; S. CBars: =sj; IF S. CBars<>S. CLines Then Begin MNotSquare; DGaussError; Exit; End; For i: =si downto 2 doBeginS. Clines: =i; SortLinesOfTheBar(i); S. Clines: =si; IF Ar63(S. M^) [i, i] =0 Then Begin DetWithGauss: =0; Exit; End; For j: =i-1 downto 1 doIF Ar63(S. M^) [j, i] <>0 ThenBeginK: =Ar63(S. M^) [j, i] /Ar63(S. M^) [i, i] ; AddLines(i,j,K); End; End; P: =1; S. Clines: =si; S. CBars: =sj; For i: =1 to S. Clines doP: =P*Ar63(S. M^) [i, i] ; DetWithGauss: =P*S. Sign(S. Chek); S. Del; End; Procedure Matrix63. SwapLines(L1,L2: Integer); Var Prom: TOE; i: Integer; BeginFor i: =1 to CBars doBeginProm: =Ar63(M^) [L1, i] ; Ar63(M^) [L1, i]: =Ar63(M^) [L2, i] ; Ar63(M^) [L2, i]: =PromEnd; End; END. Контрольні прикладиДана матриця: 3 - 1 0А= - 2 1 12 - 1 4Відповідь: 1 0,8 - 0,2А-1 = 2 2,4 - 0,60 0,2 0,2Список використаної літератури1. А.Г. Курош "курс высшей алгебры", "наука", Москва 1975.2. С.Т. Завало, В.М. Костарчук, Б.И. Хацет "алгебра и теория чисел", Том 1,"высшая школа", Киев 1974.3. С.Т. Завало, В.М. Костарчук, Б.И. Хацет "алгебра и теория чисел", Том 2,"высшая школа", Киев 1976.
Страницы: 1, 2
|
|
|
© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент. |
|
|