一个日期的综合运算小程序

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include <time.h>
#include <stdlib.h>
#include <math.h>

	struct date                                                         //建立日期结构体
	{
		int year;
		int month;
		int day;
	};
	int m[2][12] = { {31,29,31,30,31,30,31,31,30,31,30,31},             //月份天数数组 第一行为闰年,第二行为平年
					{ 31,28,31,30,31,30,31,31,30,31,30,31 } };

	int leap(int y)                                                     //判断是否为闰年
	{
		if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
			return 1;
		else
			return 0;
	}

	int datetodays(struct date d)                                        //求一个日期到1970.01.01的天数
	{ 
		int sum = 0;
		int i;
		for ( i = 1970;i < d.year;i++)
		{
			sum = leap(i) + sum + 365;
		}
		if (leap(d.year))
		{
			for (int j = 1;j < d.month;j++)
			{
				sum = sum + m[0][j - 1];
			}
		}
		else
		{
			for (int j = 1;j < d.month;j++)
			{
				sum = sum + m[1][j - 1];
			}
		}
		sum = sum + d.day - 1;
		return sum;
	}

	struct date daystodate(int days)                                      //求1970.01.01加一定天数后的日期 
	{
		int year = 1970, month = 1, day = 1;
		int j;
		struct date d2;
		for ( j = 1970;days >= 365 + leap(j);j++)
		{
			days = days - 365 - leap(j);
			year++;
		}
		if (leap(j))
		{
			for (int k = 0;days >= m[0][k]; k++)
			{
				days = days - m[0][k];
				month++;
			}
		}
		else
		{
			for (int k = 0;days >= m[1][k]; k++)
			{
				days = days - m[1][k];
				month++;
			}
		}
		day += days;
		d2.year = year;d2.month = month;d2.day = day;
		return d2;
	}

	void outputdate(struct date a)                                       //输出日期
	{
		printf("year=%d month=%d day=%d", a.year, a.month, a.day);
	 }

	int isvalidity(struct date b)                                        //判断日期的合理性
	{
		if (b.year >= 1970)
		{
			if (leap(b.year))
			{
				if (b.month <= 12 && b.month >= 1)
				{
					if (b.day <= m[0][b.month - 1] && b.day >= 1)
						return 1;
					else
						return 0;
				}
				else return 0;
			}
			else
			{
				if (b.month <= 12 && b.month >= 1)
				{
					if (b.day <= m[1][b.month - 1]&&b.day>=1)
						return 1;
					else
						return 0;
				}
				else return 0;
			}
		}
		else 
			return 0;
	}

	int dateinterval(struct date a, struct date b)                      //计算两个日期间的天数
	{
		return abs(datetodays(a) - datetodays(b));
	}

	struct date dateadddays(struct date a, int days)                    //求日期加上天数后的日期
	{
		return daystodate(datetodays(a) + days);
	}

	struct date datesubdays(struct date b, int days)                    //求日期减去天数后的日期(最低为1970.01.01)
	{
		return daystodate(datetodays(b) - days);
	}

	int whatday(struct date c)                                          //求某个日期是星期几
	{
		return (datetodays(c)+3)%7+1;  //1970.01.01是星期四
	}

	int main()                                                          //test
	{
		printf("                        ******************日期的综合计算器******************\n");
		printf("选择你要使用的功能:\n");
		printf("1.计算两个日期之间的天数\n2.求一个日期加一定天数后的日期\n3.求一个日期减一定天数后的日期\n");
		printf("4.求某个日期是星期几\n");
		printf("请输入选择功能的序号:\n");
		int num = 0;int days = 0;
		struct date d1 = { 0,0,0 }, d2 = { 0,0,0 };
		scanf("%d", &num);
		switch (num)
		{
		case 1:
			printf("请输入第一个日期的年 月 日:");
			scanf("%d %d %d", &d1.year,&d1.month,&d1.day);
			if (isvalidity(d1) == 0)
				printf("日期错误,请重试");
				exit(0);
			printf("请输入第二个日期的年 月 日:");
			scanf("%d %d %d", &d2.year,&d2.month,&d2.day);
			if (isvalidity(d2) == 0)
				printf("日期错误,请重试");
				exit(0);
			printf("两个日期间的天数为:%d", dateinterval(d1, d2));
			break;
		case 2:
			printf("输入日期和要加的天数:");
			printf("请输入日期的年 月 日:");
			scanf("%d %d %d", &d1.year, &d1.month, &d1.day);
			if (isvalidity(d1) == 0)
				printf("日期错误,请重试");
			exit(0);
			printf("请输入天数:");
			scanf("%d", &days);
			struct date d2 = dateadddays(d1, days);
			printf("日期为:%d年%d月%d日", d2.year, d2.month, d2.day);
			break;
		case 3:
			printf("输入日期和要减的天数:");
			printf("注意:得出的日期最低为1970.01.01");
			printf("请输入日期的年 月 日:");
			scanf("%d %d %d", &d1.year, &d1.month, &d1.day);
			if (isvalidity(d1) == 0)
				printf("日期错误,请重试");
			exit(0);
			printf("请输入天数:");
			scanf("%d", &days);
		    d2 = datesubdays(d1, days);
			printf("日期为:%d年%d月%d日", d2.year, d2.month, d2.day);
			break;
		case 4:
			printf("输入需要求星期几的日期:");
			scanf("%d %d %d",&d1.year,&d1.month,&d1.day);
			int x = whatday(d1);
			printf("这天是星期%d", x);
			break;	
		}
		system("pause");
		return 0;
	}                                                              // liuyh 2021.10.11

根据课本中的课后尝试编写的进行日期综合计算的程序代码。

这也算我作为新人入门写的第一个完整项目代码,耗时六个多小时,做完觉得还挺有实用性,很有成就感。

上一篇:Error occurred during initialization of VM Could not reserve enough space for object heap


下一篇:Calendar的使用以及活动每月星期的信息