第十七周项目5-玩日期时间

定义一个表示时间(包括年、月、日、时、分、秒)的结构体,然后完成下面的功能。
提示:将各个功能分别设计成函数实现,在main函数中调用,进行测试。
要实现的功能是:
(1)输入一个时间(注意各部分数据的取值范围)将输入的时间保存在一个结构体变量中;
(2)输出该日在本年中是第几天(注意闰年问题);
(3)输出这是这一天中的第几秒;
(4)输出这是这一年中的第几秒;(不要认为这个数荒唐,在计算中需要取随机数时需要一个不会重复的“种子数”,这个秒数是常用的。)
(5)求你输入的时间d天后是哪年哪月哪日,将结果保存在一个结构体变量中输出;

(6)求你输入的时间s秒后是何日何时,将结果保存在一个结构体变量中输出;

/*
* Copyright (c) 2014,烟台大学计算机学院
* All right reserved.
* 作者:邵帅
* 文件:temp.cpp
* 完成时间:2014年12月20日
* 版本号:v1.0
*/
#include<iostream>
using namespace std;
struct date
{
    int year;
    int month;
    int day;
    int hour;
    int min;
    int sec;
};
bool year(int y);
int day(int y, int m, int d);
int sec(int h, int m, int s);
int afterday(int y, int m, int d,int n);
int aftersec(int y, int m, int d,int h, int m1, int s,int n);
int main()
{
    date date;
    int days, secs,allsecs;
    int after,after1;
    cout << "请输入日期:";
    cin >> date.year >> date.month >> date.day;
    cout  << "请输入时间:";
    cin >> date.hour >> date.min >> date.sec;
    days = day(date.year, date.month, date.day);
    cout << date.year << "年" << date.month << "月" << date.day << "日是这一年的第" << days<< "天。" << endl;
    secs = sec(date.hour, date.min, date.sec);
    allsecs=((day(date.year,date.month,date.day))*86400)+secs;
    cout <<date.hour << ":" << date.min << ":" << date.sec << "是今天的第" << secs << "秒," ;
    cout << "今年的第" <<allsecs << "秒。" << endl;
    cout<<"请输入天数:";
    cin>>after;
    cout<<after<<"天后的日期为:";
    afterday(date.year,date.month,date.day,after);
    cout<<endl;
    cout<<"请输入秒数:";
    cin>>after1;
    cout<<after1<<"秒后的日期为:";
    aftersec(date.year, date.month, date.day,date.hour, date.min, date.sec,after1);
}
int day(int y, int m, int d)	// 一年中的第几天
{
    int sum;
    switch (m)
    {
    case 1:
        sum = d;
        break;
    case 2:
        sum = d + 31;
        break;
    case 3:
        sum = d + 59;
        break;
    case 4:
        sum = d + 90;
        break;
    case 5:
        sum = d + 120;
        break;
    case 6:
        sum = d + 151;
        break;
    case 7:
        sum = d + 181;
        break;
    case 8:
        sum = d + 212;
        break;
    case 9:
        sum = d + 243;
        break;
    case 10:
        sum = d + 273;
        break;
    case 11:
        sum = d + 304;
        break;
    case 12:
        sum = d + 334;
        break;
    }
    if (year(y))
    {
        if (m > 2)
            sum--;
    }
    return sum;
}
int sec(int h, int m, int s)	// 一天中的第几秒
{
    int secs;
    secs = h * 3600 + m * 60 + s;
    return secs;
}
int afterday(int y, int m, int d,int n) //d天后的日期
{
    int mon[12]= {31,28,31,30,31,30,31,31,30,31,30,31}; //每月天数
    while(n--)    //循环经过每一天,
    {
        d++;
        if(d>mon[m-1]) //过了一个月
        {
            m++;
            d=1;
        }
        if(m>12) //过了一年
        {
            y++;
            if(year(y))
                mon[1]=29;
            else mon[1]=28;
            m=1;
        }
    }
    cout<<y<<"年"<<m<<"月"<<d<<"日";
}
int aftersec(int y, int m, int d,int h, int m1, int s,int n) //过了n秒
{
    int d1=0;
    while (n--)
    {
        s++;
        if (s>60)
        {
            m1++;
            s=1;
        }
        if (m1>60)
        {
            h++;
            m1=1;
        }
        if (h>24)
        {
            d1++;
            h=1;
        }
    }
    afterday(y,m,d,d1);
    cout<<h<<":"<<m1<<":"<<s<<""<<endl;
}
bool year(int y) //布尔型,判断是否是闰年
{
    if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0 && y % 100 == 0))
        return true;
    else
        return false;
}

运行结果:



过程中复杂的是(5)和(6),如何正确处理d天后、s秒后的日期很重要。

int afterday(int y, int m, int d,int n) //d天后的日期
{
    int mon[12]= {31,28,31,30,31,30,31,31,30,31,30,31}; //每月天数
    while(n--)    //循环经过每一天,
    {
        d++;
        if(d>mon[m-1]) //过了一个月
        {
            m++;
            d=1;
        }
        if(m>12) //过了一年
        {
            y++;
            if(year(y))
                mon[1]=29;
            else mon[1]=28;
            m=1;
        }
    }
    cout<<y<<"年"<<m<<"月"<<d<<"日";
}

s秒后的日期和时间,同上。

int aftersec(int y, int m, int d,int h, int m1, int s,int n) //过了n秒
{
    int d1=0;
    while (n--)
    {
        s++;
        if (s>60)
        {
            m1++;
            s=1;
        }
        if (m1>60)
        {
            h++;
            m1=1;
        }
        if (h>24)
        {
            d1++;
            h=1;
        }
    }
    afterday(y,m,d,d1);
    cout<<h<<":"<<m1<<":"<<s<<""<<endl;
}

同时,如何判断平年闰年。

可以使用Bool型参数。

bool year(int y) //布尔型,判断是否是闰年
{
    if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0 && y % 100 == 0))
        return true;
    else
        return false;
}


@ Mayuko

posted @ 2014-12-20 15:28  麻麻麻麻鱼鱼  阅读(136)  评论(0编辑  收藏  举报