鱼C论坛

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

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

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

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

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

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

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

输出描述
标准输出,输出这一天是这一年的第几天,如果日期不合法,输出“data error!”。
  1. #include<stdio.h>
  2. int main()
  3. {
  4.     int year,mon,day,days=0;
  5.     scanf("%d%d%d",&year,&mon,&day);
  6.     if(year>9999||year<1000) printf("data error!");
  7.     else
  8.    
  9.     {if(((year%400==0)||(year%4==0&&year%100!=0))&&mon>2)
  10.         days++;
  11.     switch(mon)
  12.     {
  13.         case 1:
  14.         {
  15.             if(day>31) printf("data error!");
  16.             else
  17.             {days=day;printf("%d",days);}
  18.             break;
  19.         }
  20.         case 2:
  21.         {
  22.             if(((year%400==0||(year%4==0&&year%100!=0))&&day>29)||
  23.                ((year%400!=0||(year%4!=0&&year%100==0))&&day>28))
  24.                 printf("data error!");
  25.             else
  26.             {days=day+31;printf("%d",days);}
  27.             break;
  28.         }
  29.         case 3:
  30.         {
  31.             if(day>31) printf("data error!");
  32.             else
  33.             {days=day+59;printf("%d",days);}
  34.             break;
  35.         }
  36.             case 4:
  37.         {
  38.             if(day>30) printf("data error!");
  39.             else
  40.             {days=day+90;printf("%d",days);}
  41.             break;
  42.         }
  43.         case 5:
  44.         {
  45.             if(day>31) printf("data error!");
  46.             else
  47.             {days=day+120;printf("%d",days);}
  48.             break;
  49.         }
  50.         case 6:
  51.         {
  52.             if(day>30) printf("data error!");
  53.             else
  54.             {days=day+151;printf("%d",days);}
  55.             break;
  56.         }
  57.         case 7:
  58.         {
  59.             if(day>31) printf("data error!");
  60.             else
  61.             {days=day+181;printf("%d",days);}
  62.             break;
  63.         }
  64.         case 8:
  65.         {
  66.             if(day>31) printf("data error!");
  67.             else
  68.             {days=day+212;printf("%d",days);}
  69.             break;
  70.         }
  71.         case 9:
  72.         {
  73.             if(day>30) printf("data error!");
  74.             else
  75.             {days=day+243;printf("%d",days);}
  76.             break;
  77.         }
  78.         case 10:
  79.         {
  80.             if(day>31) printf("data error!");
  81.             else
  82.             {days=day+273;printf("%d",days);}
  83.             break;
  84.         }
  85.         case 11:
  86.         {
  87.             if(day>30) printf("data error!");
  88.             else
  89.             {days=day+304;printf("%d",days);}
  90.             break;
  91.         }
  92.         case 12:
  93.         {
  94.             if(day>31) printf("data error!");
  95.             else
  96.             {days=day+334;printf("%d",days);}
  97.             break;
  98.         }
  99.         default:printf("data error!");
  100.     }
  101. }
  102. }
复制代码
最佳答案
2023-10-7 19:50:12
本帖最后由 六翻了 于 2023-10-7 20:20 编辑

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

