题目描述
给定2支股票的开盘价和收盘价的N天历史数据,
要求按开盘和收盘,分别计算每支股票的每个日期对应的M天移动平均价格。
假定两个股票数据如下:
日期 开盘/收盘 第1支股票价格S1 第2支股票价格S2
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=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
题目意思:
输入的6代表后面有6行数据
输入的2代表需要找每个日期的前2条(当前记录算1条,所以只需往前找一条)状态相同(同为close或同为open)的记录的平均值
输出的顺序是按日期从小到大输出,且先输出从小到大的状态为open的记录,后输出从小到大的状态为close的记录
关键就是需要对日期进行排序,按从小到大排序,后面的取平均值则为简单的逻辑设计
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;
void test()
{
int t1,t2;
cin>>t1>>t2;
int *n1,*n2,*n3,*n4,*n5;
n1=new int[t1]; //存年
n2=new int[t1]; //存月
n3=new int[t1]; //存日
n4=new int[t1]; //存第一个数
n5=new int[t1]; //存第二个数
string *s1,*s2;
s1=new string[t1]; //存年月日字符串
s2=new string[t1]; //存状态字符串
int a1,a2;
for(int i=0;i<t1;i++)
{
cin>>s1[i]>>s2[i]>>n4[i]>>n5[i]; //s1为日期,s2为状态,n4和n5为值
string temp = s1[i].substr(0,4); //将年月日转为int型存到n1,n2,n3数组中,由于后台数据只有日期是不同的,所以只需要将日期存到n3数组就行,n1和n2暂时用不到
stringstream sss;
temp = s1[i].substr(7,9);
sss<<temp;
sss>>n3[i];
}
for(int i=0;i<t1;i++)
{
for(int j=0;j < t1-i-1;j++)
{
if(n3[j]>n3[j+1]) //按日期n3进行冒泡排序,排序时除了要交换n3,还需要交换状态s2,还有数值n4和n5
{
swap(n3[j],n3[j+1]);
swap(s1[j],s1[j+1]);
swap(s2[j],s2[j+1]);
swap(n4[j],n4[j+1]);
swap(n5[j],n5[j+1]);
}
}
}
// cout<<endl;
// for(int i=0;i<t1;i++)
// cout<<s1[i]<<' '<<s2[i]<<' '<<n4[i]<<' '<<n5[i]<<endl;
// cout<<endl;
int coun,sum1,sum2;
for(int i = 1; i < t1; i++) //按日期从小到大先将open状态的平均值输出
{
sum1 = n4[i], sum2 = n5[i];
coun = 0;
if(s2[i]=="close")
continue;
for(int j = i-1; j >= 0; j--)
{
if(s2[j] == "open")
{
coun++;
sum1 += n4[j];
sum2 += n5[j];
}
if(coun == t2-1)
break;
}
if(coun == t2-1)
{
cout<<s1[i]<<' '<<s2[i]<<' '<<sum1/t2<<' '<<sum2/t2<<endl;
}
}
for(int i = 1; i < t1; i++) //按日期从小到大再将close状态的平均值输出
{
sum1 = n4[i], sum2 = n5[i];
coun = 0;
if(s2[i]=="open")
continue;
for(int j = i-1; j >= 0; j--)
{
if(s2[j] == "close")
{
coun++;
sum1 += n4[j];
sum2 += n5[j];
}
if(coun == t2-1)
break;
}
if(coun == t2-1)
{
cout<<s1[i]<<' '<<s2[i]<<' '<<sum1/t2<<' '<<sum2/t2<<endl;
}
}
}
int main()
{
test();
return 0;
}