本帖最后由 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 ;
}
}
|