输入两个年份,判断两个年份之间相差多少天 (c语言)

#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<string.h>

//定义一个结构体的日期
typedef struct
{
	//年
	int Year;
	//月
	int Month;
	//日
	int Day;
} DateTime;

//日期对比结果
typedef enum  
{
	//小于对方
	Min = -1,
	//等于
	Equal = 0,
	//大于
	Max = 1
}DateTimeResult;
//判断是否是一个大的日期,返回1为大
DateTimeResult IsMaxDateTime(DateTime dt1,DateTime dt2)
{
	DateTimeResult temp = IsMaxNumber(dt1.Year,dt2.Year);
	if(temp != Equal)
	{
		return temp;
	}
	else
	{
		temp = IsMaxNumber(dt1.Month,dt2.Month);
		if(temp != Equal)
		{
			return temp;
		}
		else
		{
			return IsMaxNumber(dt1.Day,dt2.Day);
		}
	}
}
//判断两个数字大小
DateTimeResult IsMaxNumber(int a,int b)
{
	int temp =  a - b;
	if(temp != 0)
	{
		if(temp > 0)
		{
			return Max;
		}
		else
		{
			return Min;
		}
	}
	return Equal;
}
//判断是否是瑞年,瑞年返回1
int IsRui(DateTime dt)
{
	if(dt.Year % 400 == 0 || (dt.Year % 100 !=0 && dt.Year % 4 == 0))
	{
		return 1;
	}
	return 0;
}
//数据交换,大的在前,相等不管
DateTimeResult SwapDataTime(DateTime *dt1,DateTime *dt2)
{
	DateTime temp;
	DateTimeResult result=IsMaxDateTime(*dt1,*dt2);
	if(result!=Equal)
	{
		if(result==Min)
		{
			temp=*dt1;
			*dt1=*dt2;
			*dt2=temp;
		}
	}
	return result;
}
//获取当月一共有多少天
int getMonthDayCount(DateTime dt)
{
	int Months[] ={31,28,31,30,31,30,31,31,30,31,30,31};
	if(dt.Month == 2)
	{
		if(IsRui(dt))
		{
			return 29;
		}
	}
	return Months[dt.Month-1];
}
//天的话,要根据月份和年份来判断上限是多少天,一次加一天
//返回值为进位
int AddDay(DateTime *dt)
{
	int carry = 0;
	int NowMonthDay =getMonthDayCount(*dt);
	if((*dt).Day == NowMonthDay)
	{
		(*dt).Day = 1;
		//开始加月
		carry = 1;
	}
	else
	{
		(*dt).Day += 1;
	}
	return carry;
}
//增加月份
int AddMonth(DateTime *dt)
{
	int carry = 0;
	if((*dt).Month == 12)
	{
		(*dt).Month=1;
		carry=1;
	}
	else
	{
		(*dt).Month+=1;
	}
	return carry;
}
//增加年
int AddYear(DateTime *dt)
{
	(*dt).Year+=1;
}
//输入两个年份,判断两个年份之间相差多少天
void main(void)
{
	//准备采用递增的思想实现
	//肯定有一个大的时间和一个小的时间
	//小的时间按照日月年,逐步往上涨,逼近指定的位置
	//可能需要用到一个递归
	DateTime dt1,dt2,temp;
	DateTimeResult result;
	int Days=0,carry=0;
	dt1.Year=1991;
	dt1.Month=2;
	dt1.Day=15;
	dt2.Year=2019;
	dt2.Month=1;
	dt2.Day=29;
	//把dt1变成大的日期
	result= SwapDataTime(&dt1,&dt2);
	temp = dt2;//temp保存一下备份,里面为最小的日期
	if(result!=Equal)
	{
		//开始进行业务处理
		while ((result=SwapDataTime(&dt1,&dt2)) != Equal)
		{
			//下面实现了日期的递增
			carry=AddDay(&dt2);
			if(carry)
			{
				carry= AddMonth(&dt2);
				if(carry)
				{
					AddYear(&dt2);
				}
			}
			Days++;
		}
	}
	printf("大的日期是:%d年%d月%d日 小的年是:%d年%d月%d日 它们相差:%d天! \r\n"
		,dt1.Year,dt1.Month,dt1.Day,temp.Year,temp.Month,temp.Day,Days);
	system("pause");
}

 

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝创精英团队

你的支持是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值