Перевод кода с Паскаля на C# - C# (216535)

Узнай цену своей работы

Формулировка задачи:

надеюсь кто-то из C# юзеров ещё помнят паскаль. суть в том что я перебивал код с паскаля(работает правильно) на C#.вроде бы и перебил верно но результат неверный.что не так?неясно.
uses crt;
type
 Tmass=array[1..20] of real;
 Tmatrix=array[1..20] of Tmass;
procedure Per(k,n:integer;var a:Tmatrix;var p:integer);{перестановка строк если главный элемент = 0}
var z:Real;j,i:integer;
begin
z:=abs(a[k,k]);
i:=k;
p:=0;
for j:=k+1 to n do
  begin
   if abs(a[j,k])>z then{выбираем максимальный по модулю в данном столбце ниже}
    begin
     z:=abs(a[j,k]);
     i:=j;
     p:=p+1;{счетчик перестановок, при каждой перестановке меняется знак определителя}
    end;
  end;
if i>k then
for j:=k to n do
  begin
   z:=a[i,j];
   a[i,j]:=a[k,j];
   a[k,j]:=z;
  end;
end;
function Znak(p:integer):integer;{определение знака определителя}
begin
if p mod 2=0 then
Znak:=1 else Znak:=-1;
end;
procedure Opr(n:integer;a:tmatrix;var det:real);{вычисление опаределителя}
var k,i,j,p:integer;r:real;
begin
det:=1.0;
for k:=1 to n do
  begin
   if a[k,k]=0 then Per(k,n,a,p);{перестановка строк}
   det:=znak(p)*det*a[k,k];{вычисление определителя}
   for j:=k+1 to n do {пересчет коэффициентов}
    begin
      r:=a[j,k]/a[k,k];
      for i:=k to n do
       begin
        a[j,i]:=a[j,i]-r*a[k,i];
       end;
    end;
  end;
end;
var a:Tmatrix;{матрица коэффициентов исходная}
    c:array[1..20] of Tmatrix;{вспомогательные матрицы для вычисления корней}
    b,x:Tmass;{свободные члены, корни}
    det,det1:real;{определители}
    n,k,j,i:integer;
begin
clrscr;
write('Порядок системы n=');
readln(n);
writeln('Введите коэффициенты системы:');
for i:=1 to n do
for j:=1 to n do
read(a[i,j]);
readln;
writeln('Введите свободные члены:');
for i:=1 to n do
read(b[i]);
readln;
clrscr;
writeln('Расширенная матрица системы:');
for i:=1 to n do
 begin
  for j:=1 to n do
  write(a[i,j]:7:2);
  write(b[i]:9:2);
  writeln;
 end;
Opr(n,a,det);{определитель системы исходной}
for i:=1 to n do
 begin
  for k:=1 to n do
   begin
    for j:=1 to n do{создаем вспомогательные матрицы, где i-товый столбец - свободные члены}
    c[i][k,j]:=a[k,j];
    c[i][k,i]:=b[k];
   end;
  Opr(n,c[i],det1);{определитедь вспомогательной матрицы}
  if(det=0)and(det1=0) then
    begin
     writeln('Система не определена!');
     readln;
     exit;
    end;
  if(det=0)and(det1<>0) then
    begin
     writeln('Система не имеет решений!');
     readln;
     exit;
    end;
  x[i]:=det1/det;{корень}
 end;