找一个确定的闰年作为一个点,再用fabs求绝对值


  1. struct Date
  2. {
  3.     int day;
  4.     int month;
  5.     int year;
  6. };
  7. int days(int, int, int, int);
  8. int days(int a, int b, int c, int i)
  9. {
  10.     while(b--)
  11.     {
  12.         switch(b)
  13.         {   case 1: c += 31; break;
  14.             case 3: c += 31; break;
  15.             case 5: c += 31; break;
  16.             case 7: c += 31; break;
  17.             case 8: c += 31; break;
  18.             case 10: c += 31; break;
  19.             case 12: c += 31; break;
  20.             case 4: c += 30; break;
  21.             case 6: c += 30; break;
  22.             case 9: c += 30; break;
  23.             case 11: c += 30; break;
  24.             case 2:         break;
  25.         }
  26.     }
  27.     if((b) > 2)
  28.     {
  29.         if(i == 0)
  30.         {
  31.             c += 29;
  32.         }
  33.         else
  34.         {
  35.             c += 28;
  36.         }
  37.     }
  38.     return c;
  39. }
  40. int main(void)
  41. {
  42.     struct Date head;
  43.     int i, sum;
  44.     do
  45.     {
  46.         printf("请输入年月日:");
  47.         scanf("%d-%d-%d", &head.year, &head.month, &head.day);
  48.         i = fabs((head.year) - 2000);
  49.         i = i % 4;
  50.         if(i != 0 && head.day >= 29 && head.month == 2)//非闰年 >= 29天
  51.         {
  52.             printf("错误!该年2月只有28天!!\n");
  53.         }
  54.         else if(i == 0 && head.day > 29 && head.month == 2)//润年 > 29天
  55.         {
  56.             printf("错误!该年2月只有29天!!\n");            
  57.         }
  58.         if (head.month == 1 || (head.month>1 && head.month <= 7 && (head.month % 2) == 1) ||
  59.             (head.month>=8 && head.month <= 12 && head.month % 2 == 0) && head.day > 31)
  60.         {
  61.             printf("date error!\n");
  62.         }
  63.         else if((head.month>1 && head.month < 7 && (head.month % 2) == 0) ||
  64.             (head.month>=8 && head.month <= 12 && head.month % 2 == 1) && head.day > 30)
  65.         {
  66.             printf("date error!\n");            
  67.         }
  68.         else
  69.             break;

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

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

  73.     return 0;
  74. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

因此,需要在2月份的判断逻辑中加入对闰年的判断,以确定日期的合法性。具体修改如下:

  1. case 2:
  2. {
  3.     if(((year%400==0||(year%4==0&&year%100!=0))&&day>29)||
  4.         ((year%400!=0||(year%4!=0&&year%100==0))&&day>28))
  5.         printf("data error!");
  6.     else
  7.     {
  8.         days=day+31;
  9.         printf("%d",days);
  10.     }
  11.     break;
  12. }
复制代码


这样,程序就能正确判断日期的合法性,并输出对应的结果。
小甲鱼最新课程 -> https://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. 二月份的天数判断错误:在判断二月份的天数时,应该先判断是否为闰年,然后再根据闰年与非闰年分别判断天数。

下面是修改后的代码:
  1. ++
  2. #include <stdio.h>
  3. int main() {
  4.     int year, mon, day, days = 0;
  5.     scanf("%d%d%d", &year, &mon, &day);
  6.    
  7.     if (year > 9999 || year < 1000) {
  8.         printf("data error!");
  9.     }
  10.     else {
  11.         if (((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) && mon > 2) {
  12.             days++;
  13.         }
  14.         
  15.         switch (mon) {
  16.             case 1:
  17.                 if (day > 31) {
  18.                     printf("data error!");
  19.                 }
  20.                 else {
  21.                     days = day;
  22.                     printf("%d", days);
  23.                 }
  24.                 break;
  25.             case 2:
  26.                 if (((year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) && day > 29)
  27.                         || ((year % 400 != 0 || (year % 4 != 0 && year % 100 == 0)) && day > 28)) {
  28.                     printf("data error!");
  29.                 }
  30.                 else {
  31.                     days = day + 31;
  32.                     printf("%d", days);
  33.                 }
  34.                 break;
  35.             case 3:
  36.                 if (day > 31) {
  37.                     printf("data error!");
  38.                 }
  39.                 else {
  40.                     days = day + 59;
  41.                     printf("%d", days);
  42.                 }
  43.                 break;
  44.             case 4:
  45.                 if (day > 30) {
  46.                     printf("data error!");
  47.                 }
  48.                 else {
  49.                     days = day + 90;
  50.                     printf("%d", days);
  51.                 }
  52.                 break;
  53.             case 5:
  54.                 if (day > 31) {
  55.                     printf("data error!");
  56.                 }
  57.                 else {
  58.                     days = day + 120;
  59.                     printf("%d", days);
  60.                 }
  61.                 break;
  62.             case 6:
  63.                 if (day > 30) {
  64.                     printf("data error!");
  65.                 }
  66.                 else {
  67.                     days = day + 151;
  68.                     printf("%d", days);
  69.                 }
  70.                 break;
  71.             case 7:
  72.                 if (day > 31) {
  73.                     printf("data error!");
  74.                 }
  75.                 else {
  76.                     days = day + 181;
  77.                     printf("%d", days);
  78.                 }
  79.                 break;
  80.             case 8:
  81.                 if (day > 31) {
  82.                     printf("data error!");
  83.                 }
  84.                 else {
  85.                     days = day + 212;
  86.                     printf("%d", days);
  87.                 }
  88.                 break;
  89.             case 9:
  90.                 if (day > 30) {
  91.                     printf("data error!");
  92.                 }
  93.                 else {
  94.                     days = day + 243;
  95.                     printf("%d", days);
  96.                 }
  97.                 break;
  98.             case 10:
  99.                 if (day > 31) {
  100.                     printf("data error!");
  101.                 }
  102.                 else {
  103.                     days = day + 273;
  104.                     printf("%d", days);
  105.                 }
  106.                 break;
  107.             case 11:
  108.                 if (day > 30) {
  109.                     printf("data error!");
  110.                 }
  111.                 else {
  112.                     days = day + 304;
  113.                     printf("%d", days);
  114.                 }
  115.                 break;
  116.             case 12:
  117.                 if (day > 31) {
  118.                     printf("data error!");
  119.                 }
  120.                 else {
  121.                     days = day + 334;
  122.                     printf("%d", days);
  123.                 }
  124.                 break;
  125.             default:
  126.                 printf("data error!");
  127.         }
  128.     }
  129.    
  130.     return 0;
  131. }
复制代码

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

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

找一个确定的闰年作为一个点,再用fabs求绝对值


  1. struct Date
  2. {
  3.     int day;
  4.     int month;
  5.     int year;
  6. };
  7. int days(int, int, int, int);
  8. int days(int a, int b, int c, int i)
  9. {
  10.     while(b--)
  11.     {
  12.         switch(b)
  13.         {   case 1: c += 31; break;
  14.             case 3: c += 31; break;
  15.             case 5: c += 31; break;
  16.             case 7: c += 31; break;
  17.             case 8: c += 31; break;
  18.             case 10: c += 31; break;
  19.             case 12: c += 31; break;
  20.             case 4: c += 30; break;
  21.             case 6: c += 30; break;
  22.             case 9: c += 30; break;
  23.             case 11: c += 30; break;
  24.             case 2:         break;
  25.         }
  26.     }
  27.     if((b) > 2)
  28.     {
  29.         if(i == 0)
  30.         {
  31.             c += 29;
  32.         }
  33.         else
  34.         {
  35.             c += 28;
  36.         }
  37.     }
  38.     return c;
  39. }
  40. int main(void)
  41. {
  42.     struct Date head;
  43.     int i, sum;
  44.     do
  45.     {
  46.         printf("请输入年月日:");
  47.         scanf("%d-%d-%d", &head.year, &head.month, &head.day);
  48.         i = fabs((head.year) - 2000);
  49.         i = i % 4;
  50.         if(i != 0 && head.day >= 29 && head.month == 2)//非闰年 >= 29天
  51.         {
  52.             printf("错误!该年2月只有28天!!\n");
  53.         }
  54.         else if(i == 0 && head.day > 29 && head.month == 2)//润年 > 29天
  55.         {
  56.             printf("错误!该年2月只有29天!!\n");            
  57.         }
  58.         if (head.month == 1 || (head.month>1 && head.month <= 7 && (head.month % 2) == 1) ||
  59.             (head.month>=8 && head.month <= 12 && head.month % 2 == 0) && head.day > 31)
  60.         {
  61.             printf("date error!\n");
  62.         }
  63.         else if((head.month>1 && head.month < 7 && (head.month % 2) == 0) ||
  64.             (head.month>=8 && head.month <= 12 && head.month % 2 == 1) && head.day > 30)
  65.         {
  66.             printf("date error!\n");            
  67.         }
  68.         else
  69.             break;

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

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

  73.     return 0;
  74. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


这是不使用函数的,有点儿小问题
  1. int main(void)
  2. {
  3.     struct Date
  4.     {
  5.         int day;
  6.         int month;
  7.         int year;
  8.     };

  9.     struct Date head;
  10.     int i;
  11.     do
  12.     {
  13.         printf("请输入年月日:");
  14.         scanf("%d-%d-%d", &head.year, &head.month, &head.day);
  15.         i = fabs((head.year) - 2000);
  16.         i = i % 4;
  17.         if(i != 0 && head.day >= 29 && head.month == 2)
  18.         {
  19.             printf("错误!该年2月只有28天!!\n");
  20.         }
  21.         if (head.month == 1 || (head.month>1 && head.month <= 7 && (head.month % 2) == 1) ||
  22.             (head.month>=8 && head.month <= 12 && head.month % 2 == 0) && head.day > 31)
  23.         {
  24.             printf("date error!\n");
  25.         }
  26.         else if((head.month>1 && head.month < 7 && (head.month % 2) == 0) ||
  27.             (head.month>=8 && head.month <= 12 && head.month % 2 == 1) && head.day > 30)
  28.         {
  29.             printf("date error!\n");            
  30.         }
  31.         else
  32.             break;

  33.     } while (1);

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

  36.     while(n--)
  37.     {
  38.         switch(n)
  39.         {   case 1: sum += 31; break;
  40.             case 3: sum += 31; break;
  41.             case 5: sum += 31; break;
  42.             case 7: sum += 31; break;
  43.             case 8: sum += 31; break;
  44.             case 10: sum += 31; break;
  45.             case 12: sum += 31; break;
  46.             case 4: sum += 30; break;
  47.             case 6: sum += 30; break;
  48.             case 9: sum += 30; break;
  49.             case 11: sum += 30; break;
  50.             case 2:        break;
  51.         }
  52.     }
  53.     if((head.month) > 2)
  54.     {
  55.         if(i == 0)
  56.         {
  57.             sum += 29;
  58.         }
  59.         else
  60.         {
  61.             sum += 28;
  62.         }
  63.     }
  64.     sum += head.day;
  65.     printf("该日是本年的第 %d 天\n", sum);

  66.     return 0;
  67. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-9 19:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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