Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2015, 17:23   #1
Camelot_2012
Пользователь
 
Регистрация: 19.12.2011
Сообщений: 90
По умолчанию Перевод с Паскаля на 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.
Camelot_2012 вне форума Ответить с цитированием
Старый 10.11.2015, 17:23   #2
Camelot_2012
Пользователь
 
Регистрация: 19.12.2011
Сообщений: 90
По умолчанию

Код на С#
Код:
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);
        }
    }
}
Camelot_2012 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод с паскаля на Си++ DJONIII Общие вопросы C/C++ 0 21.09.2015 05:26
Перевод из паскаля в С++ vigorouz Помощь студентам 1 21.05.2014 22:14
Перевод на C++ с паскаля dimka123 Помощь студентам 0 12.04.2014 23:16
перевод с паскаля на с++ kostan3 Общие вопросы C/C++ 1 29.03.2014 21:33
Перевод с Паскаля на С RamilFaz Общие вопросы C/C++ 3 08.04.2010 14:40