[函数] 日期的前一天YESTERDAY 后一天 TOMORROW
Posted leocathyfelix
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[函数] 日期的前一天YESTERDAY 后一天 TOMORROW相关的知识,希望对你有一定的参考价值。
(1)用数组 month[ ] 存储每个月的天数后,通过指针*m里的值做数组下标来选择月末那天的日期;
(2)算前一天,日期往后退,所以先减1再赋值;用 --*d;
(3)闰年的判断条件:能被400整除,或者能被4整除但不能被100整除。
解释:地球绕太阳一圈,实际上花365.24219天,但公历一年只有365天,所以一年就少算了0.24219天。400年下来,少的日子就很可观了,有(0.24219*400=96.876天),约97天,这些得补上。一个简单的法子就是每4年规定为闰年,闰年要补一天,这样子400年就补了100天,但多补了3天。怎么办?简单,随便废掉3个闰年就行了。为了方便,就找上了整百的年份,每400年有4个整百年份,除了能被400整除的那年定为闰年,其他3个整百年都是平年,这纯粹是人为规定。(来源于网络)
(4)判断条件的返回值要么是1要么是0,直接拿来做计算,省去了一个 if 语句;
* d = 28 + (*y % 400 == 0 || *y % 4 == 0 && *y % 100 != 0);
(5)下面两个函数的第一个if条件判断时已经对*d做了减1处理,是先做了减1运算再去比较值,所以后面不需要再另外减1了,否则结果就多减了天数。
前一天
1 void yesterday(int* y, int* m, int* d) { 2 int month[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; 3 if (-- * d == 0) { 4 (*m)--;*d = month[*m]; 5 if (* m == 2) 6 * d = 28 + (*y % 400 == 0 || *y % 4 == 0 && *y % 100 != 0); 7 else if (* m == 0) { 8 (*y)--; 9 *m = 12; 10 *d = 31; 11 } 12 } 13 }
后一天
void tomorrow(int* y, int* m, int* d) { int month[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; month[2]=28+ (*y % 400 == 0 || *y % 4 == 0 && *y % 100 != 0); if (++ * d > month[*m]) { (*m)++; *d = 1; if (*m > 12) { (*y)++; *m = 1; *d = 1; } } }
主程序
1 #include<stdio.h> 2 int main(void){ 3 int cont; 4 do { 5 int ty, tm, td; 6 int yy, ym, yd; 7 printf("请输入一个日期(格式为xxxx xx xx):"); scanf("%d%d%d", &ty, &tm, &td); 8 yy = ty; 9 ym = tm; 10 yd = td; 11 printf("\n日期%.4d-%.2d-%.2d的后一天是:", ty, tm, td); 12 tomorrow(&ty, &tm, &td); 13 printf("\n%.4d-%.2d-%.2d。\n", ty, tm, td); 14 15 printf("\n日期%.4d-%.2d-%.2d的前一天是:", yy, ym, yd); 16 yesterday(&yy, &ym, &yd); 17 printf("\n%.4d-%.2d-%.2d。\n", yy, ym, yd); 18 puts("是否继续?1-YES,Others-NO"); scanf("%d", &cont); 19 } while(cont == 1); 20 puts("如您所愿,程序结束!"); 21 22 return(0); 23 }
以上是关于[函数] 日期的前一天YESTERDAY 后一天 TOMORROW的主要内容,如果未能解决你的问题,请参考以下文章