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

Показать сообщение отдельно

Ветеран


Сообщения: 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