Ошибка сегментации в полосах Боллинджера - PullRequest
0 голосов
/ 26 апреля 2018

Я попытался создать программу, которая печатает даты покупки / продажи акций в хронологическом порядке, используя полосы Боллинджера.Полосы Боллинджера - это инструмент, который использует скользящее среднее (MA) и стандартное отклонение (SD) цен на акции для определения верхней и нижней границ для покупки и продажи.

Эта программа получает N, M и цены на акции в течение N дней.Затем границы получают с использованием MA & SD цен на акции с (n-M + 1) -го дня до n-го дня.Если цена акций n-го дня выше верхней границы, акции должны быть проданы, а если ниже, то должны быть куплены.Когда наступает день покупки, перед продажей печатается «+», а при продаже - «-».

Приведенный ниже код сообщает об ошибке сегментации, и я попытался выполнить отладку с помощью анализа ядра, из-за которого я не смог добиться успеха.Интересно, почему в этом коде возникает ошибка сегментации.

#include <stdio.h>
#include <math.h>

long double average(int a[], int M, int n)
{
     int i;
     long double sum = 0;
     for(i=n-M+1; i<=n; i++)
     {
         sum += a[i-1];
     }
     return sum/(long double)M;
}

long double deviation(int a[], int M, int n, long double av)
{
    int i;
    long double temp, sum = 0;
    for(i=n-M+1; i<=n; i++)
    {
        temp = a[i-1]-av;
        sum += temp*temp;
    }
    return sqrt(sum/(long double)M);
}

int main()
{
    int N, M;
    scanf("%d %d", &N, &M);

    int i;
    int a[N];
    for(i=0; i<N; i++)
    {
        scanf("%d", a[i]);
    }

    long double av, high, low;
    for(i=M; i<=N; i++)
    {
        av = average(a, M, i);
        high = av + 2*deviation(a, M, i, av);
        low = av - 2*deviation(a, M, i, av);

        if(a[i-1] > high)
            printf("-%d", a[i-1]);
        else if(a[i-1] < low)
            printf("+%d", a[i-1]);
    }
    return 0;
}

вход:

40 10
161 250 324 330 308 356 410 449 524 489 514 569 491 447 521 535 564 641 558 539 516 580 629 656 736 670 668 691 618 618 556 611 632 561 606 607 585 560 462 500 

вывод:

-18-25+39

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Посмотрите на второй цикл внутри, затем основной, вы запустили его от М до N, доза М - верхняя граница, я считаю, что вы должны использовать for(i=M; i<=N; i--), также индекс массива c начинается с 0, поэтому используйте for(i= M - 1; i<=N; i--), иscanf("%d", &a[i]);

0 голосов
/ 26 апреля 2018

Вы должны передать адрес переменной scanf(), иначе это приведет к неопределенному поведению, что может привести к ошибке сегмента, поэтому, пожалуйста, измените:

 scanf("%d", a[i]);

на

 scanf("%d", &a[i]);
...