目录
更新
- 2019-07-04更新
之前说到的报错问题原因找到了,在dateAdd函数使用的参数是*mindate,是一个指针,但是下面的函数直接使用mindate,这样的用法是错误的,*mindate≠mindate,所以没办法使用这个参数,修改方法是,把函数 int datee(struct date ndate)改成int datee(struct date *ndate),让他也使用指针进行运算,同时把几个用到的地方同样进行更改就能使用了。
前言
上一篇博客的那个程序写完之后越想越觉得算法好复杂,有点麻烦,今天就想着怎么优化优化。
主要功能
选项界面
1.输入两个日期,计算两个日期的间隔;
2.输入一个开始日期和天数,往后计算是哪天;
3.输入一个最终的日期和天数,往前计算是哪天;
4.退出程序。
改进
主要功能就和前面还是一样的没有改,算法改了一下
增加了两个函数:一个是计算输入日期是这一年的第几天,另一个是这一年的第几天是什么日期。
加入这两个函数之后计算就方便了很多:
- 求间隔就两个天数做差加上年份的间隔产生的天数
- 往后算就天数直接相加再用另一个函数算日期
- 往前就相反,天数相减,再算日期
不用一直考虑月份了(月份这里也改成二维数组了,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;
}
结束
代码长度以肉眼可见的速度变少了,还是求一波前辈们的指导,还有感觉自己好像很多写代码习惯都很不好,也请各位前辈多指教,谢谢