Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Перевод процедуры с Pascal на C++ (http://forum.oszone.net/showthread.php?t=270385)

jhonjhonson 21-10-2013 10:23 2238252

Перевод процедуры с Pascal на C++
 
Помогите с программой нужно переделать ее на C ++ builder


Код:

Program F_An;
 uses CRT;
 type complex = record re, im: real;
  end;
 type Opis_comp = record nam:char;a,b:integer; par: real;
  end;
 const n=2; Ninp=1; Nout=2; Nf=21; f1=0.01; f2=100;
  Zapis: array [1..2] of Opis_comp=
            ((nam: 'R'; a:1; b:2; par:1),
            (nam: 'C'; a:2; b:0; par:0.159));
 var i,j,k, m, a, b  : integer;
  f,df,w,Kvid,Kdb: real;
  Cres,t, z, y1: complex;
  Y:array [0..n,0..n+1] of complex;
 
    Procedure CAdd(C1, C2: complex; var Cres:complex);
      begin Cres.Re:= C1.Re+C2.Re; CRes.Im :=C1.Im+C2. Im
      end;
 
    Procedure CMinus(C1, C2: complex; var Cres:complex);
      begin Cres.Re:= C1.Re-C2.Re; CRes.Im :=C1.Im-C2. Im
      end;
 
    Procedure CMult(c1, c2: complex; var Cres:complex);
      begin Cres.re:= c1.Re*c2.Re-c1.im*c2.im;
                CRes.im:= c1.re*c2.im+c2.re*c1.im
      end;
 
    Procedure CDiv(c1, c2: complex; var Cres:complex);
      var q:real;
      begin q:=c2.re*c2.re+c2.im*c2.im;
        Cres.re:= (c1.Re*c2.Re+c1.im*c2.im)/q;
        Cres.im:= (c1.im*c2.re-c1.re*c2.im)/q;
      end;
 
  Begin
  ClrScr;
  df:=exp((ln(f2)-ln(f1))/(Nf-1));
  f:=f1;
  for m:=1 to Nf do
  begin
    w:=2*Pi*f;
    for i:=0 to n do
 
   
    for j:=0 to n+1 do
        with Y[i,j] do
          begin re:=0; im:=0
          end;
    for i:=1 to 2 do
      begin
        with Zapis[i], y1 do
          begin
            case nam of
              'R': begin re:=1/Par; im:=0
                    end;
              'C': begin re:=0; im:=w*Par
                    end;
            end; {case}
          CAdd  (Y[a,a], y1, Y[a,a]);
          CAdd  (Y[b,b], y1, Y[b,b]);
          Cminus(Y[a,b], y1, Y[a,b]);
          Cminus(Y[b,a], y1, Y[b,a]);
        end; {with}
      end; { for i }
    Y[Ninp, n+1].re:=1;
    for k:=1 to n-1 do
      for i:=k+1 to n do
        begin
          CDiv(Y[i,k], Y[k,k], z);
          for j:=1 to n+1 do
              begin CMult(z, Y[k, j], t); CMinus(Y[i, j], t, Y[i, j])
              end;
      end;{direct step}
    for i:=n downto 1 do {invers step}
      begin
        z:=Y[i,n+1];
        for j:=i+1 to n do
            begin CMult(Y[i, j], Y[j, n+1], t); CAdd(z, t, z)
          end; {sum  for j }
        CDiv(z, Y[i, i], Y[i, n+1]);
      end; { for i }
    Cdiv(Y[Nout, n+1], Y[Ninp, n+1], y1);
    Kvid:=sqrt(sqr(y1.re)+sqr(y1.im));
    Kdb:=20*ln(Kvid)/ln(10);
    writeln('f',m:2,'=',f:7:3,' kGc    K= ', Kvid:5:3,'    Kdb=',Kdb:3:0,' dB');
    f:=f*df
  end; {for m to Nf}
    readln
  end.


XPEHOMETP 21-10-2013 13:50 2238384

Сомнительно, чтобы тут паслось много Дед-Морозов (или Дед-Мазаев), понимающих в обоих языках. Погуглить не пробовали, на какой-нибудь "pascal 2c converter"? Оказывается, они наличествуют, но их довольно мало. Особо не шерстил, но кое-что нашел очень быстро (усложнение поиска замедляет результат).

1) PtoC - здесь не скачивание, здесь теория и хелп к программе. Скачивание здесь.
2) p2cxx. В качестве предупреждения вынужден процитировать этот же сайт:
Цитата:

Description: Pascal to C++ source code converter

License: Freeware

Downloads: 11
3) pascal2c. Ссылка на исходники видна в виде закладки таб-интерфейса.

mrcnn 23-10-2013 20:36 2239787

Это ошибочный перевод, но может быть поможет. С синтаксической стороны ошибок нет, но код является ошибочным алгоритмически.

Код:

#include <stdio.h>
#include <math.h>

#define N 2
#define Ninp 1
#define Nout 2
#define Nf 21
#define f1 0.01
#define f2 100.0

