新人报道!复习C语言期间写了个计算日期的程序

前言

新人报到,第一次写博客,有哪里写得不好的地方,请各位大佬多多指导

主要功能

选项界面

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

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

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

4.退出程序。

直接贴程序

头文件

    
#include <stdio.h>

定义一个结构体

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

定义每个月的长度


const int primeMonth[12]={31,29,31,30,31,30,31,31,30,31,30,31};   
const int notPrimeMonth[12]={31,28,31,30,31,30,31,31,30,31,30,31};

主函数


int main(void)
{	
	int isPrime(int year);	
	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 dateDiff(struct date mindate,struct date maxdate)
{	int days=0, flag=1;		
	
	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;	
	} 		
	int maxmonth,minmonth;
	
	if (maxdate.month<mindate.month)	
	{	
		maxmonth=mindate.month;		
		minmonth=maxdate.month;		
		flag=-1;	
	}	
	else
	{	
		maxmonth=maxdate.month;		
		minmonth=mindate.month;		
		flag=1;	
	} 
	int j=mindate.year;
	for(j;j<maxdate.year;++j)	
	{	
		if (isPrime(j)==1)		
		{		
			days+=366;		
		}		
		else			
		days+=365;	
	}	
	int day;	
	if(isPrime(maxdate.year)==1)
	{			
		int i=minmonth;
		for(i;i<maxmonth;i++)	
		{		
			day=primeMonth[i-1]*flag;			
			days=days+day;		
		}		
		days=days+maxdate.day-mindate.day;	
	}	
	else
	{	
		int i=minmonth;
		for (i;i<maxmonth;i++)		
		{		
			day=notPrimeMonth[i-1]*flag;			
			days=days+day;		
		}	
		days=days+maxdate.day-mindate.day;	
	}	
	return days;
}

函数:往后计算日期


int dateAdd(struct date *mindate,int days)
{
	struct date *pmaxdate=mindate;
	
	for(days;days>=365;)
	{
		if(isPrime(pmaxdate->year)==1)
			if(days>=366)
			{
				days-=366;
				pmaxdate->year++;
			}
			else
				break;
		else
			if(days>=365)
			{
				days-=365;
				pmaxdate->year++;
			}
	}
	pmaxdate->day+=days;
	if(isPrime(pmaxdate->year)==1)
		for(pmaxdate->day;pmaxdate->day>=primeMonth[pmaxdate->month-1];)
		{
			pmaxdate->day-=primeMonth[pmaxdate->month-1];
			pmaxdate->month++;
			if(pmaxdate->month>12)
			{
				pmaxdate->month-=12;
				pmaxdate->year++;
			}
		}
	else
		for(pmaxdate->day;pmaxdate->day>=notPrimeMonth[pmaxdate->month-1];)
		{
			pmaxdate->day-=notPrimeMonth[pmaxdate->month-1];
			pmaxdate->month++;
			if(pmaxdate->month>12)
			{
				pmaxdate->month-=12;
				pmaxdate->year++;
			}
		}
	return pmaxdate;
}  

函数:往前计算日期


int dateSub(struct date *maxdate,int days)
{
	struct date *pmindate=maxdate;
	
	for(days;days>=365;)
	{
		if(isPrime(pmindate->year-2)==1)
			if(days>=366)
			{
				days-=366;
				pmindate->year--;
			}
			else
				break;
		else
			if(days>=365)
			{
				days-=365;
				pmindate->year--;
			}
	}
	if(days<pmindate->day)
		pmindate->day-=days;
	else
	{
		pmindate->day=days-pmindate->day; 
		pmindate->month--;
		if(isPrime(pmindate->year)==1)
			{
				for(pmindate->day;pmindate->day>=primeMonth[pmindate->month-1];)
				{
					pmindate->day-=primeMonth[pmindate->month-1];
					pmindate->month--;
					if(pmindate->month<1)
					{
						pmindate->month+=12;
						pmindate->year--;
					}
				}
				pmindate->day=primeMonth[pmindate->month-2]-pmindate->day;
			}
		else
			{
				for(pmindate->day;pmindate->day>=notPrimeMonth[pmindate->month-1];)
				{
					pmindate->day-=notPrimeMonth[pmindate->month-1];
					pmindate->month--;
					if(pmindate->month<1)
					{
						pmindate->month+=12;
						pmindate->year--;
						if(isPrime(pmindate->year)==1)
							break;
					}
				}
				if(isPrime(pmindate->year)==1)
				{
					for(pmindate->day;pmindate->day>primeMonth[pmindate->month-2];)
					{
						pmindate->day-=primeMonth[pmindate->month-1];
						pmindate->month--;
						if(pmindate->month<1)
						{
							pmindate->month+=12;
							pmindate->year--;
						}
					}
					pmindate->day=primeMonth[pmindate->month-1]-pmindate->day;
				}
				else
					pmindate->day=notPrimeMonth[pmindate->month-1]-pmindate->day;		
			}
	}
	return pmindate;
}

结束

要哭出来了这玩意排版太难了,请各位大佬指教

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值