Исправить код, что бы он заработал - C (СИ)

Узнай цену своей работы

Формулировка задачи:

#include <stdio.h>
#include <math.h>
#define F 50.0              /*частота, Гц*/
#define TD 20.0             /*длина сигнала, с*/
#define N 80.0              /*количество точек дискретизаци на период*/
#define SZ (N*F*TD)         /*количество точек на всей длине сигнала*/
#define Inorm 2.0           /*амплитуда тока нормального режима, А*/
#define Iavar 5.0           /*амплитуда тока аварийного режима, А*/
#define PSYnorm 20.0        /*начальная фаза тока нормального режима, градусы*/
#define PSYavar 30.0        /*начальная фаза тока аварийного режима, градусы*/
#define PI 3.14159265359    /*число ПИ*/
#define n 35000.0           /*возникновение аварийного режима*/
#define BUF_SZ (2*N)        /*размер буфера*/
 
typedef struct {
    int head;
    double data[BUF_SZ];
} buffer_t;
 
buffer_t input2;
buffer_t sum2;
buffer_t output;
 
 int main(void)
 {
     int i;
     double h, T, w;
     T = 1.0/(double)F;          /*период, с*/
     h = T/N;                    /*шаг интегрирования, с*/
     w = 2*PI*F;                 /*угловая частота, рад/с*/
     for (i = 0; i < SZ; ++i) {
         double t = i*h;
         double sample;
         if (i > n) {
             sample = Iavar * sin(w * t + PSYavar);    /*аварийный режим*/
         } else {
             sample = Inorm * sin(w * t + PSYnorm);    /*нормальный режим*/
         }
         sum2.data[i] = 0.0;
         input2.data[i] = sample[i]*sample[i];
         for (i = 1; i < SZ; ++i) {
             sum2.data[i] = sum2.data[i-1] + input2.data[i];
         }
 
         double sum, r;
         if (i < N) {
             sum = sum2.data[i];
         } else {
              sum = sum2[i] - sum2[i-N];
         }
         r = sqrt(sum/N);
         printf("RMS=%lf\n",r);
        }
     return 0;
         }

Решение задачи: «Исправить код, что бы он заработал»

textual
Листинг программы
#include <stdio.h>
#include <math.h>
#define F 50              /*частота, Гц*/
#define TD 20             /*длина сигнала, с*/
#define N 80              /*количество точек дискретизаци на период было 80.0 */
#define SZ (N*F*TD)         /*количество точек на всей длине сигнала*/
#define Inorm 2.0           /*амплитуда тока нормального режима, А*/
#define Iavar 5.0           /*амплитуда тока аварийного режима, А*/
#define PSYnorm 20.0        /*начальная фаза тока нормального режима, градусы*/
#define PSYavar 30.0        /*начальная фаза тока аварийного режима, градусы*/
#define PI 3.14159265359    /*число ПИ*/
#define n 35000.0           /*возникновение аварийного режима*/
#define BUF_SZ (N*F*TD)        /*размер буфера */
 
typedef struct 
{
    int head;
    double data[BUF_SZ];
} buffer_t;
 
buffer_t input2;
buffer_t sum2;
buffer_t output;
 
int main(void)
{
    int i,j;
    double h, T, w;
    T = 1.0/(double)F;          /*период, с*/
    h = T/N;                    /*шаг интегрирования, с*/
    w = 2*PI*F;                 /*угловая частота, рад/с*/
    for (i = 0; i < BUF_SZ; ++i) 
    {
        double t = i*h;
        double sample;
        if (i > n)
            sample = Iavar * sin(w * t + PSYavar);    /*аварийный режим*/
        else
            sample = Inorm * sin(w * t + PSYnorm);    /*нормальный режим*/
        sum2.data[i] = 0.0;
        input2.data[i] = sample*sample;// sample[i]*sample[i]
        for (j = 1; j < SZ; ++j) 
        {
            sum2.data[j] = sum2.data[j-1] + input2.data[j]; // нужен другой индекс j
        }
        double sum, r;
        if (i < N) {
            sum = sum2.data[i];
        } else {
            sum = sum2.data[i] - sum2.data[i-N]; // было без data
        }
        r = sqrt(sum/N);
        printf("RMS=%lf\n",r);
    }
    return 0;
}

Объяснение кода листинга программы

  1. В начале кода подключаются необходимые заголовочные файлы: iostream.h, math.h и cmath.
  2. Определяются константы: F, TD, N, SZ, Inorm, Iavar, PSYnorm, PSYavar, PI и n.
  3. Определяется структура буфера: buffer_t.
  4. Создаются переменные: input2, sum2 и output типа buffer_t.
  5. В функции main() инициализируются переменные: i, j, T, h, w.
  6. Вычисляется период T и шаг интегрирования h.
  7. Вычисляется угловая частота w.
  8. Запускается цикл for для заполнения буфера input2. В каждой итерации вычисляется время t, значение которого используется для вычисления текущего значения сигнала в нормальном или аварийном режиме. Значение сигнала возводится в квадрат и сохраняется в массиве input2.
  9. Запускается вложенный цикл for для вычисления суммы элементов в буфере sum2.
  10. Если i меньше N, то сумма sum обновляется значением sum2.data[i]. Если i больше или равно N, то сумма sum обновляется как разность между sum2.data[i] и sum2.data[i-N].
  11. Вычисляется среднее значение суммы sum по всем элементам буфера.
  12. Вычисляется среднеквадратичное значение RMS.
  13. Выводится значение RMS на экран.
  14. Функция main() возвращает 0, что означает успешное завершение работы программы.

Оцени полезность:

9   голосов , оценка 4.111 из 5
Похожие ответы