c语言:日期识别1

日期识别1

任务描述

X同学最近非常烦,因为他正面对一大堆日期数据愁眉不展,原因是那些日期书写的极其不规范,不仔细辨别根本认不清是哪一天。
以下每个日期中的三个数,年月日的位置是不确定的,假设其中最大的数表示年份,1-12范围的数表示月份,1-31范围的数表示日期,如果月日的范围都是1-12则按前月后日的顺序识别。
例如:
2/3-123 识别为0123年2月3日,合法;
13+12+45 识别为0045年12月13日,合法;
12=3=13 识别为0013年12月3日,合法;
29,2,2019 识别为2019年2月29日,这一天不存在,不合法;
12@12#12 识别为0012年12月12日,合法;
35.36.37 识别为0037年XX月XX日,XX超出月份和日期范围,不合法;
113030 识别为0030年11月30日,合法;

现在X要编程判断一下那些日期到底是否合法,你们说他能编出来吗。

输入格式:
一行,以X-Y-Z形式表示的一个日期,其中X、Y、Z为不超过4位的正整数,“-”为一个分隔字符,可能为任何符号。

输出格式:
若该日期为合法存在的日期,以“YYYY-MM-DD”的形式输出该日期的规范式,年4位,月日2位,不足前补0。
若该日期为不合法日期,输出:Invalid Date!。

输入示例1

25-30-5

输出示例1

0030-05-25

输入示例2

2019-32-09

输出示例2

Invalid Date!

代码

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main() {
    int x, y, z;
    int year, month, day;
    char separator;
    scanf("%d%c%d%c%d", &x, &separator, &y, &separator, &z);
    if (x > y && x > z) {
        year = x;
        if (y <= 12) {
            month = y;
            day = z;
        } else if (y > z) {
            month = z;
            day = y;
        } else {
            month = y;
            day = z;
        }
    } else if (y > x && y > z) {
        year = y;
        if (x <= 12) {
            month = x;
            day = z;
        } else if (x > z) {
            month = z;
            day = x;
        } else {
            month = x;
            day = z;
        }
    } else {
        year = z;
        if (x <= 12) {
            month = x;
            day = y;
        } else if (x > y) {
            month = y;
            day = x;
        } else {
            month = x;
            day = y;
        }
    }
    if (month < 1 || month > 12 || day < 1 || day > 31) {
        printf("Invalid Date!");
        return 0;
    }
    if ((month == 4 || month == 6 || month == 9 || month == 11) && day > 30) {
        printf("Invalid Date!");
        return 0;
    } else if (month == 2) {
        if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
            if (day > 29) {
                printf("Invalid Date!");
                return 0;
            }
        } else {
            if (day > 28) {
                printf("Invalid Date!");
                return 0;
            }
        }
    }
    printf("%04d-%02d-%02d", year, month, day);
    return 0;
}

  • 20
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值