|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Перевод процедуры с Pascal на C++ |
|
C/C++ - Перевод процедуры с Pascal на C++
|
Новый участник Сообщения: 1 |
Профиль | Отправить 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 |
Ветеран Сообщения: 1812
|
Профиль | Отправить PM | Цитировать Сомнительно, чтобы тут паслось много Дед-Морозов (или Дед-Мазаев), понимающих в обоих языках. Погуглить не пробовали, на какой-нибудь "pascal 2c converter"? Оказывается, они наличествуют, но их довольно мало. Особо не шерстил, но кое-что нашел очень быстро (усложнение поиска замедляет результат).
1) PtoC - здесь не скачивание, здесь теория и хелп к программе. Скачивание здесь. 2) p2cxx. В качестве предупреждения вынужден процитировать этот же сайт: Цитата:
|
|
Отправлено: 13:50, 21-10-2013 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 1404
|
Профиль | Отправить 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; } |
------- Отправлено: 20:36, 23-10-2013 | #3 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|