鱼C论坛

 找回密码
 立即注册
查看: 703|回复: 4

[已解决]二月的日期判断错在哪里了啊

[复制链接]
发表于 2023-10-7 17:29:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
键盘上按照年月日的格式输入年份、月和日期,运行程序以后,判断这一天是这一年的第几天。

输入描述
标准输入,输入三个整数,即年、月、日(都是正数),以空格间隔,不保证输入的年份和日期是正确的。

输出描述
标准输出,输出这一天是这一年的第几天,如果日期不合法,输出“data error!”。
#include<stdio.h>
int main()
{
    int year,mon,day,days=0;
    scanf("%d%d%d",&year,&mon,&day);
    if(year>9999||year<1000) printf("data error!");
    else
   
    {if(((year%400==0)||(year%4==0&&year%100!=0))&&mon>2)
        days++;
    switch(mon)
    {
        case 1:
        {
            if(day>31) printf("data error!");
            else
            {days=day;printf("%d",days);}
            break;
        }
        case 2:
        {
            if(((year%400==0||(year%4==0&&year%100!=0))&&day>29)||
               ((year%400!=0||(year%4!=0&&year%100==0))&&day>28))
                printf("data error!");
            else
            {days=day+31;printf("%d",days);}
            break;
        }
        case 3:
        {
            if(day>31) printf("data error!");
            else
            {days=day+59;printf("%d",days);}
            break;
        }
            case 4:
        {
            if(day>30) printf("data error!");
            else
            {days=day+90;printf("%d",days);}
            break;
        }
        case 5:
        {
            if(day>31) printf("data error!");
            else
            {days=day+120;printf("%d",days);}
            break;
        }
        case 6:
        {
            if(day>30) printf("data error!");
            else
            {days=day+151;printf("%d",days);}
            break;
        }
        case 7:
        {
            if(day>31) printf("data error!");
            else
            {days=day+181;printf("%d",days);}
            break;
        }
        case 8:
        {
            if(day>31) printf("data error!");
            else
            {days=day+212;printf("%d",days);}
            break;
        }
        case 9:
        {
            if(day>30) printf("data error!");
            else
            {days=day+243;printf("%d",days);}
            break;
        }
        case 10:
        {
            if(day>31) printf("data error!");
            else
            {days=day+273;printf("%d",days);}
            break;
        }
        case 11:
        {
            if(day>30) printf("data error!");
            else
            {days=day+304;printf("%d",days);}
            break;
        }
        case 12:
        {
            if(day>31) printf("data error!");
            else
            {days=day+334;printf("%d",days);}
            break;
        }
        default:printf("data error!");
    }
}
}
最佳答案
2023-10-7 19:50:12
本帖最后由 六翻了 于 2023-10-7 20:20 编辑

之前写的,你看下判断2月到底有几天的部分

