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

/* 
* Copyright (c) 2014, 烟台大学计算机学院 
* All rights reserved. 
* 文件名称:test.cpp 
* 作    者:刘畅 
* 完成日期:2014 年 12  月  19  日 
* 版 本 号:v1.0 
* 
* 问题描述:定义一个表示时间(包括年、月、日、时、分、秒)的结构体,然后完成下面的功能(可以在一个main函数中完成,也可以用函数求解,main函数调用即可):
           (1)输入一个时间(注意各部分数据的取值范围)将输入的时间保存在一个结构体变量中;
           (2)输出该日在本年中是第几天(注意闰年问题);
           (3)输出这是这一天中的第几秒;
           (4)输出这是这一年中的第几秒;
           (5)求你输入的时间d天后是哪年哪月哪日,将结果保存在一个结构体变量中输出;(你的万天日期靠这个 功能了)——插讲一个故事。当年老贺由小孩儿过百日,想到自己的万日在哪天。            编程计算,结果刚过了十几天,那个懊恼啊。第二个万日得再等26年多,第三个万日,谁敢说            一定能过上?20岁左右的你,要算清楚了。在第(1)问中输入你的生日及时辰,d值取为10000            ,可以算出你的万日,大概在26岁多。
           (6)求你输入的时间s秒后是何日何时,将结果保存在一个结构体变量中输出;。
* 输入描述:输入年月日时分秒,
* 程序输出:按照要求输出。


#include <iostream>
using namespace std;
struct Time
{
    int year;
    int month;
    int day;
    int hour;
    int minute;
    int second;
};
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 Daysofyear(int y);
Time afterDays(Time time,int d);
int main()
{
    Time time,addtime;
    cout<<"请输入一个时间(依次为年、月、日、时、分、秒):"<<endl;
    getTime(time);
    outTime(time);
    cout<<"这是该年的第"<<Dayofyear(time)<<"天"<<endl;
    cout<<"这是该天的第"<<Secondofday(time)<<"秒"<<endl;
    cout<<"这是该年的第"<<Secondofyear(time)<<"秒"<<endl;
    int d;
    cout<<"请输入一个天数:";
    cin>>d;
    addtime=afterDays(time,d);
    cout<<"原时间后"<<d<<"天的";
    outTime(addtime);
    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,23);
    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;
}

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 Daysofyear(int y)
{
    int n;
    if ((y%4==0&&y%100!=0)||y%400==0)
       n=366;
    else
       n=365;
    return n;
}

Time afterDays(Time time,int d)
{
    Time time1=time;
    int d1=d+Dayofyear(time);
    time1.month=1;
    time1.day=0;
    while(d1>Daysofyear(time1.year))
    {
        d1-=Daysofyear(time1.year);
        ++time1.year;
    }
    while(d1>Dayofmonth(time1.year,time1.month))
    {
        d1-=Dayofmonth(time1.year,time1.month);
        ++time1.month;
    }
    time1.day+=d1;
    return time1;
}


 


运行结果:


学习心得:

连续两个多小时的努力,在做不下去的时候总算是搞定了。真心醉了啊!!!这个项目对我们这些菜鸟来说还是有些麻烦了。我卡在了好几个地方大哭。一个是想要消除在不同字符串常量去传入定义了char *的函数里面去时的警告,算是没搞定吧,最后选择用数组表示同时在学长的帮助下定义string才消除了警告,之后又发现了一个及其脑残的错误,求本月有几天的函数被我的定性思维给弄成了求当年第几天(前面说过,当年第几天做过好几次了,一次比一次印象深,结果,,,被坑得体无完肤啊),最后一个求d天后的时间刚看的也是没有什么头绪,在借助老师的博客的帮助下才做出来。唉唉,继续加油!还有一个用结构体给定两个时间,求相差多少天,相差多少秒的问题明天再做,敬请期待。

刚刚又发现两个个小错误,在前面的函数定义中漏掉了int Daysofyear(int y);可能是不小心在编译完成后碰到Delete被删除了吧。还有时的范围应该是0到23,现已改正。图上的错误就不改了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值