您的位置:首页 > 其它

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

2017-11-30 20:59 239 查看
输入一个日期: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++;
}
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: