Регистрация: 19.06.2015
Сообщений: 8
|
Ошибка возвращение результата
Здравствуйте. При возвращении измененной матрицы из процедуры DECOMP происходит ошибка и пишет что данные не число. В чем проблема?
Код:
program ChM_KR;
const n=4;
type RMATR = array[1..n,1..n] of real;
IVECT = array[1..n] of integer;
RVECT = array [1..n] of real;
Procedure DECOMP(n:integer; var A:rmatr; var eps: real; var ip:ivect; var det:real; var ifsolve: Boolean);
Label 10;
Var I, j, k, km, ipm : integer;
S, norm, am : real;
Begin
Ifsolve := true;
Det := 1.0;
For I :=1 to n do ip[i]:=I;
Norm:=0.0;
For i:=1 to n do
Begin s := 0.0;
For j := 1 to n do s:= s+abs(A[i, j]);
If norm<s then norm:=s
End;
Eps := eps*norm;
For k:= 1 to n do
Begin
Am := abs(A[k, k]); km:=k;
For I := k+1 to n do
If abs (A[I, k])>am then
Begin am := abs(A[I, k]); km:=I end;
If km<>k then
Begin
Det := -det; ipm := ip[km];
Ip [km] := ip[k]; ip[k]:= ipm;
For j:= 1 to n do
Begin am:= A[km, j];
A[km, j]:= A[k, j];
A[k, j]:= am
End;
End;
If abs (A[k, k])< eps then
Begin ifsolve := false; goto 10 end;
For i:=1 to n do
Begin am := A[I, k] / A[k, k] ; A[I, k]:= am;
For j:=1 to n do A[I, j] := A[I, j] - am * A[k, j];
End;
End;
10: if ifsolve and (abs(A[n, n])>=eps) then
For k := 1 to n do det := det * A[k, k]
Else
Det := 0.0;
End;
Procedure SOLVE ( n:integer; var A:rmatr; var ip:ivect; var s1:rvect);
Var I, j, k:integer;
S:real;
Y:rvect;
Begin
For k :=1 to n do y[k] :=s1[ip[k]];
For k:= n downto 2 do
Begin
S:=Y[k];
For j := 1 to k-1 do
s:= s-A[k, j] * Y[ j];
Y[k]:=s;
end;
S1[n] := y[n] / A[n, n];
For k:= n downto i do
Begin
S:= Y[k];
For j := k+1 to n do
S:= (S - A[k, j]) * S1[j];
S1[k] := s / A[k, k]
End;
end;
begin
Var A:rmatr;
Var ip:ivect;
Var det:real;
Var ifsolve:Boolean;
Var S:rvect;
Var eps:real;
Var i:integer;
A[1,1]:=3.56;
A[1,2]:=4;
A[1,3]:=12;
A[1,4]:=-0.8;
A[2,1]:=2;
A[2,2]:=4;
A[2,3]:=1.2;
A[2,4]:=3.4;
A[3,1]:=3.6;
A[3,2]:=-2;
A[3,3]:=13.33;
A[3,4]:=0.4;
A[4,1]:=0.98;
A[4,2]:=-2.3;
A[4,3]:=-16;
A[4,4]:=-9.8;
S[1]:=3;
S[2]:=5;
S[3]:=-3;
S[4]:=-1;
for i:=1 to n do writeln(A[i]);
DECOMP(n,A,eps,ip,det,ifsolve);
for i:=1 to n do writeln(A[i]);
SOLVE(n,A,ip,S);
for i:=1 to n do writeln(S[i]);
end.
Результат выполнения
Код:
[3.56,4,12,-0.8]Ошибка времени выполнения: System.IndexOutOfRangeException: Индекс находился вне границ массива.
Стек:
в ChM_KR.ChM_KR.SOLVE(Int32 n, RMATR& A, IVECT& ip, RVECT& s1) в C:\Users\Admin\Desktop\ChM_KR 2.pas:строка 67
в ChM_KR.ChM_KR.$Main() в C:\Users\Admin\Desktop\ChM_KR 2.pas:строка 109
в ChM_KR 2.Program.Main()
[2,4,1.2,3.4]
[3.6,-2,13.33,0.4]
[0.98,-2.3,-16,-9.8]
[не*число,не*число,не*число,не*число]
[не*число,не*число,не*число,не*число]
[не*число,не*число,не*число,не*число]
[не*число,не*число,не*число,не*число]
|