C++ 我试着用C++; 我想要一个有效的函数 我相信我的逻辑是正确的,因此我的(向量超出范围错误)一定是由于不熟悉和正确使用代码造成的 我知道这个相当简单的算法有很长的代码。 如果可以的话,请帮忙

C++ 我试着用C++; 我想要一个有效的函数 我相信我的逻辑是正确的,因此我的(向量超出范围错误)一定是由于不熟悉和正确使用代码造成的 我知道这个相当简单的算法有很长的代码。 如果可以的话,请帮忙,c++,algorithm,while-loop,nested-loops,moving-average,C++,Algorithm,While Loop,Nested Loops,Moving Average,基本上,我把长度作为“移动”窗口,当它通过j循环到向量大小的末尾。这个向量充满了股票价格 如果数字1、2、3、4的2天移动平均线长度等于2。我应该能够输出1.5、2.5和3.5。但是,我得到了一个超出范围的错误 代码中显示了逻辑。如果一位专家能帮助我使用我正在尝试创建的这个简单的移动平均线函数,那就太好了!谢谢 void Analysis::SMA() { double length; cout << "Enter number days for your Simp

基本上,我把长度作为“移动”窗口,当它通过j循环到向量大小的末尾。这个向量充满了股票价格

如果数字1、2、3、4的2天移动平均线长度等于2。我应该能够输出1.5、2.5和3.5。但是,我得到了一个超出范围的错误

代码中显示了逻辑。如果一位专家能帮助我使用我正在尝试创建的这个简单的移动平均线函数,那就太好了!谢谢

void Analysis::SMA()
{

    double length;
    cout << "Enter number days for your Simple Moving Average:" << endl;
    cin >> length;
    double sum = 0;
    double a;
    while (length >= 2){
        vector<double>::iterator it;
        for (int j = 0; j < close.size(); j++){

                sum = vector1[length + j - 1] + vector1[length + j - 2];
                a = sum / length;
                vector2.push_back(a);

                vector<double>::iterator g;
                for (g = vector2.begin(); g != vector2.end(); ++g){

                    cout << "Your SMA: " << *g;
            }
        }
    }
}
void分析::SMA()
{
双倍长度;
库特长度;
双和=0;
双a;
而(长度>=2){
向量::迭代器;
对于(int j=0;jcout在最外层的while循环中,您永远不会更改
长度,因此您的函数将永远运行


然后,请注意,如果
length
是2,而
是closes.size()
是4,
length+j-1
将是5,因此我的心理调试技能告诉我,你的
vector1
太短,你可以从末端开始索引。

在你最外层的while循环中,你永远不会改变
length
,这样你的函数将永远运行


然后,请注意,如果
length
为2,并且
关闭.size()
是4,
length+j-1
将是5,所以我的心理调试技能告诉我你的
vector1
太短了,你从末尾开始索引。

你不需要3个循环来计算一个数据数组的移动平均值,你只需要1个。你在数组上迭代并跟踪最后n个项的总和,然后只需要一个循环为每个新值调整它,每次添加一个值,然后删除一个值

例如,假设您有一个数据集:

4 8 1 6 9
如果你想计算一个窗口大小为3的移动平均值,那么你可以这样计算一个运行总数:

iteration add subtract running-total output average
0         4   -        4             - (not enough values yet)
1         8   -        12            -
2         1   -        13            13 / 3
3         6   4        15            15 / 3
4         9   8        16            16 / 3
double runningTotal = 0.0;
int windowSize = 3;
for(int i = 0; i < length; i++)
{
     runningTotal += array[i];   // add
     if(i >= windowSize)
         runningTotal -= array[i - windowSize];   // subtract
     if(i >= (windowSize - 1))  // output moving average
         cout << "Your SMA: " << runningTotal / (double)windowSize;
}
请注意,我们每次加,我们在迭代3开始减法(窗口大小为3),并在迭代2开始输出平均值(窗口大小减1)

所以代码是这样的:

iteration add subtract running-total output average
0         4   -        4             - (not enough values yet)
1         8   -        12            -
2         1   -        13            13 / 3
3         6   4        15            15 / 3
4         9   8        16            16 / 3
double runningTotal = 0.0;
int windowSize = 3;
for(int i = 0; i < length; i++)
{
     runningTotal += array[i];   // add
     if(i >= windowSize)
         runningTotal -= array[i - windowSize];   // subtract
     if(i >= (windowSize - 1))  // output moving average
         cout << "Your SMA: " << runningTotal / (double)windowSize;
}
double runningTotal=0.0;
int windowSize=3;
for(int i=0;i=窗口大小)
runningTotal-=数组[i-WindowsSize];//减法
如果(i>=(WindowsSize-1))//输出移动平均值

cout在一个数据数组上计算移动平均值不需要3个循环,只需要1个循环。在数组上迭代并跟踪最后n个项目的总和,然后针对每个新值调整它,每次添加一个值并删除一个值

例如,假设您有一个数据集:

4 8 1 6 9
如果你想计算一个窗口大小为3的移动平均值,那么你可以这样计算一个运行总数:

iteration add subtract running-total output average
0         4   -        4             - (not enough values yet)
1         8   -        12            -
2         1   -        13            13 / 3
3         6   4        15            15 / 3
4         9   8        16            16 / 3
double runningTotal = 0.0;
int windowSize = 3;
for(int i = 0; i < length; i++)
{
     runningTotal += array[i];   // add
     if(i >= windowSize)
         runningTotal -= array[i - windowSize];   // subtract
     if(i >= (windowSize - 1))  // output moving average
         cout << "Your SMA: " << runningTotal / (double)windowSize;
}
请注意,我们每次加,我们在迭代3开始减法(窗口大小为3),并在迭代2开始输出平均值(窗口大小减1)

所以代码是这样的:

iteration add subtract running-total output average
0         4   -        4             - (not enough values yet)
1         8   -        12            -
2         1   -        13            13 / 3
3         6   4        15            15 / 3
4         9   8        16            16 / 3
double runningTotal = 0.0;
int windowSize = 3;
for(int i = 0; i < length; i++)
{
     runningTotal += array[i];   // add
     if(i >= windowSize)
         runningTotal -= array[i - windowSize];   // subtract
     if(i >= (windowSize - 1))  // output moving average
         cout << "Your SMA: " << runningTotal / (double)windowSize;
}
double runningTotal=0.0;
int windowSize=3;
for(int i=0;i=窗口大小)
runningTotal-=数组[i-WindowsSize];//减法
如果(i>=(WindowsSize-1))//输出移动平均值

cout这个问题已经得到了回答,但我想我会发布完整的代码,供将来寻找信息的人使用

#include <iostream>
#include <vector>
using namespace std;

int main() {
vector<double> vector1 { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 };
double length;
cout << "Enter number days for your Simple Moving Average:" << endl;
cin >> length;
double sum = 0;
int cnt = 0;
for (int i = 0; i < vector1.size(); i++) {
    sum += vector1[i];
    cnt++;
    if (cnt >= length) {
        cout << "Your SMA: " << (sum / (double) length) << endl;
        sum -= vector1[cnt - length];           
        }
    }
return 0;
}
#包括
#包括
使用名称空间std;
int main(){
向量向量1{2,4,6,8,10,12,14,16,18,20};
双倍长度;
库特长度;
双和=0;
int-cnt=0;
对于(int i=0;i=长度){

cout这个问题已经得到了回答,但我想我会发布完整的代码,供将来寻找信息的人使用

#include <iostream>
#include <vector>
using namespace std;

int main() {
vector<double> vector1 { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 };
double length;
cout << "Enter number days for your Simple Moving Average:" << endl;
cin >> length;
double sum = 0;
int cnt = 0;
for (int i = 0; i < vector1.size(); i++) {
    sum += vector1[i];
    cnt++;
    if (cnt >= length) {
        cout << "Your SMA: " << (sum / (double) length) << endl;
        sum -= vector1[cnt - length];           
        }
    }
return 0;
}
#包括
#包括
使用名称空间std;
int main(){
向量向量1{2,4,6,8,10,12,14,16,18,20};
双倍长度;
库特长度;
双和=0;
int-cnt=0;
对于(int i=0;i=长度){

移动平均线是否只需要一个循环,你的代码有三个。哥们,这太有用了!谢谢。你能给我看一下代码并回答它吗?为什么你要循环(长度>=2)当你从不修改长度时?为什么你要声明并用迭代器命名它,然后再不使用它?我要求用户输入,然后我使用这些信息来计算SMA。While很可能应该从那里删除。我会将While循环更改为IF语句。移动平均只需要一个循环,你的代码有三个。老兄,就是这样很有帮助!谢谢。你能给我看一下代码并回答吗?为什么你在(长度>=2)时循环当你从不修改长度时?为什么你声明并用迭代器命名它,然后从不使用它?我要求用户输入,然后我使用这些信息来计算SMA。While很可能应该从中删除。我将把While循环更改为IF语句。这是概念,但代码的逻辑在那里。我只是在尝试要编写SMA函数,通常长度为9、10、20、30、50、100或200。我看到了while如何永远循环。这是正确的概念,但代码的逻辑在那里。我只是尝试编写SMA函数,通常长度为9、10、20、30、50、100或200。我看到了