坑坑坑 完全深坑 日历 吐槽!!!!

题目描述

我们大多数人都有一个日历,我们可以在这个日历上涂写我们生活中重要事件的细节 - 拜访牙医,丽晶酒店24小时预订销售,编程比赛等等。不过也有固定的日期:合作伙伴的生日,结婚纪念日等; 我们也需要跟踪这些。通常我们需要提醒这些重要日期何时到来 - 事​​件越重要,我们越想提前进一步慢跑。

编写一个程序来提供这样的服务。输入将指定日历相关的年份(范围从1901到1999)。请记住,在指定的范围内,所有可以被4整除的年份都是闰年,因此会增加额外的一天(2月29日)。输出将指定“今天”的日期,即将发生的事件列表以及其相对重要性的指示。

输入

第一行输入将包含一个表示年份的整数(范围在1901到1999之间)。接下来是一系列代表周年纪念日或请求服务的日子。

周年纪念系列将包括字母'A'; 表示日期,月份和事件重要性的三个整数(D,  M,  P); 和一个描述事件的字符串,全部由一个或多个空格分隔。P将是介于1和7之间的数字(包括两者),并且表示在提醒服务应该开始的事件之前的天数。描述事件的字符串将始终存在,并将从优先级后的第一个非空字符开始。

日期行由字母'D'和上述日期和月份组成。

所有的周年纪念行将在任何日期行之前。没有一行会超过255个字符。该文件将由一个由单个#组成的行终止。


输出

输出将由一系列线组成,输入中的每个日期线都会有一行。每个区块将包含要求的日期,之后是当天的活动列表,以及随后的日子。

输出应指定事件的日期(D  和  M),在宽度为3的字段中右对齐,并指出事件的相对重要性。今天发生的事件应该标记如下,明天发生的事件应该有P星,后天发生的事件应该有P-1星,等等。如果几个事件安排在同一天,按相对重要性(星号)排序。

如果仍然存在冲突,请在输入流中对其进行排序。按照下面例子中使用的格式。在块之间留出1个空行。

样例输入

1993
A 23 12 5 Partner's birthday
A 25 12 7    Christmas
A 20 12 1 Unspecified Anniversary
D 20 12
#

样例输出

Today is: 20 12
 20 12 *TODAY* Unspecified Anniversary
 23 12 ***     Partner's birthday
 25 12 ***     Christmas
算法实现:
#include<iostream>
#include<vector>
#include<stdio.h> 
#include<algorithm>
using namespace std;
int sum1;
struct node
{
    int m;
    int d;
    int p;
    int id;
    int sum;
    char a[260];
}day;
bool cmp(const struct node& left,const struct node& right)
{
//    return left.sum==right.sum?left.p>right.p:left.sum<right.sum;

    if(left.sum==right.sum)//如果纪念日是同一天 按照星级排序大到小,如果星级一样,按照输入次序排序先来后到 
    {                      
        if(left.sum==sum1)  //如果纪念日是今天,按照输入次序先来后到 
            return left.id<right.id;
        if(left.p==right.p)
            return left.id<right.id;
        else
            return left.p>right.p;
    }
    else
        return left.sum<right.sum;//纪念日不是同一天则按照日期小的在前面大的在后面排序 
}

int main()
{
	int time[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    vector <struct node> days;
    int mark=0;
    int year;
    int m1,d1,i1=0;
    cin>>year;
    if(year%4==0)
        time[2]=29;
    for(int k=1;k<=12;k++)
        time[k]+=time[k-1];
    int i=0;
    char ch;
    int flag=0;
    while(1)
    {
        cin>>ch;
        if(ch=='#')
            break;
        if(ch=='A')
        {
            cin>>day.d>>day.m>>day.p;
            gets(day.a);
            while(day.a[0]==' ')
                for(int k=0;day.a[k];k++)
                    day.a[k]=day.a[k+1];
            day.sum=time[day.m-1]+day.d;//day.sum用来计算当天是当年的第几天 
            if(day.m==1)//如果该纪念日是一月标记为mark=1,总天数sum加上12月份的天数 
            {
                day.sum+=time[12];
                mark=1;
            }
            day.id=i;//记录是第几位输入的数据 
            days.push_back(day);//将该纪念日放入容器内 
            if(mark==1)//如果被标记为1,将该day放入容器,只是此时sum是正常的 
            {
                day.sum-=time[12];
                mark=0;
                days.push_back(day);
                i1++;
            }
            i++;//i用来统计有多少个纪念日 
        }
        if(ch=='D')
        {
            cin>>d1>>m1;
            sum1=time[m1-1]+d1;//sum1表示今天是今年的第几天 
            sort(days.begin(),days.end(),cmp);//将所有纪念日进行排序 
            flag=1;
            printf("Today is:%3d%3d\n",d1,m1);
            for(int j=0;j<i+i1;j++)
            {
                if(sum1>days[j].sum)//如果纪念日在今天之前 跳过 
                    continue;
                if(sum1==days[j].sum)//纪念日等于今天 
                    printf("%3d%3d *TODAY* %s\n",days[j].d,days[j].m,days[j].a);
                else //纪念日不等于今天 
                {

                    int k=days[j].p-(days[j].sum-sum1)+1;//k用来计算星级程度 
                    int k1=7-k;//k1来计算空格数  保证输出整齐 
                    if(k<=0)//如果星级程度为负 则跳过 
                        continue;
                    printf("%3d%3d ",days[j].d,days[j].m);
                    while(k--)
                        cout<<"*";
                    while(k1--)
                        cout<<" ";
                    cout<<" "<<days[j].a<<endl;
                }
            }
            cout<<endl;
        }
    }
    return 0;
}




猜你喜欢

转载自blog.csdn.net/qq_41486817/article/details/80685166