|
发表于 2023-11-12 14:26:57
|
显示全部楼层
本帖最后由 jackz007 于 2023-11-12 14:29 编辑
- #include <stdio.h>
- int leapyear(int y)
- {
- return ((y % 400 == 0) || ((y % 4 == 0) && (y % 100 != 0))) ? 1 : 0 ;
- }
- int lastday(int y , int m)
- {
- int d[] = {31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31} ;
- return (leapyear(y) && m == 2) ? 29 : d[m - 1] ;
- }
- int main(void)
- {
- char c ;
- int a , d , e[5] , f , i , k , m , y ;
- for(;;) {
- for(i = 0 ; i < 3 ; i ++) e[i] = 0 ; // 每一轮输入-判断开始前,需要先将年月日数据清零
- for(i = k = 0 ; k < 3 ;) {
- c = getchar() ;
- if(c >= '0' && c <= '9') {
- e[k] = e[k] * 10 + c - '0' ;
- i ++ ;
- } else if(i) {
- i = 0 ;
- k ++ ;
- }
- if(c == '\n') break ;
- }
- if(k == 3) {
- for(a = 0 , i = 1 ; i < 3 ; i ++) if(e[i] > e[a]) a = i ; // 取得数组 e[] 三个元素中值最大那个元素的索引值 a
- for(i = 0 , m = 3 ; i < 3 ; i ++) if(i != a) e[m ++] = e[i] ; // 将数组 e[] 中除最大值外剩余的两个元素复制到 e[3] 和 e[4] 中
- y = e[a] ; // 最大值 e[a] 为年,e[3]、e[4] 两个元素为月和日
- f = 0 ; // 先将日期合法标志初始化为无效
- if(e[3] >= 1 && e[3] <= 12 && e[4] >= 1 && e[4] <= lastday(y , e[3])) { // 将 e[3]、e[4] 分别作为月、日判断是否合法
- m = e[3] ; // 如果判断通过则执行这些代码
- d = e[4] ;
- f ++ ;
- } else if(e[4] >= 1 && e[4] <= 12 && e[3] >= 1 && e[3] <= lastday(y , e[4])) { // 将 e[3]、e[4] 分别作为日、月判断是否合法
- m = e[4] ; // 如果判断通过则执行这些代码
- d = e[3] ;
- f ++ ;
- }
- if(f) printf("%04d-%d-%d\n" , y , m , d) ; // 根据判断标志确定年月日数据是否有效
- else printf("Invalid Date !\n") ;
- } else if(! k) break ;
- }
- }
复制代码 |
|