初莫M 发表于 2023-10-7 17:29:42

二月的日期判断错在哪里了啊

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

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

输出描述
标准输出,输出这一天是这一年的第几天,如果日期不合法,输出“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!");
    }
}
}

isdkz 发表于 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;
}


这样,程序就能正确判断日期的合法性,并输出对应的结果。

Mike_python小 发表于 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;
}


希望以上回答对你有帮助!如果还有其他问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

六翻了 发表于 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;
}

六翻了 发表于 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;
}
页: [1]
查看完整版本: 二月的日期判断错在哪里了啊