writeln('Корни сиcтемы:');
for i:=1 to n do
writeln('x',i,'=',x[i]:7:3);
readln
end.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace TEmps
{
 
    class Program
    {
        static void Perestanovki(int k, int n, double[][] a, ref int p)//перестановки
        {
            double z;
            int i = k;
            z = Math.Abs(a[k][k]);
            p = 0;
            for (int j = k + 1; j < n; j++)
            {
                if (Math.Abs(a[j][k]) > z)
                {
                    z = Math.Abs(a[j][k]);
                    i = j;
                    p += 1;//счетчик перестановок для смены знака
                }
            }
            if (i > k)
                for (int j = k; j < n; j++)
                {
                    z = a[i][j];
                    a[i][j] = a[k][j];
                    a[k][j] = z;
                }
 
        }
 
        static int Znak(int p)//знак определителя
        {
            if (p % 2 == 0) return 1;
            return -1;
        }
 
        static void Determinant(int n, double[][] a, ref double det)//поиск определителя
        {
            int p = 0;
            det = 1.0;
            for (int k = 0; k < n; k++)
            {
                if (a[k][k] == 0) Perestanovki(k, n, a, ref p);//перемтановка строк
                det = Znak(p) * det * a[k][k];//вычисление определителя
                for (int j = k + 1; j < n; j++)
                {
                    double r = a[j][k] / a[k][k];
                    for (int i = k; i < n; i++)
                        a[j][i] = a[j][i] - r * a[k][i];
                }
            }
        }
 
        static double[] Mainpart(double[][] a, int n, double[] b)//основная часть программы
        {
            double det = 0;
            double det1 = 0;
            double[] x;
            x = new double[n];
 
            //массив определителей
            double[][][] c;
            c = new double[n][][];
            for (int i = 0; i < n; i++)
                c[i] = new double[n][];
            for (int i = 0; i < n; i++)
                for (int j = 0; j < n; j++)
                    c[i][j] = new double[n];
 
            Determinant(n, a, ref det);//определитель исходной системы
            for (int i = 0; i < n; i++)//вспомогательные матрицы
            {
                for (int k = 0; k < n; k++)
                {
                    for (int j = 0; j < n; j++)
                        c[i][k][j] = a[k][j];
                    c[i][k][i] = b[k];
                }
                Determinant(n, c[i], ref det1);
                if (det == 0 && det1 == 0)//не определена
                {
                    //double[] x;
                    //x = new double[n];
                    for (int q = 0; q < n; q++)
                        x[q] = 1;
                    return x;
                }
                if (det == 0 && det1 != 0)//нет решений
                {
                    //double[] x;
                    //x = new double[n];
                    for (int q = 0; q < n; q++)
                        x[q] = 0;
                    return x;
                }
                x[i] = det1 / det;
            }
            return x;
        }
        static void Main(string[] args)
        {
            double[][] assert;
            double[] x;
            assert = new double[3][];
            for (int i = 0; i < 3; i++)
                assert[i] = new double[3];
            Console.WriteLine("Бесплатники");
            for (int i = 0; i < 3; i++)
                for (int j = 0; j < 3; j++)
                    assert[i][j] = Double.Parse(Console.ReadLine());
            double[] teta;
            teta = new double[3];
            Console.WriteLine("Свободники");
            for (int i = 0; i < 3; i++)
                teta[i] = Double.Parse(Console.ReadLine());
            Console.WriteLine("Начальная матрица");
            for (int i = 0; i < 3; i++)
            {
                for (int j = 0; j < 3; j++)
                    Console.Write("{0}  ", assert[i][j]);
                Console.WriteLine("{0} ", teta[i]);
            }
 
            x = Mainpart(assert, 3, teta);
            for (int i = 0; i < x.Length; i++)
                Console.WriteLine("{0}", x[i]);
            Console.ReadKey();
 
        }
    }
}
Матрицу вводится верно.(это метод Крамера если что) перебивал максимально дословно. и пример вот матрица 2 0 -1 0 2 -1 -1 -1 0 свободные члены -4 -8 -180 результат 89 91 180
Есть идеи?

Решение задачи: «Перевод кода с Паскаля на C#»

textual
Листинг программы
procedure Opr(n:integer;a:tmatrix;var det:real);{вычисление опаределителя}
procedure Per(k,n:integer;var a:Tmatrix;var p:integer);{перестановка строк если главный элемент = 0}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.6 из 5