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

Дан пример из паскаля, в нём несколько ошибок, нужно исправить их чтоб пример заработал.

Program Example_103;
const n=3;
type vectr=array[1..n] of real;
matr= array[1..n,1..n+1] of real;
var I: integer; a: matr; z:vectr;
procedure Data(var x:matr);
{ процедура ввода данных }
var i,j:integer;
begin
for i:=1 to nn do
for j:=1 to mm do
x[i,j]:=random(21)-10;
end;
procedure Print(x:matr);
{ процедура вывода данных }
var i,j:integer;
begin
for i:=1 to nn do begin
for j:=1 to mm do
write(x[i,j]:5); writeln; end
end;
procedure Swap(var a,b:real);
var z:real;
begin
z:=a; a:=b; b:=z
end;
function Det(a:matr):real;
{ вычисление определителя }
function Turn(k:integer):real;
var s:real; k1,k2,k3,k4: integer;
begin s:=0;
k1:=2-k; k2:=2; k3:=2+k;
for I:=1 to n do
begin
s:=s + a[1,k1]*a[2,k2]*a[3,k3];
k4:=k1; k1:=k2; k2:=k3; k3:=k4
end;
Turn:=s
end;
begin
Det:=Turn(1)-Turn(-1)
end;
procedure Solve_Kram(a:matr;var x:vectr);
{ процедура решения системы уравнений методом Крамера}
var d:real; I,j:integer;
begin
d:=Det(a);
if (abs(d) < 1.0e-6 ) then begin writeln('Error'); Exit end;
for j:=1 to n do
begin
for I:=1 to n do Swap(a[I,j],a[I,j+1]);
x[j]:=Det(a)/d;
for I:=1 to n do Swap(a[I,n+1],a[I,j])
end;
end;
{ Основная программа }
Begin
Data(a); Print(a); Solve_Kram(a,z);
for I:=1 to n do writeln(‘x[‘,I:2,’]=’,z[i];
readln
End.
Kirill Тихомиров
Kirill Тихомиров
4 626
Program Example_103;
const n=3;
type vectr=array[1..n] of real;
matr=array[1..n,1..n+1] of real;
var
I: integer; a: matr; z:vectr;
procedure Data(var x:matr); { процедура ввода данных }
var
i,j,m:integer;
begin
m:=4;
for i:=1 to n do for j:=1 to m do x[i,j]:=random(21)-10;
end;
procedure Print(x:matr); { процедура вывода данных }
var
i,j,m:integer;
begin for i:=1 to n do begin for j:=1 to m do write(x[i,j]:5);
writeln;
end
end;
procedure Swap(var a,b:real);
var
z:real;
begin
z:=a; a:=b; b:=z
end;
function Det(a:matr):real; { вычисление определителя }
function Turn(k:integer):real;
var
s:real; k1,k2,k3,k4: integer;
I: integer;
begin
s:=0; k1:=2-k; k2:=2; k3:=2+k;
for I:=1 to n do
begin
s:=s + a[1,k1]*a[2,k2]*a[3,k3]; k4:=k1; k1:=k2; k2:=k3; k3:=k4
end;
Turn:=s
end;
begin
Det:=Turn(1)-Turn(-1)
end;
procedure Solve_Kram(a:matr;
var
x:vectr); { процедура решения системы уравнений методом Крамера}
var
d:real; I,j:integer;
begin
d:=Det(a);
if (abs(d) < 1.0e-6 ) then
begin
writeln('Error');
Exit end;
for j:=1 to n do
begin
for I:=1 to n do Swap(a[I,j],a[I,j+1]);
x[j]:=Det(a)/d;
for I:=1 to n do Swap(a[I,n+1],a[I,j])
end;
end; { Основная программа }
Begin Data(a);
Print(a);
Solve_Kram(a,z);
for I:=1 to n do writeln('x[',I:2,']=',z[i]);
readln
End.
Питомник Наямале
Питомник Наямале
31 030
Лучший ответ
Kirill Тихомиров Спасибо! честно говоря, уже начинал сомневаться что это можно заставить работать без радикальных изменений, буквально одна ошибка за другой. <3
То, что программа стала запускаться, вовсе не значит, что она стала работать правильно.
Вы запутались в перестановках столбцов. Например X[1] в этой программе всегда -1, так как вы делите определители матриц с переставленными столбцами.
Советую добавить отладочный вывод Print(a) в функцию Det, чтобы понять, определитель чего вы считаете. Для правильной работы нужно заменить всего 1 букву.
Emin Quliyev
Emin Quliyev
11 112
Kirill Тихомиров Не считая 4 частей procedure - в остальном программа таковой и давалась в условиях задания, я её не менял. если-бы нужно было создать работающую программу решения системы уравнений методом Крамера - я-бы просто взял готовую которые к слову строчек на 6-10 короче этой и логически понятней для меня, но нужно было именно эту заставить работать.
Emin Quliyev Да понятно, что это задание. И смысл которого как раз в том, чтобы вы включили голову и попытались разобраться, как должна работать этав программа. Вам дали готовый ответ, который всё ещё содержит ОДНУ ошибку, попытайтесь найти её самостоятельно, благо компиляцция работает.