Eat.随 发表于 2023-12-7 17:08:34

解决问题

这个月份算出来是15,哪里出错了。
以下是计算月份的代码
void calculate_mouth(int time_s,int *mouth)
{
    int mouth_all[] = {31,28,31,30,31,30,31,31,30,31,30,31};
    int day_remainder = (time_s % (3 * 365 * 86400 + 366 * 86400)) / 86400;//get the remainder day of four year
    if (day_remainder >= 365 * 2 + 366)
    {
      mouth_all = 29;
    }
    int day;
    calculate_day(time_s,&day);
    int i;
    for (i = 0;i < 12;i++)
    {
      int n = day - mouth_all;
      if (n > 0)
      {
            continue;
      }
      else
      {
            *mouth = i + 1;
            break;
      }
    }
}
以下是完整代码
#include <stdio.h>
#include <time.h>
void leap_years(int time_s,int *leap)
{
    int day_remainder = (time_s % (3 * 365 * 86400 + 366 * 86400)) / 86400;//get the remainder day of four year
    if (day_remainder >= 0 && day_remainder < 365)
    {
      *leap = 0;
    }
    else if (day_remainder >= 365 && day_remainder < (365 * 2))
    {
      *leap = 1;
    }
    else if (day_remainder >= (365 * 2) && day_remainder < (365 * 2 + 366))
    {
      *leap = 2;
    }
    else
    {
      *leap = 3;
    }   
}

void cal_second_remainder(int time_s,int *second_remainder)
{
    int leap;
    leap_years(time_s,&leap);
    switch(leap)
    {
      case 0:*second_remainder = time_s % (3 * 365 * 86400 + 366 * 86400);break;
      case 1:*second_remainder = time_s % (3 * 365 * 86400 + 366 * 86400) - 365 * 86400;break;
      case 2:*second_remainder = time_s % (3 * 365 * 86400 + 366 * 86400) - 365 * 2 * 86400;break;
      case 3:*second_remainder = time_s % (3 * 365 * 86400 + 366 * 86400) - (365 * 2 + 366) * 86400;break;
    }
}

void calculate_year(int time_s,int *year)
{
    int leap;
    leap_years(time_s,&leap);
    *year = 4 * (time_s / (3 * 365 * 86400 + 366 * 86400)) + 1970 + leap;
}

void calculate_day(int time_s,int *day)
{
    int second_remainder;
    cal_second_remainder(time_s,&second_remainder);
    *day = second_remainder / (24 * 60 * 60);
}   

void calculate_hour_minute(int time_s,int *hour,int *minute)
{
    int day,second_remainder,second;
    calculate_day(time_s,&day);
    cal_second_remainder(time_s,&second_remainder);
    second = second_remainder - day * 24 * 60 * 60;
    *hour = second / (60 * 60);
    *minute = (second % (60 * 60)) / 60;
}

void calculate_mouth(int time_s,int *mouth)
{
    int mouth_all[] = {31,28,31,30,31,30,31,31,30,31,30,31};
    int day_remainder = (time_s % (3 * 365 * 86400 + 366 * 86400)) / 86400;//get the remainder day of four year
    if (day_remainder >= 365 * 2 + 366)
    {
      mouth_all = 29;
    }
    int day;
    calculate_day(time_s,&day);
    int i;
    for (i = 0;i < 12;i++)
    {
      int n = day - mouth_all;
      if (n > 0)
      {
            continue;
      }
      else
      {
            *mouth = i + 1;
            break;
      }
    }
}

int prnitf_time(int time_s,int year,int day,int hour,int minute)
{
    printf("senconds:%i\n",time_s);
    printf("year:%i\n",year);
    printf("day:%i\n",day);
    printf("hour:%i\n",hour);
    printf("minute:%i\n",minute);
}


int main()
{
    int time_s = time(NULL) + 8 * 60 * 60;
    int year,day,hour,minute,mouth;

    calculate_year(time_s,&year);
    calculate_day(time_s,&day);
    calculate_hour_minute(time_s,&hour,&minute);
    calculate_mouth(time_s,&mouth);
   
    prnitf_time(time_s,year,day,hour,minute);
    printf("%i",mouth);

    return 0;
}

FishC_GPT 发表于 2023-12-7 17:09:14

在代码中,你定义了一个名为`mouth_all`的数组,并尝试将初始值赋给它。然而,你使用了错误的语法来初始化数组。正确的写法是使用大括号`{}`来赋值,而不是使用等号`=`。以下是修改后的代码:

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

另外,在循环中,你需要更新`day`的值,以便计算剩余天数。你可以通过减去已经过去的月份的天数来实现。以下是修改后的`calculate_mouth`函数的完整代码:

void calculate_mouth(int time_s,int *mouth)
{
    int month_all[] = {31,28,31,30,31,30,31,31,30,31,30,31};// 修改了语法错误

    int day_remainder = (time_s % (3 * 365 * 86400 + 366 * 86400)) / 86400; // 获取四年的余下天数
    if (day_remainder >= 365 * 2 + 366)
    {
      month_all = 29;// 修改了变量名错误
    }

    int day;
    calculate_day(time_s,&day);
    int i;
    for (i = 0; i < 12; i++)
    {
      day -= month_all; // 更新剩余天数

      if (day <= 0)// 找到月份后立即停止循环
      {
            *mouth = i + 1;
            break;
      }
    }
}

通过以上修改,你应该能够正确计算出月份。希望对你有所帮助!

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

jackz007 发表于 2023-12-7 17:34:56

本帖最后由 jackz007 于 2023-12-7 18:02 编辑

          简单的问题竟被你搞得如此复杂,参考此贴(你自己发的求助帖):
https://fishc.com.cn/forum.php?mod=redirect&goto=findpost&ptid=237407&pid=6406392
页: [1]
查看完整版本: 解决问题