开始日期,加天数,求结束日期(跨年,闰年)

输入一个日期:startdate(年月日)和天数(days>=1),输出字该输入日期days天的日期enddate(即enddate=startdate+days)要求输入和输出的年份为四位整数,并确保得到有效的输入数据。同时需要考虑跨年和闰年等情况,闰年用自定义函数计算,日期自定义结构体描述。

#include "stdio.h" 
int Is_Special_Year(int year);
int From_Year_Day_Num(int year,int month,int day);
void main()
{
    struct Input_Date 
    {
        int year;
        int month;
        int day;
        int day_num;
    };
    struct  Input_Date test_input_date;
    printf("xxxx-xx-xx,n格式输入\n"); 
    scanf("%d-%d-%d,%d",&test_input_date.year,&test_input_date.month,&test_input_date.day,&test_input_date.day_num);
Print_Dest_Date(test_input_date.year,test_input_date.month,test_input_date.day,test_input_date.day_num);
//From_Year_Day_Date(2017,1);
}
// 判断是否为闰年 
int Is_Special_Year(int year)
{
    if(year%4==0&&year%100!=0||year%400==0)
    {
        printf("is\n");
        return 1;
    }
    else
    {   
        printf("isn't\n");
        return 0;       
    }
}
//  判断一年当中的第几天
int From_Year_Day_Num(int year,int month,int day)
{
    int day_num=0;
    int temp=Is_Special_Year(year);
    switch(month)
    {
        case 1:     day_num=0;break;
        case 2:     day_num=31;break;
        case 3:     day_num=31+28+temp;break;
        case 4:     day_num=31+28+31+temp;break;
        case 5:     day_num=31+28+31+30+temp;break;
        case 6:     day_num=31+28+31+30+31+temp;break;
        case 7:     day_num=31+28+31+30+31+30+temp;break;
        case 8:     day_num=31+28+31+30+31+30+31+temp;break;
        case 9:     day_num=31+28+31+30+31+30+31+31+temp;break;
        case 10:    day_num=31+28+31+30+31+30+31+31+30+temp;break;
        case 11:    day_num=31+28+31+30+31+30+31+31+30+31+temp;break;
        case 12:    day_num=31+28+31+30+31+30+31+31+30+31+30+temp;break;
    }
    day_num+=day;
    return day_num; 
}
//根据输出的天数判断当前日期
int From_Year_Day_Date(int year,int day_num)
{
    int i;
    int temp_month,temp_day;
    int sum =0;
    int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    if(Is_Special_Year(year)) 
    {
        a[2] =29;
    }
    for(i=0;i<12;i++)
    {
        sum=sum+a[i];
        if(day_num>sum && day_num<=sum+a[i+1])
        {
            temp_month = i+1;
            temp_day = day_num-sum;
        }
    }
    //输出目的日期 
    printf("enddate日期为:%d-%d-%d",year,temp_month,temp_day);
} 
// 输出enddate 
void Print_Dest_Date(int year,int month,int day,int day_num)
{
    //起始日期-距离该年第多少天----临时变量 
    int temp_start_days = From_Year_Day_Num(year,month,day);
    printf("距离该年第多少天-:%d\n",temp_start_days);
    //判断有没有跨年的变量 
    int is_temp_over_year;  
    //临时年份-
    int temp_year; 
    //距离输入的起始年开始的总天数 
        printf("距离输入的起始年开始的总天数-:%d\n",day_num);
    is_temp_over_year = temp_start_days + day_num;
    printf("距离输入的起始年开始的总天数-:%d\n",is_temp_over_year);
    //思路:首先判断该年是否是闰年---
    //  Yes:根据现有的总天数判断有没有跨年,
    //  若没有跨年,直接调用 From_Year_Day_Date
    //  若跨年,对其进行% 
    temp_year = year;
    int flag = 1;
    while(flag)
     {
        //首先判断该年是否是闰年 
        if(Is_Special_Year(temp_year))
        {
            if(is_temp_over_year<=366)
            {   
                From_Year_Day_Date(temp_year,is_temp_over_year);
                flag=0;
                break;
            }
            else
            {
                is_temp_over_year =is_temp_over_year - 366;
                //年份加1 
                temp_year++;
            }
        }
        else 
        {
            if(is_temp_over_year<=365)
            {   
                From_Year_Day_Date(temp_year,is_temp_over_year);
                flag=0;
                break;
            }
            else
            {
                is_temp_over_year =is_temp_over_year - 365; 
                //年份加1 
                temp_year++;
            }
        }
    }


}
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值