Войти

Показать полную графическую версию : Перевод процедуры с Pascal на C++


jhonjhonson
21-10-2013, 10:23
Помогите с программой нужно переделать ее на 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
Сомнительно, чтобы тут паслось много Дед-Морозов (или Дед-Мазаев), понимающих в обоих языках. Погуглить не пробовали, на какой-нибудь "pascal 2c converter"? Оказывается, они наличествуют, но их довольно мало. Особо не шерстил, но кое-что нашел очень быстро (усложнение поиска замедляет результат).

1) PtoC (http://www.garret.ru/ptoc/Readme.htm) - здесь не скачивание, здесь теория и хелп к программе. Скачивание здесь (http://www.garret.ru/pascal.html).
2) p2cxx (http://www.sourcecodeonline.com/details/p2cxx.html). В качестве предупреждения вынужден процитировать этот же сайт:
Description: Pascal to C++ source code converter

License: Freeware

Downloads: 11
3) pascal2c (http://code.google.com/p/pascal2c/). Ссылка на исходники видна в виде закладки таб-интерфейса.

mrcnn
23-10-2013, 20:36
Это ошибочный перевод, но может быть поможет. С синтаксической стороны ошибок нет, но код является ошибочным алгоритмически.

#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;
}




© OSzone.net 2001-2012