Новичок
Джуниор
Регистрация: 03.05.2017
Сообщений: 2
|
Нужна помощь с переводом в С++
Помогите перевести программу из Pascal, хотя бы часть её, что бы было на что упираться, или же конвертор из Pascal в C++, не могу никак найти.
Код:
const n=2;
type TAr2=array[1..n,1..n] of real;
TAr1=array[1..n] of real;
const
{
// это из примера-образца
A:TAr2= (
(1/2,1/3),
(1/6,1/3)
);
C:TAr1= (1,1/2);
Abis:TAr2 = (
(1/3,1/4),
(1/3,1/4)
);
}
// это из контрольного примера №6
A:TAr2= (
(1/4,1/8),
(1/5,2/5)
);
C:TAr1= (1,2);
Abis:TAr2 = (
(1/4,1/3),
(1/4,1/3)
);
l:TAr2 = (
(1,0),
(0,1)
);
var i,j:integer;
X,AX,Xbis:TAr1;
Y,Y2,MM,MAD,TMAD,B,B2:TAr2;
opred:real;
kol:integer;
procedure VivodVektora(ar:TAr1);
// вывод матрицы типа TAr1
var i:integer;
begin
for i := 1 to n do begin
write (ar[i]:4:4,' ');
end;
writeln;
end;//VivodVektora
procedure VivodMatricy(ar:TAr2);
// вывод матрицы типа TAr2
var i,j:integer;
begin
for i := 1 to n do begin
for j := 1 to n do begin
write (ar[i,j]:4:4,' ');
end;
writeln;
end;
end;//VivodMatricy
Function determ(ar:TAr2):real;
// вычисление определителя матрицы
var i,j:integer;
begin
// для двумерных матриц
Result:=(Ar[1,1]*Ar[2,2])-(Ar[1,2]*Ar[2,1]);
end;
Function ObrMatrica(ar:TAr2):TAr2;
// нахождение обратной матрицы для ar
var i,j:integer;
begin
// вычисляем обратную матрицу для Y
// с помощью алгебраических дополнений
// теория по ссылке:
//http://mathprofi.ru/kak_naiti_obratnuyu_matricu.html
// для этого
//1)находим определитель матрицы Y в переменную opred
//2) Находим матрицу миноров MM
//3) Находим матрицу алгебраических дополнений MAD
//4) Находим транспонированную матрицу алгебраических дополнений. TMAD
//5) и наконец находим обратную для Y матрицу B = (1/|opred|)*TMAD
//1)
opred:=determ(ar);
if opred=0 then begin
writeLn('определитель = 0:');
writeLn('обратной матрицы НЕ существует');
writeLn('решение отсутствует');
Exit;
end else begin
writeLn('определитель:');
writeLn (opred:4:4,' ');
end;
//2) получение 2-мерной матрицы миноров
MM[1,1]:= ar[2,2];
MM[2,2]:= ar[1,1];
MM[1,2]:= ar[2,1];
MM[2,1]:= ar[1,2];
writeLn('Матрица MM:');
VivodMatricy(MM);
//3) матрица алгебраических дополнений
MAD[1,1]:=MM[1,1];
MAD[2,2]:=MM[2,2];
MAD[1,2]:= - MM[1,2];
MAD[2,1]:= - MM[2,1];
writeLn('Матрица MAD:');
VivodMatricy(mad);
//4) Находим транспонированную матрицу алгебраических дополнений. TMAD
// то есть строки делаем столбцами
for i := 1 to n do begin
for j := 1 to n do begin
tmad[j,i]:=mad[i,j];
end;
end;
writeLn('Матрица TMAD:');
VivodMatricy(Tmad);
//5) Находим матрицу B
for i := 1 to n do begin
for j := 1 to n do begin
Result[i,j]:=(1/abs(opred))*Tmad[i,j];
end;
end;
end;//ObrMatrica
begin
// чтобы при отладке не вводить все матрицы и вектор
// возьмём элементы из констант
writeLn('Исходные данные:');
writeLn('Матрица A:');
VivodMatricy(a);
writeLn('Матрица l:');
VivodMatricy(l);
writeLn('Матрица A":');
VivodMatricy(Abis);
writeLn('Вектор С:');
VivodVektora(C);
//readln;// останов
// вычисляем Y=I-A
for i := 1 to n do begin
for j := 1 to n do begin
Y[i,j]:=l[i,j]-A[i,j];
end;
end;
writeLn('Матрица Y:');
VivodMatricy(Y);
B:=ObrMatrica(Y); // вычисляем обратную матрицу для Y
writeLn('Матрица B, обратная для Y:');
VivodMatricy(B);
// умножаем матрицу B на вектор C и получаем вектор X
for i := 1 to n do begin
X[i]:=0;
for j := 1 to n do begin
X[i]:=X[i]+(B[i,j]*C[j]);
end;
end;
writeLn('вектор X:');
VivodVektora(X);
// определяем эффективность экономики
//Экономика, характеризуемая матрицей A и векторами X и C , называется высокоэффективной, если A*X<=C .
// Определяем A*X
// умножаем матрицу A на вектор X и получаем вектор AX
for i := 1 to n do begin
AX[i]:=0;
for j := 1 to n do begin
AX[i]:=AX[i]+(A[i,j]*X[j]);
end;
end;
// проводим сравнение векторов
kol:=0;
for i := 1 to n do begin
if AX[i]<=C[i] then begin
kol:=kol+1;
end;
end;
if kol=n then begin
writeLn('Экономика, характеризуемая матрицей A и векторами X и C - высокоэффективная');
end else begin
writeLn('Экономика, характеризуемая матрицей A и векторами X и C - НЕ является высокоэффективной');
end;
//////////////////
// вычисляем Y2=I-Abis
for i := 1 to n do begin
for j := 1 to n do begin
Y2[i,j]:=l[i,j]-Abis[i,j];
end;
end;
writeLn('Матрица Y2:');
VivodMatricy(Y2);
B2:=ObrMatrica(Y2); // вычисляем обратную матрицу для Y2
writeLn('Матрица B2, обратная для Y2:');
VivodMatricy(B2);
// умножаем матрицу B2 на вектор C и получаем вектор Xbis
for i := 1 to n do begin
Xbis[i]:=0;
for j := 1 to n do begin
Xbis[i]:=Xbis[i]+(B2[i,j]*C[j]);
end;
end;
writeLn('вектор X":');
VivodVektora(Xbis);
end.
|