第17周项目5-玩日期时间

问题及代码:

/* 
*Copyright (c)2014,烟台大学计算机与控制工程学院 
*All rights reserved. 
*文件名称:days.cpp 
*作    者:单昕昕 
*完成日期:2014年12月20日 
*版 本 号:v1.0 
* 
*问题描述:输入一个时间,保存到结构体变量中。
1、求该日是本年第几天;2、求该日是本年第几秒;3、求该时是当年第几秒;4、计算输入的某日的日期;5、计算某秒是何日何时;5、计算两个日期间隔。
*程序输入:时间。
*程序输出:1、求该日是本年第几天;2、求该日是本年第几秒;3、求该时是当年第几秒;4、计算输入的某日的日期;5、计算某秒是何日何时;5、计算两个日期间隔。
*/  
#include <iostream>
#include <cmath>
using namespace std;
int day(int y, int m, int d);  //计算当年第几天
int second_day(int h, int m, int s);  //计算当天第几秒
int second_year(int y, int m, int d,int h, int mm, int s);  //计算当年第几秒
void calculate_day(int y, int m, int d);  //计算某日的日期
void calculate_second(int d,int h, int m, int s);  //计算某秒是何日何时
void d_date(int y1, int m1, int d1,int h1, int mm1, int s1,int y2, int m2, int d2,int h2, int mm2, int s2);  //计算两个日期间隔
struct Date  //结构体定义日期时间
{
    int year;
    int month;
    int day;
    int hour;
    int minute;
    int second;
};
int main()
{
    Date date;
    cout<<"请输入年、月、日、时、分、秒(中间用空格隔开):";
    cin>>date.year>>date.month>>date.day>>date.hour>>date.minute>>date.second;
    int days=day(date.year,date.month,date.day);//计算当年第几天
    int seconds_day=second_day(date.hour,date.minute,date.second);//计算当天第几秒
    int seconds_year=second_year(date.year,date.month,date.day,date.hour,date.minute,date.second);//计算当年第几秒
    cout<<date.month<<"月"<<date.day<<"日是"<<date.year<<"年的第"<<days<<"天."<<endl;
    cout<<date.hour<<"时"<<date.minute<<"分"<<date.second<<"秒是该天的第"<<seconds_day<<"秒."<<endl;
    cout<<date.hour<<"时"<<date.minute<<"分"<<date.second<<"秒是该年的第"<<seconds_year<<"秒."<<endl;
    calculate_day(date.year,date.month,date.day); //计算某日的日期
    calculate_second(date.day,date.hour,date.minute,date.second);  //计算某秒是何日何时
    Date date1,date2;  //定义两个结构体变量
    cout<<"请输入第一个时间:";
    cin>>date1.year>>date1.month>>date1.day>>date1.hour>>date1.minute>>date1.second;
    cout<<"请输入第二个时间:";
    cin>>date2.year>>date2.month>>date2.day>>date2.hour>>date2.minute>>date2.second;
    d_date(date1.year,date1.month,date1.day,date1.hour,date1.minute,date1.second,date2.year,date2.month,date2.day,date2.hour,date2.minute,date2.second); //计算两个日期间隔
    return 0;
}
int day(int y, int m, int d)
{
    int sum=0,n;
    for(n=1; n<m; ++n)
    {
        if ((y%4==0&&y%100!=0)||y%400==0)
        {
            if(n==1||n==3||n==5||n==7||n==8||n==10||n==12)
                sum+=31;
            else if (n==2)
                sum+=29;
            else
                sum+=30;
        }
        else
        {
            if(n==1||n==3||n==5||n==7||n==8||n==10||n==12)
                sum+=31;
            else if (n==2)
                sum+=28;
            else
                sum+=30;
        }
    }
    sum+=d;
    return (sum);
}
int second_day(int h, int m, int s)
{
    int sum;
    sum=h*3600+m*60+s;
    return (sum);
}
int second_year(int y, int m, int d,int h, int mm, int s)
{
    int days=day(y,m,d)-1;
    int seconds=second_day(h,mm,s);
    int sum=days*24*3600+seconds;
    return (sum);
}
void calculate_day(int y, int m, int d)
{
    struct Dates  //定义一个保存目标日期的结构体
    {
        int year;
        int month;
        int day;
    };
    Dates dates;  //目标日期
    cout<<"请输入想计算的天数:";
    int dd,yy;
    cin>>dd;  //输入想计算的天数
    int sum,ycount,mcount,dcount;  //各种辅助计数变量
    sum=ycount=mcount=dcount=0;
    int i=dd/365;  //先判断是否满一年
    if(i>0)
    {
        yy=y;  //防止y的原值在计算中受到影响
        while(i>0)  //计算相隔有多少年
        {
            yy++;
            if ((yy%4==0&&yy%100!=0)||yy%400==0)
            {
                sum+=366;
                ycount++;
            }
            else
            {
                sum+=365;
                ycount++;
            }
            i--;
        }
    }
    int j=(dd-sum)/30;  //再判断是否满一个月
    y+=ycount;  //更新年份
    if(j>0)
    {
        int mm=m;
        if((mm+j)<12)  //判断是否超出一年12个月
        {
            for(; j>0; j--)  //计算月份
            {
                if ((y%4==0&&y%100!=0)||y%400==0)  //闰年
                {
                    if(mm==1||mm==3||mm==5||mm==7||mm==8||mm==10||mm==12)
                    {
                        sum+=31;
                        mcount++;
                    }
                    else if (mm==2)
                    {
                        sum+=29;
                        mcount++;
                    }
                    else
                    {
                        sum+=30;
                        mcount++;
                    }
                }
                else  //平年
                {
                    if(mm==1||mm==3||mm==5||mm==7||mm==8||mm==10||mm==12)
                    {
                        sum+=31;
                        mcount++;
                    }
                    else if (m==2)
                    {
                        sum+=28;
                        mcount++;
                    }
                    else
                    {
                        sum+=30;
                        mcount++;
                    }
                }
                mm+=(j-1);
            }
            m+=mcount;  //更新月份
            d+=(dd-sum);  //更新天数
        }
        else  //如果超出一年12个月
        {
            y++;  //最多超出1年,所以在这里直接更新+1
            int k;
            mm=m;
            for(k=0; (mm+=k)<=12; ++k)  //计算12个月内的月份数
            {
                if ((y%4==0&&y%100!=0)||y%400==0)  //闰年
                {
                    if(mm==1||mm==3||mm==5||mm==7||mm==8||mm==10||mm==12)
                    {
                        sum+=31;
                    }
                    else if (mm==2)
                    {
                        sum+=29;
                    }
                    else
                    {
                        sum+=30;
                    }
                }
                else  //平年
                {
                    if(mm==1||mm==3||mm==5||mm==7||mm==8||mm==10||mm==12)
                    {
                        sum+=31;
                    }
                    else if (mm==2)
                    {
                        sum+=28;
                    }
                    else
                    {
                        sum+=30;
                    }
                }
            }
            j=m+j-12;
            m=1;  //更新月份
            mm=m;
             for(; mm<=j; ++mm) //计算超出的一年后的月份
            {
                if ((y%4==0&&y%100!=0)||y%400==0)  //闰年
                {
                    if(mm==1||mm==3||mm==5||mm==7||mm==8||mm==10||mm==12)
                    {
                        sum+=31;
                        mcount++;
                    }
                    else if (mm==2)
                    {
                        sum+=29;
                        mcount++;
                    }
                    else
                    {
                        sum+=30;
                        mcount++;
                    }
                }
                else  //平年
                {
                    if(mm==1||mm==3||mm==5||mm==7||mm==8||mm==10||mm==12)
                    {
                        sum+=31;
                        mcount++;
                    }
                    else if (mm==2)
                    {
                        sum+=28;
                        mcount++;
                    }
                    else
                    {
                        sum+=30;
                        mcount++;
                    }
                }
            }
            m+=mcount;  //更新月份
            d+=(dd-sum);  //更新天数
        }
    }
    else  //如果剩下的天数不满一个月
        d+=(dd-sum);  //更新天数
    if ((y%4==0&&y%100!=0)||y%400==0)  //闰年
    {
        if(m==2&&d>29)
        {
            m++;
            d-=29;
        }
        else if(((m==1||m==3||m==5||m==7||m==8||m==10||m==12))&&d>31)
        {
            m++;
            d-=31;
        }
        else if((m==4||m==6||m==9||m==11)&&d>30)  //注意这里不能直接用else,因为情况太多
        {
            m++;
            d-=30;
        }
    }
    else  //平年
    {
        if(m==2&&d>28)
        {
            m++;
            d-=28;
        }
        else if(((m==1||m==3||m==5||m==7||m==8||m==10||m==12))&&d>31)
        {
            m++;
            d-=31;
        }
        else if((m==4||m==6||m==9||m==11)&&d>30)
        {
            m++;
            d-=30;
        }
    }
    dates.year=y;  //将数据存入结构体变量中
    dates.month=m;
    dates.day=d;
    cout<<"您输入的"<<dd<<"天后是"<<dates.year<<"年"<<dates.month<<"月"<<dates.day<<"日"<<endl;
}
void calculate_second(int d,int h, int m, int s)
{
    struct Time  //定义一个保存目标日期的结构体
    {
        int hour;
        int minute;
        int second;
    };
    Time time;  //目标时间
    cout<<"请输入经过的秒数(一天内):";
    int ss;  //经过的秒数
    cin>>ss;
    time.hour=ss/3600;  //计算目标时间
    time.minute=(ss-time.hour*3600)/60;
    time.second=ss-time.hour*3600-time.minute*60+s;
    if(time.second>60)
    {
        time.second-=60;
        time.minute++;
    }
    time.minute+=m;
    if(time.minute>60)
    {
        time.minute-=60;
        time.hour++;
    }
    time.hour+=h;
    if(time.hour>24)
    {
        time.hour=0;
        d++;
    }
    cout<<ss<<"秒后是"<<time.hour<<"时"<<time.minute<<"分"<<time.second<<"秒"<<endl;
}
void d_date(int y1, int m1, int d1,int h1, int mm1, int s1,int y2, int m2, int d2,int h2, int mm2, int s2)  //形参有6个
{
    int s=0;
    int day(int y, int m, int d);
    int sum1=day(y1,m1,d1);
    int sum2=day(y2,m2,d2);
    int hsum=h1*60*60+mm1*60+s1;
    int msum=h2*60*60+mm2*60+s2;
    int ssum=fabs(hsum-msum);  //求两段时间的绝对值
    if(y1>y2)
    {
        while(y1>=y2)
        {
            y1--;
            if(((y1%4==0&&y1%100!=0)||y1%400==0))
                s+=366;
            else
                s+=365;
            y1--;
        }
        sum1+=s;
        sum1-=sum2;
        cout<<"这两个时间相差"<<sum1<<"天."<<endl;
        cout<<"这两个时间相差"<<ssum<<"秒."<<endl;
    }
    else if(y1<y2)
    {
        while(y2>=y1)
        {
            y2--;
            if(((y2%4==0&&y2%100!=0)||y2%400==0))
                s+=366;
            else
                s+=365;
            y2--;
        }
        sum2+=s;
        sum2-=sum1;
        cout<<"这两个时间相差"<<sum2<<"天."<<endl;
        cout<<"这两个时间相差"<<ssum<<"秒."<<endl;
    }
    else
        cout<<"这两个时间相差"<<fabs(sum1-sum2)<<"天."<<endl;
    cout<<"这两个时间相差"<<ssum<<"秒."<<endl;
}
 

