初莫M 发表于 2023-12-2 19:16:16

错在哪了啊

输入年月日,判断这一天是今年的第几天?
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int year,mon,day,days=0,i;
    scanf("%4d%2d%2d",&year,&mon,&day);
    if(mon<1||mon>12)
    {cout<<"-1"<<endl;return 0;}
    if(day>31) {cout<<"-1"<<endl;return 0;}
    int a={31,29,31,30,31,30,31,31,30,31,30,31};
    int b={31,28,31,30,31,30,31,31,30,31,30,31};
    if(year%400==0||(year%4==0&&year%100!=0))
    {
      if(mon==2&&day>29) {cout<<"-1"<<endl;return 0;}
      else switch(mon)
      {
            case 1:
            case 3:
            case 5:
            case 7:
            case 9:if(day==31){cout<<"-1"<<endl;return 0;}
      }
      days=day;
      for(i=1;i<mon;i++)
      {
            days+=a;
      }
    }
    if(year%400!=0||(year%4!=0&&year%100==0))
    {
      if(mon==2&&day>28) {cout<<"-1"<<endl;return 0;}
      else switch(mon)
      {
            case 1:
            case 3:
            case 5:
            case 7:
            case 9:if(day==31){cout<<"-1"<<endl;return 0;}
      }
      days=day;
      for(i=1;i<mon;i++)
      {
            days+=a;
      }
    }
    cout<<days;
    return 0;
}

FishC_GPT 发表于 2023-12-2 19:16:31

错误的地方在于条件判断语句 `if(mon12)`,这是一个错误的条件表达式。

可以修改代码如下:

#include <iostream>
using namespace std;

int main() {
    int year, mon, day, days = 0;
    cin >> year >> mon >> day;

    int month_days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

    // 判断是否为闰年,闰年2月有29天
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
      month_days = 29;
    }

    // 累加前面几个月的天数
    for (int i = 0; i < mon - 1; i++) {
      days += month_days;
    }

    // 加上当前月的天数
    days += day;

    cout << "这一天是今年的第" << days << "天" << endl;

    return 0;
}

这段代码首先根据输入的年份 `year` 判断是否为闰年,如果是闰年则将二月的天数设为29天。然后使用循环累加前面几个月的天数,最后加上当前月的天数,得到结果输出。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。

sfqxx 发表于 2023-12-2 19:46:12

在非闰年的情况下,你在计算累计天数时错误地使用了闰年的月份天数数组a,应当使用非闰年的月份天数数组b。以下是修正后的代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int year,mon,day,days=0,i;
    scanf("%4d%2d%2d",&year,&mon,&day);
    if(mon<1||mon>12)
    {cout<<"-1"<<endl;return 0;}
    if(day>31) {cout<<"-1"<<endl;return 0;}
    int a={31,29,31,30,31,30,31,31,30,31,30,31};
    int b={31,28,31,30,31,30,31,31,30,31,30,31};
    if(year%400==0||(year%4==0&&year%100!=0))
    {
      if(mon==2&&day>29) {cout<<"-1"<<endl;return 0;}
      else switch(mon)
      {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:   // 此处应为8
            case 10:// 此处应为10
            case 12: if(day>31){cout<<"-1"<<endl;return 0;} break; //应增加返回操作
      }
      days=day;
      for(i=1;i<mon;i++)
      {
            days+=a;
      }
    }
    if(year%400!=0||(year%4!=0&&year%100==0))
    {
      if(mon==2&&day>28) {cout<<"-1"<<endl;return 0;}
      else switch(mon)
      {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:   // 此处应为8
            case 10:// 此处应为10
            case 12: if(day>31){cout<<"-1"<<endl;return 0;} break; //应增加返回操作
      }
      days=day;
      for(i=1;i<mon;i++)
      {
            days+=b; // 此处应为b
      }
    }
    cout<<days;
    return 0;
}


这段代码修复了你的问题,现在正确地在给定日期是非闰年时使用了正确的月份天数数组,并且在日期超出月份天数限制时也可以正确返回错误信息。

有用请设置最佳答案{:10_254:}
页: [1]
查看完整版本: 错在哪了啊