Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Перевод процедуры с Pascal на C++

Ответить
Настройки темы
C/C++ - Перевод процедуры с Pascal на C++

Новый участник


Сообщения: 1
Благодарности: 0

Профиль | Отправить PM | Цитировать


Помогите с программой нужно переделать ее на 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.

Отправлено: 10:23, 21-10-2013

 

Ветеран


Сообщения: 1656
Благодарности: 146

Профиль | Отправить PM | Цитировать


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

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

License: Freeware

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

Отправлено: 13:50, 21-10-2013 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 1404
Благодарности: 135

Профиль | Отправить PM | Цитировать


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

Код: Выделить весь код
#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;
}

-------
Ehhh.. what's up, doc?..


Отправлено: 20:36, 23-10-2013 | #3



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Перевод процедуры с Pascal на C++

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
C/C++ - Перевод с Pascal на C++ Snake750 Программирование и базы данных 14 14-09-2015 04:48
C/C++ - [решено] Перевод с Pascal на C++ sleepking89 Программирование и базы данных 3 16-02-2013 04:32
C/C++ - Перевод с Pascal на C++ Ru1nN Программирование и базы данных 0 21-12-2011 22:45
C/C++ - Перевод процедуры с Pascal на C++ Snake750 Программирование и базы данных 56 05-04-2011 09:39
C/C++ - Перевод с Pascal на C++ DimaZone88 Программирование и базы данных 0 13-05-2010 13:52




 
Переход