问题及代码:
/*
*Copyright (c) 2014,烟台大学计算机学院
*All rights reserved.
*文件名称:莉莉.cpp
*作者:李莉
*完成日期:2014年12月14日
*版本号:v1.0
*
*问题描述:利用结构体玩转日期
*程序输入:根据界面输入
*程序输出:跟据界面输出
*/
#include <iostream>
using namespace std;
struct Time
{
int year;
int month;
int day;
int hour;
int minute;
int second;
};
Time t1,t2,t3;
int month(Time &t);//声明函数输入的日期是该月的第几天
void getTime(Time &t);//声明输入日期的函数
void outputTime(Time &t);//声明输出日期的函数
int dayofyear(Time &t);//声明计算本天是该年第几天的函数
int daysofyear(int y);//声明一年有多少天的函数,处理闰年问题
int secondofday(Time &t);//声明输入秒数是该天的第几秒
int secondofyear(Time &t);//声明输入日期是该年的第几秒
Time afterdays(Time t,int d);//计算增加天数后的日期
Time secondafteryear(Time &t,int second);//计算增加秒数的还是函数
void compare(Time x,Time y);//声明两个日期比较函数
int days (Time t);//计算一个日期距离1900年一共有多少天
int d[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
Time t,nt;
int d,second;
cout<<"请输入一个时间(包含年月日时分秒)"<<endl;
getTime(t);
outputTime(t);
cout<<"这一天是这一年中的第"<<dayofyear(t)<<"天"<<endl;
cout<<"这是一天中的第"<<secondofday(t)<<"秒"<<endl;
cout<<"这是一年的第"<<secondofyear(t)<<"秒"<<endl;
cout<<"请输入一个天数";
cin>>d;
nt=afterdays(t,d);
cout<<"经过"<<d<<"天后这一天是";
outputTime(nt);
cout<<"请输入一个秒数:";
cin>>second;
nt=secondafteryear(t,second);
outputTime(nt);
cout<<"请输入两个日期:"<<endl;
cin>>t2.year>>t2.month>>t2.day>>t2.hour>>t2.minute>>t2.second;
cin>>t3.year>>t3.month>>t3.day>>t3.hour>>t3.minute>>t3.second;
compare(t2,t3);
return 0;
}
int month(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)
{
cin>>t.year>>t.month>>t.day>>t.hour>>t.minute>>t.second;
}
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+=month(m,t.year);//充分利用已有的函数,求前面几个月的天数和
m++;
}
days+=t.day;//再加上本月天数
return days;
}
int secondofday(Time &t)
{
return t.hour*3600+t.minute*60+t.second;//利用求出的天数计算
}
int daysofyear(int y)
{
return ((y%4==0&&y%100!=0)||(y%400==0))?366:365;//判断闰年与平年
}
int secondofyear(Time &t)
{
return (dayofyear(t)-1)*24*3600+secondofday(t);
}
Time afterdays(Time t,int d)
{
Time t1=t;
int d1=d+dayofyear(t);//加上你输入的天数是本年的第几天
t1.month=1;
t1.day=0;//不必再考虑平闰年问题,前面函数已解决
while(d1>daysofyear(t1.year))//当多出来的天数还够一年
{
d1-=daysofyear(t1.year);//减去一年的天数后还剩的日子数
++t1.year;//年数同时增加
}
while(d1>month(t1.month,t1.year))//剩余的天数还够一个月
{
d1-=month(t1.month,t1.year);//减去一个月的天数还剩的天数
++t1.month;//月份增加
}
t1.day+=d1;//剩下的天数即为本月的天数
return t1;
}
Time secondafteryear(Time &t,int second)
{
int i;
t1=t;//利用新的结构体储存数据
t1.hour=t.hour;
t1.minute=t.minute;
t1.second=t.second;
i=second/(3600*24);
afterdays(t,i);//加入的秒数换算成天数,利用已经设计好的函数重复增加天数的计算
second-=i*3600*24;//剩余的秒数还够的小时数
i=second/3600;
t1.hour+=i;
if(t1.hour>24)//如果小时数大于24,则日期增加
{
t1.day++;
}
second-=i*3600;
i=second/60;
t1.minute+=i;
second-=i*60;//剩余的秒数还够分钟
if(t1.minute>=60)//如果分钟大于60,小时增加
{
t1.hour++;
}
t1.second+=second;
if(t1.second>=60)
{
t1.minute++;
}
t=t1;
return t;
}
void compare (Time x,Time y)
{
int day1,day2,day3,s,se=0;
day1=days(x);
day2=days(y);
day3=day2-day1;
if(day3<0)
{
day3=-day3;
}
cout<<"两个日期相差的天数是:"<<day3<<"天"<<endl;
s=(x.hour-y.hour)*3600+(x.minute-y.minute)*60+(x.second-y.second);
if(s<0)
{
s=-s;
}
se=day3*24*3600+s;
cout<<"两个日期相差的秒数是:"<<se<<"秒"<<endl;
}
int days(Time t)
{
int i,days=0;
for(i=1900;i<t.year;i++)//计算所在的年份距离1900年这些年相差的天数
{
days+=365;
if((i%400==0)||((i%4==0)&&(i%100!=0)))//闰年的话就要在加上一天
days+=1;
}
days+=dayofyear(t);
return days;
}
运行结果:
心得体会:
做了三天。。。不说了。。满满的辛酸泪啊。。。各种哭。。不过挺有成就感的