新人第二发!日期计算代码优化

更新

  • 2019-07-04更新

之前说到的报错问题原因找到了,在dateAdd函数使用的参数是*mindate,是一个指针,但是下面的函数直接使用mindate,这样的用法是错误的,*mindate≠mindate,所以没办法使用这个参数,修改方法是,把函数 int datee(struct date ndate)改成int datee(struct date *ndate),让他也使用指针进行运算,同时把几个用到的地方同样进行更改就能使用了。

前言

上一篇博客的那个程序写完之后越想越觉得算法好复杂,有点麻烦,今天就想着怎么优化优化。

主要功能

选项界面

1.输入两个日期,计算两个日期的间隔;

2.输入一个开始日期和天数,往后计算是哪天;

3.输入一个最终的日期和天数,往前计算是哪天;

4.退出程序。

改进

主要功能就和前面还是一样的没有改,算法改了一下

增加了两个函数:一个是计算输入日期是这一年的第几天,另一个是这一年的第几天是什么日期。

加入这两个函数之后计算就方便了很多:

  1. 求间隔就两个天数做差加上年份的间隔产生的天数
  2. 往后算就天数直接相加再用另一个函数算日期
  3. 往前就相反,天数相减,再算日期

不用一直考虑月份了(月份这里也改成二维数组了,0是非闰年,1是闰年,省去if判断的过程)

“可是”

~~写完之后就不想动了,~~还有一堆语法上的报错不知道怎么改,~~因为太懒也不想试了,~~有老哥知道的请告诉我,谢谢

直接贴程序

头文件

    
#include <stdio.h>

定义一个结构体

    
struct date  
    
{
	
struct date
{
	int year;	
	int month;	
	int day;
}*pdate;  
    

定义每个月的长度

  
const int Monthdays[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};	

主函数


int main(void)
{	
	int isPrime(int year);	
	int datee(struct date *ndate);
	/* 2019.7.4更新
	** int datee(struct date ndate);
	*/
	int dateee(int days, struct date maxdate);
	int dateDiff(struct date mindate,struct date maxdate);
	int dateAdd(struct date *mindate,int days);
	int dateSub(struct date *maxdate,int days);
	struct date mindate,maxdate;	
	int days,n;
	
	while(n!=4)
	{
		system("cls");
        /*---------------开始的菜单选项-----------------*/
		printf("**********************************\n");
		printf("**  What do you want to know?   **\n");
		printf("**********************************\n");
		printf("**1.Difference between two days?**\n");
		printf("**2.One day plus a few days?    **\n");
		printf("**3.One day subtract a few days?**\n");
		printf("**4.Exit                        **\n");
		printf("**********************************\n");
		printf("I need:\n");
		scanf("%d",&n);
		printf("**********************************\n");
		switch(n)
		{
			case 1://输入1,计算两天间隔
				printf("Please input the one date:");	
				scanf("%i-%i-%i",&mindate.year,&mindate.month,&mindate.day);
				printf("Please input other day:");	
				scanf("%i-%i-%i",&maxdate.year,&maxdate.month,&maxdate.day); 
				days=dateDiff(mindate,maxdate);	    
				printf("The days are:%d\n",days);
				system("pause");
				break;
				
			case 2://输入2,往后计算日期
				printf("Please input the date:");	
				scanf("%i-%i-%i",&mindate.year,&mindate.month,&mindate.day);
				printf("Please input the number of days:");	
				scanf("%d",&days); 	
				pdate=dateAdd(&mindate,days);  
				printf("The date is:%i-%i-%i\n",pdate->year,pdate->month,pdate->day); 
				system("pause");
				break;
		
			case 3://输入3,往前计算日期
				printf("Please input the date:");	
				scanf("%i-%i-%i",&maxdate.year,&maxdate.month,&maxdate.day);
				printf("Please input the number of days:");	
				scanf("%d",&days); 	
				pdate=dateSub(&maxdate,days);	    
				printf("The date is:%i-%i-%i\n",pdate->year,pdate->month,pdate->day); 
				system("pause");
				break;
				
			case 4://输入4,退出程序
				printf("You will regret it. Goodbye!\n");
				system("pause");
				break;
				
			default://提示错误
				printf("Why not take the request seriously?\n");
				system("pause");
				break;
			return 0;
		}
	}
}

函数:判断是否闰年


int isPrime(int year)
{
	if ((year%4==0&&year%100!=0)||(year%400==0))		
		return 1;		
	else	
		return 0;	
} 

函数:日期转成天数


//计算输入日期是那一年的第几天 
int datee(struct date *ndate)
/* 2019.7.4更新
** int datee(struct date ndate)
*/
{
	int i,n,days=0;
	for(i=1;i<ndate->month;i++)   //.改成->   2019.7.4
	{
		days+=Monthdays[isPrime(ndate->year)][i-1];
	}
	days+=ndate->day;
	return days;
} 

函数:天数转日期


//计算输入天数是那一年对应日期 
int dateee(int days,struct date *ndate)
{
	struct date *pdate=ndate;
	pdate->month=1;
	while(days>Monthdays[isPrime(pdate->year)][pdate->month-1])
	{
		days-=Monthdays[isPrime(pdate->year)][pdate->month-1];
		pdate->month++;
	}
	pdate->day=days;
	return pdate;
}

函数:计算两个日期间隔


int dateDiff(struct date mindate,struct date maxdate)
{
	int mindays=0, maxdays=0;		
	struct date tmp;
		
	if ((mindate.year>maxdate.year)|| (mindate.year==maxdate.year&&mindate.month>maxdate.month)||(mindate.year==maxdate.year&&mindate.month==maxdate.month&&mindate.day>maxdate.day))	
	{	
		tmp=mindate;		
		mindate=maxdate;		
		maxdate=tmp;	
	} 
	mindays=datee(&mindate);
	maxdays=datee(&maxdate);
	/* 2019.7.4更新
 	** mindays=datee(mindate);
 	** maxdays=datee(maxdate);
 	*/
	for(maxdate.year;maxdate.year>mindate.year;maxdate.year--)
	{
		if(isPrime(maxdate.year-1))
			maxdays += 366;
		else
			maxdays += 365;
	}
	return (maxdays-mindays);
}

函数:往后计算日期


int dateAdd(struct date *mindate,int days)
{
	int mindays;
	mindays = datee(mindate)+days;
	while(mindays > 365)
	{
		if(isPrime(mindate->year))     //.改成->
			if(mindays>366)
			{
				mindays-=366;
				(mindate->year)++;
			}
			else
				break;
		else
			if(mindays>365)
			{
				mindays-=365;
				(mindate->year)++;
			}
	}
	struct date *pmaxdate;
	pmaxdate = dateee(mindays,mindate);
	return pmaxdate;
}

函数:往前计算日期


int dateSub(struct date *maxdate,int days)
{
	int maxdays;
	maxdays = datee(maxdate);
	while(maxdays<days)
	{
		if(isPrime(maxdate->year-1))
		{
			maxdays += 366;
			(maxdate->year)--;
		}
		else
		{
			maxdays += 365;
			(maxdate->year)--;
		}
	}
	struct date *pmindate;
	pmindate = dateee(maxdays-days,maxdate);
	return pmindate;
}

结束

代码长度以肉眼可见的速度变少了,还是求一波前辈们的指导,还有感觉自己好像很多写代码习惯都很不好,也请各位前辈多指教,谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值