Ветеран
Сообщения: 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;
}
|