用C语言计算两个日期之间的天数

计算两个日期间的天数,并在用户输入时检查月份和日期是否有误,有误时要求重新输入。
编译器为visual studio 2019

#include<stdio.h>
#include<stdlib.h>
int func1(int flag,int mon);
int func2(int mon, int day, int year);
int check(int in, int flag);
int main() 
{
	system("color F0");
	int year1,year2,mon1,mon2,day1,day2,flag,i,p,n=0,m=0;
	void input(int *year,int *mon,int *day);
	void change(int* x, int* y);
	while (1)
	{
		printf("请输入起始时间:\n");
		input(&year1, &mon1, &day1);
		printf("请输入结束时间:\n");
		input(&year2, &mon2, &day2);
		if ((year1 * 10000 + mon1 * 100 + day1) > (year2 * 10000 + mon2 * 100 + day2)){
			change(&year1, &year2);
			change(&mon1, &mon2);
			change(&day1, &day2);
		}
		p = year2 - year1;
		i = p;
		while (p >= 2)
		{
			p = p - 1;
			flag = year1 + p;
			if ((flag % 4 == 0) && ((flag % 400 == 0) || (flag % 100 != 0))) 
				n++;
			else 
				m++;
		}
		year1 = ((year1 % 4 == 0) && ((year1 % 400 == 0) || (year1 % 100 != 0))) ? 366 : 365;
		year2 = ((year2 % 4 == 0) && ((year2 % 400 == 0) || (year2 % 100 != 0))) ? 366 : 365;
		flag = func2(mon2, day2, year2) - func2(mon1, day1, year1);
		if (i == 0)
			printf("日期相差%d天\n\n", flag);
		else if (i == 1)
			printf("日期相差%d天\n\n", flag + year1);
		else
			printf("日期相差%d天\n\n", flag + year1 + n * 366 + m * 365);
	}
	return 0;
}
void input(int* year, int* mon, int* day)
{
	int flag;
	printf("年:");
	scanf_s("%d", year);
	printf("月:");
	scanf_s("%d", mon);
	*mon = check(*mon,12);
    flag = ((*year % 4 == 0) && ((*year % 400 == 0) || (*year % 100 != 0))) ? 1 : 0;
	flag = func1(flag, *mon);
	printf("日:");
	scanf_s("%d", day);
	*day = check(*day, flag);
}
void change(int* x, int* y)
{
	int z;
	z = *y;
	*y = *x;
	*x = z;
}
int func1(int flag,int mon)
{
	int a, b;
	a = (mon == 2) ? 1 : 0;
	b = ((mon == 1) || (mon == 3) || (mon == 5) || (mon == 7) || (mon == 8) || (mon == 10) || (mon == 12)) ? 1 : 0;
	switch (a * 4 + b * 2 + flag)
	{
	case 0:
	case 1:return 30; break;
	case 2:
	case 3:return 31; break;
	case 4:return 28; break;
	case 5:return 29; break;
	}
}
int func2(int mon, int day, int year)
{
	int flag,num=0;
	if (year == 365){
		for (flag = 1; flag < mon; flag++)
		{
			num = func1(0, flag) + num;
		}
	}
	else{
		for (flag = 1; flag < mon; flag++)
		{
			num = func1(1, flag) + num;
		}
	}
	return num + day;
}
int check(int in, int flag)
{
	if ((in <= flag) && (in >= 1))
		return in;
	else{
		printf("输入有误,请重新输入:");
		scanf_s("%d", &in);
		return check(in,flag);
	}
}

运行结果

在这里插入图片描述

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值