长老标答:

#include <iostream>  
using namespace std;  
struct Time  
{  
    int year;  
    int month;  
    int day;  
    int hour;  
    int minute;  
    int second;  
};  
  
  
//输入一个限定范围内的整型数值  
int getNum(char *prompt, int min, int max)  
{  
    int value=-1;  
    cout<<"输入"<<prompt<<",范围["<<min<<","<<max<<"]:";  
    do  
    {  
        cin>>value;  
    }  
    while(value<min || value>max);  
    return value;  
}  
  
  
//返回y年m月的天数  
int daysOfMonth(int m,int y)  
{  
    int days;  
    switch(m)  
    {  
    case 1:  
    case 3:  
    case 5:  
    case 7:  
    case 8:  
    case 10:  
    case 12:  
        days=31;  
        break;  
    case 4:  
    case 6:  
    case 9:  
    case 11:  
        days=30;  
        break;  
    case 2:  
        if((y%4==0&&y%100!=0)||y%400==0)  
            days=29;  
        else  
            days=28;  
    }  
    return days;  
}  
  
  
//输入时间,参数为引用类型,可以影响实参的值  
void getTime(Time &t)  
{  
    t.year=getNum("年",0,3000); //用于输入一定范围内的数  
    t.month=getNum("月",1,12);  
    t.day=getNum("日",1,daysOfMonth(t.month, t.year));  
    t.hour=getNum("时",0,24);  
    t.minute=getNum("分",0,59);  
    t.second=getNum("秒",0,59);  
}  
  
  
//输出时间,参数也用作引用是对结构常见的处理办法  
void outputTime(Time &t)  
{  
    cout<<"时间为: "<<t.year<<"年"<<t.month<<"月"<<t.day<<"日"<<t.hour<<"时"<<t.minute<<"分"<<t.second<<"秒"<<endl;  
}  
  
  
//这天是这一年的第几天  
int dayOfYear(Time &t)  
{  
    int days=0;  
    int m=1;  
    while(m<t.month)  //前若干月的天数加起来  
    {  
        days+=daysOfMonth(m,t.year);  //充分利用已经设计的函数  
        ++m;  
    }  
    days+=t.day; //再加上本月的天数  
    return days;  
}  
  
  
//这天是这一天的第几秒  
int secondOfDay(Time &t)  
{  
    return t.hour*3600+t.minute*60+t.second;  
}  
  
  
//返回一年有多少天(365或366天)  
int daysOfYear(int y)  
{  
    return ((y%4==0&&y%100!=0)||y%400==0)?366:365;  
}  
  
  
//求你输入的时间d天后是哪年哪月哪日  
Time afterDays(Time t,int d)  
{  
    Time t1=t;  
    int d1=d+dayOfYear(t); //dayOfYear(t)求出t是当年第几天  
    t1.month=1;  
    t1.day=0;  //这样,将问题转换为在当年1月0日基础上加d1天(这个0有意思),避免以后老为2月操心,以及剩余天数一加以后持续进位  
//    cout<<"转换为";  
//    outputTime(t1);  
//    cout<<"这一天后"<<d1<<"天。";  
    while(d1>daysOfYear(t1.year))  //天数还够一个整年  
    {  
        d1-=daysOfYear(t1.year);  
        ++t1.year;  
    }  
    //天数不够一整年后,再考虑月,因为从1月1日开始,不用担心Nt.year再加1年  
    while(d1>daysOfMonth(t1.month,t1.year))  //天数还够一个整月  
    {  
        d1-=daysOfMonth(t1.month,t1.year);  
        ++t1.month;  
    }  
    //剩全天数加到日上  
    t1.day+=d1;  
    return t1;  
}  
  
  
int main()  
{  
    Time t,nt;  
    //(1)输入一个时间(注意各部分数据的取值范围)将输入的时间保存在一个结构体变量中;  
    cout<<"请输入一个时间(包括年,月,日,时,分,秒):"<<endl;  
    getTime(t);  
    outputTime(t);  
    //(2)输出该日在本年中是第几天(注意闰年问题);  
    cout<<"这是这一年中的第"<<dayOfYear(t)<<"天。"<<endl;  
    //(3)输出这是这一天中的第几秒;  
    cout<<"这是这一天中的第"<<secondOfDay(t)<<"秒。"<<endl;  
    //(4)输出这是这一年中的第几秒;  
    cout<<"这是这一年中的第"<<dayOfYear(t)*24*3600+secondOfDay(t)<<"秒。"<<endl;  
    //(5)求你输入的时间d天后是哪年哪月哪日,将结果保存在一个结构体变量中输出;  
    int d;  
    cout<<"请输入一个天数";  
    cin>>d;  
    nt=afterDays(t,d);  
    cout<<"这一天后d(如10000)天后是:";  
    outputTime(nt);  
  
  
    return 0;  
}  



运行结果:

 

知识点总结:

1、求该日是本年第几天;2、求该日是本年第几秒;3、求该时是当年第几秒;4、计算输入的某日的日期;5、计算某秒是何日何时;5、计算两个日期间隔。

用各种函数,结构体。

 

学习心得:

好难啊,我写了好几个小时啊啊!!

总是有些小bug,改了好多好多次。

这是我到现在为止写过的最长的一个程序了,中间输入秒数求解的还偷工减料了,因为真心来不了,不然代码行数会更长的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值