C言語 配列3(日付のデータチェック)

/*******************************************************************************
西暦の年、月、日を入力し、正しい日付ならば"正しい日付です"、正しくない年月日ならば"誤った日付です"と表示する。
正しい日付の条件
・西暦の年が1900から2000の範囲であること。
・月が1から12であること
・1,3,5,7,8,10,12月の日は1から31であること。
・4,6,9,11は1から30の範囲であること。
・2月の日はうるう年の場合1から29、うるう年以外の場合1から28の範囲であること。
---出力例---
年==> 2012
月==> 2
日==> 29
2012年2月29日は、正しい日付です
---出力例---
年==> 2013
月==> 2
日==> 29
2013年2月29日は、誤った日付です
---出力例---
年==> 1899
月==> 12
日==> 31
1899年12月31日は、誤った日付です
---出力例---
年==> 2013
月==> 13
日==> 13
2013年13月13日は、誤った日付です
---出力例---
年==> 2015
月==> 6
日==> 28
2015年6月28日は、正しい日付です

********************************************************************************/
#include <stdio.h>

int main(void) {

  int lastday[12] = {31,28,31,30,31,30,31,31,30,31,30,31};/*末日の判定に使用*/
  int flag = -1;
  int year, month ,day;

  printf("年==> ");
  scanf("%d", &year);
  printf("月==> ");
  scanf("%d", &month);
  printf("日==> ");
  scanf("%d", &day);

  printf("%d%d%d日は、", year, month, day);
  /*末日以外の判定*/
  if( ( ( year >= 1900 ) && ( year <= 2100 ) ) && ( month >= 1 ) && ( month <= 12 ) && ( day >= 1) ){
    /*31日まである日の判定*/
    if (( month == ( 1 || 3 || 5 || 7 || 8 || 10 || 12 ) ) && ( day <= lastday[month-1]) ){
      flag = 0;
    }else{
      /*30日まである日の判定*/
      if( ( month == ( 4 || 6 || 9 || 11 )) && ( day <= lastday[month-1] ) ){
        flag = 0;
      }else{
        /*うるう年かどうか*/
        if( year % 400 ==0 || ( year % 4 == 0 && !( year % 100 == 0 ) ) ){
          /*うるう年なら29日以下か*/
          if( day <= 29){
            flag = 0;
          }else{
            flag = -1;
          }
        }else{
          /*うるう年でないなら28日以下か*/
          if( day <= 28){
            flag = 0;
          }else{
            flag = -1;
          }
        }
      }
    }
  }else{
    flag = 1;
  }
  if( flag == 0){
    printf("正しい日付です\n");
  }else{
    printf("誤った日付です\n");
  }
  return 0;
}