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

题目描述

给定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行:N2支股票的开盘与收盘价格(注意日期是无序的)

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值