Проверить корректность перевода кода с Pascal - C#
Формулировка задачи:
Здравствуйте, помогите проверить, правильно ли перевел код, результаты почему-то разные
код на паскале
Код на С#
uses crt; type vektor=array[1..2]of real; var x1:vektor;k,q:integer; eps,beta,c:real; procedure v(var a:vektor; b:vektor); begin a[1]:=b[1]; a[2]:=b[2]; end; function max(x1,x2:real):real; begin if x1>x2 then max:=x1 else max:=x2; end; function funct1(c:real;x:vektor):real; var fi,g1,g2,g3,g4:real; begin fi:=0; g1:=2*x[1]-x[2]-2; fi:=fi+max(0,g1); g2:=-x[1]; fi:=fi+max(0,g2); g3:=-x[2]; fi:=fi+max(0,g3); funct1:=sqr(fi)*c/2; end; function funct2(c:real;x:vektor):real; var fi,g1,g2,g3,g4:real; begin fi:=0; g1:=2*x[1]-x[2]-2; fi:=fi+max(0,g1); g2:=-x[1]; fi:=fi+max(0,g2); g3:=-x[2]; fi:=fi+max(0,g3); fi:=sqr(fi)*c/2; funct2:=fi+sqr(x[1]+4)+sqr(x[2]-4); end; procedure minimization(c:real;var x1:vektor); var x,y,g:vektor; e:array[1..2,1..2]of integer; alf,l,eps:real; k,q,j:integer; begin eps:=0.01; l:=0.001; alf:=0.01; e[1,1]:=1;e[1,2]:=0;e[2,1]:=0;e[2,2]:=1; v(y,x1); k:=1; q:=0; repeat for j:=1 to 2 do begin g[1]:=y[1]+e[j,1]*l; g[2]:=y[2]+e[j,2]*l; if funct2(c,g)<funct2(c,y) then v(y,g) else begin g[1]:=y[1]-e[j,1]*l; g[2]:=y[2]-e[j,2]*l; if funct2(c,g)<funct2(c,y) then v(y,g); end; end; if funct2(c,y)<funct2(c,x1) then begin v(x,x1); v(x1,y); y[1]:=x1[1]+alf*(x1[1]-x[1]); y[2]:=x1[2]+alf*(x1[2]-x[2]); end else begin if l<=eps then q:=1 else l:=l/2; end; k:=k+1; until q=1; end; begin write('eps='); read(eps); write('x[1]='); read(x1[1]); write('x[2]='); read(x1[2]); write('beta='); read(beta); write('C='); read(c); k:=1; q:=0; repeat minimization(c,x1); if funct1(c,x1)<eps then q:=1 else begin c:=c*beta; k:=k+1; end; until q=1; writeln(x1[1],' ',x1[2]); end.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace metod_strafov { class Program { static float eps = 0; static float[] xy = new float[2]; static float c = 0; static float beta = 0; static void Main(string[] args) { Console.WriteLine("Укажите точность: "); eps = (float)Convert.ToDouble(Console.ReadLine()); Console.WriteLine("Укажите координату x точки: "); xy[0] = (float)Convert.ToDouble(Console.ReadLine()); Console.WriteLine("Укажите координату y точки: "); xy[1] = (float)Convert.ToDouble(Console.ReadLine()); Console.WriteLine("Укажите начальное значение параметра штрафа: "); beta = (float)Convert.ToDouble(Console.ReadLine()); Console.WriteLine("Укажите значение увеличения параметра: "); c = (float)Convert.ToDouble(Console.ReadLine()); int q = 0; int k = 1; do { minimization(c); if (f1(c, xy) < eps) q = 1; else { c = c * beta; k++; } } while (q != 1); Console.WriteLine("Результат: " + xy[0].ToString() + ' ' + xy[1].ToString()); //Console.WriteLine(" " + k); Console.Read(); } static float f1(float c, float[] x) { float fi = 0; float g1 = 0; float g2 = 0; float g3 = 0; g1 = 2 * x[0] - x[1] - 2; fi += Math.Max(0, g1); g2 = -x[0]; fi += Math.Max(0, g2); g3 = -x[1]; fi += Math.Max(0, g3); return (fi * fi * c / 2); } static float f2(float c, float[] x) { float fi = 0; float g1 = 0; float g2 = 0; float g3 = 0; g1 = 2 * x[0] - x[1] - 2; fi += Math.Max(0, g1); g2 = -x[0]; fi += Math.Max(0, g2); g3 = -x[1]; fi += Math.Max(0, g3); fi = fi * fi * c / 2; return (float)(fi + Math.Pow(x[0] + 4, 2) + Math.Pow(x[1] - 4, 2)); } static void minimization(float c) { float[] x = new float[2]; //float[] x1 = new float[2]; float[] y = xy; float[] g = new float[2]; int[,] e = new int[2, 2] { { 1, 0 }, { 0, 1 } }; float alf = 0.01f; //float l = 0.001f; float l = 2; float eps = 0.01f; int k = 1; int q = 0; do { for (int j = 0; j < 1; j++) { g[0] = y[0] + e[j, 0] * l; g[1] = y[1] + e[j, 1] * l; if (f2(c, g) < f2(c, y)) { //y = g; y[0] = g[0]; y[1] = g[1]; } else { g[0] = y[0] - e[j, 0] * l; g[1] = y[1] - e[j, 1] * l; if (f2(c, g) < f2(c, y)) { //y = g; y[0] = g[0]; y[1] = g[1]; } } } if (f2(c, y) < f2(c, xy)) { //x = x1; //x1 = y; x[0] = xy[0]; x[1] = xy[1]; xy[0] = y[0]; xy[1] = y[1]; y[0] = xy[0] + alf * (xy[0] - x[0]); y[1] = xy[1] + alf * (xy[1] - x[1]); } else { if (l <= eps) q = 1; else l = l / 2; } k++; } while (q != 1); } } }
Решение задачи: «Проверить корректность перевода кода с Pascal»
textual
Листинг программы
float[] y = new float[2]; y[0] = xy[0]; y[1] = xy[1];
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д