Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Delphi > Паскаль
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 07.01.2018, 20:33   #1
Dormammu
 
Регистрация: 19.06.2015
Сообщений: 9
Репутация: 10
По умолчанию Ошибка возвращение результата

Здравствуйте. При возвращении измененной матрицы из процедуры 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]
[не*число,не*число,не*число,не*число]
[не*число,не*число,не*число,не*число]
[не*число,не*число,не*число,не*число]
[не*число,не*число,не*число,не*число]

Dormammu вне форума   Ответить с цитированием
Старый 07.01.2018, 21:27   #2
min@y™
Цифровой кот
Профессионал
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Адрес: 1600, пенсильвания-авеню, п.г.т. верхний Вашингтонск, 8126 км от МКАД, от поста ГАИ - налево.
Сообщений: 7,648
Репутация: 2371

icq: 100500
skype: kick-ass
По умолчанию


__________________
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C] Подскажите, в чем ошибка: перевод дюймов в сантиметры. Но когда запускаю и ввожу число (например 2), то при выводе результата вместо 2 в формуле стоит 0.00 UserOne Помощь студентам 2 23.09.2017 22:46
Возвращение результата из потока Gregor Общие вопросы по Java, Java SE, Kotlin 2 01.03.2016 19:35
Ошибка при попытке вывода результата sql-запроса в DBGrid Fahnrich БД в Delphi 6 08.07.2013 18:23
Возвращение результата через аргумент NinjaNoob Помощь студентам 8 04.12.2012 11:04


10:03.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru