17周项目五。。结构体玩转日期。。

本文通过C++代码展示了如何使用结构体处理日期相关的计算,包括日期的输入输出、计算一年中的第几天、增加天数和秒数后的日期计算等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题及代码:

/* 
*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;
}


运行结果:

心得体会:

做了三天。。。不说了。。满满的辛酸泪啊。。。各种哭。。不过挺有成就感的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值