QuânSysAd's Blog: lich van nien
Hiển thị các bài đăng có nhãn lich van nien. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn lich van nien. Hiển thị tất cả bài đăng

11 tháng 7 2018

Lập trình C: Ngày tháng Năm đầu tiên sau công nguyên

Chương trình tính số ngày trong tháng. Tính ngày hôm trước và tính ngày hôm sau.


Do ngày đầu tiên sau công nguyên là ngày 01/01/0001. Do không có năm 0000. Nên là ngày trước ngày đầu tiên sau công nguyên là ngày 31 tháng 12 năm 1 trước công nguyên.



Như vậy. Nếu ta định nghĩa năm 1 trước công nguyên là -1. Như vậy ta có hàm tính ngày hôm trước được định nghĩa như sau:



#include <stdbool.h>


void timNgayHomTruoc(int *ngay, int *thang, int *nam) {
(*ngay)--;
if ( *ngay < 1 ) {
        (*thang) --;
        if ( *thang < 1 ) {
         (*nam)--;
         if( *nam == 0 ) {
          *thang = 31;
          *ngay = 12;
                        *nam = -1;
          return;
         }
         else {
            *thang = 12; 
            //*nam = 0;
            }
     }
        *ngay = LayTongSoNgayTrongThang(*thang, *nam);
    }
}





Như vậy ở đây nếu ngày đầu vào là 01/01/0001 là ngày hợp lệ thì ngày hôm trước sẽ là ngày 31/12 năm -1.


Ta có thể định nghĩa hàm kiểm tra ngày tháng như sau. Ở đây ta đã công nhận năm trước công nguyên nên chỉ bỏ qua năm 0.



bool validDate(int ngay, int thang, int nam) {
  if (nam = 0 || nam > 9999 || thang < 1 || thang > 12 || ngay < 1 || ngay > 31) {
    return false;
  }
  if (ngay > LayTongSoNgayTrongThang(thang, nam)) {
    return false;
  }
  return true;
}





Chương trình đầy đủ như sau:


```
#include < stdio.h > #include < stdbool.h > #include < string.h >

  #define IS_LEAP_YEAR(year)(((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) ? true : false)

void findNextDate(int * day, int * month, int * year);
int LayTongSoNgayTrongThang(int Thang, int Nam);
bool validDate(int ngay, int thang, int nam);
void timNgayHomTruoc(int * ngay, int * thang, int * nam);

const int SoNgayThangNamThuong[] = {
  31,
  28,
  31,
  30,
  31,
  30,
  31,
  31,
  30,
  31,
  30,
  31
};
const int SoNgayThangNamNhuan[] = {
  31,
  29,
  31,
  30,
  31,
  30,
  31,
  31,
  30,
  31,
  30,
  31
};

int main(void) {
  bool x = true;
  int ngay, thang, nam;
  ngay = 1;
  thang = 1;
  nam = -1;
  //printf ("%d", IS_LEAP_YEAR(2000));
  printf(IS_LEAP_YEAR(2000) ? "true\n" : "false\n");
  //printf("%d\n",LayTongSoNgayTrongThang(04,1999));
  //findNextDate(&ngay,&thang,&nam);
  //printf("Ngay: %d, Thang: %d, Nam: %d\n",ngay,thang,nam);
  if (validDate(ngay, thang, nam)) {
    timNgayHomTruoc( & ngay, & thang, & nam);
    if (validDate(ngay, thang, nam)) {
      printf("Ngay Truoc: Ngay: %d, Thang: %d, Nam: %d\n", ngay, thang, nam);
    } else printf("Ngay Truoc Cong Nguyen\n");
    printf("Ngay Truoc: Ngay: %d, Thang: %d, Nam: %d\n", ngay, thang, nam);
  } else printf("Ngay Khong Hop Le\n");

  return 0;
}

int LayTongSoNgayTrongThang(int Thang, int Nam) {
  return (IS_LEAP_YEAR(Nam) ? SoNgayThangNamNhuan[Thang - 1] : SoNgayThangNamThuong[Thang - 1]);
}

void findNextDate(int * day, int * month, int * year) {
  ( * day) ++;
  if ( * day > LayTongSoNgayTrongThang( * month, * year)) { * day = 1;
    ( * month) ++;
    if ( * month > 12) { * month = 1;
      ( * year) ++;
    }
  }
}

bool validDate(int ngay, int thang, int nam) {
  if (nam = 0 || nam > 9999 || thang < 1 || thang > 12 || ngay < 1 || ngay > 31) {
    return false;
  }
  if (ngay > LayTongSoNgayTrongThang(thang, nam)) {
    return false;
  }
  return true;
}

void timNgayHomTruoc(int * ngay, int * thang, int * nam) {
  ( * ngay) --;
  if ( * ngay < 1) {
    ( * thang) --;
    if ( * thang < 1) {
      ( * nam) --;
      if ( * nam == 0) { * thang = 31; * ngay = 12; * nam = -1;
        return;
      } else { * thang = 12;
        //*nam = 0;
      }
    } * ngay = LayTongSoNgayTrongThang( * thang, * nam);
  }
}
```