计算2支股票的M天运动平均价格

题目描述

给定2支股票的开盘价和收盘价的N天历史数据,
要求按开盘和收盘,分别计算每支股票的每个日期对应的M天移动平均价格。
 
假定两个股票数据如下:     
 
日期            开盘/收盘      第1支股票价格S1       第2支股票价格S2
 
2004/7/29   close 64
2004/7/25   close 2 6
2004/7/26   open 8 12
2004/7/30   open 2 4
2004/7/27   close 8 10
2004/7/28   open 4 2
 
按M=2天计算移动平均价格,按先开盘,后收盘价,输出如下:(若某日期之前,没有M-1条的记录(日期不用连续),则不用输出)
 
2004/7/28   open 6 7
2004/7/30   open 3 3
2004/7/27   close 5 8
2004/7/29   close 7 7
 
其中, 2004/7/28日的S1的值为(8+4)/2 = 6, 即将2004/7/28和(最近1条记录2004/7/26,最近2条记录,最近M-1条记录)的价格,求和并计算平均。
 

输入

第1行:N天记录   M天平均
第2行到N+1行:N天2支股票的开盘与收盘价格(注意日期是无序的)
 
6  2
2004/7/29   close 6 4
2004/7/25   close 2 6
2004/7/26   open 8 12
2004/7/30   open 2 4
2004/7/27   close 8 10
2004/7/28   open 4  2
 

输出

每个日期的最近M条记录(包括该日期的价格在内)的平均价格(若某日期之前没有M-1条的记录(日期不用连续),则不用输出)
2004/7/28   open 6 7
2004/7/30   open 3 3
2004/7/27   close 5 8
2004/7/29   close 7 7

样例输入

6 2 2004/7/29 close 6 4 2004/7/25 close 2 6 2004/7/26 open 8 12 2004/7/30 open 2 4 2004/7/27 close 8 10 2004/7/28 open 4 2

样例输出

2004/7/28 open 6 7 2004/7/30 open 3 3 2004/7/27 close 5 8 2004/7/29 close 7 7

提示

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
    int N,M;///N天记录,M天平均
    cin>>N>>M;
    string *date,*tag;
    date=new string[N];
    tag=new string[N];
    int *year,*month,*day,*value1,*value2;
    year=new int[N];
    month=new int[N];
    day=new int[N];
    int *D=new int[N];
    value1=new int[N];
    value2=new int[N];
    for(int i=0;i<N;i++)
    {
        cin>>date[i]>>tag[i]>>value1[i]>>value2[i];//date为日期,tag为状态,value1和value2为值
        string t=date[i];
        int Y=(t[0]-'0')*1000+(t[1]-'0')*100+(t[2]-'0')*10+(t[3]-'0');
        year[i]=Y;
        if(t[6]=='/')
        {
            int M=t[5]-'0';
            month[i]=M;
            if(t.size()==8)
            {
                int D=t[7]-'0';
                day[i]=D;
            }
            else
            {
                int D=(t[7]-'0')*10+t[8]-'0';
                day[i]=D;
            }
        }
        else
        {
            int Mon=(t[5]-'0')*10+t[6]-'0';
            month[i]=Mon;
            if(t.size()==9)
            {
                int D=t[8]-'0';
                day[i]=D;
            }
            else
            {
                int D=(t[8]-'0')*10+t[9]-'0';
                day[i]=D;
            }
        }
        D[i]=year[i]*1000+month[i]*10+day[i];
    }
 
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<N-1-i;j++)
        {
            if(D[j]>D[j+1])//按总日期D进行冒泡排序,排序时除了要交换date,还需要交换状态tag,还有数值value1和value2
            {
                swap(D[j],D[j+1]);
                swap(date[j],date[j+1]);
                swap(tag[j],tag[j+1]);
                swap(value1[j],value1[j+1]);
                swap(value2[j],value2[j+1]);
            }
        }
    }
    int count,sum1,sum2;
    for(int i=1;i<N;i++)//按日期从小到大先将open状态的平均值输出
    {
        sum1=value1[i],sum2=value2[i];
        count=0;
        if(tag[i]=="close")
            continue;
        for(int j=i-1;j>=0;j--)
        {
            if(tag[j]=="open")
            {
                count++;
                sum1+=value1[j];
                sum2+=value2[j];
            }
            if(count==M-1)
                break;
        }
        if(count==M-1)
        {
            cout<<date[i]<<' '<<tag[i]<<' '<<sum1/M<<' '<<sum2/M<<endl;
        }
    }
    for(int i=1;i<N;i++)//按日期从小到大再将close状态的平均值输出
    {
        sum1=value1[i],sum2=value2[i];
        count=0;
        if(tag[i]=="open")
            continue;
        for(int j=i-1;j>=0;j--)
        {
            if(tag[j]=="close")
            {
                count++;
                sum1+=value1[j];
                sum2+=value2[j];
            }
            if(count==M-1)
                break;
        }
        if(count==M-1)
        {
            cout<<date[i]<<' '<<tag[i]<<' '<<sum1/M<<' '<<sum2/M<<endl;
        }
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/SZU-DS-wys/p/12180776.html