问题及代码:
/*
*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,改了好多好多次。
这是我到现在为止写过的最长的一个程序了,中间输入秒数求解的还偷工减料了,因为真心来不了,不然代码行数会更长的。