#define Pi 3.14

class c_complex
{
 public:
  c_complex(){}
  c_complex(double a1, double a2) { re = a1; im = a2;};
  void print() { printf("%f %f\n", re, im); };
  double get_re(){ return re;};
  double get_im(){ return im;};
  void set_re (double a) { re = a;};
  void set_im (double a) { im = a;};
 private:
  double re;
  double im;
};

void c_add(c_complex* a1, c_complex* a2, c_complex* a3)
{
 a3->set_re(a1->get_re() + a2->get_re());
 a3->set_im(a1->get_im() + a2->get_im());
}

void c_minus(c_complex* a1, c_complex* a2, c_complex* a3)
{
 a3->set_re(a1->get_re() - a2->get_re());
 a3->set_im(a1->get_im() - a2->get_im());
}

void c_mult(c_complex* a1, c_complex* a2, c_complex* a3)
{
 a3->set_re(a1->get_re() * a2->get_re()  -  a1->get_im() * a2->get_im() );
 a3->set_im(a1->get_re() - a2->get_im()  +  a2->get_re() * a1->get_im() );
}

void c_div(c_complex* a1, c_complex* a2, c_complex* a3)
{
 double q;
 q = a2->get_re() * a2->get_re()  + a2->get_im() *a2->get_im() ;
 a3->set_re( (a1->get_re() * a2->get_re()  +  a1->get_im() * a2->get_im() ) / q );
 a3->set_im( (a1->get_im() - a2->get_re()  -  a1->get_re() * a2->get_im()  ) /q );
}


struct Opis_comp
{
char nam;
int a;
int b;
double par;
};

struct Opis_comp Zapis[2] = {{'R', 1, 2, 1.0}, {'C', 2, 0, 0.159}}; // откуда эти цифры? нужно задание

int main()
{

int i, j, k, m, a, b;
double f, df, w, Kvid, Kdb;
c_complex Cres, t, z, y1;
c_complex Y[N][N+1];

df = exp ( log(f2) - log (f1) ) / (Nf - 1);
f = f1;
for (m = 0; m < Nf;  m++)
{
 w = 2*Pi*f;
 for ( i = 0; i < N; i++)
  for ( j = 0; j < N+1; j++)
  {
  Y[i][j].set_re(0.0);
  Y[i][j].set_im(0.0);
  }

  // подобный перевод ошибочен
  // нужно учитывать что индексы Y считаются с нуля, а не с единицы как в Паскале
  // это влечет изменения:
  // 1. в константах
  // 2. в счетчиках циклов
  // 3. в индексах массивов

 for (i=0;i<2; i++)
 {
  switch(Zapis[i].nam) { case 'R': y1.set_re( 1.0 / Zapis[i].par ); y1.set_im(0.0); break;case 'C': y1.set_re(0.0); y1.set_im(w * Zapis[i].par); break;}
  c_add ( &(Y[Zapis[i].a][Zapis[i].a]) ,  &y1 , &(Y[Zapis[i].a][Zapis[i].a]) );
  c_add ( &(Y[Zapis[i].b][Zapis[i].b]) ,  &y1 , &(Y[Zapis[i].b][Zapis[i].b]) ); // выход за границы массива
  c_minus ( &(Y[Zapis[i].a][Zapis[i].b]) ,  &y1 , &(Y[Zapis[i].a][Zapis[i].b]) );
  c_minus ( &(Y[Zapis[i].b][Zapis[i].a]) ,  &y1 , &(Y[Zapis[i].b][Zapis[i].a]) ); // выход за границы массива
 }

 Y[Ninp][N+1].set_re(1.0);

 for (k = 0; k < N-1; k++)
  for (i = k+1; i < N;  i++)
  {
    c_div ( &(Y[i][k]), &(Y[k][k]), &z);
    for (j = 0; j < N; j++)
    {
    c_mult(&z, &(Y[k][j]), &t);
    c_minus (&(Y[i][j]), &t, &(Y[i][j]));
    }
  }

  for (i = N - 1; i >= 0; i--)
  {
    z.set_re (Y[i][N+1].get_re());
    z.set_im(Y[i][N+1].get_im());
    for (j = i + 1; j < N; j++)
    {
      c_mult(&(Y[i][j]), &(Y[j][N+1]), &t);
      c_add(&z, &t, &z);
    }
    c_div(&z, &(Y[i][j]), &(Y[i][N+1]));
  }


  c_div( &(Y[Nout][N+1]) ,  &(Y[Ninp][N+1]), &y1);
  Kvid = sqrt( y1.get_re() * y1.get_re() +  y1.get_im() * y1.get_im() );
  Kdb = 20 * log (Kvid) / log (10.0);


  printf("f %d = %f Kgc  K = %f  Kdb = %f dB\n", m, f, Kvid, Kdb);
  f = f * df;
}
return 0;
}



Время: 00:07.

Время: 00:07.
© OSzone.net 2001-