给定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
#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;
}