找一个确定的闰年作为一个点,再用fabs求绝对值
struct Date
{
    int day;
    int month;
    int year;
};
int days(int, int, int, int);
int days(int a, int b, int c, int i)
{
    while(b--)
    {
        switch(b)
        {   case 1: c += 31; break;
            case 3: c += 31; break;
            case 5: c += 31; break;
            case 7: c += 31; break;
            case 8: c += 31; break;
            case 10: c += 31; break;
            case 12: c += 31; break;
            case 4: c += 30; break;
            case 6: c += 30; break;
            case 9: c += 30; break;
            case 11: c += 30; break;
            case 2:         break;
        }
    }
    if((b) > 2)
    {
        if(i == 0)
        {
            c += 29;
        }
        else
        {
            c += 28;
        }
    }
    return c;
}
int main(void)
{
    struct Date head;
    int i, sum;
    do
    {
        printf("请输入年月日:");
        scanf("%d-%d-%d", &head.year, &head.month, &head.day);
        i = fabs((head.year) - 2000);
        i = i % 4;
        if(i != 0 && head.day >= 29 && head.month == 2)//非闰年 >= 29天
        {
            printf("错误!该年2月只有28天!!\n");
        }
        else if(i == 0 && head.day > 29 && head.month == 2)//润年 > 29天
        {
            printf("错误!该年2月只有29天!!\n");            
        }
        if (head.month == 1 || (head.month>1 && head.month <= 7 && (head.month % 2) == 1) || 
            (head.month>=8 && head.month <= 12 && head.month % 2 == 0) && head.day > 31)
        {
            printf("date error!\n");
        }
        else if((head.month>1 && head.month < 7 && (head.month % 2) == 0) || 
            (head.month>=8 && head.month <= 12 && head.month % 2 == 1) && head.day > 30)
        {
            printf("date error!\n");            
        }
        else
            break;

    } while (1);
    sum = days(head.year, head.month, head.day, i);

    printf("该日是本年的第 %d 天\n", sum);

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-7 17:30:22 | 显示全部楼层
问题出在日期判断的逻辑上。在输入的年份和月份都合法的情况下,程序会根据月份的不同进行不同的处理。但是在每个月份的判断逻辑中,都只判断了日期的大小,而没有考虑到闰年的情况。

闰年是指能被4整除但不能被100整除的年份,或者能被400整除的年份。在闰年的2月份,日期的范围是1-29;在平年的2月份,日期的范围是1-28。

因此,需要在2月份的判断逻辑中加入对闰年的判断,以确定日期的合法性。具体修改如下:
case 2:
{
    if(((year%400==0||(year%4==0&&year%100!=0))&&day>29)||
        ((year%400!=0||(year%4!=0&&year%100==0))&&day>28))
        printf("data error!");
    else
    {
        days=day+31;
        printf("%d",days);
    }
    break;
}

这样,程序就能正确判断日期的合法性,并输出对应的结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-7 17:31:47 | 显示全部楼层
这段代码有几个错误:

1. 没有加入break语句:在每个case后面,需要添加break语句以结束switch语句块,否则会继续执行后面的case。

2. 闰年判断条件错误:在判断是否为闰年的条件中,存在括号不匹配的问题。正确的条件应该是((year%400==0)||(year%4==0&&year%100!=0))。

3. 二月份的天数判断错误:在判断二月份的天数时,应该先判断是否为闰年,然后再根据闰年与非闰年分别判断天数。

下面是修改后的代码:
++#include <stdio.h>int main() {    int year, mon, day, days = 0;    scanf("%d%d%d", &year, &mon, &day);        if (year > 9999 || year < 1000) {        printf("data error!");    }    else {        if (((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) && mon > 2) {            days++;        }                switch (mon) {            case 1:                if (day > 31) {                    printf("data error!");                }                else {                    days = day;                    printf("%d", days);                }                break;            case 2:                if (((year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) && day > 29)                        || ((year % 400 != 0 || (year % 4 != 0 && year % 100 == 0)) && day > 28)) {                    printf("data error!");                }                else {                    days = day + 31;                    printf("%d", days);                }                break;            case 3:                if (day > 31) {                    printf("data error!");                }                else {                    days = day + 59;                    printf("%d", days);                }                break;            case 4:                if (day > 30) {                    printf("data error!");                }                else {                    days = day + 90;                    printf("%d", days);                }                break;            case 5:                if (day > 31) {                    printf("data error!");                }                else {                    days = day + 120;                    printf("%d", days);                }                break;            case 6:                if (day > 30) {                    printf("data error!");                }                else {                    days = day + 151;                    printf("%d", days);                }                break;            case 7:                if (day > 31) {                    printf("data error!");                }                else {                    days = day + 181;                    printf("%d", days);                }                break;            case 8:                if (day > 31) {                    printf("data error!");                }                else {                    days = day + 212;                    printf("%d", days);                }                break;            case 9:                if (day > 30) {                    printf("data error!");                }                else {                    days = day + 243;                    printf("%d", days);                }                break;            case 10:                if (day > 31) {                    printf("data error!");                }                else {                    days = day + 273;                    printf("%d", days);                }                break;            case 11:                if (day > 30) {                    printf("data error!");                }                else {                    days = day + 304;                    printf("%d", days);                }                break;            case 12:                if (day > 31) {                    printf("data error!");                }                else {                    days = day + 334;                    printf("%d", days);                }                break;            default:                printf("data error!");        }    }        return 0;}
希望以上回答对你有帮助!如果还有其他问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-7 19:50:12 | 显示全部楼层    本楼为最佳答案   
本帖最后由 六翻了 于 2023-10-7 20:20 编辑

之前写的,你看下判断2月到底有几天的部分

找一个确定的闰年作为一个点,再用fabs求绝对值
struct Date
{
    int day;
    int month;
    int year;
};
int days(int, int, int, int);
int days(int a, int b, int c, int i)
{
    while(b--)
    {
        switch(b)
        {   case 1: c += 31; break;
            case 3: c += 31; break;
            case 5: c += 31; break;
            case 7: c += 31; break;
            case 8: c += 31; break;
            case 10: c += 31; break;
            case 12: c += 31; break;
            case 4: c += 30; break;
            case 6: c += 30; break;
            case 9: c += 30; break;
            case 11: c += 30; break;
            case 2:         break;
        }
    }
    if((b) > 2)
    {
        if(i == 0)
        {
            c += 29;
        }
        else
        {
            c += 28;
        }
    }
    return c;
}
int main(void)
{
    struct Date head;
    int i, sum;
    do
    {
        printf("请输入年月日:");
        scanf("%d-%d-%d", &head.year, &head.month, &head.day);
        i = fabs((head.year) - 2000);
        i = i % 4;
        if(i != 0 && head.day >= 29 && head.month == 2)//非闰年 >= 29天
        {
            printf("错误!该年2月只有28天!!\n");
        }
        else if(i == 0 && head.day > 29 && head.month == 2)//润年 > 29天
        {
            printf("错误!该年2月只有29天!!\n");            
        }
        if (head.month == 1 || (head.month>1 && head.month <= 7 && (head.month % 2) == 1) || 
            (head.month>=8 && head.month <= 12 && head.month % 2 == 0) && head.day > 31)
        {
            printf("date error!\n");
        }
        else if((head.month>1 && head.month < 7 && (head.month % 2) == 0) || 
            (head.month>=8 && head.month <= 12 && head.month % 2 == 1) && head.day > 30)
        {
            printf("date error!\n");            
        }
        else
            break;

    } while (1);
    sum = days(head.year, head.month, head.day, i);

    printf("该日是本年的第 %d 天\n", sum);

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-7 19:53:36 | 显示全部楼层
本帖最后由 六翻了 于 2023-10-7 20:19 编辑
六翻了 发表于 2023-10-7 19:50
之前写的,你看下判断2月到底有几天的部分


这是不使用函数的,有点儿小问题
int main(void)
{
    struct Date
    {
        int day;
        int month;
        int year;
    };

    struct Date head;
    int i;
    do
    {
        printf("请输入年月日:");
        scanf("%d-%d-%d", &head.year, &head.month, &head.day);
        i = fabs((head.year) - 2000);
        i = i % 4;
        if(i != 0 && head.day >= 29 && head.month == 2)
        {
            printf("错误!该年2月只有28天!!\n");
        }
        if (head.month == 1 || (head.month>1 && head.month <= 7 && (head.month % 2) == 1) || 
            (head.month>=8 && head.month <= 12 && head.month % 2 == 0) && head.day > 31)
        {
            printf("date error!\n");
        }
        else if((head.month>1 && head.month < 7 && (head.month % 2) == 0) || 
            (head.month>=8 && head.month <= 12 && head.month % 2 == 1) && head.day > 30)
        {
            printf("date error!\n");            
        }
        else
            break;

    } while (1);

    int sum = 0;
    int n = head.month;

    while(n--)
    {
        switch(n)
        {   case 1: sum += 31; break;
            case 3: sum += 31; break;
            case 5: sum += 31; break;
            case 7: sum += 31; break;
            case 8: sum += 31; break;
            case 10: sum += 31; break;
            case 12: sum += 31; break;
            case 4: sum += 30; break;
            case 6: sum += 30; break;
            case 9: sum += 30; break;
            case 11: sum += 30; break;
            case 2:        break;
        }
    }
    if((head.month) > 2)
    {
        if(i == 0)
        {
            sum += 29;
        }
        else
        {
            sum += 28;
        }
    }
    sum += head.day;
    printf("该日是本年的第 %d 天\n", sum);

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 21:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表