C语言算法-计算两个日期的间距天数

思路

分析

日期1:起始日期
日期2:最终日期

  1. 两个日期在同一年
    1)日期2天数-日期1天数

  2. 不在同一年
    1)计算间隔几年
    2)这些间隔年份中是否有闰年
    3)间隔年份天数+日期2天数-日期1天数

流程图

在这里插入图片描述

代码

#include<stdio.h>

int mdays[12] = {31,28,31,30,31,30,31,31,30,31,30,31};

int sumdays(int year,int month,int day){

	int days = 0,leap = 0;

	if( (year%4==0 && year%100!=0) || year%400==0 )
	{
		leap = 1;
	}
	switch(month)
	{
	case 1:
		days = day;
		break;
	case 2:
		days += 31 + day;
		break;
	case 3:
		days += 31 + (leap?29:28) + day;
		break;
	case 4:
		days += 31 + (leap?29:28) + 31 + day;
		break;
	case 5:
		days += 31 + (leap?29:28) + 31 + 30 + day;
		break;
	case 6:
		days += 31 + (leap?29:28) + 31 + 30 + 31 + day;
		break;
	case 7:
		days += 31 + (leap?29:28) + 31 + 30 + 31 + 30 + day;
		break;
	case 8:
		days += 31 + (leap?29:28) + 31 + 30 + 31 + 30 + 31 + day;
		break;
	case 9:
		days += 31 + (leap?29:28) + 31 + 30 + 31 + 30 + 31 + 31 + day;
		break;
	case 10:
		days += 31 + (leap?29:28) + 31 + 30 + 31 + 30 + 31 + 31 + 30 + day;
		break;
	case 11:
		days += 31 + (leap?29:28) + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + day;
		break;
	case 12:
		days += 31 + (leap?29:28) + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + day;
		break;
	}

	return days;
}

int contrastYear(int year_one,int year_two){
	if(year_one>year_two){
		return 1;
	}else{
		return 0;
	}
}

int contrastMonth(int month_one,int month_two){
	if(month_one>month_two){
		return 1;
	}else{
		return 0;
	}
}


int main(){
	int year_one,month_one,day_one,year_two,month_two,day_two;
	int sums = 0,n = 0,y,m,d;
	printf("--------------------------------------\n");
	printf("日期格式:2020.1.1");
	printf("请输入起始日期:");
	scanf("%d.%d.%d",&year_one,&month_one,&day_one);
	printf("\n请输入终止日期:");
	scanf("%d.%d.%d",&year_two,&month_two,&day_two);
	printf("--------------------------------------\n");

	if(year_one<0 || month_one<=0 || month_one>12 || day_one<=0 || day_one>mdays[month_one-1]
		|| year_two<0 || month_two<=0 || month_two>12 || day_two<=0 || day_two>mdays[month_two-1])//输入非法。
    {
        printf("输入年月日不合法\n");//提示并退出。
        return -1;
    }


	if(contrastYear(year_one,year_two)){
		y = year_one,
		year_one = year_two;
		year_two = y;

		m = month_one;
		month_one = month_two;
		month_two = m;

		d = day_one;
		day_one = day_two;
		day_two = d;
	}

	n = year_two - year_one;
	if(n == 0){

		if(contrastMonth(month_one,month_two)){
			m = month_one;
			month_one = month_two;
			month_two = m;

			d = day_one;
			day_one = day_two;
			day_two = d;
		}


		sums += sumdays(year_two,month_two,day_two);
		sums -= sumdays(year_one,month_one,day_one);
	}else{
		while(n>0){
			sums += 365;
			if( ((year_one+n-1)%4==0 && (year_one+n-1)%100!=0) || (year_one+n-1)%400==0 ){
				sums++;
			}
			n--;
		}
		sums += sumdays(year_two,month_two,day_two);
		sums -= sumdays(year_one,month_one,day_one);
	}

	printf("结果为%d\n",sums);
	printf("--------------------------------------\n");
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值