我尝试使用布林带(Bollinger Bands)制作一个程序,按时间顺序打印股票的买入/卖出日期。布林带是一个使用移动平均线(MA)和放大器的工具。标准偏差(SD)的股票价格,以确定购买的上限和下限。抛售。
此程序收到N天的N,M和股票价格。然后,通过使用从第(n-M + 1)天到第n天的股票价格的MA& SD获得界限。如果第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
答案 0 :(得分:0)
你必须将变量的地址传递给scanf()
,否则会导致未定义的行为,可能导致段错误,所以请更改:
scanf("%d", a[i]);
到
scanf("%d", &a[i]);
答案 1 :(得分:0)
看看里面的第二个循环然后主要你从M跑到N剂量M是上限我相信你应该使用for(i=M; i<=N; i--)
,也是c数组索引从0开始,所以使用{{1 }}和for(i= M - 1; i<=N; i--)
;