Другие языки программирования и технологии

Как решить эту проблему ?

Переменная цикла for должна описываться в том же блоке, что и цикл for (Как исправить?)
program SLAU;
uses crt;
type
aa=array[1..4,1..4] of real;
bb=array[1..4] of real;
xx=array[1..4] of real;
var a:aa;b:bb;x:xx;q,s,eps:real;slaum:text;
var x1:array[1..4] of real;x0:array[1..4] of real;
i,j,k,m,n:integer;
procedure gaussa(a:aa;b:bb;var x:xx;n:integer);
Begin
eps:=0.0001;
for i:=1 to n-1 do
for k:=i+1 to n do
Begin
q:=a[k,i]/a[i,i];
for j:=1 to n do
a[k,j]:=a[k,j]-q*a[i,j];
b[k]:=b[k]-b[i]*q;
end;
Writeln;
x[n]:=b[n]/a[n,n];
for i:=n-1 downto 1 do
Begin
s:=0;
for j:=i+1 to n do
s:=s+a[i,j]*x[j];
x[i]:=(b[i]-s)/a[i,i];
end;
End;
(Ошибка 13 строка)
Hugo Boss
Hugo Boss
165
Мы не видим вашего полного кода, поэтому оценить всей красоты вашего решения не можем, НО Компилятор явно вас предупреждает, что не стоит стелить грабли туда, куда вы собираетесь падать.
В данном случае он вам говорит, что в блоке кода (в процедуре) вы используете переменные в цикле объявленные снаружи этого блока кода, а следовательно они могут меняться снаружи этого кода, что будет прямо влиять на блок, а не должно. Но что веселее - циклы из процедуры после вызова ее гарантировано изменят значения глобальных переменных, которые много для чего могут использоваться.
В идеале должно быть так, что блок оперирует с данными явно переданными в него как параметры и возвращает обозначенный перечень данных не трогая кроме этого ничего снаружи, у вас же полный фарш граблей:
1. i,j,k - объявлены снаружи блока, а должны внутри, в процедуре.
есть переменные
2. n, a,b,x объявленные снаружи, как глобальные переменные, но при этом их полные тезки передаются в нее как параметры - грязь и потенциальный источник ошибок.
3. eps объявлена снаружи, в процедуре задано значение, но ни разу внутри процедуры не используется - потенциальный источник ошибок, если используется где-то снаружи, и бесполезный бред, если не используется нигде.
4. x, x0 и x1 имеют тот же тип по сути что и b но объявлены почему то все раздельно, при попытке передать в процедуру глобальный x или x0 или x1 получите несоответствие типов.
Как решить - отделите глобальные переменные от тех что используются в подпрограммах дав им разные имена, да этого можно не делать в некоторых случаях, но это даст вам гораздо больше понимания что на что влияет и когда используется. Т. е. я бы, например, написал так: https://onlinegdb.com/HJd8Twud_
При этом я не проверял логику самого метода.
Александр Реш
Александр Реш
5 910
Лучший ответ
Александр Реш блин ваше редактировал, но не до конца: вот тут поправил https://onlinegdb.com/H1cP7ddu_, но опечатки могут быть, логику поймите главное.
у n значения нет
Олег Лазарев
Олег Лазарев
84 909
for var i:=1 to n-1 do
Игорь Чумак
Игорь Чумак
20 254
ты точку с запятой забыл