[函数] 日期的前一天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 }

 

posted @ 2019-05-30 11:41  中年二班  阅读(1161)  评论(0编辑  收藏  举报