第17周项目5--玩日期时间(两个日期天数之差,秒数之差)

/* 
* Copyright (c) 2014, 烟台大学计算机学院 
* All rights reserved. 
* 文件名称:test.cpp 
* 作    者:刘畅 
* 完成日期:2014 年 12  月  20  日 
* 版 本 号:v1.0 
* 
* 问题描述:定义一个表示时间(包括年、月、日、时、分、秒)的结构体,然后完成下面的功能(可以在一个main函数中完成,也可以用函数求解,main函数调用即可):
(7)用结构体变量给定两个时间,求相差多少天?相差多少秒?

* 输入描述:输入两个日期(年月日时分秒),
* 程序输出:输出这两个日期。


#include <iostream>
using namespace std;
struct Time
{
    int year;
    int month;
    int day;
    int hour;
    int minute;
    int second;
}time1;
Time time2;
void getTime(Time &time);                                //输入一个时间(注意各部分数据的取值范围)将输入的时间保存在一个结构体变量中;
void outTime(Time &time);                                //输出时间;
int getscope(string t,int min,int max);                  //在给定的范围内输入数字;
int Dayofmonth(int y,int m);                             //确定月份的天数;
int Dayofyear(Time &time);                               //输出该日在该年中是第几天(注意闰年问题);
int Secondofday(Time &time);                             //输出这是该天中的第几秒;
int Secondofyear(Time &time);                            //输出这是该年的第几秒;                                   //
int Compareday(Time &time1,Time &time2);                 //输出两个日期相差多少天;
int Comparesecond(Time &time1,Time &time2);              //输出两个日期相差多少秒。
int main()
{
    Time time1,time2;
    cout<<"请输入一个时间(依次为年、月、日、时、分、秒):"<<endl;
    getTime(time1);
    cout<<"请输入另一个时间(依次为年、月、日、时、分、秒):"<<endl;
    getTime(time2);
    outTime(time1);
    outTime(time2);
    cout<<"经过计算得出,两个日期之间相差"<<Compareday(time1,time2)<<"天,相差"<<Comparesecond(time1,time2)<<"秒。";
    return 0;
}

void getTime(Time &time)
{
    string t[6]= {"年","月","日","时","分","秒"};
    time.year=getscope(t[0],1,9999);
    time.month=getscope(t[1],1,12);
    time.day=getscope(t[2],1,Dayofmonth(time.year,time.month));
    time.hour=getscope(t[3],0,24);
    time.minute=getscope(t[4],0,59);
    time.second=getscope(t[5],0,59);
}

void outTime(Time &time)
{
    cout<<"时间为:"<<time.year<<"年"<<time.month<<"月"<<time.day<<"日";
    cout<<time.hour<<"时"<<time.minute<<"分"<<time.second<<"秒"<<endl;
    cout<<"这是该年的第"<<Dayofyear(time)<<"天"<<endl;
    cout<<"这是该天的第"<<Secondofday(time)<<"秒"<<endl;
    cout<<"这是该年的第"<<Secondofyear(time)<<"秒"<<endl;
}

int getscope(string t,int min,int max)
{
    int num;
    cout<<"请输入"<<t<<"的范围:["<<min<<","<<max<<"]:";
    do
    {
        cin>>num;
    }
    while (num<min||num>max);
    return num;
}

int Dayofmonth(int y,int m)
{
    int days,i;
    for(i=1; i<=m; i++)
    {
        if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)
            days=31;
        else if (i==4||i==6||i==9||i==11)
            days=30;
        else if ((y%4==0 && y % 100 != 0)||y% 400 == 0)
            days=29;
        else
            days=28;
    }
    return days;
}

int Dayofyear(Time &time)
{
    int days1=0,n=1;
    while (n<time.month)
    {
        days1+=Dayofmonth(time.year,n);
        ++n;
    }
    days1+=time.day;
    return days1;
}

int Secondofday(Time &time)
{
    return time.hour*3600+time.minute*60+time.second;

}

int Secondofyear(Time &time)
{
    int s;
    s=(Dayofyear(time)-1)*24*3600+Secondofday(time);
    return s;
}



int Compareday(Time &time1,Time &time2)
{
    Time time3;
    int sum1,i,m=0;
    if (time1.year>time2.year)
    {
        time3=time1;
        time1=time2;
        time2=time3;
    }
    for (i=time1.year; i<time2.year; ++i)
    {
        if ((i%4==0&&i%100!=0)||i%400==0)
            m++;
    }
    sum1=(time2.year-time1.year)*365+m+Dayofyear(time2)-Dayofyear(time1);
    return sum1;
}

int Comparesecond(Time &time1,Time &time2)
{
    Time time4;
    int sum2;
    if (time1.year>time2.year)
    {
        time4=time1;
        time1=time2;
        time2=time4;
    }
    sum2=Compareday(time1,time2)*24*3600+Secondofday(time2)-Secondofday(time1);
    return sum2;
}

运行结果:



学习心得:

好吧,困扰了我半天的问题在把前面那个生日之差的项目补上之后迎刃而解了。

虽然不知道正确与否,但能做到这样,我已经很开心了。不过不足的是实在不知道怎么去写注释的好,读者们敬请见谅啊。

这是在昨晚那篇博文也就是这个项目的前六个问题的代码上加以删改补充的,突然又找到了前面一个没发现的错误----时的范围应该是0到23,之前写成了24。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值